shithub: freetype+ttf2subf

ref: 7ce42f4443dc288eb187c189e4cd78721f3ca7bf
dir: /src/truetype/ttpload.c/

View raw version
/***************************************************************************/
/*                                                                         */
/*  ttpload.h                                                              */
/*                                                                         */
/*    TrueType glyph data/program tables loader (body).                    */
/*                                                                         */
/*  Copyright 1996-1999 by                                                 */
/*  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.                                        */
/*                                                                         */
/***************************************************************************/


#include <freetype/internal/ftdebug.h>
#include <freetype/internal/ftobjs.h>
#include <freetype/internal/ftstream.h>
#include <freetype/tttags.h>

#include <ttpload.h>
#include <tterrors.h>

#undef  FT_COMPONENT
#define FT_COMPONENT  trace_ttload

  /*************************************************************************/
  /*                                                                       */
  /* <Function>                                                            */
  /*    TT_Load_Locations                                                  */
  /*                                                                       */
  /* <Description>                                                         */
  /*    Loads the locations table.                                         */
  /*                                                                       */
  /* <Input>                                                               */
  /*    face   :: A handle to the target face object.                      */
  /*    stream :: The input stream.                                        */
  /*                                                                       */
  /* <Return>                                                              */
  /*    TrueType error code.  0 means success.                             */
  /*                                                                       */
  LOCAL_FUNC
  TT_Error  TT_Load_Locations( TT_Face    face,
                               FT_Stream  stream )
  {
    TT_Error   error;
    FT_Memory  memory = stream->memory;
    TT_Short   LongOffsets;
    TT_ULong   table_len;

    FT_TRACE2(( "Locations " ));
    LongOffsets = face->header.Index_To_Loc_Format;

    error = face->goto_table( face, TTAG_loca, stream, &table_len );
    if (error)
    {
      error = TT_Err_Locations_Missing;
      goto Exit;
    }

    if ( LongOffsets != 0 )
    {
      face->num_locations = (TT_UShort)(table_len >> 2);

      FT_TRACE2(( "(32 bits offsets): %12d ", face->num_locations ));

      if ( ALLOC_ARRAY( face->glyph_locations,
                        face->num_locations,
                        TT_Long ) )
        goto Exit;

      if ( ACCESS_Frame( face->num_locations * 4L ) )
        goto Exit;

      {
        TT_Long*  loc   = face->glyph_locations;
        TT_Long*  limit = loc + face->num_locations;

        for ( ; loc < limit; loc++ )
          *loc = GET_Long();
      }

      FORGET_Frame();
    }
    else
    {
      face->num_locations = (TT_UShort)(table_len >> 1);

      FT_TRACE2(( "(16 bits offsets): %12d ",
                   face->num_locations ));

      if ( ALLOC_ARRAY( face->glyph_locations,
                        face->num_locations,
                        TT_Long ) )
        goto Exit;

      if ( ACCESS_Frame( face->num_locations * 2L ) )
        goto Exit;
      {
        TT_Long*  loc   = face->glyph_locations;
        TT_Long*  limit = loc + face->num_locations;

        for ( ; loc < limit; loc++ )
          *loc = (TT_Long)((TT_ULong)GET_UShort() * 2);
      }
      FORGET_Frame();
    }

    FT_TRACE2(( "loaded\n" ));

  Exit:
    return error;
  }


  /*************************************************************************/
  /*                                                                       */
  /* <Function>                                                            */
  /*    TT_Load_CVT                                                        */
  /*                                                                       */
  /* <Description>                                                         */
  /*    Loads the control value table into a face object.                  */
  /*                                                                       */
  /* <Input>                                                               */
  /*    face   :: A handle to the target face object.                      */
  /*    stream :: A handle to the input stream.                            */
  /*                                                                       */
  /* <Return>                                                              */
  /*    TrueType error code.  0 means success.                             */
  /*                                                                       */
  LOCAL_FUNC
  TT_Error  TT_Load_CVT( TT_Face    face,
                         FT_Stream  stream )
  {
    TT_Error   error;
    FT_Memory  memory = stream->memory;
    TT_ULong   table_len;

    FT_TRACE2(( "CVT " ));

    error = face->goto_table( face, TTAG_cvt, stream, &table_len );
    if (error)
    {
      FT_TRACE2(( "is missing!\n" ));

      face->cvt_size = 0;
      face->cvt      = NULL;
      error          = TT_Err_Ok;

      goto Exit;
    }

    face->cvt_size = table_len / 2;

    if ( ALLOC_ARRAY( face->cvt,
                      face->cvt_size,
                      TT_Short ) )
      goto Exit;

    if ( ACCESS_Frame( face->cvt_size * 2L ) )
      goto Exit;

    {
      TT_Short*  cur   = face->cvt;
      TT_Short*  limit = cur + face->cvt_size;

      for ( ; cur <  limit; cur++ )
        *cur = GET_Short();
    }

    FORGET_Frame();
    FT_TRACE2(( "loaded\n" ));

  Exit:
    return error;
  }


  /*************************************************************************/
  /*                                                                       */
  /* <Function>                                                            */
  /*    TT_Load_Progams                                                    */
  /*                                                                       */
  /* <Description>                                                         */
  /*    Loads the font program and the cvt program.                        */
  /*                                                                       */
  /* <Input>                                                               */
  /*    face   :: A handle to the target face object.                      */
  /*    stream :: A handle to the input stream.                            */
  /*                                                                       */
  /* <Return>                                                              */
  /*    TrueType error code.  0 means success.                             */
  /*                                                                       */
  LOCAL_FUNC
  TT_Error  TT_Load_Programs( TT_Face    face,
                              FT_Stream  stream )
  {
    TT_Error   error;
    FT_Memory  memory = stream->memory;
    TT_ULong   table_len;


    FT_TRACE2(( "Font program " ));

    /* The font program is optional */
    error = face->goto_table( face, TTAG_fpgm, stream, &table_len );
    if ( error )
    {
      face->font_program      = NULL;
      face->font_program_size = 0;
      FT_TRACE2(( "is missing!\n" ));
    }
    else
    {
      face->font_program_size = table_len;

      if ( ALLOC( face->font_program,
                  face->font_program_size ) ||

           FILE_Read( (void*)face->font_program,
                      face->font_program_size )   )
        goto Exit;

      FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size ));
    }

    FT_TRACE2(( "Prep program " ));

    error = face->goto_table( face, TTAG_prep, stream, &table_len );
    if ( error )
    {
      face->cvt_program      = NULL;
      face->cvt_program_size = 0;
      error                  = TT_Err_Ok;

      FT_TRACE2(( "is missing!\n" ));
    }
    else
    {
      face->cvt_program_size = table_len;

      if ( ALLOC( face->cvt_program,
                  face->cvt_program_size )           ||

           FILE_Read( (void*)face->cvt_program,
                      face->cvt_program_size ) )
        return error;

      FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size ));
    }

  Exit:
    return error;
  }


/* END */