Blame src/ftglue.c

Packit 352660
/* ftglue.c: Glue code for compiling the OpenType code from
Packit 352660
 *           FreeType 1 using only the public API of FreeType 2
Packit 352660
 *
Packit 352660
 * By David Turner, The FreeType Project (www.freetype.org)
Packit 352660
 *
Packit 352660
 * This code is explicitely put in the public domain
Packit 352660
 *
Packit 352660
 * See ftglue.h for more information.
Packit 352660
 */
Packit 352660
Packit 352660
#include "ftglue.h"
Packit 352660
Packit 352660
#if 0
Packit 352660
#include <stdio.h>
Packit 352660
#define  LOG(x)  ftglue_log x
Packit 352660
Packit 352660
static void
Packit 352660
ftglue_log( const char*   format, ... )
Packit 352660
{
Packit 352660
  va_list  ap;
Packit 352660
Packit 352660
  va_start( ap, format );
Packit 352660
  vfprintf( stderr, format, ap );
Packit 352660
  va_end( ap );
Packit 352660
}
Packit 352660
Packit 352660
#else
Packit 352660
#define  LOG(x)  do {} while (0)
Packit 352660
#endif
Packit 352660
Packit 352660
/* only used internally */
Packit 352660
static FT_Pointer
Packit 352660
ftglue_qalloc( FT_Memory  memory,
Packit 352660
               FT_ULong   size,
Packit 352660
               FT_Error  *perror )
Packit 352660
{
Packit 352660
  FT_Error    error = 0;
Packit 352660
  FT_Pointer  block = NULL;
Packit 352660
Packit 352660
  if ( size > 0 )
Packit 352660
  {
Packit 352660
    block = memory->alloc( memory, size );
Packit 352660
    if ( !block )
Packit 352660
      error = FT_Err_Out_Of_Memory;
Packit 352660
  }
Packit 352660
Packit 352660
  *perror = error;
Packit 352660
  return block;
Packit 352660
}
Packit 352660
Packit 352660
#undef   QALLOC  /* just in case */
Packit 352660
#define  QALLOC(ptr,size)    ( (ptr) = ftglue_qalloc( memory, (size), &error ), error != 0 )
Packit 352660
#define  FREE(_ptr)                    \
Packit 352660
  do {                                 \
Packit 352660
    if ( (_ptr) )                      \
Packit 352660
    {                                  \
Packit 352660
      ftglue_free( memory, _ptr );     \
Packit 352660
      _ptr = NULL;                     \
Packit 352660
    }                                  \
Packit 352660
  } while (0)
Packit 352660
Packit 352660
Packit 352660
static void
Packit 352660
ftglue_free( FT_Memory   memory,
Packit 352660
             FT_Pointer  block )
Packit 352660
{
Packit 352660
  if ( block )
Packit 352660
    memory->free( memory, block );
Packit 352660
}
Packit 352660
Packit 352660
FTGLUE_APIDEF( FT_Long )
Packit 352660
ftglue_stream_pos( FT_Stream   stream )
Packit 352660
{
Packit 352660
  LOG(( "ftglue:stream:pos() -> %ld\n", stream->pos ));
Packit 352660
  return stream->pos;
Packit 352660
}
Packit 352660
Packit 352660
Packit 352660
FTGLUE_APIDEF( FT_Error )
Packit 352660
ftglue_stream_seek( FT_Stream   stream,
Packit 352660
                    FT_Long     pos )
Packit 352660
{
Packit 352660
  FT_Error  error = 0;
Packit 352660
Packit 352660
  if ( stream->read )
Packit 352660
  {
Packit 352660
    if ( stream->read( stream, pos, 0, 0 ) )
Packit 352660
      error = FT_Err_Invalid_Stream_Operation;
Packit 352660
  }
Packit 352660
  else if ( pos < 0 || (FT_ULong) pos > stream->size )
Packit 352660
    error = FT_Err_Invalid_Stream_Operation;
Packit 352660
Packit 352660
  if ( !error )
Packit 352660
    stream->pos = pos;
Packit 352660
  LOG(( "ftglue:stream:seek(%ld) -> %d\n", pos, error ));
Packit 352660
  return error;
Packit 352660
}
Packit 352660
Packit 352660
Packit 352660
FTGLUE_APIDEF( FT_Error )
Packit 352660
ftglue_stream_frame_enter( FT_Stream   stream,
Packit 352660
                           FT_ULong    count )
