aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/extras/freetype2/src/otlayout/otlgdef.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/extras/freetype2/src/otlayout/otlgdef.c')
-rw-r--r--nx-X11/extras/freetype2/src/otlayout/otlgdef.c175
1 files changed, 175 insertions, 0 deletions
diff --git a/nx-X11/extras/freetype2/src/otlayout/otlgdef.c b/nx-X11/extras/freetype2/src/otlayout/otlgdef.c
new file mode 100644
index 000000000..ff1c2a1e8
--- /dev/null
+++ b/nx-X11/extras/freetype2/src/otlayout/otlgdef.c
@@ -0,0 +1,175 @@
+#include "otlgdef.h"
+#include "otlcommn.h"
+
+ /************************************************************************/
+ /************************************************************************/
+ /***** *****/
+ /***** ATTACHMENTS LIST *****/
+ /***** *****/
+ /************************************************************************/
+ /************************************************************************/
+
+ static void
+ otl_attach_point_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_UInt count;
+
+ if ( p + 2 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+
+ count = OTL_NEXT_USHORT( p );
+ if ( table + count*2 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+ }
+
+
+ static void
+ otl_attach_list_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_Bytes coverage;
+ OTL_UInt count;
+
+ if ( p + 4 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+
+ coverage = table + OTL_NEXT_USHORT( p );
+ count = OTL_NEXT_USHORT( p );
+
+ otl_coverage_validate( coverage, valid );
+ if ( count != otl_coverage_get_count( coverage ) )
+ OTL_INVALID_DATA;
+
+ if ( p + count*2 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+
+ for ( ; count > 0; count-- )
+ otl_attach_point_validate( table + OTL_NEXT_USHORT( p ) );
+ }
+
+
+ /************************************************************************/
+ /************************************************************************/
+ /***** *****/
+ /***** LIGATURE CARETS *****/
+ /***** *****/
+ /************************************************************************/
+ /************************************************************************/
+
+ static void
+ otl_caret_value_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+
+ if ( p + 4 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+
+ format = OTL_NEXT_USHORT( p );
+ switch ( format )
+ {
+ case 1:
+ case 2:
+ break;
+
+ case 3:
+ {
+ OTL_Bytes device;
+
+ p += 2;
+ if ( p + 2 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+
+ otl_device_table_validate( table + OTL_PEEK_USHORT( p ) );
+ }
+ break;
+
+ default:
+ OTL_INVALID_DATA;
+ }
+ }
+
+
+ static void
+ otl_ligature_glyph_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_UInt count;
+
+ if ( p + 2 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+
+ count = OTL_NEXT_USHORT( p );
+
+ if ( p + count*2 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+
+ for ( ; count > 0; count-- )
+ otl_caret_value_validate( table + OTL_NEXT_USHORT( p ) );
+ }
+
+
+ static void
+ otl_ligature_caret_list_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+ OTL_Bytes coverage;
+ OTL_UInt count;
+
+ if ( p + 4 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+
+ coverage = table + OTL_NEXT_USHORT( p );
+ count = OTL_NEXT_USHORT( p );
+
+ otl_coverage_validate( coverage, valid );
+ if ( count != otl_coverage_get_count( coverage ) )
+ OTL_INVALID_DATA;
+
+ if ( p + count*2 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+
+ for ( ; count > 0; count-- )
+ otl_ligature_glyph_validate( table + OTL_NEXT_USHORT( p ) );
+ }
+
+
+ /************************************************************************/
+ /************************************************************************/
+ /***** *****/
+ /***** GDEF TABLE *****/
+ /***** *****/
+ /************************************************************************/
+ /************************************************************************/
+
+ OTL_APIDEF( void )
+ otl_gdef_validate( OTL_Bytes table,
+ OTL_Validator valid )
+ {
+ OTL_Bytes p = table;
+
+ if ( p + 12 > valid->limit )
+ OTL_INVALID_TOO_SHORT;
+
+ /* check format */
+ if ( OTL_NEXT_ULONG( p ) != 0x00010000UL )
+ OTL_INVALID_FORMAT;
+
+ /* validate class definition table */
+ otl_class_definition_validate( table + OTL_NEXT_USHORT( p ) );
+
+ /* validate attachment point list */
+ otl_attach_list_validate( table + OTL_NEXT_USHORT( p ) );
+
+ /* validate ligature caret list */
+ otl_ligature_caret_list_validate( table + OTL_NEXT_USHORT( p ) );
+
+ /* validate mark attach class */
+ otl_class_definition_validate( table + OTL_NEXT_USHORT( p ) );
+ }
+