Subversion Repositories Kolibri OS

Rev

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

  1. /***************************************************************************/
  2. /*                                                                         */
  3. /*  cffparse.c                                                             */
  4. /*                                                                         */
  5. /*    CFF token stream parser (body)                                       */
  6. /*                                                                         */
  7. /*  Copyright 1996-2004, 2007-2013 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 <ft2build.h>
  20. #include "cffparse.h"
  21. #include FT_INTERNAL_STREAM_H
  22. #include FT_INTERNAL_DEBUG_H
  23.  
  24. #include "cfferrs.h"
  25. #include "cffpic.h"
  26.  
  27.  
  28.   /*************************************************************************/
  29.   /*                                                                       */
  30.   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
  31.   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
  32.   /* messages during execution.                                            */
  33.   /*                                                                       */
  34. #undef  FT_COMPONENT
  35. #define FT_COMPONENT  trace_cffparse
  36.  
  37.  
  38.   FT_LOCAL_DEF( void )
  39.   cff_parser_init( CFF_Parser  parser,
  40.                    FT_UInt     code,
  41.                    void*       object,
  42.                    FT_Library  library)
  43.   {
  44.     FT_MEM_ZERO( parser, sizeof ( *parser ) );
  45.  
  46.     parser->top         = parser->stack;
  47.     parser->object_code = code;
  48.     parser->object      = object;
  49.     parser->library     = library;
  50.   }
  51.  
  52.  
  53.   /* read an integer */
  54.   static FT_Long
  55.   cff_parse_integer( FT_Byte*  start,
  56.                      FT_Byte*  limit )
  57.   {
  58.     FT_Byte*  p   = start;
  59.     FT_Int    v   = *p++;
  60.     FT_Long   val = 0;
  61.  
  62.  
  63.     if ( v == 28 )
  64.     {
  65.       if ( p + 2 > limit )
  66.         goto Bad;
  67.  
  68.       val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] );
  69.       p  += 2;
  70.     }
  71.     else if ( v == 29 )
  72.     {
  73.       if ( p + 4 > limit )
  74.         goto Bad;
  75.  
  76.       val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) |
  77.                        ( (FT_ULong)p[1] << 16 ) |
  78.                        ( (FT_ULong)p[2] <<  8 ) |
  79.                          (FT_ULong)p[3]         );
  80.       p += 4;
  81.     }
  82.     else if ( v < 247 )
  83.     {
  84.       val = v - 139;
  85.     }
  86.     else if ( v < 251 )
  87.     {
  88.       if ( p + 1 > limit )
  89.         goto Bad;
  90.  
  91.       val = ( v - 247 ) * 256 + p[0] + 108;
  92.       p++;
  93.     }
  94.     else
  95.     {
  96.       if ( p + 1 > limit )
  97.         goto Bad;
  98.  
  99.       val = -( v - 251 ) * 256 - p[0] - 108;
  100.       p++;
  101.     }
  102.  
  103.   Exit:
  104.     return val;
  105.  
  106.   Bad:
  107.     val = 0;
  108.     FT_TRACE4(( "!!!END OF DATA:!!!" ));
  109.     goto Exit;
  110.   }
  111.  
  112.  
  113.   static const FT_Long power_tens[] =
  114.   {
  115.     1L,
  116.     10L,
  117.     100L,
  118.     1000L,
  119.     10000L,
  120.     100000L,
  121.     1000000L,
  122.     10000000L,
  123.     100000000L,
  124.     1000000000L
  125.   };
  126.  
  127.  
  128.   /* read a real */
  129.   static FT_Fixed
  130.   cff_parse_real( FT_Byte*  start,
  131.                   FT_Byte*  limit,
  132.                   FT_Long   power_ten,
  133.                   FT_Long*  scaling )
  134.   {
  135.     FT_Byte*  p = start;
  136.     FT_UInt   nib;
  137.     FT_UInt   phase;
  138.  
  139.     FT_Long   result, number, exponent;
  140.     FT_Int    sign = 0, exponent_sign = 0, have_overflow = 0;
  141.     FT_Long   exponent_add, integer_length, fraction_length;
  142.  
  143.  
  144.     if ( scaling )
  145.       *scaling = 0;
  146.  
  147.     result = 0;
  148.  
  149.     number   = 0;
  150.     exponent = 0;
  151.  
  152.     exponent_add    = 0;
  153.     integer_length  = 0;
  154.     fraction_length = 0;
  155.  
  156.     /* First of all, read the integer part. */
  157.     phase = 4;
  158.  
  159.     for (;;)
  160.     {
  161.       /* If we entered this iteration with phase == 4, we need to */
  162.       /* read a new byte.  This also skips past the initial 0x1E. */
  163.       if ( phase )
  164.       {
  165.         p++;
  166.  
  167.         /* Make sure we don't read past the end. */
  168.         if ( p >= limit )
  169.           goto Bad;
  170.       }
  171.  
  172.       /* Get the nibble. */
  173.       nib   = ( p[0] >> phase ) & 0xF;
  174.       phase = 4 - phase;
  175.  
  176.       if ( nib == 0xE )
  177.         sign = 1;
  178.       else if ( nib > 9 )
  179.         break;
  180.       else
  181.       {
  182.         /* Increase exponent if we can't add the digit. */
  183.         if ( number >= 0xCCCCCCCL )
  184.           exponent_add++;
  185.         /* Skip leading zeros. */
  186.         else if ( nib || number )
  187.         {
  188.           integer_length++;
  189.           number = number * 10 + nib;
  190.         }
  191.       }
  192.     }
  193.  
  194.     /* Read fraction part, if any. */
  195.     if ( nib == 0xa )
  196.       for (;;)
  197.       {
  198.         /* If we entered this iteration with phase == 4, we need */
  199.         /* to read a new byte.                                   */
  200.         if ( phase )
  201.         {
  202.           p++;
  203.  
  204.           /* Make sure we don't read past the end. */
  205.           if ( p >= limit )
  206.             goto Bad;
  207.         }
  208.  
  209.         /* Get the nibble. */
  210.         nib   = ( p[0] >> phase ) & 0xF;
  211.         phase = 4 - phase;
  212.         if ( nib >= 10 )
  213.           break;
  214.  
  215.         /* Skip leading zeros if possible. */
  216.         if ( !nib && !number )
  217.           exponent_add--;
  218.         /* Only add digit if we don't overflow. */
  219.         else if ( number < 0xCCCCCCCL && fraction_length < 9 )
  220.         {
  221.           fraction_length++;
  222.           number = number * 10 + nib;
  223.         }
  224.       }
  225.  
  226.     /* Read exponent, if any. */
  227.     if ( nib == 12 )
  228.     {
  229.       exponent_sign = 1;
  230.       nib           = 11;
  231.     }
  232.  
  233.     if ( nib == 11 )
  234.     {
  235.       for (;;)
  236.       {
  237.         /* If we entered this iteration with phase == 4, */
  238.         /* we need to read a new byte.                   */
  239.         if ( phase )
  240.         {
  241.           p++;
  242.  
  243.           /* Make sure we don't read past the end. */
  244.           if ( p >= limit )
  245.             goto Bad;
  246.         }
  247.  
  248.         /* Get the nibble. */
  249.         nib   = ( p[0] >> phase ) & 0xF;
  250.         phase = 4 - phase;
  251.         if ( nib >= 10 )
  252.           break;
  253.  
  254.         /* Arbitrarily limit exponent. */
  255.         if ( exponent > 1000 )
  256.           have_overflow = 1;
  257.         else
  258.           exponent = exponent * 10 + nib;
  259.       }
  260.  
  261.       if ( exponent_sign )
  262.         exponent = -exponent;
  263.     }
  264.  
  265.     if ( !number )
  266.       goto Exit;
  267.  
  268.     if ( have_overflow )
  269.     {
  270.       if ( exponent_sign )
  271.         goto Underflow;
  272.       else
  273.         goto Overflow;
  274.     }
  275.  
  276.     /* We don't check `power_ten' and `exponent_add'. */
  277.     exponent += power_ten + exponent_add;
  278.  
  279.     if ( scaling )
  280.     {
  281.       /* Only use `fraction_length'. */
  282.       fraction_length += integer_length;
  283.       exponent        += integer_length;
  284.  
  285.       if ( fraction_length <= 5 )
  286.       {
  287.         if ( number > 0x7FFFL )
  288.         {
  289.           result   = FT_DivFix( number, 10 );
  290.           *scaling = exponent - fraction_length + 1;
  291.         }
  292.         else
  293.         {
  294.           if ( exponent > 0 )
  295.           {
  296.             FT_Long  new_fraction_length, shift;
  297.  
  298.  
  299.             /* Make `scaling' as small as possible. */
  300.             new_fraction_length = FT_MIN( exponent, 5 );
  301.             shift               = new_fraction_length - fraction_length;
  302.  
  303.             if ( shift > 0 )
  304.             {
  305.               exponent -= new_fraction_length;
  306.               number   *= power_tens[shift];
  307.               if ( number > 0x7FFFL )
  308.               {
  309.                 number   /= 10;
  310.                 exponent += 1;
  311.               }
  312.             }
  313.             else
  314.               exponent -= fraction_length;
  315.           }
  316.           else
  317.             exponent -= fraction_length;
  318.  
  319.           result   = (FT_Long)( (FT_ULong)number << 16 );
  320.           *scaling = exponent;
  321.         }
  322.       }
  323.       else
  324.       {
  325.         if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )
  326.         {
  327.           result   = FT_DivFix( number, power_tens[fraction_length - 4] );
  328.           *scaling = exponent - 4;
  329.         }
  330.         else
  331.         {
  332.           result   = FT_DivFix( number, power_tens[fraction_length - 5] );
  333.           *scaling = exponent - 5;
  334.         }
  335.       }
  336.     }
  337.     else
  338.     {
  339.       integer_length  += exponent;
  340.       fraction_length -= exponent;
  341.  
  342.       if ( integer_length > 5 )
  343.         goto Overflow;
  344.       if ( integer_length < -5 )
  345.         goto Underflow;
  346.  
  347.       /* Remove non-significant digits. */
  348.       if ( integer_length < 0 )
  349.       {
  350.         number          /= power_tens[-integer_length];
  351.         fraction_length += integer_length;
  352.       }
  353.  
  354.       /* this can only happen if exponent was non-zero */
  355.       if ( fraction_length == 10 )
  356.       {
  357.         number          /= 10;
  358.         fraction_length -= 1;
  359.       }
  360.  
  361.       /* Convert into 16.16 format. */
  362.       if ( fraction_length > 0 )
  363.       {
  364.         if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )
  365.           goto Exit;
  366.  
  367.         result = FT_DivFix( number, power_tens[fraction_length] );
  368.       }
  369.       else
  370.       {
  371.         number *= power_tens[-fraction_length];
  372.  
  373.         if ( number > 0x7FFFL )
  374.           goto Overflow;
  375.  
  376.         result = (FT_Long)( (FT_ULong)number << 16 );
  377.       }
  378.     }
  379.  
  380.   Exit:
  381.     if ( sign )
  382.       result = -result;
  383.  
  384.     return result;
  385.  
  386.   Overflow:
  387.     result = 0x7FFFFFFFL;
  388.     FT_TRACE4(( "!!!OVERFLOW:!!!" ));
  389.     goto Exit;
  390.  
  391.   Underflow:
  392.     result = 0;
  393.     FT_TRACE4(( "!!!UNDERFLOW:!!!" ));
  394.     goto Exit;
  395.  
  396.   Bad:
  397.     result = 0;
  398.     FT_TRACE4(( "!!!END OF DATA:!!!" ));
  399.     goto Exit;
  400.   }
  401.  
  402.  
  403.   /* read a number, either integer or real */
  404.   static FT_Long
  405.   cff_parse_num( FT_Byte**  d )
  406.   {
  407.     return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 )
  408.                      :   cff_parse_integer( d[0], d[1] );
  409.   }
  410.  
  411.  
  412.   /* read a floating point number, either integer or real */
  413.   static FT_Fixed
  414.   do_fixed( FT_Byte**  d,
  415.             FT_Long    scaling )
  416.   {
  417.     if ( **d == 30 )
  418.       return cff_parse_real( d[0], d[1], scaling, NULL );
  419.     else
  420.     {
  421.       FT_Long  val = cff_parse_integer( d[0], d[1] );
  422.  
  423.  
  424.       if ( scaling )
  425.         val *= power_tens[scaling];
  426.  
  427.       if ( val > 0x7FFF )
  428.       {
  429.         val = 0x7FFFFFFFL;
  430.         goto Overflow;
  431.       }
  432.       else if ( val < -0x7FFF )
  433.       {
  434.         val = -0x7FFFFFFFL;
  435.         goto Overflow;
  436.       }
  437.  
  438.       return (FT_Long)( (FT_ULong)val << 16 );
  439.  
  440.     Overflow:
  441.       FT_TRACE4(( "!!!OVERFLOW:!!!" ));
  442.       return val;
  443.     }
  444.   }
  445.  
  446.  
  447.   /* read a floating point number, either integer or real */
  448.   static FT_Fixed
  449.   cff_parse_fixed( FT_Byte**  d )
  450.   {
  451.     return do_fixed( d, 0 );
  452.   }
  453.  
  454.  
  455.   /* read a floating point number, either integer or real, */
  456.   /* but return `10^scaling' times the number read in      */
  457.   static FT_Fixed
  458.   cff_parse_fixed_scaled( FT_Byte**  d,
  459.                           FT_Long    scaling )
  460.   {
  461.     return do_fixed( d, scaling );
  462.   }
  463.  
  464.  
  465.   /* read a floating point number, either integer or real,     */
  466.   /* and return it as precise as possible -- `scaling' returns */
  467.   /* the scaling factor (as a power of 10)                     */
  468.   static FT_Fixed
  469.   cff_parse_fixed_dynamic( FT_Byte**  d,
  470.                            FT_Long*   scaling )
  471.   {
  472.     FT_ASSERT( scaling );
  473.  
  474.     if ( **d == 30 )
  475.       return cff_parse_real( d[0], d[1], 0, scaling );
  476.     else
  477.     {
  478.       FT_Long  number;
  479.       FT_Int   integer_length;
  480.  
  481.  
  482.       number = cff_parse_integer( d[0], d[1] );
  483.  
  484.       if ( number > 0x7FFFL )
  485.       {
  486.         for ( integer_length = 5; integer_length < 10; integer_length++ )
  487.           if ( number < power_tens[integer_length] )
  488.             break;
  489.  
  490.         if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL )
  491.         {
  492.           *scaling = integer_length - 4;
  493.           return FT_DivFix( number, power_tens[integer_length - 4] );
  494.         }
  495.         else
  496.         {
  497.           *scaling = integer_length - 5;
  498.           return FT_DivFix( number, power_tens[integer_length - 5] );
  499.         }
  500.       }
  501.       else
  502.       {
  503.         *scaling = 0;
  504.         return (FT_Long)( (FT_ULong)number << 16 );
  505.       }
  506.     }
  507.   }
  508.  
  509.  
  510.   static FT_Error
  511.   cff_parse_font_matrix( CFF_Parser  parser )
  512.   {
  513.     CFF_FontRecDict  dict   = (CFF_FontRecDict)parser->object;
  514.     FT_Matrix*       matrix = &dict->font_matrix;
  515.     FT_Vector*       offset = &dict->font_offset;
  516.     FT_ULong*        upm    = &dict->units_per_em;
  517.     FT_Byte**        data   = parser->stack;
  518.     FT_Error         error  = FT_ERR( Stack_Underflow );
  519.  
  520.  
  521.     if ( parser->top >= parser->stack + 6 )
  522.     {
  523.       FT_Long  scaling;
  524.  
  525.  
  526.       error = FT_Err_Ok;
  527.  
  528.       dict->has_font_matrix = TRUE;
  529.  
  530.       /* We expect a well-formed font matrix, this is, the matrix elements */
  531.       /* `xx' and `yy' are of approximately the same magnitude.  To avoid  */
  532.       /* loss of precision, we use the magnitude of element `xx' to scale  */
  533.       /* all other elements.  The scaling factor is then contained in the  */
  534.       /* `units_per_em' value.                                             */
  535.  
  536.       matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );
  537.  
  538.       scaling = -scaling;
  539.  
  540.       if ( scaling < 0 || scaling > 9 )
  541.       {
  542.         /* Return default matrix in case of unlikely values. */
  543.  
  544.         FT_TRACE1(( "cff_parse_font_matrix:"
  545.                     " strange scaling value for xx element (%d),\n"
  546.                     "                      "
  547.                     " using default matrix\n", scaling ));
  548.  
  549.         matrix->xx = 0x10000L;
  550.         matrix->yx = 0;
  551.         matrix->xy = 0;
  552.         matrix->yy = 0x10000L;
  553.         offset->x  = 0;
  554.         offset->y  = 0;
  555.         *upm       = 1;
  556.  
  557.         goto Exit;
  558.       }
  559.  
  560.       matrix->yx = cff_parse_fixed_scaled( data++, scaling );
  561.       matrix->xy = cff_parse_fixed_scaled( data++, scaling );
  562.       matrix->yy = cff_parse_fixed_scaled( data++, scaling );
  563.       offset->x  = cff_parse_fixed_scaled( data++, scaling );
  564.       offset->y  = cff_parse_fixed_scaled( data,   scaling );
  565.  
  566.       *upm = power_tens[scaling];
  567.  
  568.       FT_TRACE4(( " [%f %f %f %f %f %f]\n",
  569.                   (double)matrix->xx / *upm / 65536,
  570.                   (double)matrix->xy / *upm / 65536,
  571.                   (double)matrix->yx / *upm / 65536,
  572.                   (double)matrix->yy / *upm / 65536,
  573.                   (double)offset->x  / *upm / 65536,
  574.                   (double)offset->y  / *upm / 65536 ));
  575.     }
  576.  
  577.   Exit:
  578.     return error;
  579.   }
  580.  
  581.  
  582.   static FT_Error
  583.   cff_parse_font_bbox( CFF_Parser  parser )
  584.   {
  585.     CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
  586.     FT_BBox*         bbox = &dict->font_bbox;
  587.     FT_Byte**        data = parser->stack;
  588.     FT_Error         error;
  589.  
  590.  
  591.     error = FT_ERR( Stack_Underflow );
  592.  
  593.     if ( parser->top >= parser->stack + 4 )
  594.     {
  595.       bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );
  596.       bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );
  597.       bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );
  598.       bbox->yMax = FT_RoundFix( cff_parse_fixed( data   ) );
  599.       error = FT_Err_Ok;
  600.  
  601.       FT_TRACE4(( " [%d %d %d %d]\n",
  602.                   bbox->xMin / 65536,
  603.                   bbox->yMin / 65536,
  604.                   bbox->xMax / 65536,
  605.                   bbox->yMax / 65536 ));
  606.     }
  607.  
  608.     return error;
  609.   }
  610.  
  611.  
  612.   static FT_Error
  613.   cff_parse_private_dict( CFF_Parser  parser )
  614.   {
  615.     CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
  616.     FT_Byte**        data = parser->stack;
  617.     FT_Error         error;
  618.  
  619.  
  620.     error = FT_ERR( Stack_Underflow );
  621.  
  622.     if ( parser->top >= parser->stack + 2 )
  623.     {
  624.       dict->private_size   = cff_parse_num( data++ );
  625.       dict->private_offset = cff_parse_num( data   );
  626.       FT_TRACE4(( " %lu %lu\n",
  627.                   dict->private_size, dict->private_offset ));
  628.  
  629.       error = FT_Err_Ok;
  630.     }
  631.  
  632.     return error;
  633.   }
  634.  
  635.  
  636.   static FT_Error
  637.   cff_parse_cid_ros( CFF_Parser  parser )
  638.   {
  639.     CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
  640.     FT_Byte**        data = parser->stack;
  641.     FT_Error         error;
  642.  
  643.  
  644.     error = FT_ERR( Stack_Underflow );
  645.  
  646.     if ( parser->top >= parser->stack + 3 )
  647.     {
  648.       dict->cid_registry = (FT_UInt)cff_parse_num( data++ );
  649.       dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );
  650.       if ( **data == 30 )
  651.         FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" ));
  652.       dict->cid_supplement = cff_parse_num( data );
  653.       if ( dict->cid_supplement < 0 )
  654.         FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n",
  655.                    dict->cid_supplement ));
  656.       error = FT_Err_Ok;
  657.  
  658.       FT_TRACE4(( " %d %d %d\n",
  659.                   dict->cid_registry,
  660.                   dict->cid_ordering,
  661.                   dict->cid_supplement ));
  662.     }
  663.  
  664.     return error;
  665.   }
  666.  
  667.  
  668. #define CFF_FIELD_NUM( code, name, id )             \
  669.           CFF_FIELD( code, name, id, cff_kind_num )
  670. #define CFF_FIELD_FIXED( code, name, id )             \
  671.           CFF_FIELD( code, name, id, cff_kind_fixed )
  672. #define CFF_FIELD_FIXED_1000( code, name, id )                 \
  673.           CFF_FIELD( code, name, id, cff_kind_fixed_thousand )
  674. #define CFF_FIELD_STRING( code, name, id )             \
  675.           CFF_FIELD( code, name, id, cff_kind_string )
  676. #define CFF_FIELD_BOOL( code, name, id )             \
  677.           CFF_FIELD( code, name, id, cff_kind_bool )
  678.  
  679. #define CFFCODE_TOPDICT  0x1000
  680. #define CFFCODE_PRIVATE  0x2000
  681.  
  682.  
  683. #ifndef FT_CONFIG_OPTION_PIC
  684.  
  685.  
  686. #undef  CFF_FIELD
  687. #undef  CFF_FIELD_DELTA
  688.  
  689.  
  690. #ifndef FT_DEBUG_LEVEL_TRACE
  691.  
  692.  
  693. #define CFF_FIELD_CALLBACK( code, name, id ) \
  694.           {                                  \
  695.             cff_kind_callback,               \
  696.             code | CFFCODE,                  \
  697.             0, 0,                            \
  698.             cff_parse_ ## name,              \
  699.             0, 0                             \
  700.           },
  701.  
  702. #define CFF_FIELD( code, name, id, kind ) \
  703.           {                               \
  704.             kind,                         \
  705.             code | CFFCODE,               \
  706.             FT_FIELD_OFFSET( name ),      \
  707.             FT_FIELD_SIZE( name ),        \
  708.             0, 0, 0                       \
  709.           },
  710.  
  711. #define CFF_FIELD_DELTA( code, name, max, id ) \
  712.           {                                    \
  713.             cff_kind_delta,                    \
  714.             code | CFFCODE,                    \
  715.             FT_FIELD_OFFSET( name ),           \
  716.             FT_FIELD_SIZE_DELTA( name ),       \
  717.             0,                                 \
  718.             max,                               \
  719.             FT_FIELD_OFFSET( num_ ## name )    \
  720.           },
  721.  
  722.   static const CFF_Field_Handler  cff_field_handlers[] =
  723.   {
  724.  
  725. #include "cfftoken.h"
  726.  
  727.     { 0, 0, 0, 0, 0, 0, 0 }
  728.   };
  729.  
  730.  
  731. #else /* FT_DEBUG_LEVEL_TRACE */
  732.  
  733.  
  734.  
  735. #define CFF_FIELD_CALLBACK( code, name, id ) \
  736.           {                                  \
  737.             cff_kind_callback,               \
  738.             code | CFFCODE,                  \
  739.             0, 0,                            \
  740.             cff_parse_ ## name,              \
  741.             0, 0,                            \
  742.             id                               \
  743.           },
  744.  
  745. #define CFF_FIELD( code, name, id, kind ) \
  746.           {                               \
  747.             kind,                         \
  748.             code | CFFCODE,               \
  749.             FT_FIELD_OFFSET( name ),      \
  750.             FT_FIELD_SIZE( name ),        \
  751.             0, 0, 0,                      \
  752.             id                            \
  753.           },
  754.  
  755. #define CFF_FIELD_DELTA( code, name, max, id ) \
  756.           {                                    \
  757.             cff_kind_delta,                    \
  758.             code | CFFCODE,                    \
  759.             FT_FIELD_OFFSET( name ),           \
  760.             FT_FIELD_SIZE_DELTA( name ),       \
  761.             0,                                 \
  762.             max,                               \
  763.             FT_FIELD_OFFSET( num_ ## name ),   \
  764.             id                                 \
  765.           },
  766.  
  767.   static const CFF_Field_Handler  cff_field_handlers[] =
  768.   {
  769.  
  770. #include "cfftoken.h"
  771.  
  772.     { 0, 0, 0, 0, 0, 0, 0, 0 }
  773.   };
  774.  
  775.  
  776. #endif /* FT_DEBUG_LEVEL_TRACE */
  777.  
  778.  
  779. #else /* FT_CONFIG_OPTION_PIC */
  780.  
  781.  
  782.   void
  783.   FT_Destroy_Class_cff_field_handlers( FT_Library          library,
  784.                                        CFF_Field_Handler*  clazz )
  785.   {
  786.     FT_Memory  memory = library->memory;
  787.  
  788.  
  789.     if ( clazz )
  790.       FT_FREE( clazz );
  791.   }
  792.  
  793.  
  794.   FT_Error
  795.   FT_Create_Class_cff_field_handlers( FT_Library           library,
  796.                                       CFF_Field_Handler**  output_class )
  797.   {
  798.     CFF_Field_Handler*  clazz  = NULL;
  799.     FT_Error            error;
  800.     FT_Memory           memory = library->memory;
  801.  
  802.     int  i = 0;
  803.  
  804.  
  805. #undef CFF_FIELD
  806. #define CFF_FIELD( code, name, id, kind ) i++;
  807. #undef CFF_FIELD_DELTA
  808. #define CFF_FIELD_DELTA( code, name, max, id ) i++;
  809. #undef CFF_FIELD_CALLBACK
  810. #define CFF_FIELD_CALLBACK( code, name, id ) i++;
  811.  
  812. #include "cfftoken.h"
  813.  
  814.     i++; /* { 0, 0, 0, 0, 0, 0, 0 } */
  815.  
  816.     if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) )
  817.       return error;
  818.  
  819.     i = 0;
  820.  
  821.  
  822. #ifndef FT_DEBUG_LEVEL_TRACE
  823.  
  824.  
  825. #undef CFF_FIELD_CALLBACK
  826. #define CFF_FIELD_CALLBACK( code_, name_, id_ )        \
  827.           clazz[i].kind         = cff_kind_callback;   \
  828.           clazz[i].code         = code_ | CFFCODE;     \
  829.           clazz[i].offset       = 0;                   \
  830.           clazz[i].size         = 0;                   \
  831.           clazz[i].reader       = cff_parse_ ## name_; \
  832.           clazz[i].array_max    = 0;                   \
  833.           clazz[i].count_offset = 0;                   \
  834.           i++;
  835.  
  836. #undef  CFF_FIELD
  837. #define CFF_FIELD( code_, name_, id_, kind_ )               \
  838.           clazz[i].kind         = kind_;                    \
  839.           clazz[i].code         = code_ | CFFCODE;          \
  840.           clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \
  841.           clazz[i].size         = FT_FIELD_SIZE( name_ );   \
  842.           clazz[i].reader       = 0;                        \
  843.           clazz[i].array_max    = 0;                        \
  844.           clazz[i].count_offset = 0;                        \
  845.           i++;                                              \
  846.  
  847. #undef  CFF_FIELD_DELTA
  848. #define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \
  849.           clazz[i].kind         = cff_kind_delta;                   \
  850.           clazz[i].code         = code_ | CFFCODE;                  \
  851.           clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \
  852.           clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \
  853.           clazz[i].reader       = 0;                                \
  854.           clazz[i].array_max    = max_;                             \
  855.           clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
  856.           i++;
  857.  
  858. #include "cfftoken.h"
  859.  
  860.     clazz[i].kind         = 0;
  861.     clazz[i].code         = 0;
  862.     clazz[i].offset       = 0;
  863.     clazz[i].size         = 0;
  864.     clazz[i].reader       = 0;
  865.     clazz[i].array_max    = 0;
  866.     clazz[i].count_offset = 0;
  867.  
  868.  
  869. #else /* FT_DEBUG_LEVEL_TRACE */
  870.  
  871.  
  872. #undef CFF_FIELD_CALLBACK
  873. #define CFF_FIELD_CALLBACK( code_, name_, id_ )        \
  874.           clazz[i].kind         = cff_kind_callback;   \
  875.           clazz[i].code         = code_ | CFFCODE;     \
  876.           clazz[i].offset       = 0;                   \
  877.           clazz[i].size         = 0;                   \
  878.           clazz[i].reader       = cff_parse_ ## name_; \
  879.           clazz[i].array_max    = 0;                   \
  880.           clazz[i].count_offset = 0;                   \
  881.           clazz[i].id           = id_;                 \
  882.           i++;
  883.  
  884. #undef  CFF_FIELD
  885. #define CFF_FIELD( code_, name_, id_, kind_ )               \
  886.           clazz[i].kind         = kind_;                    \
  887.           clazz[i].code         = code_ | CFFCODE;          \
  888.           clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \
  889.           clazz[i].size         = FT_FIELD_SIZE( name_ );   \
  890.           clazz[i].reader       = 0;                        \
  891.           clazz[i].array_max    = 0;                        \
  892.           clazz[i].count_offset = 0;                        \
  893.           clazz[i].id           = id_;                      \
  894.           i++;                                              \
  895.  
  896. #undef  CFF_FIELD_DELTA
  897. #define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \
  898.           clazz[i].kind         = cff_kind_delta;                   \
  899.           clazz[i].code         = code_ | CFFCODE;                  \
  900.           clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \
  901.           clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \
  902.           clazz[i].reader       = 0;                                \
  903.           clazz[i].array_max    = max_;                             \
  904.           clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
  905.           clazz[i].id           = id_;                              \
  906.           i++;
  907.  
  908. #include "cfftoken.h"
  909.  
  910.     clazz[i].kind         = 0;
  911.     clazz[i].code         = 0;
  912.     clazz[i].offset       = 0;
  913.     clazz[i].size         = 0;
  914.     clazz[i].reader       = 0;
  915.     clazz[i].array_max    = 0;
  916.     clazz[i].count_offset = 0;
  917.     clazz[i].id           = 0;
  918.  
  919.  
  920. #endif /* FT_DEBUG_LEVEL_TRACE */
  921.  
  922.  
  923.     *output_class = clazz;
  924.  
  925.     return FT_Err_Ok;
  926.   }
  927.  
  928.  
  929. #endif /* FT_CONFIG_OPTION_PIC */
  930.  
  931.  
  932.   FT_LOCAL_DEF( FT_Error )
  933.   cff_parser_run( CFF_Parser  parser,
  934.                   FT_Byte*    start,
  935.                   FT_Byte*    limit )
  936.   {
  937.     FT_Byte*    p       = start;
  938.     FT_Error    error   = FT_Err_Ok;
  939.     FT_Library  library = parser->library;
  940.     FT_UNUSED( library );
  941.  
  942.  
  943.     parser->top    = parser->stack;
  944.     parser->start  = start;
  945.     parser->limit  = limit;
  946.     parser->cursor = start;
  947.  
  948.     while ( p < limit )
  949.     {
  950.       FT_UInt  v = *p;
  951.  
  952.  
  953.       if ( v >= 27 && v != 31 )
  954.       {
  955.         /* it's a number; we will push its position on the stack */
  956.         if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )
  957.           goto Stack_Overflow;
  958.  
  959.         *parser->top ++ = p;
  960.  
  961.         /* now, skip it */
  962.         if ( v == 30 )
  963.         {
  964.           /* skip real number */
  965.           p++;
  966.           for (;;)
  967.           {
  968.             /* An unterminated floating point number at the */
  969.             /* end of a dictionary is invalid but harmless. */
  970.             if ( p >= limit )
  971.               goto Exit;
  972.             v = p[0] >> 4;
  973.             if ( v == 15 )
  974.               break;
  975.             v = p[0] & 0xF;
  976.             if ( v == 15 )
  977.               break;
  978.             p++;
  979.           }
  980.         }
  981.         else if ( v == 28 )
  982.           p += 2;
  983.         else if ( v == 29 )
  984.           p += 4;
  985.         else if ( v > 246 )
  986.           p += 1;
  987.       }
  988.       else
  989.       {
  990.         /* This is not a number, hence it's an operator.  Compute its code */
  991.         /* and look for it in our current list.                            */
  992.  
  993.         FT_UInt                   code;
  994.         FT_UInt                   num_args = (FT_UInt)
  995.                                              ( parser->top - parser->stack );
  996.         const CFF_Field_Handler*  field;
  997.  
  998.  
  999.         *parser->top = p;
  1000.         code = v;
  1001.         if ( v == 12 )
  1002.         {
  1003.           /* two byte operator */
  1004.           p++;
  1005.           if ( p >= limit )
  1006.             goto Syntax_Error;
  1007.  
  1008.           code = 0x100 | p[0];
  1009.         }
  1010.         code = code | parser->object_code;
  1011.  
  1012.         for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ )
  1013.         {
  1014.           if ( field->code == (FT_Int)code )
  1015.           {
  1016.             /* we found our field's handler; read it */
  1017.             FT_Long   val;
  1018.             FT_Byte*  q = (FT_Byte*)parser->object + field->offset;
  1019.  
  1020.  
  1021. #ifdef FT_DEBUG_LEVEL_TRACE
  1022.             FT_TRACE4(( "  %s", field->id ));
  1023. #endif
  1024.  
  1025.             /* check that we have enough arguments -- except for */
  1026.             /* delta encoded arrays, which can be empty          */
  1027.             if ( field->kind != cff_kind_delta && num_args < 1 )
  1028.               goto Stack_Underflow;
  1029.  
  1030.             switch ( field->kind )
  1031.             {
  1032.             case cff_kind_bool:
  1033.             case cff_kind_string:
  1034.             case cff_kind_num:
  1035.               val = cff_parse_num( parser->stack );
  1036.               goto Store_Number;
  1037.  
  1038.             case cff_kind_fixed:
  1039.               val = cff_parse_fixed( parser->stack );
  1040.               goto Store_Number;
  1041.  
  1042.             case cff_kind_fixed_thousand:
  1043.               val = cff_parse_fixed_scaled( parser->stack, 3 );
  1044.  
  1045.             Store_Number:
  1046.               switch ( field->size )
  1047.               {
  1048.               case (8 / FT_CHAR_BIT):
  1049.                 *(FT_Byte*)q = (FT_Byte)val;
  1050.                 break;
  1051.  
  1052.               case (16 / FT_CHAR_BIT):
  1053.                 *(FT_Short*)q = (FT_Short)val;
  1054.                 break;
  1055.  
  1056.               case (32 / FT_CHAR_BIT):
  1057.                 *(FT_Int32*)q = (FT_Int)val;
  1058.                 break;
  1059.  
  1060.               default:  /* for 64-bit systems */
  1061.                 *(FT_Long*)q = val;
  1062.               }
  1063.  
  1064. #ifdef FT_DEBUG_LEVEL_TRACE
  1065.               switch ( field->kind )
  1066.               {
  1067.               case cff_kind_bool:
  1068.                 FT_TRACE4(( " %s\n", val ? "true" : "false" ));
  1069.                 break;
  1070.  
  1071.               case cff_kind_string:
  1072.                 FT_TRACE4(( " %ld (SID)\n", val ));
  1073.                 break;
  1074.  
  1075.               case cff_kind_num:
  1076.                 FT_TRACE4(( " %ld\n", val ));
  1077.                 break;
  1078.  
  1079.               case cff_kind_fixed:
  1080.                 FT_TRACE4(( " %f\n", (double)val / 65536 ));
  1081.                 break;
  1082.  
  1083.               case cff_kind_fixed_thousand:
  1084.                 FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 ));
  1085.  
  1086.               default:
  1087.                 ; /* never reached */
  1088.               }
  1089. #endif
  1090.  
  1091.               break;
  1092.  
  1093.             case cff_kind_delta:
  1094.               {
  1095.                 FT_Byte*   qcount = (FT_Byte*)parser->object +
  1096.                                       field->count_offset;
  1097.  
  1098.                 FT_Byte**  data = parser->stack;
  1099.  
  1100.  
  1101.                 if ( num_args > field->array_max )
  1102.                   num_args = field->array_max;
  1103.  
  1104.                 FT_TRACE4(( " [" ));
  1105.  
  1106.                 /* store count */
  1107.                 *qcount = (FT_Byte)num_args;
  1108.  
  1109.                 val = 0;
  1110.                 while ( num_args > 0 )
  1111.                 {
  1112.                   val += cff_parse_num( data++ );
  1113.                   switch ( field->size )
  1114.                   {
  1115.                   case (8 / FT_CHAR_BIT):
  1116.                     *(FT_Byte*)q = (FT_Byte)val;
  1117.                     break;
  1118.  
  1119.                   case (16 / FT_CHAR_BIT):
  1120.                     *(FT_Short*)q = (FT_Short)val;
  1121.                     break;
  1122.  
  1123.                   case (32 / FT_CHAR_BIT):
  1124.                     *(FT_Int32*)q = (FT_Int)val;
  1125.                     break;
  1126.  
  1127.                   default:  /* for 64-bit systems */
  1128.                     *(FT_Long*)q = val;
  1129.                   }
  1130.  
  1131.                   FT_TRACE4(( " %ld", val ));
  1132.  
  1133.                   q += field->size;
  1134.                   num_args--;
  1135.                 }
  1136.  
  1137.                 FT_TRACE4(( "]\n" ));
  1138.               }
  1139.               break;
  1140.  
  1141.             default:  /* callback */
  1142.               error = field->reader( parser );
  1143.               if ( error )
  1144.                 goto Exit;
  1145.             }
  1146.             goto Found;
  1147.           }
  1148.         }
  1149.  
  1150.         /* this is an unknown operator, or it is unsupported; */
  1151.         /* we will ignore it for now.                         */
  1152.  
  1153.       Found:
  1154.         /* clear stack */
  1155.         parser->top = parser->stack;
  1156.       }
  1157.       p++;
  1158.     }
  1159.  
  1160.   Exit:
  1161.     return error;
  1162.  
  1163.   Stack_Overflow:
  1164.     error = FT_THROW( Invalid_Argument );
  1165.     goto Exit;
  1166.  
  1167.   Stack_Underflow:
  1168.     error = FT_THROW( Invalid_Argument );
  1169.     goto Exit;
  1170.  
  1171.   Syntax_Error:
  1172.     error = FT_THROW( Invalid_Argument );
  1173.     goto Exit;
  1174.   }
  1175.  
  1176.  
  1177. /* END */
  1178.