< prev index next >
src/java.desktop/share/native/libfreetype/src/psaux/psobjs.c
Print this page
*** 1,21 ****
! /***************************************************************************/
! /* */
! /* psobjs.c */
! /* */
! /* Auxiliary functions for PostScript fonts (body). */
! /* */
! /* Copyright 1996-2018 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 <ft2build.h>
#include FT_INTERNAL_POSTSCRIPT_AUX_H
#include FT_INTERNAL_DEBUG_H
--- 1,21 ----
! /****************************************************************************
! *
! * psobjs.c
! *
! * Auxiliary functions for PostScript fonts (body).
! *
! * Copyright (C) 1996-2019 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 <ft2build.h>
#include FT_INTERNAL_POSTSCRIPT_AUX_H
#include FT_INTERNAL_DEBUG_H
*** 27,74 ****
#include "psauxerr.h"
#include "psauxmod.h"
! /*************************************************************************/
! /* */
! /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
! /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
! /* messages during execution. */
! /* */
#undef FT_COMPONENT
! #define FT_COMPONENT trace_psobjs
/*************************************************************************/
/*************************************************************************/
/***** *****/
/***** PS_TABLE *****/
/***** *****/
/*************************************************************************/
/*************************************************************************/
! /*************************************************************************/
! /* */
! /* <Function> */
! /* ps_table_new */
! /* */
! /* <Description> */
! /* Initializes a PS_Table. */
! /* */
! /* <InOut> */
! /* table :: The address of the target table. */
! /* */
! /* <Input> */
! /* count :: The table size = the maximum number of elements. */
! /* */
! /* memory :: The memory object to use for all subsequent */
! /* reallocations. */
! /* */
! /* <Return> */
! /* FreeType error code. 0 means success. */
! /* */
FT_LOCAL_DEF( FT_Error )
ps_table_new( PS_Table table,
FT_Int count,
FT_Memory memory )
{
--- 27,77 ----
#include "psauxerr.h"
#include "psauxmod.h"
! /**************************************************************************
! *
! * The macro FT_COMPONENT is used in trace mode. It is an implicit
! * parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log
! * messages during execution.
! */
#undef FT_COMPONENT
! #define FT_COMPONENT psobjs
/*************************************************************************/
/*************************************************************************/
/***** *****/
/***** PS_TABLE *****/
/***** *****/
/*************************************************************************/
/*************************************************************************/
! /**************************************************************************
! *
! * @Function:
! * ps_table_new
! *
! * @Description:
! * Initializes a PS_Table.
! *
! * @InOut:
! * table ::
! * The address of the target table.
! *
! * @Input:
! * count ::
! * The table size = the maximum number of elements.
! *
! * memory ::
! * The memory object to use for all subsequent
! * reallocations.
! *
! * @Return:
! * FreeType error code. 0 means success.
! */
FT_LOCAL_DEF( FT_Error )
ps_table_new( PS_Table table,
FT_Int count,
FT_Memory memory )
{
*** 142,173 ****
return FT_Err_Ok;
}
! /*************************************************************************/
! /* */
! /* <Function> */
! /* ps_table_add */
! /* */
! /* <Description> */
! /* Adds an object to a PS_Table, possibly growing its memory block. */
! /* */
! /* <InOut> */
! /* table :: The target table. */
! /* */
! /* <Input> */
! /* idx :: The index of the object in the table. */
! /* */
! /* object :: The address of the object to copy in memory. */
! /* */
! /* length :: The length in bytes of the source object. */
! /* */
! /* <Return> */
! /* FreeType error code. 0 means success. An error is returned if a */
! /* reallocation fails. */
! /* */
FT_LOCAL_DEF( FT_Error )
ps_table_add( PS_Table table,
FT_Int idx,
void* object,
FT_UInt length )
--- 145,180 ----
return FT_Err_Ok;
}
! /**************************************************************************
! *
! * @Function:
! * ps_table_add
! *
! * @Description:
! * Adds an object to a PS_Table, possibly growing its memory block.
! *
! * @InOut:
! * table ::
! * The target table.
! *
! * @Input:
! * idx ::
! * The index of the object in the table.
! *
! * object ::
! * The address of the object to copy in memory.
! *
! * length ::
! * The length in bytes of the source object.
! *
! * @Return:
! * FreeType error code. 0 means success. An error is returned if a
! * reallocation fails.
! */
FT_LOCAL_DEF( FT_Error )
ps_table_add( PS_Table table,
FT_Int idx,
void* object,
FT_UInt length )
*** 214,239 ****
table->cursor += length;
return FT_Err_Ok;
}
! /*************************************************************************/
! /* */
! /* <Function> */
! /* ps_table_done */
! /* */
! /* <Description> */
! /* Finalizes a PS_TableRec (i.e., reallocate it to its current */
! /* cursor). */
! /* */
! /* <InOut> */
! /* table :: The target table. */
! /* */
! /* <Note> */
! /* This function does NOT release the heap's memory block. It is up */
! /* to the caller to clean it, or reference it in its own structures. */
! /* */
FT_LOCAL_DEF( void )
ps_table_done( PS_Table table )
{
FT_Memory memory = table->memory;
FT_Error error;
--- 221,247 ----
table->cursor += length;
return FT_Err_Ok;
}
! /**************************************************************************
! *
! * @Function:
! * ps_table_done
! *
! * @Description:
! * Finalizes a PS_TableRec (i.e., reallocate it to its current
! * cursor).
! *
! * @InOut:
! * table ::
! * The target table.
! *
! * @Note:
! * This function does NOT release the heap's memory block. It is up
! * to the caller to clean it, or reference it in its own structures.
! */
FT_LOCAL_DEF( void )
ps_table_done( PS_Table table )
{
FT_Memory memory = table->memory;
FT_Error error;
*** 496,511 ****
return error;
}
! /***********************************************************************/
! /* */
! /* All exported parsing routines handle leading whitespace and stop at */
! /* the first character which isn't part of the just handled token. */
! /* */
! /***********************************************************************/
FT_LOCAL_DEF( void )
ps_parser_skip_PS_token( PS_Parser parser )
{
--- 504,519 ----
return error;
}
! /************************************************************************
! *
! * All exported parsing routines handle leading whitespace and stop at
! * the first character which isn't part of the just handled token.
! *
! */
FT_LOCAL_DEF( void )
ps_parser_skip_PS_token( PS_Parser parser )
{
*** 1098,1119 ****
--- 1106,1131 ----
switch ( type )
{
case T1_FIELD_TYPE_BOOL:
val = ps_tobool( &cur, limit );
+ FT_TRACE4(( " %s", val ? "true" : "false" ));
goto Store_Integer;
case T1_FIELD_TYPE_FIXED:
val = PS_Conv_ToFixed( &cur, limit, 0 );
+ FT_TRACE4(( " %f", (double)val / 65536 ));
goto Store_Integer;
case T1_FIELD_TYPE_FIXED_1000:
val = PS_Conv_ToFixed( &cur, limit, 3 );
+ FT_TRACE4(( " %f", (double)val / 65536 / 1000 ));
goto Store_Integer;
case T1_FIELD_TYPE_INTEGER:
val = PS_Conv_ToInt( &cur, limit );
+ FT_TRACE4(( " %ld", val ));
/* fall through */
Store_Integer:
switch ( field->size )
{
*** 1186,1195 ****
--- 1198,1214 ----
goto Exit;
FT_MEM_COPY( string, cur, len );
string[len] = 0;
+ #ifdef FT_DEBUG_LEVEL_TRACE
+ if ( token.type == T1_TOKEN_TYPE_STRING )
+ FT_TRACE4(( " (%s)", string ));
+ else
+ FT_TRACE4(( " /%s", string ));
+ #endif
+
*(FT_String**)q = string;
}
break;
case T1_FIELD_TYPE_BBOX:
*** 1211,1220 ****
--- 1230,1245 ----
bbox->xMin = FT_RoundFix( temp[0] );
bbox->yMin = FT_RoundFix( temp[1] );
bbox->xMax = FT_RoundFix( temp[2] );
bbox->yMax = FT_RoundFix( temp[3] );
+
+ FT_TRACE4(( " [%d %d %d %d]",
+ bbox->xMin / 65536,
+ bbox->yMin / 65536,
+ bbox->xMax / 65536,
+ bbox->yMax / 65536 ));
}
break;
case T1_FIELD_TYPE_MM_BBOX:
{
*** 1249,1268 ****
--- 1274,1301 ----
}
skip_spaces( &cur, limit );
}
+ FT_TRACE4(( " [" ));
for ( i = 0; i < max_objects; i++ )
{
FT_BBox* bbox = (FT_BBox*)objects[i];
bbox->xMin = FT_RoundFix( temp[i ] );
bbox->yMin = FT_RoundFix( temp[i + max_objects] );
bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] );
bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] );
+
+ FT_TRACE4(( " [%d %d %d %d]",
+ bbox->xMin / 65536,
+ bbox->yMin / 65536,
+ bbox->xMax / 65536,
+ bbox->yMax / 65536 ));
}
+ FT_TRACE4(( "]" ));
FT_FREE( temp );
}
break;
*** 1331,1340 ****
--- 1364,1375 ----
/* we further assume that `count_offset' can't be zero */
if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 )
*(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) =
(FT_Byte)num_elements;
+ FT_TRACE4(( " [" ));
+
/* we now load each element, adjusting the field.offset on each one */
token = elements;
for ( ; num_elements > 0; num_elements--, token++ )
{
parser->cursor = token->start;
*** 1349,1358 ****
--- 1384,1395 ----
break;
fieldrec.offset += fieldrec.size;
}
+ FT_TRACE4(( "]" ));
+
#if 0 /* obsolete -- keep for reference */
if ( pflags )
*pflags |= 1L << field->flag_bit;
#else
FT_UNUSED( pflags );
*** 1408,1431 ****
*pnum_bytes = PS_Conv_ASCIIHexDecode( &cur,
parser->limit,
bytes,
max_bytes );
if ( delimiters )
{
if ( cur < parser->limit && *cur != '>' )
{
FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" ));
error = FT_THROW( Invalid_File_Format );
goto Exit;
}
! cur++;
}
- parser->cursor = cur;
-
Exit:
return error;
}
--- 1445,1468 ----
*pnum_bytes = PS_Conv_ASCIIHexDecode( &cur,
parser->limit,
bytes,
max_bytes );
+ parser->cursor = cur;
+
if ( delimiters )
{
if ( cur < parser->limit && *cur != '>' )
{
FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" ));
error = FT_THROW( Invalid_File_Format );
goto Exit;
}
! parser->cursor++;
}
Exit:
return error;
}
*** 1507,1536 ****
/***** T1 BUILDER *****/
/***** *****/
/*************************************************************************/
/*************************************************************************/
! /*************************************************************************/
! /* */
! /* <Function> */
! /* t1_builder_init */
! /* */
! /* <Description> */
! /* Initializes a given glyph builder. */
! /* */
! /* <InOut> */
! /* builder :: A pointer to the glyph builder to initialize. */
! /* */
! /* <Input> */
! /* face :: The current face object. */
! /* */
! /* size :: The current size object. */
! /* */
! /* glyph :: The current glyph object. */
! /* */
! /* hinting :: Whether hinting should be applied. */
! /* */
FT_LOCAL_DEF( void )
t1_builder_init( T1_Builder builder,
FT_Face face,
FT_Size size,
FT_GlyphSlot glyph,
--- 1544,1578 ----
/***** T1 BUILDER *****/
/***** *****/
/*************************************************************************/
/*************************************************************************/
! /**************************************************************************
! *
! * @Function:
! * t1_builder_init
! *
! * @Description:
! * Initializes a given glyph builder.
! *
! * @InOut:
! * builder ::
! * A pointer to the glyph builder to initialize.
! *
! * @Input:
! * face ::
! * The current face object.
! *
! * size ::
! * The current size object.
! *
! * glyph ::
! * The current glyph object.
! *
! * hinting ::
! * Whether hinting should be applied.
! */
FT_LOCAL_DEF( void )
t1_builder_init( T1_Builder builder,
FT_Face face,
FT_Size size,
FT_GlyphSlot glyph,
*** 1570,1592 ****
builder->funcs = t1_builder_funcs;
}
! /*************************************************************************/
! /* */
! /* <Function> */
! /* t1_builder_done */
! /* */
! /* <Description> */
! /* Finalizes a given glyph builder. Its contents can still be used */
! /* after the call, but the function saves important information */
! /* within the corresponding glyph slot. */
! /* */
! /* <Input> */
! /* builder :: A pointer to the glyph builder to finalize. */
! /* */
FT_LOCAL_DEF( void )
t1_builder_done( T1_Builder builder )
{
FT_GlyphSlot glyph = builder->glyph;
--- 1612,1635 ----
builder->funcs = t1_builder_funcs;
}
! /**************************************************************************
! *
! * @Function:
! * t1_builder_done
! *
! * @Description:
! * Finalizes a given glyph builder. Its contents can still be used
! * after the call, but the function saves important information
! * within the corresponding glyph slot.
! *
! * @Input:
! * builder ::
! * A pointer to the glyph builder to finalize.
! */
FT_LOCAL_DEF( void )
t1_builder_done( T1_Builder builder )
{
FT_GlyphSlot glyph = builder->glyph;
*** 1767,1796 ****
/***** *****/
/*************************************************************************/
/*************************************************************************/
! /*************************************************************************/
! /* */
! /* <Function> */
! /* cff_builder_init */
! /* */
! /* <Description> */
! /* Initializes a given glyph builder. */
! /* */
! /* <InOut> */
! /* builder :: A pointer to the glyph builder to initialize. */
! /* */
! /* <Input> */
! /* face :: The current face object. */
! /* */
! /* size :: The current size object. */
! /* */
! /* glyph :: The current glyph object. */
! /* */
! /* hinting :: Whether hinting is active. */
! /* */
FT_LOCAL_DEF( void )
cff_builder_init( CFF_Builder* builder,
TT_Face face,
CFF_Size size,
CFF_GlyphSlot glyph,
--- 1810,1844 ----
/***** *****/
/*************************************************************************/
/*************************************************************************/
! /**************************************************************************
! *
! * @Function:
! * cff_builder_init
! *
! * @Description:
! * Initializes a given glyph builder.
! *
! * @InOut:
! * builder ::
! * A pointer to the glyph builder to initialize.
! *
! * @Input:
! * face ::
! * The current face object.
! *
! * size ::
! * The current size object.
! *
! * glyph ::
! * The current glyph object.
! *
! * hinting ::
! * Whether hinting is active.
! */
FT_LOCAL_DEF( void )
cff_builder_init( CFF_Builder* builder,
TT_Face face,
CFF_Size size,
CFF_GlyphSlot glyph,
*** 1839,1861 ****
builder->funcs = cff_builder_funcs;
}
! /*************************************************************************/
! /* */
! /* <Function> */
! /* cff_builder_done */
! /* */
! /* <Description> */
! /* Finalizes a given glyph builder. Its contents can still be used */
! /* after the call, but the function saves important information */
! /* within the corresponding glyph slot. */
! /* */
! /* <Input> */
! /* builder :: A pointer to the glyph builder to finalize. */
! /* */
FT_LOCAL_DEF( void )
cff_builder_done( CFF_Builder* builder )
{
CFF_GlyphSlot glyph = builder->glyph;
--- 1887,1910 ----
builder->funcs = cff_builder_funcs;
}
! /**************************************************************************
! *
! * @Function:
! * cff_builder_done
! *
! * @Description:
! * Finalizes a given glyph builder. Its contents can still be used
! * after the call, but the function saves important information
! * within the corresponding glyph slot.
! *
! * @Input:
! * builder ::
! * A pointer to the glyph builder to finalize.
! */
FT_LOCAL_DEF( void )
cff_builder_done( CFF_Builder* builder )
{
CFF_GlyphSlot glyph = builder->glyph;
*** 1991,2000 ****
--- 2040,2057 ----
return;
first = outline->n_contours <= 1
? 0 : outline->contours[outline->n_contours - 2] + 1;
+ /* in malformed fonts it can happen that a contour was started */
+ /* but no points were added */
+ if ( outline->n_contours && first == outline->n_points )
+ {
+ outline->n_contours--;
+ return;
+ }
+
/* We must not include the last point in the path if it */
/* is located on the first point. */
if ( outline->n_points > 1 )
{
FT_Vector* p1 = outline->points + first;
*** 2031,2060 ****
/***** PS BUILDER *****/
/***** *****/
/*************************************************************************/
/*************************************************************************/
! /*************************************************************************/
! /* */
! /* <Function> */
! /* ps_builder_init */
! /* */
! /* <Description> */
! /* Initializes a given glyph builder. */
! /* */
! /* <InOut> */
! /* builder :: A pointer to the glyph builder to initialize. */
! /* */
! /* <Input> */
! /* face :: The current face object. */
! /* */
! /* size :: The current size object. */
! /* */
! /* glyph :: The current glyph object. */
! /* */
! /* hinting :: Whether hinting should be applied. */
! /* */
FT_LOCAL_DEF( void )
ps_builder_init( PS_Builder* ps_builder,
void* builder,
FT_Bool is_t1 )
{
--- 2088,2122 ----
/***** PS BUILDER *****/
/***** *****/
/*************************************************************************/
/*************************************************************************/
! /**************************************************************************
! *
! * @Function:
! * ps_builder_init
! *
! * @Description:
! * Initializes a given glyph builder.
! *
! * @InOut:
! * builder ::
! * A pointer to the glyph builder to initialize.
! *
! * @Input:
! * face ::
! * The current face object.
! *
! * size ::
! * The current size object.
! *
! * glyph ::
! * The current glyph object.
! *
! * hinting ::
! * Whether hinting should be applied.
! */
FT_LOCAL_DEF( void )
ps_builder_init( PS_Builder* ps_builder,
void* builder,
FT_Bool is_t1 )
{
*** 2114,2136 ****
ps_builder->is_t1 = is_t1;
ps_builder->funcs = ps_builder_funcs;
}
! /*************************************************************************/
! /* */
! /* <Function> */
! /* ps_builder_done */
! /* */
! /* <Description> */
! /* Finalizes a given glyph builder. Its contents can still be used */
! /* after the call, but the function saves important information */
! /* within the corresponding glyph slot. */
! /* */
! /* <Input> */
! /* builder :: A pointer to the glyph builder to finalize. */
! /* */
FT_LOCAL_DEF( void )
ps_builder_done( PS_Builder* builder )
{
CFF_GlyphSlot glyph = builder->glyph;
--- 2176,2199 ----
ps_builder->is_t1 = is_t1;
ps_builder->funcs = ps_builder_funcs;
}
! /**************************************************************************
! *
! * @Function:
! * ps_builder_done
! *
! * @Description:
! * Finalizes a given glyph builder. Its contents can still be used
! * after the call, but the function saves important information
! * within the corresponding glyph slot.
! *
! * @Input:
! * builder ::
! * A pointer to the glyph builder to finalize.
! */
FT_LOCAL_DEF( void )
ps_builder_done( PS_Builder* builder )
{
CFF_GlyphSlot glyph = builder->glyph;
*** 2334,2360 ****
/***** *****/
/*************************************************************************/
/*************************************************************************/
! /*************************************************************************/
! /* */
! /* <Function> */
! /* ps_decoder_init */
! /* */
! /* <Description> */
! /* Creates a wrapper decoder for use in the combined */
! /* Type 1 / CFF interpreter. */
! /* */
! /* <InOut> */
! /* ps_decoder :: A pointer to the decoder to initialize. */
! /* */
! /* <Input> */
! /* decoder :: A pointer to the original decoder. */
! /* */
! /* is_t1 :: Flag indicating Type 1 or CFF */
! /* */
FT_LOCAL_DEF( void )
ps_decoder_init( PS_Decoder* ps_decoder,
void* decoder,
FT_Bool is_t1 )
{
--- 2397,2426 ----
/***** *****/
/*************************************************************************/
/*************************************************************************/
! /**************************************************************************
! *
! * @Function:
! * ps_decoder_init
! *
! * @Description:
! * Creates a wrapper decoder for use in the combined
! * Type 1 / CFF interpreter.
! *
! * @InOut:
! * ps_decoder ::
! * A pointer to the decoder to initialize.
! *
! * @Input:
! * decoder ::
! * A pointer to the original decoder.
! *
! * is_t1 ::
! * Flag indicating Type 1 or CFF
! */
FT_LOCAL_DEF( void )
ps_decoder_init( PS_Decoder* ps_decoder,
void* decoder,
FT_Bool is_t1 )
{
< prev index next >