-/***************************************************************************/
-/* */
-/* gxvlcar.c */
-/* */
-/* TrueTypeGX/AAT lcar table validation (body). */
-/* */
-/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
-/* David Turner, Robert Wilhelm, and Werner Lemberg. */
-/* */
-/* This file is part of the FreeType project, and may only be used, */
-/* modified, and distributed under the terms of the FreeType project */
-/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
-/* this file you indicate that you have read the license and */
-/* understand and accept it fully. */
-/* */
-/***************************************************************************/
-
-/***************************************************************************/
-/* */
-/* gxvalid is derived from both gxlayout module and otvalid module. */
-/* Development of gxlayout is supported by the Information-technology */
-/* Promotion Agency(IPA), Japan. */
-/* */
-/***************************************************************************/
-
-
-#include "gxvalid.h"
-#include "gxvcommn.h"
-
-
- /*************************************************************************/
- /* */
- /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
- /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
- /* messages during execution. */
- /* */
-#undef FT_COMPONENT
-#define FT_COMPONENT trace_gxvlcar
-
-
- /*************************************************************************/
- /*************************************************************************/
- /***** *****/
- /***** Data and Types *****/
- /***** *****/
- /*************************************************************************/
- /*************************************************************************/
-
- typedef struct GXV_lcar_DataRec_
- {
- FT_UShort format;
-
- } GXV_lcar_DataRec, *GXV_lcar_Data;
-
-
-#define GXV_LCAR_DATA( FIELD ) GXV_TABLE_DATA( lcar, FIELD )
-
-
- /*************************************************************************/
- /*************************************************************************/
- /***** *****/
- /***** UTILITY FUNCTIONS *****/
- /***** *****/
- /*************************************************************************/
- /*************************************************************************/
-
- static void
- gxv_lcar_partial_validate( FT_UShort partial,
- FT_UShort glyph,
- GXV_Validator valid )
- {
- GXV_NAME_ENTER( "partial" );
-
- if ( GXV_LCAR_DATA( format ) != 1 )
- goto Exit;
-
- gxv_ctlPoint_validate( glyph, partial, valid );
-
- Exit:
- GXV_EXIT;
- }
-
-
- static void
- gxv_lcar_LookupValue_validate( FT_UShort glyph,
- GXV_LookupValueDesc value,
- GXV_Validator valid )
- {
- FT_Bytes p = valid->root->base + value.u;
- FT_Bytes limit = valid->root->limit;
- FT_UShort count;
- FT_Short partial;
- FT_UShort i;
-
-
- GXV_NAME_ENTER( "element in lookupTable" );
-
- GXV_LIMIT_CHECK( 2 );
- count = FT_NEXT_USHORT( p );
-
- GXV_LIMIT_CHECK( 2 * count );
- for ( i = 0; i < count; i++ )
- {
- partial = FT_NEXT_SHORT( p );
- gxv_lcar_partial_validate( partial, glyph, valid );
- }
-
- GXV_EXIT;
- }
-
-
- /*
- +------ lcar --------------------+
- | |
- | +===============+ |
- | | looup header | |
- | +===============+ |
- | | BinSrchHeader | |
- | +===============+ |
- | | lastGlyph[0] | |
- | +---------------+ |
- | | firstGlyph[0] | | head of lcar sfnt table
- | +---------------+ | +
- | | offset[0] | -> | offset [byte]
- | +===============+ | +
- | | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte]
- | +---------------+ |
- | | firstGlyph[1] | |
- | +---------------+ |
- | | offset[1] | |
- | +===============+ |
- | |
- | .... |
- | |
- | 16bit value array |
- | +===============+ |
- +------| value | <-------+
- | ....
- |
- |
- |
- |
- |
- +----> lcar values...handled by lcar callback function
- */
-
- static GXV_LookupValueDesc
- gxv_lcar_LookupFmt4_transit( FT_UShort relative_gindex,
- GXV_LookupValueDesc base_value,
- FT_Bytes lookuptbl_limit,
- GXV_Validator valid )
- {
- FT_Bytes p;
- FT_Bytes limit;
- FT_UShort offset;
- GXV_LookupValueDesc value;
-
- FT_UNUSED( lookuptbl_limit );
-
- /* XXX: check range? */
- offset = (FT_UShort)( base_value.u +
- relative_gindex * sizeof ( FT_UShort ) );
- p = valid->root->base + offset;
- limit = valid->root->limit;
-
- GXV_LIMIT_CHECK ( 2 );
- value.u = FT_NEXT_USHORT( p );
-
- return value;
- }
-
-
- /*************************************************************************/
- /*************************************************************************/
- /***** *****/
- /***** lcar TABLE *****/
- /***** *****/
- /*************************************************************************/
- /*************************************************************************/
-
- FT_LOCAL_DEF( void )
- gxv_lcar_validate( FT_Bytes table,
- FT_Face face,
- FT_Validator ftvalid )
- {
- FT_Bytes p = table;
- FT_Bytes limit = 0;
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
-
- GXV_lcar_DataRec lcarrec;
- GXV_lcar_Data lcar = &lcarrec;
-
- FT_Fixed version;
-
-
- valid->root = ftvalid;
- valid->table_data = lcar;
- valid->face = face;
-
- FT_TRACE3(( "validating `lcar' table\n" ));
- GXV_INIT;
-
- GXV_LIMIT_CHECK( 4 + 2 );
- version = FT_NEXT_ULONG( p );
- GXV_LCAR_DATA( format ) = FT_NEXT_USHORT( p );
-
- if ( version != 0x00010000UL)
- FT_INVALID_FORMAT;
-
- if ( GXV_LCAR_DATA( format ) > 1 )
- FT_INVALID_FORMAT;
-
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_lcar_LookupValue_validate;
- valid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit;
- gxv_LookupTable_validate( p, limit, valid );
-
- FT_TRACE4(( "\n" ));
- }
-
-
-/* END */
+/***************************************************************************/\r
+/* */\r
+/* gxvlcar.c */\r
+/* */\r
+/* TrueTypeGX/AAT lcar table validation (body). */\r
+/* */\r
+/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */\r
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */\r
+/* */\r
+/* This file is part of the FreeType project, and may only be used, */\r
+/* modified, and distributed under the terms of the FreeType project */\r
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */\r
+/* this file you indicate that you have read the license and */\r
+/* understand and accept it fully. */\r
+/* */\r
+/***************************************************************************/\r
+\r
+/***************************************************************************/\r
+/* */\r
+/* gxvalid is derived from both gxlayout module and otvalid module. */\r
+/* Development of gxlayout is supported by the Information-technology */\r
+/* Promotion Agency(IPA), Japan. */\r
+/* */\r
+/***************************************************************************/\r
+\r
+\r
+#include "gxvalid.h"\r
+#include "gxvcommn.h"\r
+\r
+\r
+ /*************************************************************************/\r
+ /* */\r
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */\r
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */\r
+ /* messages during execution. */\r
+ /* */\r
+#undef FT_COMPONENT\r
+#define FT_COMPONENT trace_gxvlcar\r
+\r
+\r
+ /*************************************************************************/\r
+ /*************************************************************************/\r
+ /***** *****/\r
+ /***** Data and Types *****/\r
+ /***** *****/\r
+ /*************************************************************************/\r
+ /*************************************************************************/\r
+\r
+ typedef struct GXV_lcar_DataRec_\r
+ {\r
+ FT_UShort format;\r
+\r
+ } GXV_lcar_DataRec, *GXV_lcar_Data;\r
+\r
+\r
+#define GXV_LCAR_DATA( FIELD ) GXV_TABLE_DATA( lcar, FIELD )\r
+\r
+\r
+ /*************************************************************************/\r
+ /*************************************************************************/\r
+ /***** *****/\r
+ /***** UTILITY FUNCTIONS *****/\r
+ /***** *****/\r
+ /*************************************************************************/\r
+ /*************************************************************************/\r
+\r
+ static void\r
+ gxv_lcar_partial_validate( FT_UShort partial,\r
+ FT_UShort glyph,\r
+ GXV_Validator valid )\r
+ {\r
+ GXV_NAME_ENTER( "partial" );\r
+\r
+ if ( GXV_LCAR_DATA( format ) != 1 )\r
+ goto Exit;\r
+\r
+ gxv_ctlPoint_validate( glyph, partial, valid );\r
+\r
+ Exit:\r
+ GXV_EXIT;\r
+ }\r
+\r
+\r
+ static void\r
+ gxv_lcar_LookupValue_validate( FT_UShort glyph,\r
+ GXV_LookupValueDesc value,\r
+ GXV_Validator valid )\r
+ {\r
+ FT_Bytes p = valid->root->base + value.u;\r
+ FT_Bytes limit = valid->root->limit;\r
+ FT_UShort count;\r
+ FT_Short partial;\r
+ FT_UShort i;\r
+\r
+\r
+ GXV_NAME_ENTER( "element in lookupTable" );\r
+\r
+ GXV_LIMIT_CHECK( 2 );\r
+ count = FT_NEXT_USHORT( p );\r
+\r
+ GXV_LIMIT_CHECK( 2 * count );\r
+ for ( i = 0; i < count; i++ )\r
+ {\r
+ partial = FT_NEXT_SHORT( p );\r
+ gxv_lcar_partial_validate( partial, glyph, valid );\r
+ }\r
+\r
+ GXV_EXIT;\r
+ }\r
+\r
+\r
+ /*\r
+ +------ lcar --------------------+\r
+ | |\r
+ | +===============+ |\r
+ | | looup header | |\r
+ | +===============+ |\r
+ | | BinSrchHeader | |\r
+ | +===============+ |\r
+ | | lastGlyph[0] | |\r
+ | +---------------+ |\r
+ | | firstGlyph[0] | | head of lcar sfnt table\r
+ | +---------------+ | +\r
+ | | offset[0] | -> | offset [byte]\r
+ | +===============+ | +\r
+ | | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte]\r
+ | +---------------+ |\r
+ | | firstGlyph[1] | |\r
+ | +---------------+ |\r
+ | | offset[1] | |\r
+ | +===============+ |\r
+ | |\r
+ | .... |\r
+ | |\r
+ | 16bit value array |\r
+ | +===============+ |\r
+ +------| value | <-------+\r
+ | ....\r
+ |\r
+ |\r
+ |\r
+ |\r
+ |\r
+ +----> lcar values...handled by lcar callback function\r
+ */\r
+\r
+ static GXV_LookupValueDesc\r
+ gxv_lcar_LookupFmt4_transit( FT_UShort relative_gindex,\r
+ GXV_LookupValueDesc base_value,\r
+ FT_Bytes lookuptbl_limit,\r
+ GXV_Validator valid )\r
+ {\r
+ FT_Bytes p;\r
+ FT_Bytes limit;\r
+ FT_UShort offset;\r
+ GXV_LookupValueDesc value;\r
+\r
+ FT_UNUSED( lookuptbl_limit );\r
+\r
+ /* XXX: check range? */\r
+ offset = (FT_UShort)( base_value.u +\r
+ relative_gindex * sizeof ( FT_UShort ) );\r
+ p = valid->root->base + offset;\r
+ limit = valid->root->limit;\r
+\r
+ GXV_LIMIT_CHECK ( 2 );\r
+ value.u = FT_NEXT_USHORT( p );\r
+\r
+ return value;\r
+ }\r
+\r
+\r
+ /*************************************************************************/\r
+ /*************************************************************************/\r
+ /***** *****/\r
+ /***** lcar TABLE *****/\r
+ /***** *****/\r
+ /*************************************************************************/\r
+ /*************************************************************************/\r
+\r
+ FT_LOCAL_DEF( void )\r
+ gxv_lcar_validate( FT_Bytes table,\r
+ FT_Face face,\r
+ FT_Validator ftvalid )\r
+ {\r
+ FT_Bytes p = table;\r
+ FT_Bytes limit = 0;\r
+ GXV_ValidatorRec validrec;\r
+ GXV_Validator valid = &validrec;\r
+\r
+ GXV_lcar_DataRec lcarrec;\r
+ GXV_lcar_Data lcar = &lcarrec;\r
+\r
+ FT_Fixed version;\r
+\r
+\r
+ valid->root = ftvalid;\r
+ valid->table_data = lcar;\r
+ valid->face = face;\r
+\r
+ FT_TRACE3(( "validating `lcar' table\n" ));\r
+ GXV_INIT;\r
+\r
+ GXV_LIMIT_CHECK( 4 + 2 );\r
+ version = FT_NEXT_ULONG( p );\r
+ GXV_LCAR_DATA( format ) = FT_NEXT_USHORT( p );\r
+\r
+ if ( version != 0x00010000UL)\r
+ FT_INVALID_FORMAT;\r
+\r
+ if ( GXV_LCAR_DATA( format ) > 1 )\r
+ FT_INVALID_FORMAT;\r
+\r
+ valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;\r
+ valid->lookupval_func = gxv_lcar_LookupValue_validate;\r
+ valid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit;\r
+ gxv_LookupTable_validate( p, limit, valid );\r
+\r
+ FT_TRACE4(( "\n" ));\r
+ }\r
+\r
+\r
+/* END */\r