Some more cleanup and merging.

2007-11-07  Behdad Esfahbod  <behdad@gnome.org>

        * pango/opentype/*: Some more cleanup and merging.
This commit is contained in:
Behdad Esfahbod 2007-11-07 08:06:01 +00:00 committed by Behdad Esfahbod
parent 5c9bd37995
commit 78ef65ba08
18 changed files with 419 additions and 372 deletions

View File

@ -16,7 +16,8 @@ INCLUDEDSOURCES = \
harfbuzz-gpos.c \ harfbuzz-gpos.c \
harfbuzz-gsub.c \ harfbuzz-gsub.c \
harfbuzz-impl.c \ harfbuzz-impl.c \
harfbuzz-open.c harfbuzz-open.c \
harfbuzz-stream.c
PUBLICHEADERS = \ PUBLICHEADERS = \
harfbuzz.h \ harfbuzz.h \
@ -33,7 +34,8 @@ PRIVATEHEADERS = \
harfbuzz-gdef-private.h \ harfbuzz-gdef-private.h \
harfbuzz-gpos-private.h \ harfbuzz-gpos-private.h \
harfbuzz-gsub-private.h \ harfbuzz-gsub-private.h \
harfbuzz-open-private.h harfbuzz-open-private.h \
harfbuzz-stream-private.h
libharfbuzz_1_la_SOURCES = \ libharfbuzz_1_la_SOURCES = \
$(MAINSOURCES) \ $(MAINSOURCES) \

View File

@ -55,6 +55,39 @@ _hb_buffer_replace_output_glyph ( HB_Buffer buffer,
HB_INTERNAL HB_UShort HB_INTERNAL HB_UShort
_hb_buffer_allocate_ligid( HB_Buffer buffer ); _hb_buffer_allocate_ligid( HB_Buffer buffer );
/* convenience macros */
#define IN_GLYPH( pos ) (buffer->in_string[(pos)].gindex)
#define IN_ITEM( pos ) (&buffer->in_string[(pos)])
#define IN_CURGLYPH() (buffer->in_string[buffer->in_pos].gindex)
#define IN_CURITEM() (&buffer->in_string[buffer->in_pos])
#define IN_PROPERTIES( pos ) (buffer->in_string[(pos)].properties)
#define IN_LIGID( pos ) (buffer->in_string[(pos)].ligID)
#define IN_COMPONENT( pos ) (buffer->in_string[(pos)].component)
#define POSITION( pos ) (&buffer->positions[(pos)])
#define OUT_GLYPH( pos ) (buffer->out_string[(pos)].gindex)
#define OUT_ITEM( pos ) (&buffer->out_string[(pos)])
#define CHECK_Property( gdef, index, flags, property ) \
( ( error = _HB_GDEF_Check_Property( (gdef), (index), (flags), \
(property) ) ) != HB_Err_Ok )
#define ADD_String( buffer, num_in, num_out, glyph_data, component, ligID ) \
( ( error = _hb_buffer_add_output_glyphs( (buffer), \
(num_in), (num_out), \
(glyph_data), (component), (ligID) \
) ) != HB_Err_Ok )
#define ADD_Glyph( buffer, glyph_index, component, ligID ) \
( ( error = _hb_buffer_add_output_glyph( (buffer), \
(glyph_index), (component), (ligID) \
) ) != HB_Err_Ok )
#define REPLACE_Glyph( buffer, glyph_index, nesting_level ) \
( ( error = _hb_buffer_replace_output_glyph( (buffer), (glyph_index), \
(nesting_level) == 1 ) ) != HB_Err_Ok )
#define COPY_Glyph( buffer ) \
( (error = _hb_buffer_copy_output_glyph ( buffer ) ) != HB_Err_Ok )
HB_END_HEADER HB_END_HEADER
#endif /* HARFBUZZ_BUFFER_PRIVATE_H */ #endif /* HARFBUZZ_BUFFER_PRIVATE_H */

View File

@ -21,8 +21,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "harfbuzz-open.h" #include "harfbuzz.h"
#include "harfbuzz-dump.h" #include "harfbuzz-dump.h"
#define N_ELEMENTS(arr) (sizeof(arr)/ sizeof((arr)[0])) #define N_ELEMENTS(arr) (sizeof(arr)/ sizeof((arr)[0]))

