Subversion Repositories Kolibri OS

Rev

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

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /*  otvjstf.c                                                              */
  4. /*                                                                         */
  5. /*    OpenType JSTF table validation (body).                               */
  6. /*                                                                         */
  7. /*  Copyright 2004, 2007 by                                                */
  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. #include "otvalid.h"
  20. #include "otvcommn.h"
  21. #include "otvgpos.h"
  22.  
  23.  
  24.   /*************************************************************************/
  25.   /*                                                                       */
  26.   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
  27.   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
  28.   /* messages during execution.                                            */
  29.   /*                                                                       */
  30. #undef  FT_COMPONENT
  31. #define FT_COMPONENT  trace_otvjstf
  32.  
  33.  
  34. #define JstfPriorityFunc  otv_JstfPriority_validate
  35. #define JstfLookupFunc    otv_GPOS_subtable_validate
  36.  
  37.   /* uses valid->extra1 (GSUB lookup count) */
  38.   /* uses valid->extra2 (GPOS lookup count) */
  39.   /* sets valid->extra1 (counter)           */
  40.  
  41.   static void
  42.   otv_JstfPriority_validate( FT_Bytes       table,
  43.                              OTV_Validator  valid )
  44.   {
  45.     FT_Bytes  p = table;
  46.     FT_UInt   table_size;
  47.     FT_UInt   gsub_lookup_count, gpos_lookup_count;
  48.  
  49.     OTV_OPTIONAL_TABLE( ShrinkageEnableGSUB  );
  50.     OTV_OPTIONAL_TABLE( ShrinkageDisableGSUB );
  51.     OTV_OPTIONAL_TABLE( ShrinkageEnableGPOS  );
  52.     OTV_OPTIONAL_TABLE( ShrinkageDisableGPOS );
  53.     OTV_OPTIONAL_TABLE( ExtensionEnableGSUB  );
  54.     OTV_OPTIONAL_TABLE( ExtensionDisableGSUB );
  55.     OTV_OPTIONAL_TABLE( ExtensionEnableGPOS  );
  56.     OTV_OPTIONAL_TABLE( ExtensionDisableGPOS );
  57.     OTV_OPTIONAL_TABLE( ShrinkageJstfMax );
  58.     OTV_OPTIONAL_TABLE( ExtensionJstfMax );
  59.  
  60.  
  61.     OTV_ENTER;
  62.     OTV_TRACE(( "JstfPriority table\n" ));
  63.  
  64.     OTV_LIMIT_CHECK( 20 );
  65.  
  66.     gsub_lookup_count = valid->extra1;
  67.     gpos_lookup_count = valid->extra2;
  68.  
  69.     table_size = 20;
  70.  
  71.     valid->extra1 = gsub_lookup_count;
  72.  
  73.     OTV_OPTIONAL_OFFSET( ShrinkageEnableGSUB );
  74.     OTV_SIZE_CHECK( ShrinkageEnableGSUB );
  75.     if ( ShrinkageEnableGSUB )
  76.       otv_x_ux( table + ShrinkageEnableGSUB, valid );
  77.  
  78.     OTV_OPTIONAL_OFFSET( ShrinkageDisableGSUB );
  79.     OTV_SIZE_CHECK( ShrinkageDisableGSUB );
  80.     if ( ShrinkageDisableGSUB )
  81.       otv_x_ux( table + ShrinkageDisableGSUB, valid );
  82.  
  83.     valid->extra1 = gpos_lookup_count;
  84.  
  85.     OTV_OPTIONAL_OFFSET( ShrinkageEnableGPOS );
  86.     OTV_SIZE_CHECK( ShrinkageEnableGPOS );
  87.     if ( ShrinkageEnableGPOS )
  88.       otv_x_ux( table + ShrinkageEnableGPOS, valid );
  89.  
  90.     OTV_OPTIONAL_OFFSET( ShrinkageDisableGPOS );
  91.     OTV_SIZE_CHECK( ShrinkageDisableGPOS );
  92.     if ( ShrinkageDisableGPOS )
  93.       otv_x_ux( table + ShrinkageDisableGPOS, valid );
  94.  
  95.     OTV_OPTIONAL_OFFSET( ShrinkageJstfMax );
  96.     OTV_SIZE_CHECK( ShrinkageJstfMax );
  97.     if ( ShrinkageJstfMax )
  98.     {
  99.       /* XXX: check lookup types? */
  100.       OTV_NEST2( JstfMax, JstfLookup );
  101.       OTV_RUN( table + ShrinkageJstfMax, valid );
  102.     }
  103.  
  104.     valid->extra1 = gsub_lookup_count;
  105.  
  106.     OTV_OPTIONAL_OFFSET( ExtensionEnableGSUB );
  107.     OTV_SIZE_CHECK( ExtensionEnableGSUB );
  108.     if ( ExtensionEnableGSUB )
  109.       otv_x_ux( table + ExtensionEnableGSUB, valid );
  110.  
  111.     OTV_OPTIONAL_OFFSET( ExtensionDisableGSUB );
  112.     OTV_SIZE_CHECK( ExtensionDisableGSUB );
  113.     if ( ExtensionDisableGSUB )
  114.       otv_x_ux( table + ExtensionDisableGSUB, valid );
  115.  
  116.     valid->extra1 = gpos_lookup_count;
  117.  
  118.     OTV_OPTIONAL_OFFSET( ExtensionEnableGPOS );
  119.     OTV_SIZE_CHECK( ExtensionEnableGPOS );
  120.     if ( ExtensionEnableGPOS )
  121.       otv_x_ux( table + ExtensionEnableGPOS, valid );
  122.  
  123.     OTV_OPTIONAL_OFFSET( ExtensionDisableGPOS );
  124.     OTV_SIZE_CHECK( ExtensionDisableGPOS );
  125.     if ( ExtensionDisableGPOS )
  126.       otv_x_ux( table + ExtensionDisableGPOS, valid );
  127.  
  128.     OTV_OPTIONAL_OFFSET( ExtensionJstfMax );
  129.     OTV_SIZE_CHECK( ExtensionJstfMax );
  130.     if ( ExtensionJstfMax )
  131.     {
  132.       /* XXX: check lookup types? */
  133.       OTV_NEST2( JstfMax, JstfLookup );
  134.       OTV_RUN( table + ExtensionJstfMax, valid );
  135.     }
  136.  
  137.     valid->extra1 = gsub_lookup_count;
  138.     valid->extra2 = gpos_lookup_count;
  139.  
  140.     OTV_EXIT;
  141.   }
  142.  
  143.  
  144.   /* sets valid->extra (glyph count)               */
  145.   /* sets valid->func1 (otv_JstfPriority_validate) */
  146.  
  147.   static void
  148.   otv_JstfScript_validate( FT_Bytes       table,
  149.                            OTV_Validator  valid )
  150.   {
  151.     FT_Bytes  p = table;
  152.     FT_UInt   table_size;
  153.     FT_UInt   JstfLangSysCount;
  154.  
  155.     OTV_OPTIONAL_TABLE( ExtGlyph );
  156.     OTV_OPTIONAL_TABLE( DefJstfLangSys );
  157.  
  158.  
  159.     OTV_NAME_ENTER( "JstfScript" );
  160.  
  161.     OTV_LIMIT_CHECK( 6 );
  162.     OTV_OPTIONAL_OFFSET( ExtGlyph );
  163.     OTV_OPTIONAL_OFFSET( DefJstfLangSys );
  164.     JstfLangSysCount = FT_NEXT_USHORT( p );
  165.  
  166.     OTV_TRACE(( " (JstfLangSysCount = %d)\n", JstfLangSysCount ));
  167.  
  168.     table_size = JstfLangSysCount * 6 + 6;
  169.  
  170.     OTV_SIZE_CHECK( ExtGlyph );
  171.     if ( ExtGlyph )
  172.     {
  173.       valid->extra1 = valid->glyph_count;
  174.       OTV_NEST1( ExtenderGlyph );
  175.       OTV_RUN( table + ExtGlyph, valid );
  176.     }
  177.  
  178.     OTV_SIZE_CHECK( DefJstfLangSys );
  179.     if ( DefJstfLangSys )
  180.     {
  181.       OTV_NEST2( JstfLangSys, JstfPriority );
  182.       OTV_RUN( table + DefJstfLangSys, valid );
  183.     }
  184.  
  185.     OTV_LIMIT_CHECK( 6 * JstfLangSysCount );
  186.  
  187.     /* JstfLangSysRecord */
  188.     OTV_NEST2( JstfLangSys, JstfPriority );
  189.     for ( ; JstfLangSysCount > 0; JstfLangSysCount-- )
  190.     {
  191.       p += 4;       /* skip JstfLangSysTag */
  192.  
  193.       OTV_RUN( table + FT_NEXT_USHORT( p ), valid );
  194.     }
  195.  
  196.     OTV_EXIT;
  197.   }
  198.  
  199.  
  200.   /* sets valid->extra1 (GSUB lookup count) */
  201.   /* sets valid->extra2 (GPOS lookup count) */
  202.   /* sets valid->glyph_count                */
  203.  
  204.   FT_LOCAL_DEF( void )
  205.   otv_JSTF_validate( FT_Bytes      table,
  206.                      FT_Bytes      gsub,
  207.                      FT_Bytes      gpos,
  208.                      FT_UInt       glyph_count,
  209.                      FT_Validator  ftvalid )
  210.   {
  211.     OTV_ValidatorRec  validrec;
  212.     OTV_Validator     valid = &validrec;
  213.     FT_Bytes          p     = table;
  214.     FT_UInt           JstfScriptCount;
  215.  
  216.  
  217.     valid->root = ftvalid;
  218.  
  219.     FT_TRACE3(( "validating JSTF table\n" ));
  220.     OTV_INIT;
  221.  
  222.     OTV_LIMIT_CHECK( 6 );
  223.  
  224.     if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
  225.       FT_INVALID_FORMAT;
  226.  
  227.     JstfScriptCount = FT_NEXT_USHORT( p );
  228.  
  229.     FT_TRACE3(( " (JstfScriptCount = %d)\n", JstfScriptCount ));
  230.  
  231.     OTV_LIMIT_CHECK( JstfScriptCount * 6 );
  232.  
  233.     if ( gsub )
  234.       valid->extra1 = otv_GSUBGPOS_get_Lookup_count( gsub );
  235.     else
  236.       valid->extra1 = 0;
  237.  
  238.     if ( gpos )
  239.       valid->extra2 = otv_GSUBGPOS_get_Lookup_count( gpos );
  240.     else
  241.       valid->extra2 = 0;
  242.  
  243.     valid->glyph_count = glyph_count;
  244.  
  245.     /* JstfScriptRecord */
  246.     for ( ; JstfScriptCount > 0; JstfScriptCount-- )
  247.     {
  248.       p += 4;       /* skip JstfScriptTag */
  249.  
  250.       /* JstfScript */
  251.       otv_JstfScript_validate( table + FT_NEXT_USHORT( p ), valid );
  252.     }
  253.  
  254.     FT_TRACE4(( "\n" ));
  255.   }
  256.  
  257.  
  258. /* END */
  259.