Edit

kc3-lang/freetype/src/otlayout/otlparse.c

Branch :

  • Show log

    Commit

  • Author : David Turner
    Date : 2002-11-07 01:36:29
    Hash : e57ca7de
    Message : * src/otlayout/otlayout.h, src/otlyaout/otlconf.h, src/otlayout/otlgsub.c, src/otlayout/otlgsub.h, src/otlayout/otlparse.c, src/otlayout/otlparse.h, src/otlayout/otlutils.h: updating the OpenType Layout code, adding support fot the first GSUB lookups. Nothing that really compiles for now though * src/autohint/ahhint.c: disabled serif stem width quantization. It produces slightly better shapes though this is not distinguishable with many fonts.

  • src/otlayout/otlparse.c
  • #include "otlparse.h"
    #include "otlutils.h"
    
      static void
      otl_string_ensure( OTL_String  string,
                         OTL_UInt    count,
                         OTL_Parser  parser )
      {
        count += string->length;
    
        if ( count > string->capacity )
        {
          OTL_UInt    old_count = string->capacity;
          OTL_UInt    new_count = old_count;
          OTL_Memory  memory    = parser->memory;
    
          while ( new_count < count )
            new_count += (new_count >> 1) + 16;
    
          if ( OTL_MEM_RENEW_ARRAY( string->glyphs, old_count, new_count ) )
            otl_parser_error( parser, OTL_Parse_Err_Memory );
    
          string->capacity = new_count;
        }
      }
    
    #define  OTL_STRING_ENSURE(str,count,parser)                   \
               OTL_BEGIN_STMNT                                     \
                 if ( (str)->length + (count) > (str)>capacity )   \
                   otl_string_ensure( str, count, parser );        \
               OTL_END_STMNT
    
    
      OTL_LOCALDEF( OTL_UInt )
      otl_parser_get_gindex( OTL_Parser  parser )
      {
        OTL_String  in = parser->str_in;
    
        if ( in->cursor >= in->num_glyphs )
          otl_parser_error( parser, OTL_Err_Parser_Internal );
    
        return in->str[ in->cursor ].gindex;
      }
    
    
      OTL_LOCALDEF( void )
      otl_parser_error( OTL_Parser      parser,
                        OTL_ParseError  error; )
      {
        parser->error = error;
        otl_longjmp( parser->jump_buffer, 1 );
      }
    
    #define  OTL_PARSER_UNCOVERED(x)  otl_parser_error( x, OTL_Parse_Err_UncoveredGlyph );
    
      OTL_LOCAL( void )
      otl_parser_check_property( OTL_Parser  parser,
                                 OTL_UInt    gindex,
                                 OTL_UInt    flags,
                                 OTL_UInt   *aproperty );
    
      OTL_LOCALDEF( void )
      otl_parser_replace_1( OTL_Parser  parser,
                            OTL_UInt    gindex )
      {
        OTL_String       in  = parser->str_in;
        OTL_String       out = parser->str_out;
        OTL_StringGlyph  glyph, in_glyph;
    
        /* sanity check */
        if ( in == NULL               ||
             out == NULL              ||
             in->length == 0          ||
             in->cursor >= in->length )
        {
          /* report as internal error, since these should */
          /* never happen !!                              */
          otl_parser_error( parser, OTL_Err_Parse_Internal );
        }
    
        OTL_STRING_ENSURE( out, 1, parser );
        glyph    = out->glyphs + out->length;
        in_glyph = in->glyphs  + in->cursor;
    
        glyph->gindex        = gindex;
        glyph->property      = in_glyph->property;
        glyph->lig_component = in_glyph->lig_component;
        glyph->lig_id        = in_glyph->lig_id;
    
        out->length += 1;
        out->cursor  = out->length;
        in->cursor  += 1;
      }
    
      OTL_LOCALDEF( void )
      otl_parser_replace_n( OTL_Parser  parser,
                            OTL_UInt    count,
                            OTL_Bytes   indices )
      {
        OTL_UInt         lig_component, lig_id, property;
        OTL_String       in  = parser->str_in;
        OTL_String       out = parser->str_out;
        OTL_StringGlyph  glyph, in_glyph;
        OTL_Bytes        p = indices;
    
        /* sanity check */
        if ( in == NULL               ||
             out == NULL              ||
             in->length == 0          ||
             in->cursor >= in->length )
        {
          /* report as internal error, since these should */
          /* never happen !!                              */
          otl_parser_error( parser, OTL_Err_Parse_Internal );
        }
    
        OTL_STRING_ENSURE( out, count, parser );
        glyph    = out->glyphs + out->length;
        in_glyph = in->glyphs  + in->cursor;
    
        glyph->gindex = gindex;
    
        lig_component = in_glyph->lig_component;
        lig_id        = in_glyph->lid_id;
        property      = in_glyph->property;
    
        for ( ; count > 0; count-- )
        {
          glyph->gindex        = OTL_NEXT_USHORT(p);
          glyph->property      = property;
          glyph->lig_component = lig_component;
          glyph->lig_id        = lig_id;
    
          out->length ++;
        }
    
        out->cursor  = out->length;
        in->cursor  += 1;
      }