Packit 352660
{
Packit 352660
  FT_Error  error = FT_Err_Ok;
Packit 352660
  FT_ULong  read_bytes;
Packit 352660
Packit 352660
  if ( stream->read )
Packit 352660
  {
Packit 352660
    /* allocate the frame in memory */
Packit 352660
    FT_Memory  memory = stream->memory;
Packit 352660
Packit 352660
Packit 352660
    if ( QALLOC( stream->base, count ) )
Packit 352660
      goto Exit;
Packit 352660
Packit 352660
    /* read it */
Packit 352660
    read_bytes = stream->read( stream, stream->pos,
Packit 352660
                               stream->base, count );
Packit 352660
    if ( read_bytes < count )
Packit 352660
    {
Packit 352660
      FREE( stream->base );
Packit 352660
      error = FT_Err_Invalid_Stream_Operation;
Packit 352660
    }
Packit 352660
    stream->cursor = stream->base;
Packit 352660
    stream->limit  = stream->cursor + count;
Packit 352660
    stream->pos   += read_bytes;
Packit 352660
  }
Packit 352660
  else
Packit 352660
  {
Packit 352660
    /* check current and new position */
Packit 352660
    if ( stream->pos >= stream->size        ||
Packit 352660
         stream->pos + count > stream->size )
Packit 352660
    {
Packit 352660
      error = FT_Err_Invalid_Stream_Operation;
Packit 352660
      goto Exit;
Packit 352660
    }
Packit 352660
Packit 352660
    /* set cursor */
Packit 352660
    stream->cursor = stream->base + stream->pos;
Packit 352660
    stream->limit  = stream->cursor + count;
Packit 352660
    stream->pos   += count;
Packit 352660
  }
Packit 352660
Packit 352660
Exit:
Packit 352660
  LOG(( "ftglue:stream:frame_enter(%ld) -> %d\n", count, error ));
Packit 352660
  return error;
Packit 352660
}
Packit 352660
Packit 352660
Packit 352660
FTGLUE_APIDEF( void )
Packit 352660
ftglue_stream_frame_exit( FT_Stream  stream )
Packit 352660
{
Packit 352660
  if ( stream->read )
Packit 352660
  {
Packit 352660
    FT_Memory  memory = stream->memory;
Packit 352660
Packit 352660
    FREE( stream->base );
Packit 352660
  }
Packit 352660
  stream->cursor = 0;
Packit 352660
  stream->limit  = 0;
Packit 352660
Packit 352660
  LOG(( "ftglue:stream:frame_exit()\n" ));
Packit 352660
}
Packit 352660
Packit 352660
Packit 352660
FTGLUE_APIDEF( FT_Error )
Packit 352660
ftglue_face_goto_table( FT_Face    face,
Packit 352660
                        FT_ULong   the_tag,
Packit 352660
                        FT_Stream  stream )
Packit 352660
{
Packit 352660
  FT_Error  error;
Packit 352660
Packit 352660
  LOG(( "ftglue_face_goto_table( %p, %c%c%c%c, %p )\n",
Packit 352660
                face,
Packit 352660
                (int)((the_tag >> 24) & 0xFF),
Packit 352660
                (int)((the_tag >> 16) & 0xFF),
Packit 352660
                (int)((the_tag >> 8) & 0xFF),
Packit 352660
                (int)(the_tag & 0xFF),
Packit 352660
                stream ));
Packit 352660
Packit 352660
  if ( !FT_IS_SFNT(face) )
Packit 352660
  {
Packit 352660
    LOG(( "not a SFNT face !!\n" ));
Packit 352660
    error = FT_Err_Invalid_Face_Handle;
Packit 352660
  }
Packit 352660
  else
Packit 352660
  {
Packit 352660
   /* parse the directory table directly, without using
Packit 352660
    * FreeType's built-in data structures
Packit 352660
    */
Packit 352660
    FT_ULong  offset = 0, sig;
Packit 352660
    FT_UInt   count, nn;
Packit 352660
Packit 352660
    if ( FILE_Seek( 0 ) || ACCESS_Frame( 4 ) )
Packit 352660
      goto Exit;
Packit 352660
Packit 352660
    sig = GET_Tag4();
Packit 352660
Packit 352660
    FORGET_Frame();
Packit 352660
Packit 352660
    if ( sig == FT_MAKE_TAG( 't', 't', 'c', 'f' ) )
Packit 352660
    {
Packit 352660
      /* deal with TrueType collections */
Packit 352660
Packit 352660
      LOG(( ">> This is a TrueType Collection\n" ));
Packit 352660
Packit 352660
      if ( FILE_Seek( 12 + face->face_index*4 ) ||
Packit 352660
           ACCESS_Frame( 4 )                    )
Packit 352660
        goto Exit;
Packit 352660
Packit 352660
      offset = GET_ULong();
Packit 352660
Packit 352660
      FORGET_Frame();
Packit 352660
    }
Packit 352660
Packit 352660
    LOG(( "TrueType offset = %ld\n", offset ));
Packit 352660
Packit 352660
    if ( FILE_Seek( offset+4 ) ||
Packit 352660
         ACCESS_Frame( 2 )     )
Packit 352660
      goto Exit;
Packit 352660
Packit 352660
    count = GET_UShort();
Packit 352660
Packit 352660
    FORGET_Frame();
Packit 352660
Packit 352660
    if ( FILE_Seek( offset+12 )   ||
Packit 352660
         ACCESS_Frame( count*16 ) )
Packit 352660
      goto Exit;
Packit 352660
Packit 352660
    for ( nn = 0; nn < count; nn++ )
Packit 352660
    {
Packit 352660
      FT_ULong  tag      = GET_ULong();
Packit 352660
      FT_ULong  checksum = GET_ULong();
Packit 352660
      FT_ULong  start    = GET_ULong();
Packit 352660
      FT_ULong  size     = GET_ULong();
Packit 352660
Packit 352660
      FT_UNUSED(checksum);
Packit 352660
      FT_UNUSED(size);
Packit 352660
Packit 352660
      if ( tag == the_tag )
Packit 352660
      {
Packit 352660
        LOG(( "TrueType table (start: %ld) (size: %ld)\n", start, size ));
Packit 352660
        error = ftglue_stream_seek( stream, start );
Packit 352660
        goto FoundIt;
Packit 352660
      }
Packit 352660
    }
Packit 352660
    error = FT_Err_Table_Missing;
Packit 352660
Packit 352660
  FoundIt:
Packit 352660
    FORGET_Frame();
Packit 352660
  }
Packit 352660
Packit 352660
Exit:
Packit 352660
  LOG(( "TrueType error=%d\n", error ));
Packit 352660
Packit 352660
  return error;
Packit 352660
}
Packit 352660
Packit 352660
#undef QALLOC
Packit 352660
#include "fcaliastail.h"
Packit 352660
#undef __ftglue__