View File

@ -14,8 +14,9 @@
#define HARFBUZZ_GDEF_PRIVATE_H #define HARFBUZZ_GDEF_PRIVATE_H
#include "harfbuzz-impl.h" #include "harfbuzz-impl.h"
#include "harfbuzz-stream-private.h"
#include "harfbuzz-buffer-private.h"
#include "harfbuzz-gdef.h" #include "harfbuzz-gdef.h"
#include "harfbuzz-buffer.h"
HB_BEGIN_HEADER HB_BEGIN_HEADER
@ -99,6 +100,12 @@ _HB_GDEF_Check_Property( HB_GDEFHeader* gdef,
HB_UShort flags, HB_UShort flags,
HB_UShort* property ); HB_UShort* property );
HB_INTERNAL HB_Error
_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef,
HB_Stream input,
HB_Lookup* lo,
HB_UShort num_lookups );
HB_END_HEADER HB_END_HEADER
#endif /* HARFBUZZ_GDEF_PRIVATE_H */ #endif /* HARFBUZZ_GDEF_PRIVATE_H */

View File

@ -1200,5 +1200,44 @@ _HB_GDEF_Check_Property( HB_GDEFHeader* gdef,
return HB_Err_Ok; return HB_Err_Ok;
} }
HB_INTERNAL HB_Error
_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef,
HB_Stream stream,
HB_Lookup* lo,
HB_UShort num_lookups)
{
HB_Error error = HB_Err_Ok;
HB_UShort i;
/* We now check the LookupFlags for values larger than 0xFF to find
out whether we need to load the `MarkAttachClassDef' field of the
GDEF table -- this hack is necessary for OpenType 1.2 tables since
the version field of the GDEF table hasn't been incremented.
For constructed GDEF tables, we only load it if
`MarkAttachClassDef_offset' is not zero (nevertheless, a build of
a constructed mark attach table is not supported currently). */
if ( gdef &&
gdef->MarkAttachClassDef_offset && !gdef->MarkAttachClassDef.loaded )
{
for ( i = 0; i < num_lookups; i++ )
{
if ( lo[i].LookupFlag & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
{
if ( FILE_Seek( gdef->MarkAttachClassDef_offset ) ||
( error = _HB_OPEN_Load_ClassDefinition( &gdef->MarkAttachClassDef,
256, stream ) ) != HB_Err_Ok )
goto Done;
break;
}
}
}
Done:
return error;
}
/* END */ /* END */

View File

@ -26,6 +26,8 @@
HB_BEGIN_HEADER HB_BEGIN_HEADER
#define HB_MAKE_TAG(a,b,c,d) FT_MAKE_TAG(a,b,c,d)
typedef unsigned char HB_Byte; typedef unsigned char HB_Byte;
typedef signed char HB_Char; typedef signed char HB_Char;
typedef unsigned short HB_UShort; typedef unsigned short HB_UShort;

View File

@ -14,6 +14,7 @@
#define HARFBUZZ_GPOS_PRIVATE_H #define HARFBUZZ_GPOS_PRIVATE_H
#include "harfbuzz-impl.h" #include "harfbuzz-impl.h"
#include "harfbuzz-stream-private.h"
#include "harfbuzz-gpos.h" #include "harfbuzz-gpos.h"
HB_BEGIN_HEADER HB_BEGIN_HEADER

View File

@ -64,9 +64,7 @@ HB_Error HB_Load_GPOS_Table( FT_Face face,
{ {
HB_UInt cur_offset, new_offset, base_offset; HB_UInt cur_offset, new_offset, base_offset;
HB_UShort i, num_lookups;
HB_GPOSHeader* gpos; HB_GPOSHeader* gpos;
HB_Lookup* lo;
HB_Stream stream = face->stream; HB_Stream stream = face->stream;
HB_Error error; HB_Error error;
@ -132,35 +130,11 @@ HB_Error HB_Load_GPOS_Table( FT_Face face,
gpos->gdef = gdef; /* can be NULL */ gpos->gdef = gdef; /* can be NULL */
/* We now check the LookupFlags for values larger than 0xFF to find if ( ( error = _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( gdef, stream,
out whether we need to load the `MarkAttachClassDef' field of the gpos->LookupList.Lookup,
GDEF table -- this hack is necessary for OpenType 1.2 tables since gpos->LookupList.LookupCount ) ) )
the version field of the GDEF table hasn't been incremented.
For constructed GDEF tables, we only load it if
`MarkAttachClassDef_offset' is not zero (nevertheless, a build of
a constructed mark attach table is not supported currently). */
if ( gdef &&
gdef->MarkAttachClassDef_offset && !gdef->MarkAttachClassDef.loaded )
{
lo = gpos->LookupList.Lookup;
num_lookups = gpos->LookupList.LookupCount;
for ( i = 0; i < num_lookups; i++ )
{
if ( lo[i].LookupFlag & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
{
if ( FILE_Seek( gdef->MarkAttachClassDef_offset ) ||
( error = _HB_OPEN_Load_ClassDefinition( &gdef->MarkAttachClassDef,
256, stream ) ) != HB_Err_Ok )
goto Fail1; goto Fail1;
break;
}
}
}
*retptr = gpos; *retptr = gpos;
return HB_Err_Ok; return HB_Err_Ok;

View File

@ -14,6 +14,7 @@
#define HARFBUZZ_GSUB_PRIVATE_H #define HARFBUZZ_GSUB_PRIVATE_H
#include "harfbuzz-impl.h" #include "harfbuzz-impl.h"
#include "harfbuzz-stream-private.h"
#include "harfbuzz-gsub.h" #include "harfbuzz-gsub.h"
HB_BEGIN_HEADER HB_BEGIN_HEADER

View File

@ -38,9 +38,7 @@ HB_Error HB_Load_GSUB_Table( FT_Face face,
HB_Error error; HB_Error error;
HB_UInt cur_offset, new_offset, base_offset; HB_UInt cur_offset, new_offset, base_offset;
HB_UShort i, num_lookups;
HB_GSUBHeader* gsub; HB_GSUBHeader* gsub;
HB_Lookup* lo;
if ( !retptr ) if ( !retptr )
return ERR(HB_Err_Invalid_Argument); return ERR(HB_Err_Invalid_Argument);
@ -100,36 +98,11 @@ HB_Error HB_Load_GSUB_Table( FT_Face face,
gsub->gdef = gdef; /* can be NULL */ gsub->gdef = gdef; /* can be NULL */
/* We now check the LookupFlags for values larger than 0xFF to find if ( ( error = _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( gdef, stream,
out whether we need to load the `MarkAttachClassDef' field of the gsub->LookupList.Lookup,
GDEF table -- this hack is necessary for OpenType 1.2 tables since gsub->LookupList.LookupCount ) ) )
the version field of the GDEF table hasn't been incremented.
For constructed GDEF tables, we only load it if
`MarkAttachClassDef_offset' is not zero (nevertheless, a build of
a constructed mark attach table is not supported currently). */
if ( gdef &&
gdef->MarkAttachClassDef_offset && !gdef->MarkAttachClassDef.loaded )
{
lo = gsub->LookupList.Lookup;
num_lookups = gsub->LookupList.LookupCount;
for ( i = 0; i < num_lookups; i++ )
{
if ( lo[i].LookupFlag & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
{
if ( FILE_Seek( gdef->MarkAttachClassDef_offset ) ||
( error = _HB_OPEN_Load_ClassDefinition( &gdef->MarkAttachClassDef,
256, stream ) ) != HB_Err_Ok )
goto Fail1; goto Fail1;
break;
}
}
}
*retptr = gsub; *retptr = gsub;
return HB_Err_Ok; return HB_Err_Ok;

View File

@ -1,9 +1,14 @@
/* /*******************************************************************
* By David Turner, The FreeType Project (www.freetype.org)
* *
* This code is explicitely put in the public domain * Copyright 2005 David Turner, The FreeType Project (www.freetype.org)
*/ * Copyright 2007 Trolltech ASA
* Copyright 2007 Red Hat, Inc
*
* This is part of HarfBuzz, an OpenType Layout engine library.
*
* See the file name COPYING for licensing information.
*
******************************************************************/
#include "harfbuzz-impl.h" #include "harfbuzz-impl.h"
#if 0 #if 0
@ -24,28 +29,6 @@ _hb_log( const char* format, ... )
#define LOG(x) do {} while (0) #define LOG(x) do {} while (0)
#endif #endif
/* only used internally */
static HB_Pointer
_hb_qalloc( HB_UInt size,
HB_Error *perror )
{
HB_Error error = 0;
HB_Pointer block = NULL;
if ( size > 0 )
{
block = malloc( size );
if ( !block )
error = ERR(HB_Err_Out_Of_Memory);
}
*perror = error;
return block;
}
#undef QALLOC /* just in case */
#define QALLOC(ptr,size) ( (ptr) = _hb_qalloc( (size), &error ), error != 0 )
HB_INTERNAL HB_Pointer HB_INTERNAL HB_Pointer
_hb_alloc( HB_UInt size, _hb_alloc( HB_UInt size,
@ -96,185 +79,6 @@ _hb_free( HB_Pointer block )
} }
HB_INTERNAL HB_Int
_hb_stream_pos( HB_Stream stream )
{
LOG(( "_hb_stream_pos() -> %ld\n", stream->pos ));
return stream->pos;
}
HB_INTERNAL HB_Error
_hb_stream_seek( HB_Stream stream,
HB_Int pos )
{
HB_Error error = 0;
stream->pos = pos;
if ( stream->read )
{
if ( stream->read( stream, pos, NULL, 0 ) )
error = ERR(HB_Err_Read_Error);
}
else if ( pos > (HB_Int)stream->size )
error = ERR(HB_Err_Read_Error);
LOG(( "_hb_stream_seek(%ld) -> %d\n", pos, error ));
return error;
}
HB_INTERNAL HB_Error
_hb_stream_frame_enter( HB_Stream stream,
HB_UInt count )
{
HB_Error error = HB_Err_Ok;
HB_UInt read_bytes;
if ( stream->read )
{
/* allocate the frame in memory */
if ( QALLOC( stream->base, count ) )
goto Exit;
/* read it */
read_bytes = stream->read( stream, stream->pos,
stream->base, count );
if ( read_bytes < count )
{
FREE( stream->base );
error = ERR(HB_Err_Read_Error);
}
stream->cursor = stream->base;
stream->limit = stream->cursor + count;
stream->pos += read_bytes;
}
else
{
/* check current and new position */
if ( stream->pos >= stream->size ||
stream->pos + count > stream->size )
{
error = ERR(HB_Err_Read_Error);
goto Exit;
}
/* set cursor */
stream->cursor = stream->base + stream->pos;
stream->limit = stream->cursor + count;
stream->pos += count;
}
Exit:
LOG(( "_hb_stream_frame_enter(%ld) -> %d\n", count, error ));
return error;
}
HB_INTERNAL void
_hb_stream_frame_exit( HB_Stream stream )
{
if ( stream->read )
{
FREE( stream->base );
}
stream->cursor = NULL;
stream->limit = NULL;
LOG(( "_hb_stream_frame_exit()\n" ));
}
HB_INTERNAL HB_Error
_hb_face_goto_table( FT_Face face,
HB_UInt the_tag,
HB_Stream stream )
{
HB_Error error;
LOG(( "_hb_face_goto_table( %p, %c%c%c%c, %p )\n",
face,
(int)((the_tag >> 24) & 0xFF),
(int)((the_tag >> 16) & 0xFF),
(int)((the_tag >> 8) & 0xFF),
(int)(the_tag & 0xFF),
stream ));
if ( !FT_IS_SFNT(face) )
{
LOG(( "not a SFNT face !!\n" ));
error = ERR(HB_Err_Invalid_Argument);
}
else
{
/* parse the directory table directly, without using
* FreeType's built-in data structures
*/
HB_UInt offset = 0;
HB_UInt count, nn;
if ( face->num_faces > 1 )
{
/* deal with TrueType collections */
LOG(( ">> This is a TrueType Collection\n" ));
if ( FILE_Seek( 12 + face->face_index*4 ) ||
ACCESS_Frame( 4 ) )
goto Exit;
offset = GET_ULong();
FORGET_Frame();
}
LOG(( "TrueType offset = %ld\n", offset ));
if ( FILE_Seek( offset+4 ) ||
ACCESS_Frame( 2 ) )
goto Exit;
count = GET_UShort();
FORGET_Frame();
if ( FILE_Seek( offset+12 ) ||
ACCESS_Frame( count*16 ) )
goto Exit;
for ( nn = 0; nn < count; nn++ )
{
HB_UInt tag = GET_ULong();
HB_UInt checksum = GET_ULong();
HB_UInt start = GET_ULong();
HB_UInt size = GET_ULong();
HB_UNUSED(checksum);
HB_UNUSED(size);
if ( tag == the_tag )
{
LOG(( "TrueType table (start: %ld) (size: %ld)\n", start, size ));
error = _hb_stream_seek( stream, start );
goto FoundIt;
}
}
error = HB_Err_Not_Covered;
FoundIt:
FORGET_Frame();
}
Exit:
LOG(( "TrueType error=%d\n", error ));
return error;
}
#undef QALLOC
/* abuse these private header/source files */
/* helper func to set a breakpoint on */ /* helper func to set a breakpoint on */
HB_INTERNAL HB_Error HB_INTERNAL HB_Error
_hb_err (HB_Error code) _hb_err (HB_Error code)

View File

@ -21,17 +21,6 @@
HB_BEGIN_HEADER HB_BEGIN_HEADER
/***********************************************************************/
/************************ remaining freetype bits **********************/
/***********************************************************************/
typedef FT_Stream HB_Stream;
#define HB_MAKE_TAG(a,b,c,d) FT_MAKE_TAG(a,b,c,d)
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/
#ifndef HB_INTERNAL #ifndef HB_INTERNAL
# define HB_INTERNAL # define HB_INTERNAL
#endif #endif
@ -68,55 +57,6 @@ typedef FT_Stream HB_Stream;
#define ARRAY_LEN(Array) ((int)(sizeof (Array) / sizeof (Array)[0])) #define ARRAY_LEN(Array) ((int)(sizeof (Array) / sizeof (Array)[0]))
/* memory and stream management */
#define SET_ERR(c) ( (error = (c)) != 0 )
/* stream macros used by the OpenType parser */
#define GOTO_Table(tag) SET_ERR( _hb_face_goto_table( face, tag, stream ) )
#define FILE_Pos() _hb_stream_pos( stream )
#define FILE_Seek(pos) SET_ERR( _hb_stream_seek( stream, pos ) )
#define ACCESS_Frame(size) SET_ERR( _hb_stream_frame_enter( stream, size ) )
#define FORGET_Frame() _hb_stream_frame_exit( stream )
#define GET_Byte() (*stream->cursor++)
#define GET_Short() (stream->cursor += 2, (HB_Short)( \
(*(((HB_Byte*)stream->cursor)-2) << 8) | \
*(((HB_Byte*)stream->cursor)-1) \
))
#define GET_Long() (stream->cursor += 4, (HB_Int)( \
(*(((HB_Byte*)stream->cursor)-4) << 24) | \
(*(((HB_Byte*)stream->cursor)-3) << 16) | \
(*(((HB_Byte*)stream->cursor)-2) << 8) | \
*(((HB_Byte*)stream->cursor)-1) \
))
#define GET_Char() ((HB_Char)GET_Byte())
#define GET_UShort() ((HB_UShort)GET_Short())
#define GET_ULong() ((HB_UInt)GET_Long())
#define GET_Tag4() GET_ULong()
HB_INTERNAL HB_Int
_hb_stream_pos( HB_Stream stream );
HB_INTERNAL HB_Error
_hb_stream_seek( HB_Stream stream,
HB_Int pos );
HB_INTERNAL HB_Error
_hb_stream_frame_enter( HB_Stream stream,
HB_UInt size );
HB_INTERNAL void
_hb_stream_frame_exit( HB_Stream stream );
HB_INTERNAL HB_Error
_hb_face_goto_table( FT_Face face,
HB_UInt tag,
HB_Stream stream );
#define ALLOC(_ptr,_size) \ #define ALLOC(_ptr,_size) \
( (_ptr) = _hb_alloc( _size, &error ), error != 0 ) ( (_ptr) = _hb_alloc( _size, &error ), error != 0 )
@ -161,38 +101,6 @@ HB_INTERNAL HB_Error
_hb_err (HB_Error code); _hb_err (HB_Error code);
/* buffer access macros */
#define IN_GLYPH( pos ) (buffer->in_string[(pos)].gindex)
#define IN_ITEM( pos ) (&buffer->in_string[(pos)])
#define IN_CURGLYPH() (buffer->in_string[buffer->in_pos].gindex)
#define IN_CURITEM() (&buffer->in_string[buffer->in_pos])
#define IN_PROPERTIES( pos ) (buffer->in_string[(pos)].properties)
#define IN_LIGID( pos ) (buffer->in_string[(pos)].ligID)
#define IN_COMPONENT( pos ) (buffer->in_string[(pos)].component)
#define POSITION( pos ) (&buffer->positions[(pos)])
#define OUT_GLYPH( pos ) (buffer->out_string[(pos)].gindex)
#define OUT_ITEM( pos ) (&buffer->out_string[(pos)])
#define CHECK_Property( gdef, index, flags, property ) \
( ( error = _HB_GDEF_Check_Property( (gdef), (index), (flags), \
(property) ) ) != HB_Err_Ok )
#define ADD_String( buffer, num_in, num_out, glyph_data, component, ligID ) \
( ( error = _hb_buffer_add_output_glyphs( (buffer), \
(num_in), (num_out), \
(glyph_data), (component), (ligID) \
) ) != HB_Err_Ok )
#define ADD_Glyph( buffer, glyph_index, component, ligID ) \
( ( error = _hb_buffer_add_output_glyph( (buffer), \
(glyph_index), (component), (ligID) \
) ) != HB_Err_Ok )
#define REPLACE_Glyph( buffer, glyph_index, nesting_level ) \
( ( error = _hb_buffer_replace_output_glyph( (buffer), (glyph_index), \
(nesting_level) == 1 ) ) != HB_Err_Ok )
#define COPY_Glyph( buffer ) \
( (error = _hb_buffer_copy_output_glyph ( buffer ) ) != HB_Err_Ok )
HB_END_HEADER HB_END_HEADER
#endif /* HARFBUZZ_IMPL_H */ #endif /* HARFBUZZ_IMPL_H */

View File

@ -33,7 +33,7 @@ struct HB_SubTable_
HB_INTERNAL HB_Error HB_INTERNAL HB_Error
_HB_OPEN_Load_ScriptList( HB_ScriptList* sl, _HB_OPEN_Load_ScriptList( HB_ScriptList* sl,
HB_Stream stream ); HB_Stream input );
HB_INTERNAL HB_Error HB_INTERNAL HB_Error
_HB_OPEN_Load_FeatureList( HB_FeatureList* fl, _HB_OPEN_Load_FeatureList( HB_FeatureList* fl,
HB_Stream input ); HB_Stream input );
@ -54,7 +54,7 @@ _HB_OPEN_Load_EmptyOrClassDefinition( HB_ClassDefinition* cd,
HB_UShort limit, HB_UShort limit,
HB_UInt class_offset, HB_UInt class_offset,
HB_UInt base_offset, HB_UInt base_offset,
HB_Stream stream ); HB_Stream input );
HB_INTERNAL HB_Error HB_INTERNAL HB_Error
_HB_OPEN_Load_Device( HB_Device* d, _HB_OPEN_Load_Device( HB_Device* d,
HB_Stream input ); HB_Stream input );

View File

@ -0,0 +1,70 @@
/*******************************************************************
*
* Copyright 1996-2000 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* Copyright 2006 Behdad Esfahbod
*
* This is part of HarfBuzz, an OpenType Layout engine library.
*
* See the file name COPYING for licensing information.
*
******************************************************************/
#ifndef HARFBUZZ_STREAM_PRIVATE_H
#define HARFBUZZ_STREAM_PRIVATE_H
#include "harfbuzz-impl.h"
HB_BEGIN_HEADER
typedef FT_Stream HB_Stream;
HB_INTERNAL HB_Int
_hb_stream_pos( HB_Stream stream );
HB_INTERNAL HB_Error
_hb_stream_seek( HB_Stream stream,
HB_UInt pos );
HB_INTERNAL HB_Error
_hb_stream_frame_enter( HB_Stream stream,
HB_UInt size );
HB_INTERNAL void
_hb_stream_frame_exit( HB_Stream stream );
HB_INTERNAL HB_Error
_hb_face_goto_table( FT_Face face,
HB_UInt tag );
/* convenience macros */
#define SET_ERR(c) ( (error = (c)) != 0 )
#define GOTO_Table(tag) SET_ERR( _hb_face_goto_table( face, tag ) )
#define FILE_Pos() _hb_stream_pos( stream )
#define FILE_Seek(pos) SET_ERR( _hb_stream_seek( stream, pos ) )
#define ACCESS_Frame(size) SET_ERR( _hb_stream_frame_enter( stream, size ) )
#define FORGET_Frame() _hb_stream_frame_exit( stream )
#define GET_Byte() (*stream->cursor++)
#define GET_Short() (stream->cursor += 2, (HB_Short)( \
(*(((HB_Byte*)stream->cursor)-2) << 8) | \
*(((HB_Byte*)stream->cursor)-1) \
))
#define GET_Long() (stream->cursor += 4, (HB_Int)( \
(*(((HB_Byte*)stream->cursor)-4) << 24) | \
(*(((HB_Byte*)stream->cursor)-3) << 16) | \
(*(((HB_Byte*)stream->cursor)-2) << 8) | \
*(((HB_Byte*)stream->cursor)-1) \
))
#define GET_Char() ((HB_Char)GET_Byte())
#define GET_UShort() ((HB_UShort)GET_Short())
#define GET_ULong() ((HB_UInt)GET_Long())
#define GET_Tag4() GET_ULong()
HB_END_HEADER
#endif /* HARFBUZZ_STREAM_PRIVATE_H */

