Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /*  gxvopbd.c                                                              */
  4. /*                                                                         */
  5. /*    TrueTypeGX/AAT opbd table validation (body).                         */
  6. /*                                                                         */
  7. /*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
  8. /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
  9. /*                                                                         */
  10. /*  This file is part of the FreeType project, and may only be used,       */
  11. /*  modified, and distributed under the terms of the FreeType project      */
  12. /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
  13. /*  this file you indicate that you have read the license and              */
  14. /*  understand and accept it fully.                                        */
  15. /*                                                                         */
  16. /***************************************************************************/
  17.  
  18. /***************************************************************************/
  19. /*                                                                         */
  20. /* gxvalid is derived from both gxlayout module and otvalid module.        */
  21. /* Development of gxlayout is supported by the Information-technology      */
  22. /* Promotion Agency(IPA), Japan.                                           */
  23. /*                                                                         */
  24. /***************************************************************************/
  25.  
  26.  
  27. #include "gxvalid.h"
  28. #include "gxvcommn.h"
  29.  
  30.  
  31.   /*************************************************************************/
  32.   /*                                                                       */
  33.   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
  34.   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
  35.   /* messages during execution.                                            */
  36.   /*                                                                       */
  37. #undef  FT_COMPONENT
  38. #define FT_COMPONENT  trace_gxvopbd
  39.  
  40.  
  41.   /*************************************************************************/
  42.   /*************************************************************************/
  43.   /*****                                                               *****/
  44.   /*****                      Data and Types                           *****/
  45.   /*****                                                               *****/
  46.   /*************************************************************************/
  47.   /*************************************************************************/
  48.  
  49.   typedef struct  GXV_opbd_DataRec_
  50.   {
  51.     FT_UShort  format;
  52.     FT_UShort  valueOffset_min;
  53.  
  54.   } GXV_opbd_DataRec, *GXV_opbd_Data;
  55.  
  56.  
  57. #define GXV_OPBD_DATA( FIELD )  GXV_TABLE_DATA( opbd, FIELD )
  58.  
  59.  
  60.   /*************************************************************************/
  61.   /*************************************************************************/
  62.   /*****                                                               *****/
  63.   /*****                      UTILITY FUNCTIONS                        *****/
  64.   /*****                                                               *****/
  65.   /*************************************************************************/
  66.   /*************************************************************************/
  67.  
  68.   static void
  69.   gxv_opbd_LookupValue_validate( FT_UShort            glyph,
  70.                                  GXV_LookupValueCPtr  value_p,
  71.                                  GXV_Validator        valid )
  72.   {
  73.     /* offset in LookupTable is measured from the head of opbd table */
  74.     FT_Bytes   p     = valid->root->base + value_p->u;
  75.     FT_Bytes   limit = valid->root->limit;
  76.     FT_Short   delta_value;
  77.     int        i;
  78.  
  79.  
  80.     if ( value_p->u < GXV_OPBD_DATA( valueOffset_min ) )
  81.       GXV_OPBD_DATA( valueOffset_min ) = value_p->u;
  82.  
  83.     for ( i = 0; i < 4; i++ )
  84.     {
  85.       GXV_LIMIT_CHECK( 2 );
  86.       delta_value = FT_NEXT_SHORT( p );
  87.  
  88.       if ( GXV_OPBD_DATA( format ) )    /* format 1, value is ctrl pt. */
  89.       {
  90.         if ( delta_value == -1 )
  91.           continue;
  92.  
  93.         gxv_ctlPoint_validate( glyph, delta_value, valid );
  94.       }
  95.       else                              /* format 0, value is distance */
  96.         continue;
  97.     }
  98.   }
  99.  
  100.  
  101.   /*
  102.     opbd ---------------------+
  103.                               |
  104.     +===============+         |
  105.     | lookup header |         |
  106.     +===============+         |
  107.     | BinSrchHeader |         |
  108.     +===============+         |
  109.     | lastGlyph[0]  |         |
  110.     +---------------+         |
  111.     | firstGlyph[0] |         |  head of opbd sfnt table
  112.     +---------------+         |             +
  113.     | offset[0]     |    ->   |          offset            [byte]
  114.     +===============+         |             +
  115.     | lastGlyph[1]  |         | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte]
  116.     +---------------+         |
  117.     | firstGlyph[1] |         |
  118.     +---------------+         |
  119.     | offset[1]     |         |
  120.     +===============+         |
  121.                               |
  122.      ....                     |
  123.                               |
  124.     48bit value array         |
  125.     +===============+         |
  126.     |     value     | <-------+
  127.     |               |
  128.     |               |
  129.     |               |
  130.     +---------------+
  131.     .... */
  132.  
  133.   static GXV_LookupValueDesc
  134.   gxv_opbd_LookupFmt4_transit( FT_UShort            relative_gindex,
  135.                                GXV_LookupValueCPtr  base_value_p,
  136.                                FT_Bytes             lookuptbl_limit,
  137.                                GXV_Validator        valid )
  138.   {
  139.     GXV_LookupValueDesc  value;
  140.  
  141.     FT_UNUSED( lookuptbl_limit );
  142.     FT_UNUSED( valid );
  143.  
  144.     /* XXX: check range? */
  145.     value.u = (FT_UShort)( base_value_p->u +
  146.                            relative_gindex * 4 * sizeof ( FT_Short ) );
  147.  
  148.     return value;
  149.   }
  150.  
  151.  
  152.   /*************************************************************************/
  153.   /*************************************************************************/
  154.   /*****                                                               *****/
  155.   /*****                         opbd TABLE                            *****/
  156.   /*****                                                               *****/
  157.   /*************************************************************************/
  158.   /*************************************************************************/
  159.  
  160.   FT_LOCAL_DEF( void )
  161.   gxv_opbd_validate( FT_Bytes      table,
  162.                      FT_Face       face,
  163.                      FT_Validator  ftvalid )
  164.   {
  165.     GXV_ValidatorRec  validrec;
  166.     GXV_Validator     valid = &validrec;
  167.     GXV_opbd_DataRec  opbdrec;
  168.     GXV_opbd_Data     opbd  = &opbdrec;
  169.     FT_Bytes          p     = table;
  170.     FT_Bytes          limit = 0;
  171.  
  172.     FT_ULong  version;
  173.  
  174.  
  175.     valid->root       = ftvalid;
  176.     valid->table_data = opbd;
  177.     valid->face       = face;
  178.  
  179.     FT_TRACE3(( "validating `opbd' table\n" ));
  180.     GXV_INIT;
  181.     GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU;
  182.  
  183.  
  184.     GXV_LIMIT_CHECK( 4 + 2 );
  185.     version                 = FT_NEXT_ULONG( p );
  186.     GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p );
  187.  
  188.  
  189.     /* only 0x00010000 is defined (1996) */
  190.     GXV_TRACE(( "(version=0x%08x)\n", version ));
  191.     if ( 0x00010000UL != version )
  192.       FT_INVALID_FORMAT;
  193.  
  194.     /* only values 0 and 1 are defined (1996) */
  195.     GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) ));
  196.     if ( 0x0001 < GXV_OPBD_DATA( format ) )
  197.       FT_INVALID_FORMAT;
  198.  
  199.     valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
  200.     valid->lookupval_func   = gxv_opbd_LookupValue_validate;
  201.     valid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit;
  202.  
  203.     gxv_LookupTable_validate( p, limit, valid );
  204.     p += valid->subtable_length;
  205.  
  206.     if ( p > table + GXV_OPBD_DATA( valueOffset_min ) )
  207.     {
  208.       GXV_TRACE((
  209.         "found overlap between LookupTable and opbd_value array\n" ));
  210.       FT_INVALID_OFFSET;
  211.     }
  212.  
  213.     FT_TRACE4(( "\n" ));
  214.   }
  215.  
  216.  
  217. /* END */
  218.