diff options
Diffstat (limited to 'nx-X11/extras/freetype2/src/otlayout/otlbase.c')
-rw-r--r-- | nx-X11/extras/freetype2/src/otlayout/otlbase.c | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/nx-X11/extras/freetype2/src/otlayout/otlbase.c b/nx-X11/extras/freetype2/src/otlayout/otlbase.c new file mode 100644 index 000000000..614e13c1a --- /dev/null +++ b/nx-X11/extras/freetype2/src/otlayout/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 |