234
src/harfbuzz-stream.c Normal file
View File

@ -0,0 +1,234 @@
/*******************************************************************
*
* Copyright 2005 David Turner, The FreeType Project (www.freetype.org)
* Copyright 2007 Trolltech ASA
* Copyright 2007 Red Hat, Inc
*
* This is part of HarfBuzz, an OpenType Layout engine library.
*
* See the file name COPYING for licensing information.
*
******************************************************************/
#include "harfbuzz-impl.h"
#include "harfbuzz-stream-private.h"
#include <stdlib.h>
#if 0
#include <stdio.h>
#define LOG(x) _hb_log x
static void
_hb_log( const char* format, ... )
{
va_list ap;
va_start( ap, format );
vfprintf( stderr, format, ap );
va_end( ap );
}
#else
#define LOG(x) do {} while (0)
#endif
/* only used internally */
static HB_Pointer
_hb_qalloc( HB_UInt size,
HB_Error *perror )
{
HB_Error error = 0;
HB_Pointer block = NULL;
if ( size > 0 )
{
block = malloc( size );
if ( !block )
error = ERR(HB_Err_Out_Of_Memory);
}
*perror = error;
return block;
}
#undef QALLOC /* just in case */
#define QALLOC(ptr,size) ( (ptr) = _hb_qalloc( (size), &error ), error != 0 )
HB_INTERNAL HB_Int
_hb_stream_pos( HB_Stream stream )
{
LOG(( "_hb_stream_pos() -> %ld\n", stream->pos ));
return stream->pos;
}
HB_INTERNAL HB_Error
_hb_stream_seek( HB_Stream stream,
HB_UInt pos )
{
HB_Error error = 0;
stream->pos = pos;
if ( stream->read )
{
if ( stream->read( stream, pos, NULL, 0 ) )
error = ERR(HB_Err_Read_Error);
}
else if ( pos > stream->size )
error = ERR(HB_Err_Read_Error);
LOG(( "_hb_stream_seek(%ld) -> 0x%04X\n", pos, error ));
return error;
}
HB_INTERNAL HB_Error
_hb_stream_frame_enter( HB_Stream stream,
HB_UInt count )
{
HB_Error error = HB_Err_Ok;
HB_UInt read_bytes;
if ( stream->read )
{
/* allocate the frame in memory */
if ( QALLOC( stream->base, count ) )
goto Exit;
/* read it */
read_bytes = stream->read( stream, stream->pos,
stream->base, count );
if ( read_bytes < count )
{
FREE( stream->base );
error = ERR(HB_Err_Read_Error);
}
stream->cursor = stream->base;
stream->limit = stream->cursor + count;
stream->pos += read_bytes;
}
else
{
/* check new position, watch for overflow */
if (HB_UNLIKELY (stream->pos + count > stream->size ||
stream->pos + count < stream->pos))
{
error = ERR(HB_Err_Read_Error);
goto Exit;
}
/* set cursor */
stream->cursor = stream->base + stream->pos;
stream->limit = stream->cursor + count;
stream->pos += count;
}
Exit:
LOG(( "_hb_stream_frame_enter(%ld) -> 0x%04X\n", count, error ));
return error;
}
HB_INTERNAL void
_hb_stream_frame_exit( HB_Stream stream )
{
if ( stream->read )
{
FREE( stream->base );
}
stream->cursor = NULL;
stream->limit = NULL;
LOG(( "_hb_stream_frame_exit()\n" ));
}
HB_INTERNAL HB_Error
_hb_face_goto_table( FT_Face face,
HB_UInt the_tag )
{
HB_Stream stream = face->stream;
HB_Error error;
LOG(( "_hb_face_goto_table( %p, %c%c%c%c, %p )\n",
face,
(int)((the_tag >> 24) & 0xFF),
(int)((the_tag >> 16) & 0xFF),
(int)((the_tag >> 8) & 0xFF),
(int)(the_tag & 0xFF),
stream ));
if ( !FT_IS_SFNT(face) )
{
LOG(( "not a SFNT face !!\n" ));
error = ERR(HB_Err_Invalid_Argument);
}
else
{
/* parse the directory table directly, without using
* FreeType's built-in data structures
*/
HB_UInt offset = 0;
HB_UInt count, nn;
if ( face->num_faces > 1 )
{
/* deal with TrueType collections */
LOG(( ">> This is a TrueType Collection\n" ));
if ( FILE_Seek( 12 + face->face_index*4 ) ||
ACCESS_Frame( 4 ) )
goto Exit;
offset = GET_ULong();
FORGET_Frame();
}
LOG(( "TrueType offset = %ld\n", offset ));
if ( FILE_Seek( offset+4 ) ||
ACCESS_Frame( 2 ) )
goto Exit;
count = GET_UShort();
FORGET_Frame();
if ( FILE_Seek( offset+12 ) ||
ACCESS_Frame( count*16 ) )
goto Exit;
for ( nn = 0; nn < count; nn++ )
{
HB_UInt tag = GET_ULong();
HB_UInt checksum = GET_ULong();
HB_UInt start = GET_ULong();
HB_UInt size = GET_ULong();
HB_UNUSED(checksum);
HB_UNUSED(size);
if ( tag == the_tag )
{
LOG(( "TrueType table (start: %ld) (size: %ld)\n", start, size ));
error = _hb_stream_seek( stream, start );
goto FoundIt;
}
}
error = HB_Err_Not_Covered;
FoundIt:
FORGET_Frame();
}
Exit:
LOG(( "TrueType error=%d\n", error ));
return error;
}
#undef QALLOC

View File

@ -17,3 +17,4 @@
#include "harfbuzz-gpos.c" #include "harfbuzz-gpos.c"
#include "harfbuzz-impl.c" #include "harfbuzz-impl.c"
#include "harfbuzz-open.c" #include "harfbuzz-open.c"
#include "harfbuzz-stream.c"

View File

@ -14,11 +14,10 @@
#define HARFBUZZ_H #define HARFBUZZ_H
#include "harfbuzz-global.h" #include "harfbuzz-global.h"
#include "harfbuzz-open.h"
#include "harfbuzz-buffer.h" #include "harfbuzz-buffer.h"
#include "harfbuzz-gdef.h" #include "harfbuzz-gdef.h"
#include "harfbuzz-gsub.h" #include "harfbuzz-gsub.h"
#include "harfbuzz-gpos.h" #include "harfbuzz-gpos.h"
#include "harfbuzz-dump.h" #include "harfbuzz-open.h"
#endif /* HARFBUZZ_OPEN_H */ #endif /* HARFBUZZ_OPEN_H */