Add support for the hexadicimal representation of binary data
started with `StartData' in CID-keyed Type 1 fonts. * include/freetype/internal/t1types.h (CID_FaceRec): Add new members `binary_data' and `cid_stream'. * src/cid/cidload.c (cid_read_subrs): Use `face->cid_stream'. (cid_hex_to_binary): New auxiliary function. (cid_face_open): Add new argument `face_index' to return quickly if less than zero. Updated all callers. Call `cid_hex_to_binary', then open and assign memory stream to `face->cid_stream' if `parser->binary_length' is non-zero. * src/cid/cidload.h: Updated. * src/cid/cidobjs.c (cid_face_done): Free `binary_data' and `cid_stream'. * src/cid/cidparse.c (cid_parser_new): Check arguments to `StartData' and set parser->binary_length accordingly. * src/cid/cidparse.h (CID_Parser): New member `binary_length'. * src/cid/cidgload.c (cid_load_glyph): Use `face->cid_stream'. * docs/CHANGES: Updated. include/freetype/config/ftstdlib.h (ft_atoi): Replaced with... (ft_atol): This. * src/base/ftdbgmem.c: s/atol/ft_atol/. * src/type42/t42drivr.c: s/ft_atoi/ft_atol/.
This commit is contained in:
parent
6cda9c489d
commit
ef512e3ec6
34
ChangeLog
34
ChangeLog
|
@ -1,3 +1,37 @@
|
|||
2004-01-22 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
Add support for the hexadicimal representation of binary data
|
||||
started with `StartData' in CID-keyed Type 1 fonts.
|
||||
|
||||
* include/freetype/internal/t1types.h (CID_FaceRec): Add new
|
||||
members `binary_data' and `cid_stream'.
|
||||
|
||||
* src/cid/cidload.c (cid_read_subrs): Use `face->cid_stream'.
|
||||
(cid_hex_to_binary): New auxiliary function.
|
||||
(cid_face_open): Add new argument `face_index' to return quickly
|
||||
if less than zero. Updated all callers.
|
||||
Call `cid_hex_to_binary', then open and assign memory stream to
|
||||
`face->cid_stream' if `parser->binary_length' is non-zero.
|
||||
* src/cid/cidload.h: Updated.
|
||||
|
||||
* src/cid/cidobjs.c (cid_face_done): Free `binary_data' and
|
||||
`cid_stream'.
|
||||
|
||||
* src/cid/cidparse.c (cid_parser_new): Check arguments to
|
||||
`StartData' and set parser->binary_length accordingly.
|
||||
* src/cid/cidparse.h (CID_Parser): New member `binary_length'.
|
||||
|
||||
* src/cid/cidgload.c (cid_load_glyph): Use `face->cid_stream'.
|
||||
|
||||
* docs/CHANGES: Updated.
|
||||
|
||||
2004-01-21 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
include/freetype/config/ftstdlib.h (ft_atoi): Replaced with...
|
||||
(ft_atol): This.
|
||||
* src/base/ftdbgmem.c: s/atol/ft_atol/.
|
||||
* src/type42/t42drivr.c: s/ft_atoi/ft_atol/.
|
||||
|
||||
2004-01-20 Masatake YAMATO <jet@gyve.org>
|
||||
|
||||
* include/freetype/ftcache.h: Delete duplicated definition of
|
||||
|
|
|
@ -38,6 +38,11 @@ LATEST CHANGES BETWEEN 2.1.8 and 2.1.7
|
|||
`tttables.h') is available to get the language ID of a
|
||||
TrueType/SFNT cmap.
|
||||
|
||||
- The hexadecimal format of data after the `StartData' command in
|
||||
CID-keyed Type 1 fonts is now supported. While this can't occur
|
||||
in file-based fonts, it can happen in document-embedded
|
||||
resources of PostScript documents.
|
||||
|
||||
- The cache sub-system has been rewritten.
|
||||
|
||||
- There is now support for deinstallation of faces.
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
/* ANSI-specific library and header configuration file (specification */
|
||||
/* only). */
|
||||
/* */
|
||||
/* Copyright 2002, 2003 by */
|
||||
/* Copyright 2002, 2003, 2004 by */
|
||||
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||
/* */
|
||||
/* This file is part of the FreeType project, and may only be used, */
|
||||
|
@ -110,7 +110,7 @@
|
|||
#define ft_qsort qsort
|
||||
#define ft_exit exit /* only used to exit from unhandled exceptions */
|
||||
|
||||
#define ft_atoi atoi
|
||||
#define ft_atol atol
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
/* Basic Type1/Type2 type definitions and interface (specification */
|
||||
/* only). */
|
||||
/* */
|
||||
/* Copyright 1996-2001, 2002, 2003 by */
|
||||
/* Copyright 1996-2001, 2002, 2003, 2004 by */
|
||||
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||
/* */
|
||||
/* This file is part of the FreeType project, and may only be used, */
|
||||
|
@ -173,6 +173,8 @@ FT_BEGIN_HEADER
|
|||
void* psaux;
|
||||
CID_FaceInfoRec cid;
|
||||
void* afm_data;
|
||||
FT_Byte* binary_data; /* used if hex data has been converted */
|
||||
FT_Stream cid_stream;
|
||||
CID_Subrs subrs;
|
||||
|
||||
/* since FT 2.1 - interface to PostScript hinter */
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
/* */
|
||||
/* Memory debugger (body). */
|
||||
/* */
|
||||
/* Copyright 2001, 2002, 2003 by */
|
||||
/* Copyright 2001, 2002, 2003, 2004 by */
|
||||
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||
/* */
|
||||
/* This file is part of the FreeType project, and may only be used, */
|
||||
|
@ -604,7 +604,7 @@
|
|||
p = getenv( "FT2_ALLOC_TOTAL_MAX" );
|
||||
if ( p != NULL )
|
||||
{
|
||||
FT_Long total_max = atol(p);
|
||||
FT_Long total_max = ft_atol(p);
|
||||
|
||||
if ( total_max > 0 )
|
||||
{
|
||||
|
@ -616,7 +616,7 @@
|
|||
p = getenv( "FT2_ALLOC_COUNT_MAX" );
|
||||
if ( p != NULL )
|
||||
{
|
||||
FT_Long total_count = atol(p);
|
||||
FT_Long total_count = ft_atol(p);
|
||||
|
||||
if ( total_count > 0 )
|
||||
{
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
/* */
|
||||
/* CID-keyed Type1 Glyph Loader (body). */
|
||||
/* */
|
||||
/* Copyright 1996-2001, 2002, 2003 by */
|
||||
/* Copyright 1996-2001, 2002, 2003, 2004 by */
|
||||
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||
/* */
|
||||
/* This file is part of the FreeType project, and may only be used, */
|
||||
|
@ -44,7 +44,7 @@
|
|||
CID_FaceInfo cid = &face->cid;
|
||||
FT_Byte* p;
|
||||
FT_UInt fd_select;
|
||||
FT_Stream stream = face->root.stream;
|
||||
FT_Stream stream = face->cid_stream;
|
||||
FT_Error error = 0;
|
||||
FT_Byte* charstring = 0;
|
||||
FT_Memory memory = face->root.memory;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
/* */
|
||||
/* CID-keyed Type1 font loader (body). */
|
||||
/* */
|
||||
/* Copyright 1996-2001, 2002, 2003 by */
|
||||
/* Copyright 1996-2001, 2002, 2003, 2004 by */
|
||||
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||
/* */
|
||||
/* This file is part of the FreeType project, and may only be used, */
|
||||
|
@ -363,7 +363,7 @@
|
|||
{
|
||||
CID_FaceInfo cid = &face->cid;
|
||||
FT_Memory memory = face->root.memory;
|
||||
FT_Stream stream = face->root.stream;
|
||||
FT_Stream stream = face->cid_stream;
|
||||
FT_Error error;
|
||||
FT_Int n;
|
||||
CID_Subrs subr;
|
||||
|
@ -399,7 +399,7 @@
|
|||
|
||||
/* read the subrmap's offsets */
|
||||
if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) ||
|
||||
FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) )
|
||||
FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) )
|
||||
goto Fail;
|
||||
|
||||
p = (FT_Byte*)stream->cursor;
|
||||
|
@ -487,11 +487,111 @@
|
|||
}
|
||||
|
||||
|
||||
static FT_Error
|
||||
cid_hex_to_binary( FT_Byte* data,
|
||||
FT_Long data_len,
|
||||
FT_ULong offset,
|
||||
CID_Face face )
|
||||
{
|
||||
FT_Stream stream = face->root.stream;
|
||||
FT_Error error;
|
||||
|
||||
FT_Byte buffer[256];
|
||||
FT_Byte *p, *plimit;
|
||||
FT_Byte *d, *dlimit;
|
||||
FT_Byte val;
|
||||
|
||||
FT_Bool upper_nibble, done;
|
||||
|
||||
|
||||
if ( FT_STREAM_SEEK( offset ) )
|
||||
goto Exit;
|
||||
|
||||
d = data;
|
||||
dlimit = d + data_len;
|
||||
p = buffer;
|
||||
plimit = p;
|
||||
|
||||
upper_nibble = 1;
|
||||
done = 0;
|
||||
|
||||
while ( d < dlimit )
|
||||
{
|
||||
if ( p >= plimit )
|
||||
{
|
||||
FT_ULong oldpos = FT_STREAM_POS();
|
||||
FT_ULong size = stream->size - oldpos;
|
||||
|
||||
|
||||
if ( size == 0 )
|
||||
{
|
||||
error = CID_Err_Syntax_Error;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) )
|
||||
goto Exit;
|
||||
p = buffer;
|
||||
plimit = p + FT_STREAM_POS() - oldpos;
|
||||
}
|
||||
|
||||
if ( ft_isdigit( *p ) )
|
||||
val = *p - '0';
|
||||
else if ( *p >= 'a' && *p <= 'f' )
|
||||
val = *p - 'a';
|
||||
else if ( *p >= 'A' && *p <= 'F' )
|
||||
val = *p - 'A' + 10;
|
||||
else if ( *p == ' ' ||
|
||||
*p == '\t' ||
|
||||
*p == '\r' ||
|
||||
*p == '\n' ||
|
||||
*p == '\f' ||
|
||||
*p == '\0' )
|
||||
{
|
||||
p++;
|
||||
continue;
|
||||
}
|
||||
else if ( *p == '>' )
|
||||
{
|
||||
val = 0;
|
||||
done = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
error = CID_Err_Syntax_Error;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if ( upper_nibble )
|
||||
*d = val << 4;
|
||||
else
|
||||
{
|
||||
*d += val;
|
||||
d++;
|
||||
}
|
||||
|
||||
upper_nibble = 1 - upper_nibble;
|
||||
|
||||
if ( done )
|
||||
break;
|
||||
|
||||
p++;
|
||||
}
|
||||
|
||||
error = CID_Err_Ok;
|
||||
|
||||
Exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
FT_LOCAL_DEF( FT_Error )
|
||||
cid_face_open( CID_Face face )
|
||||
cid_face_open( CID_Face face,
|
||||
FT_Int face_index )
|
||||
{
|
||||
CID_Loader loader;
|
||||
CID_Parser* parser;
|
||||
FT_Memory memory = face->root.memory;
|
||||
FT_Error error;
|
||||
|
||||
|
||||
|
@ -509,7 +609,30 @@
|
|||
if ( error )
|
||||
goto Exit;
|
||||
|
||||
face->cid.data_offset = loader.parser.data_offset;
|
||||
if ( face_index < 0 )
|
||||
goto Exit;
|
||||
|
||||
if ( parser->binary_length )
|
||||
{
|
||||
/* we must convert the data section from hexadecimal to binary */
|
||||
if ( FT_ALLOC( face->binary_data, parser->binary_length ) ||
|
||||
cid_hex_to_binary( face->binary_data, parser->binary_length,
|
||||
parser->data_offset, face ) )
|
||||
goto Exit;
|
||||
|
||||
if ( FT_NEW( face->cid_stream ) )
|
||||
goto Exit;
|
||||
|
||||
FT_Stream_OpenMemory( face->cid_stream,
|
||||
face->binary_data, parser->binary_length );
|
||||
face->cid.data_offset = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
face->cid_stream = face->root.stream;
|
||||
face->cid.data_offset = loader.parser.data_offset;
|
||||
}
|
||||
|
||||
error = cid_read_subrs( face );
|
||||
|
||||
Exit:
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
/* */
|
||||
/* CID-keyed Type1 font loader (specification). */
|
||||
/* */
|
||||
/* Copyright 1996-2001, 2002, 2003 by */
|
||||
/* Copyright 1996-2001, 2002, 2003, 2004 by */
|
||||
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||
/* */
|
||||
/* This file is part of the FreeType project, and may only be used, */
|
||||
|
@ -41,7 +41,8 @@ FT_BEGIN_HEADER
|
|||
FT_Byte offsize );
|
||||
|
||||
FT_LOCAL( FT_Error )
|
||||
cid_face_open( CID_Face face );
|
||||
cid_face_open( CID_Face face,
|
||||
FT_Int face_index );
|
||||
|
||||
|
||||
FT_END_HEADER
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
/* */
|
||||
/* CID objects manager (body). */
|
||||
/* */
|
||||
/* Copyright 1996-2001, 2002, 2003 by */
|
||||
/* Copyright 1996-2001, 2002, 2003, 2004 by */
|
||||
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||
/* */
|
||||
/* This file is part of the FreeType project, and may only be used, */
|
||||
|
@ -234,6 +234,9 @@
|
|||
|
||||
face->root.family_name = 0;
|
||||
face->root.style_name = 0;
|
||||
|
||||
FT_FREE( face->binary_data );
|
||||
FT_FREE( face->cid_stream );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -275,7 +278,6 @@
|
|||
|
||||
FT_UNUSED( num_params );
|
||||
FT_UNUSED( params );
|
||||
FT_UNUSED( face_index );
|
||||
FT_UNUSED( stream );
|
||||
|
||||
|
||||
|
@ -305,7 +307,7 @@
|
|||
if ( FT_STREAM_SEEK( 0 ) )
|
||||
goto Exit;
|
||||
|
||||
error = cid_face_open( face );
|
||||
error = cid_face_open( face, face_index );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
|
||||
|
|
|
@ -140,22 +140,23 @@
|
|||
/* in a comment or string. We also get its arguments to find out */
|
||||
/* whether the data is represented in binary or hex format. */
|
||||
|
||||
arg1 = parser->root.cursor;
|
||||
cid_parser_skip_PS_token( parser );
|
||||
cid_parser_skip_spaces ( parser );
|
||||
arg2 = parser->root.cursor;
|
||||
cid_parser_skip_PS_token( parser );
|
||||
cid_parser_skip_spaces ( parser );
|
||||
|
||||
limit = parser->root.limit;
|
||||
cur = parser->root.cursor;
|
||||
|
||||
arg1 = cur;
|
||||
cid_parser_skip_PS_token( parser );
|
||||
cid_parser_skip_spaces ( parser );
|
||||
arg2 = cur;
|
||||
cid_parser_skip_PS_token( parser );
|
||||
cid_parser_skip_spaces ( parser );
|
||||
|
||||
while ( cur < limit )
|
||||
{
|
||||
if ( *cur == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 )
|
||||
{
|
||||
if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 )
|
||||
parser->data_type = 1;
|
||||
parser->binary_length = ft_atol( (const char *)arg2 );
|
||||
|
||||
limit = parser->root.limit;
|
||||
cur = parser->root.cursor;
|
||||
goto Exit;
|
||||
|
|
|
@ -50,8 +50,8 @@ FT_BEGIN_HEADER
|
|||
/* data_offset :: The start position of the binary data (i.e., the */
|
||||
/* end of the data to be parsed. */
|
||||
/* */
|
||||
/* data_type :: If true, the binary data is represented in */
|
||||
/* hexadecimal format. */
|
||||
/* binary_length :: The length of the data after the `StartData' */
|
||||
/* command if the data format is hexadecimal. */
|
||||
/* */
|
||||
/* cid :: A structure which holds the information about */
|
||||
/* the current font. */
|
||||
|
@ -67,7 +67,8 @@ FT_BEGIN_HEADER
|
|||
FT_Long postscript_len;
|
||||
|
||||
FT_ULong data_offset;
|
||||
FT_Bool data_type;
|
||||
|
||||
FT_Long binary_length;
|
||||
|
||||
CID_FaceInfo cid;
|
||||
FT_Int num_dict;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
/* */
|
||||
/* High-level Type 42 driver interface (body). */
|
||||
/* */
|
||||
/* Copyright 2002, 2003 by Roberto Alameda. */
|
||||
/* Copyright 2002, 2003, 2004 by Roberto Alameda. */
|
||||
/* */
|
||||
/* This file is part of the FreeType project, and may only be used, */
|
||||
/* modified, and distributed under the terms of the FreeType project */
|
||||
|
@ -95,7 +95,7 @@
|
|||
gname = face->type1.glyph_names[i];
|
||||
|
||||
if ( !ft_strcmp( glyph_name, gname ) )
|
||||
return ft_atoi( (const char *)face->type1.charstrings[i] );
|
||||
return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] );
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue