- Remove svn:needs-lock, svn:eol-type, and svn:eol-tyle properties.
[reactos.git] / reactos / lib / 3rdparty / freetype / src / gxvalid / gxvopbd.c
index 802a1e5..8d6fe66 100644 (file)
-/***************************************************************************/\r
-/*                                                                         */\r
-/*  gxvopbd.c                                                              */\r
-/*                                                                         */\r
-/*    TrueTypeGX/AAT opbd 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_gxvopbd\r
-\r
-\r
-  /*************************************************************************/\r
-  /*************************************************************************/\r
-  /*****                                                               *****/\r
-  /*****                      Data and Types                           *****/\r
-  /*****                                                               *****/\r
-  /*************************************************************************/\r
-  /*************************************************************************/\r
-\r
-  typedef struct  GXV_opbd_DataRec_\r
-  {\r
-    FT_UShort  format;\r
-    FT_UShort  valueOffset_min;\r
-\r
-  } GXV_opbd_DataRec, *GXV_opbd_Data;\r
-\r
-\r
-#define GXV_OPBD_DATA( FIELD )  GXV_TABLE_DATA( opbd, FIELD )\r
-\r
-\r
-  /*************************************************************************/\r
-  /*************************************************************************/\r
-  /*****                                                               *****/\r
-  /*****                      UTILITY FUNCTIONS                        *****/\r
-  /*****                                                               *****/\r
-  /*************************************************************************/\r
-  /*************************************************************************/\r
-\r
-  static void\r
-  gxv_opbd_LookupValue_validate( FT_UShort            glyph,\r
-                                 GXV_LookupValueDesc  value,\r
-                                 GXV_Validator        valid )\r
-  {\r
-    /* offset in LookupTable is measured from the head of opbd table */\r
-    FT_Bytes   p     = valid->root->base + value.u;\r
-    FT_Bytes   limit = valid->root->limit;\r
-    FT_Short   delta_value;\r
-    int        i;\r
-\r
-\r
-    if ( value.u < GXV_OPBD_DATA( valueOffset_min ) )\r
-      GXV_OPBD_DATA( valueOffset_min ) = value.u;\r
-\r
-    for ( i = 0; i < 4; i++ )\r
-    {\r
-      GXV_LIMIT_CHECK( 2 );\r
-      delta_value = FT_NEXT_SHORT( p );\r
-\r
-      if ( GXV_OPBD_DATA( format ) )    /* format 1, value is ctrl pt. */\r
-      {\r
-        if ( delta_value == -1 )\r
-          continue;\r
-\r
-        gxv_ctlPoint_validate( glyph, delta_value, valid );\r
-      }\r
-      else                              /* format 0, value is distance */\r
-        continue;\r
-    }\r
-  }\r
-\r
-\r
-  /*\r
-    opbd ---------------------+\r
-                              |\r
-    +===============+         |\r
-    | lookup header |         |\r
-    +===============+         |\r
-    | BinSrchHeader |         |\r
-    +===============+         |\r
-    | lastGlyph[0]  |         |\r
-    +---------------+         |\r
-    | firstGlyph[0] |         |  head of opbd sfnt table\r
-    +---------------+         |             +\r
-    | offset[0]     |    ->   |          offset            [byte]\r
-    +===============+         |             +\r
-    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte]\r
-    +---------------+         |\r
-    | firstGlyph[1] |         |\r
-    +---------------+         |\r
-    | offset[1]     |         |\r
-    +===============+         |\r
-                              |\r
-     ....                     |\r
-                              |\r
-    48bit value array         |\r
-    +===============+         |\r
-    |     value     | <-------+\r
-    |               |\r
-    |               |\r
-    |               |\r
-    +---------------+\r
-    .... */\r
-\r
-  static GXV_LookupValueDesc\r
-  gxv_opbd_LookupFmt4_transit( FT_UShort            relative_gindex,\r
-                               GXV_LookupValueDesc  base_value,\r
-                               FT_Bytes             lookuptbl_limit,\r
-                               GXV_Validator        valid )\r
-  {\r
-    GXV_LookupValueDesc  value;\r
-\r
-    FT_UNUSED( lookuptbl_limit );\r
-    FT_UNUSED( valid );\r
-\r
-    /* XXX: check range? */\r
-    value.u = (FT_UShort)( base_value.u +\r
-                           relative_gindex * 4 * sizeof ( FT_Short ) );\r
-\r
-    return value;\r
-  }\r
-\r
-\r
-  /*************************************************************************/\r
-  /*************************************************************************/\r
-  /*****                                                               *****/\r
-  /*****                         opbd TABLE                            *****/\r
-  /*****                                                               *****/\r
-  /*************************************************************************/\r
-  /*************************************************************************/\r
-\r
-  FT_LOCAL_DEF( void )\r
-  gxv_opbd_validate( FT_Bytes      table,\r
-                     FT_Face       face,\r
-                     FT_Validator  ftvalid )\r
-  {\r
-    GXV_ValidatorRec  validrec;\r
-    GXV_Validator     valid = &validrec;\r
-    GXV_opbd_DataRec  opbdrec;\r
-    GXV_opbd_Data     opbd  = &opbdrec;\r
-    FT_Bytes          p     = table;\r
-    FT_Bytes          limit = 0;\r
-\r
-    FT_ULong  version;\r
-\r
-\r
-    valid->root       = ftvalid;\r
-    valid->table_data = opbd;\r
-    valid->face       = face;\r
-\r
-    FT_TRACE3(( "validating `opbd' table\n" ));\r
-    GXV_INIT;\r
-    GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU;\r
-\r
-\r
-    GXV_LIMIT_CHECK( 4 + 2 );\r
-    version                 = FT_NEXT_ULONG( p );\r
-    GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p );\r
-\r
-\r
-    /* only 0x00010000 is defined (1996) */\r
-    GXV_TRACE(( "(version=0x%08x)\n", version ));\r
-    if ( 0x00010000UL != version )\r
-      FT_INVALID_FORMAT;\r
-\r
-    /* only values 0 and 1 are defined (1996) */\r
-    GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) ));\r
-    if ( 0x0001 < GXV_OPBD_DATA( format ) )\r
-      FT_INVALID_FORMAT;\r
-\r
-    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;\r
-    valid->lookupval_func   = gxv_opbd_LookupValue_validate;\r
-    valid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit;\r
-\r
-    gxv_LookupTable_validate( p, limit, valid );\r
-    p += valid->subtable_length;\r
-\r
-    if ( p > table + GXV_OPBD_DATA( valueOffset_min ) )\r
-    {\r
-      GXV_TRACE((\r
-        "found overlap between LookupTable and opbd_value array\n" ));\r
-      FT_INVALID_OFFSET;\r
-    }\r
-\r
-    FT_TRACE4(( "\n" ));\r
-  }\r
-\r
-\r
-/* END */\r
+/***************************************************************************/
+/*                                                                         */
+/*  gxvopbd.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT opbd 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_gxvopbd
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      Data and Types                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  GXV_opbd_DataRec_
+  {
+    FT_UShort  format;
+    FT_UShort  valueOffset_min;
+
+  } GXV_opbd_DataRec, *GXV_opbd_Data;
+
+
+#define GXV_OPBD_DATA( FIELD )  GXV_TABLE_DATA( opbd, FIELD )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  gxv_opbd_LookupValue_validate( FT_UShort            glyph,
+                                 GXV_LookupValueDesc  value,
+                                 GXV_Validator        valid )
+  {
+    /* offset in LookupTable is measured from the head of opbd table */
+    FT_Bytes   p     = valid->root->base + value.u;
+    FT_Bytes   limit = valid->root->limit;
+    FT_Short   delta_value;
+    int        i;
+
+
+    if ( value.u < GXV_OPBD_DATA( valueOffset_min ) )
+      GXV_OPBD_DATA( valueOffset_min ) = value.u;
+
+    for ( i = 0; i < 4; i++ )
+    {
+      GXV_LIMIT_CHECK( 2 );
+      delta_value = FT_NEXT_SHORT( p );
+
+      if ( GXV_OPBD_DATA( format ) )    /* format 1, value is ctrl pt. */
+      {
+        if ( delta_value == -1 )
+          continue;
+
+        gxv_ctlPoint_validate( glyph, delta_value, valid );
+      }
+      else                              /* format 0, value is distance */
+        continue;
+    }
+  }
+
+
+  /*
+    opbd ---------------------+
+                              |
+    +===============+         |
+    | lookup header |         |
+    +===============+         |
+    | BinSrchHeader |         |
+    +===============+         |
+    | lastGlyph[0]  |         |
+    +---------------+         |
+    | firstGlyph[0] |         |  head of opbd sfnt table
+    +---------------+         |             +
+    | offset[0]     |    ->   |          offset            [byte]
+    +===============+         |             +
+    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte]
+    +---------------+         |
+    | firstGlyph[1] |         |
+    +---------------+         |
+    | offset[1]     |         |
+    +===============+         |
+                              |
+     ....                     |
+                              |
+    48bit value array         |
+    +===============+         |
+    |     value     | <-------+
+    |               |
+    |               |
+    |               |
+    +---------------+
+    .... */
+
+  static GXV_LookupValueDesc
+  gxv_opbd_LookupFmt4_transit( FT_UShort            relative_gindex,
+                               GXV_LookupValueDesc  base_value,
+                               FT_Bytes             lookuptbl_limit,
+                               GXV_Validator        valid )
+  {
+    GXV_LookupValueDesc  value;
+
+    FT_UNUSED( lookuptbl_limit );
+    FT_UNUSED( valid );
+
+    /* XXX: check range? */
+    value.u = (FT_UShort)( base_value.u +
+                           relative_gindex * 4 * sizeof ( FT_Short ) );
+
+    return value;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         opbd TABLE                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  gxv_opbd_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    GXV_ValidatorRec  validrec;
+    GXV_Validator     valid = &validrec;
+    GXV_opbd_DataRec  opbdrec;
+    GXV_opbd_Data     opbd  = &opbdrec;
+    FT_Bytes          p     = table;
+    FT_Bytes          limit = 0;
+
+    FT_ULong  version;
+
+
+    valid->root       = ftvalid;
+    valid->table_data = opbd;
+    valid->face       = face;
+
+    FT_TRACE3(( "validating `opbd' table\n" ));
+    GXV_INIT;
+    GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU;
+
+
+    GXV_LIMIT_CHECK( 4 + 2 );
+    version                 = FT_NEXT_ULONG( p );
+    GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p );
+
+
+    /* only 0x00010000 is defined (1996) */
+    GXV_TRACE(( "(version=0x%08x)\n", version ));
+    if ( 0x00010000UL != version )
+      FT_INVALID_FORMAT;
+
+    /* only values 0 and 1 are defined (1996) */
+    GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) ));
+    if ( 0x0001 < GXV_OPBD_DATA( format ) )
+      FT_INVALID_FORMAT;
+
+    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
+    valid->lookupval_func   = gxv_opbd_LookupValue_validate;
+    valid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit;
+
+    gxv_LookupTable_validate( p, limit, valid );
+    p += valid->subtable_length;
+
+    if ( p > table + GXV_OPBD_DATA( valueOffset_min ) )
+    {
+      GXV_TRACE((
+        "found overlap between LookupTable and opbd_value array\n" ));
+      FT_INVALID_OFFSET;
+    }
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */