summaryrefslogtreecommitdiff
path: root/libfreetype/otlbase.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
commit37da2899f40661e3e9631e497da8dc59b971cbd0 (patch)
treecbc6d4680e347d906f5fa7fca73214418741df72 /libfreetype/otlbase.c
parent54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff)
20060303a
Diffstat (limited to 'libfreetype/otlbase.c')
-rw-r--r--libfreetype/otlbase.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/libfreetype/otlbase.c b/libfreetype/otlbase.c
new file mode 100644
index 00000000..614e13c1
--- /dev/null
+++ b/libfreetype/otlbase.c
@@ -0,0 +1,181 @@
+#include "otlbase.h"
+#include "otlcommn.h"
+
+ static void
+ otl_base_coord_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_UInt format;
+
+ OTL_CHECK( 4 );
+
+ format = OTL_NEXT_USHORT( p );
+ p += 2;
+
+ switch ( format )
+ {
+ case 1:
+ break;
+
+ case 2:
+ OTL_CHECK( 4 );
+ break;
+
+ case 3:
+ OTL_CHECK( 2 );
+ otl_device_table_validate( table + OTL_PEEK_USHORT( p ) );
+ break;
+
+ default:
+ OTL_INVALID_DATA;
+ }
+ }
+
+
+ static void
+ otl_base_tag_list_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_UInt count;
+
+ OTL_CHECK(2);
+
+ count = OTL_NEXT_USHORT( p );
+ OTL_CHECK( count*4 );
+ }
+
+
+
+ static void
+ otl_base_values_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_UInt count;
+
+ OTL_CHECK( 4 );
+
+ p += 2; /* skip default index */
+ count = OTL_NEXT_USHORT( p );
+
+ OTL_CHECK( count*2 );
+
+ for ( ; count > 0; count-- )
+ otl_base_coord_validate( table + OTL_NEXT_USHORT( p ), valid );
+ }
+
+
+ static void
+ otl_base_minmax_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_UInt min_coord, max_coord, count;
+
+ OTL_CHECK(6);
+ min_coord = OTL_NEXT_USHORT( p );
+ max_coord = OTL_NEXT_USHORT( p );
+ count = OTL_NEXT_USHORT( p );
+
+ if ( min_coord )
+ otl_base_coord_validate( table + min_coord, valid );
+
+ if ( max_coord )
+ otl_base_coord_validate( table + max_coord, valid );
+
+ OTL_CHECK( count*8 );
+ for ( ; count > 0; count-- )
+ {
+ p += 4; /* ignore tag */
+ min_coord = OTL_NEXT_USHORT( p );
+ max_coord = OTL_NEXT_USHORT( p );
+
+ if ( min_coord )
+ otl_base_coord_validate( table + min_coord, valid );
+
+ if ( max_coord )
+ otl_base_coord_validate( table + max_coord, valid );
+ }
+ }
+
+
+ static void
+ otl_base_script_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_UInt values, default_minmax;
+
+ OTL_CHECK(6);
+
+ values = OTL_NEXT_USHORT( p );
+ default_minmax = OTL_NEXT_USHORT( p );
+ count = OTL_NEXT_USHORT( p );
+
+ if ( values )
+ otl_base_values_validate( table + values, valid );
+
+ if ( default_minmax )
+ otl_base_minmax_validate( table + default_minmax, valid );
+
+ OTL_CHECK( count*6 );
+ for ( ; count > 0; count-- )
+ {
+ p += 4; /* ignore tag */
+ otl_base_minmax_validate( table + OTL_NEXT_USHORT( p ), valid );
+ }
+ }
+
+
+ static void
+ otl_base_script_list_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_UInt count;
+
+ OTL_CHECK(2);
+
+ count = OTL_NEXT_USHORT( p );
+ OTL_CHECK(count*6);
+
+ for ( ; count > 0; count-- )
+ {
+ p += 4; /* ignore script tag */
+ otl_base_script_validate( table + OTL_NEXT_USHORT( p ) );
+ }
+ }
+
+ static void
+ otl_axis_table_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_UInt tags;
+
+ OTL_CHECK(4);
+
+ tags = OTL_NEXT_USHORT( p );
+ if ( tags )
+ otl_base_tag_list_validate ( table + tags );
+
+ otl_base_script_list_validate( table + OTL_NEXT_USHORT( p ) );
+ }
+
+
+ OTL_LOCALDEF( void )
+ otl_base_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+
+ OTL_CHECK(6);
+
+ if ( OTL_NEXT_ULONG( p ) != 0x10000UL )
+ OTL_INVALID_DATA;
+
+ otl_axis_table_validate( table + OTL_NEXT_USHORT( p ) );
+ otl_axis_table_validate( table + OTL_NEXT_USHORT( p ) );
+ } \ No newline at end of file