2001-01-03 01:15:00 +01:00
|
|
|
/***************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* cffgload.c */
|
|
|
|
/* */
|
|
|
|
/* OpenType Glyph Loader (body). */
|
|
|
|
/* */
|
2015-01-17 20:41:43 +01:00
|
|
|
/* Copyright 1996-2015 by */
|
2001-01-03 01:15:00 +01:00
|
|
|
/* 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_DEBUG_H
|
|
|
|
#include FT_INTERNAL_STREAM_H
|
|
|
|
#include FT_INTERNAL_SFNT_H
|
|
|
|
#include FT_OUTLINE_H
|
2013-05-02 11:09:15 +02:00
|
|
|
#include FT_CFF_DRIVER_H
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2001-12-20 14:14:18 +01:00
|
|
|
#include "cffobjs.h"
|
2001-03-20 12:14:24 +01:00
|
|
|
#include "cffload.h"
|
|
|
|
#include "cffgload.h"
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
#include "cf2ft.h" /* for cf2_decoder_parse_charstrings */
|
2001-01-03 01:15:00 +01:00
|
|
|
|
Complete redesign of error codes. Please check ftmoderr.h for more
details.
* include/freetype/internal/cfferrs.h,
include/freetype/internal/tterrors.h,
include/freetype/internal/t1errors.h: Removed. Replaced with files
local to the module. All extra error codes have been moved to
`fterrors.h'.
* src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
* src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
error names for the module it belongs to.
* include/freetype/ftmoderr.h: New file, defining the module error
offsets. Its structure is similar to `fterrors.h'.
* include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
(FT_ERRORDEF): Redefined to use module error offsets.
All internal error codes are now public; unused error codes have
been removed, some are new.
* include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
macro.
* include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
All other source files have been updated to use the new error codes;
some already existing (internal) error codes local to a module have
been renamed to give them the same name as in the base module.
All make files have been updated to include the local error files.
* src/cid/cidtokens.h: Replaced with...
* src/cid/cidtoken.h: This file for 8+3 consistency.
* src/raster/ftraster.c: Use macros for header file names.
2001-06-06 19:30:41 +02:00
|
|
|
#include "cfferrs.h"
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* 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_cffgload
|
|
|
|
|
|
|
|
|
2013-06-03 12:41:58 +02:00
|
|
|
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
typedef enum CFF_Operator_
|
|
|
|
{
|
|
|
|
cff_op_unknown = 0,
|
|
|
|
|
|
|
|
cff_op_rmoveto,
|
|
|
|
cff_op_hmoveto,
|
|
|
|
cff_op_vmoveto,
|
|
|
|
|
|
|
|
cff_op_rlineto,
|
|
|
|
cff_op_hlineto,
|
|
|
|
cff_op_vlineto,
|
|
|
|
|
|
|
|
cff_op_rrcurveto,
|
|
|
|
cff_op_hhcurveto,
|
|
|
|
cff_op_hvcurveto,
|
|
|
|
cff_op_rcurveline,
|
|
|
|
cff_op_rlinecurve,
|
|
|
|
cff_op_vhcurveto,
|
|
|
|
cff_op_vvcurveto,
|
|
|
|
|
|
|
|
cff_op_flex,
|
|
|
|
cff_op_hflex,
|
|
|
|
cff_op_hflex1,
|
|
|
|
cff_op_flex1,
|
|
|
|
|
|
|
|
cff_op_endchar,
|
|
|
|
|
|
|
|
cff_op_hstem,
|
|
|
|
cff_op_vstem,
|
|
|
|
cff_op_hstemhm,
|
|
|
|
cff_op_vstemhm,
|
|
|
|
|
|
|
|
cff_op_hintmask,
|
|
|
|
cff_op_cntrmask,
|
2001-03-20 12:14:24 +01:00
|
|
|
cff_op_dotsection, /* deprecated, acts as no-op */
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
cff_op_abs,
|
|
|
|
cff_op_add,
|
|
|
|
cff_op_sub,
|
|
|
|
cff_op_div,
|
|
|
|
cff_op_neg,
|
|
|
|
cff_op_random,
|
|
|
|
cff_op_mul,
|
|
|
|
cff_op_sqrt,
|
|
|
|
|
|
|
|
cff_op_blend,
|
|
|
|
|
|
|
|
cff_op_drop,
|
|
|
|
cff_op_exch,
|
|
|
|
cff_op_index,
|
|
|
|
cff_op_roll,
|
|
|
|
cff_op_dup,
|
|
|
|
|
|
|
|
cff_op_put,
|
|
|
|
cff_op_get,
|
|
|
|
cff_op_store,
|
|
|
|
cff_op_load,
|
|
|
|
|
|
|
|
cff_op_and,
|
|
|
|
cff_op_or,
|
|
|
|
cff_op_not,
|
|
|
|
cff_op_eq,
|
|
|
|
cff_op_ifelse,
|
|
|
|
|
|
|
|
cff_op_callsubr,
|
|
|
|
cff_op_callgsubr,
|
|
|
|
cff_op_return,
|
|
|
|
|
2008-09-22 13:28:46 +02:00
|
|
|
/* Type 1 opcodes: invalid but seen in real life */
|
|
|
|
cff_op_hsbw,
|
|
|
|
cff_op_closepath,
|
|
|
|
cff_op_callothersubr,
|
|
|
|
cff_op_pop,
|
2009-11-04 07:21:15 +01:00
|
|
|
cff_op_seac,
|
|
|
|
cff_op_sbw,
|
|
|
|
cff_op_setcurrentpoint,
|
2007-12-06 18:17:30 +01:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
/* do not remove */
|
|
|
|
cff_op_max
|
|
|
|
|
|
|
|
} CFF_Operator;
|
|
|
|
|
|
|
|
|
|
|
|
#define CFF_COUNT_CHECK_WIDTH 0x80
|
|
|
|
#define CFF_COUNT_EXACT 0x40
|
|
|
|
#define CFF_COUNT_CLEAR_STACK 0x20
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
/* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are */
|
|
|
|
/* used for checking the width and requested numbers of arguments */
|
|
|
|
/* only; they are set to zero afterwards */
|
|
|
|
|
|
|
|
/* the other two flags are informative only and unused currently */
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
static const FT_Byte cff_argument_counts[] =
|
|
|
|
{
|
|
|
|
0, /* unknown */
|
|
|
|
|
|
|
|
2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */
|
|
|
|
1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
|
|
|
|
1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
|
|
|
|
|
|
|
|
0 | CFF_COUNT_CLEAR_STACK, /* rlineto */
|
|
|
|
0 | CFF_COUNT_CLEAR_STACK,
|
|
|
|
0 | CFF_COUNT_CLEAR_STACK,
|
|
|
|
|
|
|
|
0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */
|
|
|
|
0 | CFF_COUNT_CLEAR_STACK,
|
|
|
|
0 | CFF_COUNT_CLEAR_STACK,
|
|
|
|
0 | CFF_COUNT_CLEAR_STACK,
|
|
|
|
0 | CFF_COUNT_CLEAR_STACK,
|
|
|
|
0 | CFF_COUNT_CLEAR_STACK,
|
|
|
|
0 | CFF_COUNT_CLEAR_STACK,
|
|
|
|
|
|
|
|
13, /* flex */
|
|
|
|
7,
|
|
|
|
9,
|
|
|
|
11,
|
|
|
|
|
|
|
|
0 | CFF_COUNT_CHECK_WIDTH, /* endchar */
|
|
|
|
|
|
|
|
2 | CFF_COUNT_CHECK_WIDTH, /* hstem */
|
|
|
|
2 | CFF_COUNT_CHECK_WIDTH,
|
|
|
|
2 | CFF_COUNT_CHECK_WIDTH,
|
|
|
|
2 | CFF_COUNT_CHECK_WIDTH,
|
|
|
|
|
2001-12-20 14:14:18 +01:00
|
|
|
0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */
|
|
|
|
0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */
|
2001-03-16 14:35:56 +01:00
|
|
|
0, /* dotsection */
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
1, /* abs */
|
|
|
|
2,
|
|
|
|
2,
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
0,
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
|
|
|
|
1, /* blend */
|
|
|
|
|
|
|
|
1, /* drop */
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
|
|
|
|
2, /* put */
|
|
|
|
1,
|
|
|
|
4,
|
|
|
|
3,
|
|
|
|
|
|
|
|
2, /* and */
|
|
|
|
2,
|
|
|
|
1,
|
|
|
|
2,
|
|
|
|
4,
|
|
|
|
|
|
|
|
1, /* callsubr */
|
|
|
|
1,
|
2007-12-06 18:17:30 +01:00
|
|
|
0,
|
|
|
|
|
|
|
|
2, /* hsbw */
|
2008-09-22 13:28:46 +02:00
|
|
|
0,
|
|
|
|
0,
|
2009-11-04 07:21:15 +01:00
|
|
|
0,
|
|
|
|
5, /* seac */
|
|
|
|
4, /* sbw */
|
|
|
|
2 /* setcurrentpoint */
|
2001-01-03 01:15:00 +01:00
|
|
|
};
|
|
|
|
|
2013-06-03 12:41:58 +02:00
|
|
|
#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/********** *********/
|
|
|
|
/********** *********/
|
|
|
|
/********** GENERIC CHARSTRING PARSING *********/
|
|
|
|
/********** *********/
|
|
|
|
/********** *********/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
/* cff_builder_init */
|
2001-01-03 01:15:00 +01:00
|
|
|
/* */
|
|
|
|
/* <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. */
|
|
|
|
/* */
|
2008-05-15 01:05:38 +02:00
|
|
|
/* hinting :: Whether hinting is active. */
|
|
|
|
/* */
|
2001-06-27 21:46:12 +02:00
|
|
|
static void
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_init( CFF_Builder* builder,
|
2001-06-27 21:46:12 +02:00
|
|
|
TT_Face face,
|
|
|
|
CFF_Size size,
|
2001-12-20 14:14:18 +01:00
|
|
|
CFF_GlyphSlot glyph,
|
|
|
|
FT_Bool hinting )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
builder->path_begun = 0;
|
|
|
|
builder->load_points = 1;
|
|
|
|
|
|
|
|
builder->face = face;
|
|
|
|
builder->glyph = glyph;
|
|
|
|
builder->memory = face->root.memory;
|
|
|
|
|
|
|
|
if ( glyph )
|
|
|
|
{
|
2002-02-24 03:59:24 +01:00
|
|
|
FT_GlyphLoader loader = glyph->root.internal->loader;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
builder->loader = loader;
|
|
|
|
builder->base = &loader->base.outline;
|
|
|
|
builder->current = &loader->current.outline;
|
|
|
|
FT_GlyphLoader_Rewind( loader );
|
2001-12-20 14:14:18 +01:00
|
|
|
|
2015-04-16 05:20:23 +02:00
|
|
|
builder->hints_globals = NULL;
|
|
|
|
builder->hints_funcs = NULL;
|
2002-02-24 03:59:24 +01:00
|
|
|
|
2001-12-20 14:14:18 +01:00
|
|
|
if ( hinting && size )
|
|
|
|
{
|
2008-05-15 01:05:38 +02:00
|
|
|
CFF_Internal internal = (CFF_Internal)size->root.internal;
|
|
|
|
|
|
|
|
|
|
|
|
builder->hints_globals = (void *)internal->topfont;
|
2001-12-20 14:14:18 +01:00
|
|
|
builder->hints_funcs = glyph->root.internal->glyph_hints;
|
|
|
|
}
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
builder->pos_x = 0;
|
|
|
|
builder->pos_y = 0;
|
|
|
|
|
|
|
|
builder->left_bearing.x = 0;
|
|
|
|
builder->left_bearing.y = 0;
|
|
|
|
builder->advance.x = 0;
|
|
|
|
builder->advance.y = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
/* cff_builder_done */
|
2001-01-03 01:15:00 +01:00
|
|
|
/* */
|
|
|
|
/* <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. */
|
|
|
|
/* */
|
2001-06-27 21:46:12 +02:00
|
|
|
static void
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_done( CFF_Builder* builder )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
CFF_GlyphSlot glyph = builder->glyph;
|
|
|
|
|
|
|
|
|
|
|
|
if ( glyph )
|
|
|
|
glyph->root.outline = *builder->base;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
2001-01-03 08:14:12 +01:00
|
|
|
/* cff_compute_bias */
|
2001-01-03 01:15:00 +01:00
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* Computes the bias value in dependence of the number of glyph */
|
|
|
|
/* subroutines. */
|
|
|
|
/* */
|
|
|
|
/* <Input> */
|
2009-11-04 07:21:15 +01:00
|
|
|
/* in_charstring_type :: The `CharstringType' value of the top DICT */
|
|
|
|
/* dictionary. */
|
|
|
|
/* */
|
|
|
|
/* num_subrs :: The number of glyph subroutines. */
|
2001-01-03 01:15:00 +01:00
|
|
|
/* */
|
|
|
|
/* <Return> */
|
|
|
|
/* The bias value. */
|
2015-02-20 20:42:55 +01:00
|
|
|
static FT_Int
|
2009-11-04 07:21:15 +01:00
|
|
|
cff_compute_bias( FT_Int in_charstring_type,
|
|
|
|
FT_UInt num_subrs )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2015-02-21 07:02:01 +01:00
|
|
|
FT_Int result;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2009-11-04 07:21:15 +01:00
|
|
|
if ( in_charstring_type == 1 )
|
|
|
|
result = 0;
|
|
|
|
else if ( num_subrs < 1240 )
|
2001-01-03 01:15:00 +01:00
|
|
|
result = 107;
|
2001-06-18 16:23:45 +02:00
|
|
|
else if ( num_subrs < 33900U )
|
2001-01-03 01:15:00 +01:00
|
|
|
result = 1131;
|
|
|
|
else
|
2001-06-18 16:23:45 +02:00
|
|
|
result = 32768U;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
/* cff_decoder_init */
|
2001-01-03 01:15:00 +01:00
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* Initializes a given glyph decoder. */
|
|
|
|
/* */
|
|
|
|
/* <InOut> */
|
|
|
|
/* decoder :: A pointer to the glyph builder to initialize. */
|
|
|
|
/* */
|
|
|
|
/* <Input> */
|
2008-05-15 01:05:38 +02:00
|
|
|
/* face :: The current face object. */
|
2001-01-03 01:15:00 +01:00
|
|
|
/* */
|
2008-05-15 01:05:38 +02:00
|
|
|
/* size :: The current size object. */
|
2001-01-03 01:15:00 +01:00
|
|
|
/* */
|
2008-05-15 01:05:38 +02:00
|
|
|
/* slot :: The current glyph object. */
|
|
|
|
/* */
|
|
|
|
/* hinting :: Whether hinting is active. */
|
|
|
|
/* */
|
|
|
|
/* hint_mode :: The hinting mode. */
|
2001-01-03 01:15:00 +01:00
|
|
|
/* */
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_LOCAL_DEF( void )
|
2002-08-28 00:34:20 +02:00
|
|
|
cff_decoder_init( CFF_Decoder* decoder,
|
|
|
|
TT_Face face,
|
|
|
|
CFF_Size size,
|
|
|
|
CFF_GlyphSlot slot,
|
|
|
|
FT_Bool hinting,
|
|
|
|
FT_Render_Mode hint_mode )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2002-03-14 09:57:10 +01:00
|
|
|
CFF_Font cff = (CFF_Font)face->extra.data;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* clear everything */
|
2002-07-28 07:05:24 +02:00
|
|
|
FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* initialize builder */
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_init( &decoder->builder, face, size, slot, hinting );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* initialize Type2 decoder */
|
2009-11-04 07:21:15 +01:00
|
|
|
decoder->cff = cff;
|
Improve CFF string (especially glyphname) lookup performance.
We do this by avoiding memory allocation and file I/O. This is
Savannah patch #7104.
* src/cff/cfftypes.h: Include PS cmaps service and
FT_INTERNAL_POSTSCRIPT_HINTS_H.
(CFF_SubFontRec): Remove `num_local_subrs'.
(CFF_FontRec): Add `num_strings', `strings', and `string_pool'
fields.
Remove `string_index' and `num_global_subrs' fields.
Use real types instead of `void' for `pshinter' and `psnames' fields.
* src/cff/cffload.c: Don't include PS cmaps service.
(cff_index_get_pointers): Add `pool' parameter which allows to
insert an extra NUL character for each String INDEX entry.
(cff_index_get_name): Make it a local function.
(cff_index_get_string): New function.
(cff_subfont_load): Updated.
(cff_font_load): Initialize `num_strings', `strings', and
`string_pool' fields in the `CFF_FontRec' structure.
(cff_index_get_sid_string): Use `cff_index_get_string' instead of
`cff_index_get_name'.
(cff_font_done): Updated.
* src/cff/cffload.h: Don't include PS cmaps service.
(cff_index_get_string): Added.
(cff_index_get_sid_string): Updated.
* src/cff/cffobjs.c: Don't include PS cmaps service and
FT_INTERNAL_POSTSCRIPT_HINTS_H.
(cff_size_get_globals_funcs, cff_slot_init): Updated.
(cff_face_init): Follow `cff_index_get_name',
`cff_index_get_string', and `cff_index_get_sid_string' changes.
* src/cff/cffcmap.c (cff_sid_free_glyph_name): Removed.
(cff_sid_to_glyph_name): Use `cff_index_get_cid_string'.
(cff_cmap_unicode_init): Updated.
* src/cff/cffdrivr.c: Don't include PS cmap service.
(cff_get_glyph_name): Avoid unnecessary lookup for POSTSCRIPT_CMAPS
service.
(cff_get_glyph_name, cff_ps_get_font_info, cff_get_ros): Follow API
`cff_index_get_sid_string' change.
(cff_get_name_index): Use `cff_index_get_string' instead of
`cff_index_get_name'.
* src/cff/cffgload.c: Don't include FT_INTERNAL_POSTSCRIPT_HINTS_H.
(cff_decoder_init, cff_decoder_prepare): Updated.
2010-03-02 13:00:55 +01:00
|
|
|
decoder->num_globals = cff->global_subrs_index.count;
|
2001-01-03 01:15:00 +01:00
|
|
|
decoder->globals = cff->global_subrs;
|
2009-11-04 07:21:15 +01:00
|
|
|
decoder->globals_bias = cff_compute_bias(
|
|
|
|
cff->top_font.font_dict.charstring_type,
|
|
|
|
decoder->num_globals );
|
2003-12-24 02:10:46 +01:00
|
|
|
|
2002-08-28 00:34:20 +02:00
|
|
|
decoder->hint_mode = hint_mode;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
2008-09-12 18:27:48 +02:00
|
|
|
|
2008-05-15 01:05:38 +02:00
|
|
|
/* this function is used to select the subfont */
|
|
|
|
/* and the locals subrs array */
|
2007-06-06 12:05:49 +02:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_decoder_prepare( CFF_Decoder* decoder,
|
2008-05-15 01:05:38 +02:00
|
|
|
CFF_Size size,
|
2001-06-27 21:46:12 +02:00
|
|
|
FT_UInt glyph_index )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2008-05-15 01:05:38 +02:00
|
|
|
CFF_Builder *builder = &decoder->builder;
|
|
|
|
CFF_Font cff = (CFF_Font)builder->face->extra.data;
|
|
|
|
CFF_SubFont sub = &cff->top_font;
|
2013-03-14 11:21:17 +01:00
|
|
|
FT_Error error = FT_Err_Ok;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* manage CID fonts */
|
2008-05-15 01:05:38 +02:00
|
|
|
if ( cff->num_subfonts )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, glyph_index );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2007-06-18 09:33:10 +02:00
|
|
|
if ( fd_index >= cff->num_subfonts )
|
2007-06-06 12:05:49 +02:00
|
|
|
{
|
|
|
|
FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" ));
|
2013-03-14 10:27:35 +01:00
|
|
|
error = FT_THROW( Invalid_File_Format );
|
2007-06-06 12:05:49 +02:00
|
|
|
goto Exit;
|
|
|
|
}
|
2007-12-06 18:17:30 +01:00
|
|
|
|
2013-08-26 12:55:48 +02:00
|
|
|
FT_TRACE3(( " in subfont %d:\n", fd_index ));
|
2008-07-26 23:22:20 +02:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
sub = cff->subfonts[fd_index];
|
2008-05-15 01:05:38 +02:00
|
|
|
|
2009-03-12 09:07:49 +01:00
|
|
|
if ( builder->hints_funcs && size )
|
2008-05-15 01:05:38 +02:00
|
|
|
{
|
|
|
|
CFF_Internal internal = (CFF_Internal)size->root.internal;
|
|
|
|
|
|
|
|
|
|
|
|
/* for CFFs without subfonts, this value has already been set */
|
|
|
|
builder->hints_globals = (void *)internal->subfonts[fd_index];
|
|
|
|
}
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
Improve CFF string (especially glyphname) lookup performance.
We do this by avoiding memory allocation and file I/O. This is
Savannah patch #7104.
* src/cff/cfftypes.h: Include PS cmaps service and
FT_INTERNAL_POSTSCRIPT_HINTS_H.
(CFF_SubFontRec): Remove `num_local_subrs'.
(CFF_FontRec): Add `num_strings', `strings', and `string_pool'
fields.
Remove `string_index' and `num_global_subrs' fields.
Use real types instead of `void' for `pshinter' and `psnames' fields.
* src/cff/cffload.c: Don't include PS cmaps service.
(cff_index_get_pointers): Add `pool' parameter which allows to
insert an extra NUL character for each String INDEX entry.
(cff_index_get_name): Make it a local function.
(cff_index_get_string): New function.
(cff_subfont_load): Updated.
(cff_font_load): Initialize `num_strings', `strings', and
`string_pool' fields in the `CFF_FontRec' structure.
(cff_index_get_sid_string): Use `cff_index_get_string' instead of
`cff_index_get_name'.
(cff_font_done): Updated.
* src/cff/cffload.h: Don't include PS cmaps service.
(cff_index_get_string): Added.
(cff_index_get_sid_string): Updated.
* src/cff/cffobjs.c: Don't include PS cmaps service and
FT_INTERNAL_POSTSCRIPT_HINTS_H.
(cff_size_get_globals_funcs, cff_slot_init): Updated.
(cff_face_init): Follow `cff_index_get_name',
`cff_index_get_string', and `cff_index_get_sid_string' changes.
* src/cff/cffcmap.c (cff_sid_free_glyph_name): Removed.
(cff_sid_to_glyph_name): Use `cff_index_get_cid_string'.
(cff_cmap_unicode_init): Updated.
* src/cff/cffdrivr.c: Don't include PS cmap service.
(cff_get_glyph_name): Avoid unnecessary lookup for POSTSCRIPT_CMAPS
service.
(cff_get_glyph_name, cff_ps_get_font_info, cff_get_ros): Follow API
`cff_index_get_sid_string' change.
(cff_get_name_index): Use `cff_index_get_string' instead of
`cff_index_get_name'.
* src/cff/cffgload.c: Don't include FT_INTERNAL_POSTSCRIPT_HINTS_H.
(cff_decoder_init, cff_decoder_prepare): Updated.
2010-03-02 13:00:55 +01:00
|
|
|
decoder->num_locals = sub->local_subrs_index.count;
|
2001-01-03 01:15:00 +01:00
|
|
|
decoder->locals = sub->local_subrs;
|
2009-11-04 07:21:15 +01:00
|
|
|
decoder->locals_bias = cff_compute_bias(
|
|
|
|
decoder->cff->top_font.font_dict.charstring_type,
|
|
|
|
decoder->num_locals );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
decoder->glyph_width = sub->private_dict.default_width;
|
|
|
|
decoder->nominal_width = sub->private_dict.nominal_width;
|
2007-06-06 12:05:49 +02:00
|
|
|
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
decoder->current_subfont = sub; /* for Adobe's CFF handler */
|
|
|
|
|
2007-06-06 12:05:49 +02:00
|
|
|
Exit:
|
|
|
|
return error;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-12-12 16:38:39 +01:00
|
|
|
/* check that there is enough space for `count' more points */
|
2013-04-12 21:13:49 +02:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
|
|
|
cff_check_points( CFF_Builder* builder,
|
|
|
|
FT_Int count )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2005-10-28 18:14:14 +02:00
|
|
|
return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* add a new point, do not check space */
|
2013-04-12 21:13:49 +02:00
|
|
|
FT_LOCAL_DEF( void )
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( CFF_Builder* builder,
|
|
|
|
FT_Pos x,
|
|
|
|
FT_Pos y,
|
|
|
|
FT_Byte flag )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
FT_Outline* outline = builder->current;
|
|
|
|
|
|
|
|
|
|
|
|
if ( builder->load_points )
|
|
|
|
{
|
|
|
|
FT_Vector* point = outline->points + outline->n_points;
|
|
|
|
FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points;
|
|
|
|
|
2013-06-03 12:41:58 +02:00
|
|
|
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
|
|
|
|
CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2013-06-03 12:41:58 +02:00
|
|
|
|
|
|
|
if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
{
|
2013-06-03 12:41:58 +02:00
|
|
|
point->x = x >> 16;
|
|
|
|
point->y = y >> 16;
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
}
|
|
|
|
else
|
2013-06-03 12:41:58 +02:00
|
|
|
#endif
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
{
|
2013-06-03 12:41:58 +02:00
|
|
|
/* cf2_decoder_parse_charstrings uses 16.16 coordinates */
|
|
|
|
point->x = x >> 10;
|
|
|
|
point->y = y >> 10;
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
}
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
*control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
2002-03-30 17:41:09 +01:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
outline->n_points++;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* check space for a new on-curve point, then add it */
|
2013-04-12 21:13:49 +02:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
2002-07-26 11:09:10 +02:00
|
|
|
cff_builder_add_point1( CFF_Builder* builder,
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
FT_Pos x,
|
|
|
|
FT_Pos y )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
FT_Error error;
|
|
|
|
|
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
error = cff_check_points( builder, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( !error )
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-12-12 16:38:39 +01:00
|
|
|
/* check space for a new contour, then add it */
|
2001-06-27 21:46:12 +02:00
|
|
|
static FT_Error
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_contour( CFF_Builder* builder )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
FT_Outline* outline = builder->current;
|
|
|
|
FT_Error error;
|
|
|
|
|
|
|
|
|
|
|
|
if ( !builder->load_points )
|
|
|
|
{
|
|
|
|
outline->n_contours++;
|
2013-03-14 11:21:17 +01:00
|
|
|
return FT_Err_Ok;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
2005-10-28 18:14:14 +02:00
|
|
|
error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( !error )
|
|
|
|
{
|
|
|
|
if ( outline->n_contours > 0 )
|
2001-06-20 01:03:41 +02:00
|
|
|
outline->contours[outline->n_contours - 1] =
|
|
|
|
(short)( outline->n_points - 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
outline->n_contours++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* if a path was begun, add its first on-curve point */
|
2013-04-12 21:13:49 +02:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_start_point( CFF_Builder* builder,
|
|
|
|
FT_Pos x,
|
|
|
|
FT_Pos y )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2013-03-14 11:21:17 +01:00
|
|
|
FT_Error error = FT_Err_Ok;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* test whether we are building a new contour */
|
|
|
|
if ( !builder->path_begun )
|
|
|
|
{
|
|
|
|
builder->path_begun = 1;
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
error = cff_builder_add_contour( builder );
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( !error )
|
2002-07-26 11:09:10 +02:00
|
|
|
error = cff_builder_add_point1( builder, x, y );
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
2002-03-30 17:41:09 +01:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* close the current contour */
|
2013-04-12 21:13:49 +02:00
|
|
|
FT_LOCAL_DEF( void )
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_close_contour( CFF_Builder* builder )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
FT_Outline* outline = builder->current;
|
2009-04-01 08:03:37 +02:00
|
|
|
FT_Int first;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2002-03-30 17:41:09 +01:00
|
|
|
|
2005-08-18 09:40:32 +02:00
|
|
|
if ( !outline )
|
|
|
|
return;
|
|
|
|
|
2009-04-01 08:03:37 +02:00
|
|
|
first = outline->n_contours <= 1
|
|
|
|
? 0 : outline->contours[outline->n_contours - 2] + 1;
|
|
|
|
|
|
|
|
/* We must not include the last point in the path if it */
|
|
|
|
/* is located on the first point. */
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( outline->n_points > 1 )
|
|
|
|
{
|
|
|
|
FT_Vector* p1 = outline->points + first;
|
|
|
|
FT_Vector* p2 = outline->points + outline->n_points - 1;
|
|
|
|
FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1;
|
|
|
|
|
|
|
|
|
2002-03-30 17:41:09 +01:00
|
|
|
/* `delete' last point only if it coincides with the first */
|
|
|
|
/* point and if it is not a control point (which can happen). */
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( p1->x == p2->x && p1->y == p2->y )
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
if ( *control == FT_CURVE_TAG_ON )
|
2001-01-03 01:15:00 +01:00
|
|
|
outline->n_points--;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( outline->n_contours > 0 )
|
2009-04-01 08:03:37 +02:00
|
|
|
{
|
|
|
|
/* Don't add contours only consisting of one point, i.e., */
|
|
|
|
/* check whether begin point and last point are the same. */
|
|
|
|
if ( first == outline->n_points - 1 )
|
|
|
|
{
|
|
|
|
outline->n_contours--;
|
|
|
|
outline->n_points--;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
outline->contours[outline->n_contours - 1] =
|
|
|
|
(short)( outline->n_points - 1 );
|
|
|
|
}
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
FT_LOCAL_DEF( FT_Int )
|
2002-03-14 09:57:10 +01:00
|
|
|
cff_lookup_glyph_by_stdcharcode( CFF_Font cff,
|
2002-03-30 17:41:09 +01:00
|
|
|
FT_Int charcode )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
FT_UInt n;
|
|
|
|
FT_UShort glyph_sid;
|
|
|
|
|
|
|
|
|
2003-12-24 14:37:58 +01:00
|
|
|
/* CID-keyed fonts don't have glyph names */
|
|
|
|
if ( !cff->charset.sids )
|
|
|
|
return -1;
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
/* check range of standard char code */
|
|
|
|
if ( charcode < 0 || charcode > 255 )
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* Get code to SID mapping from `cff_standard_encoding'. */
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
for ( n = 0; n < cff->num_glyphs; n++ )
|
|
|
|
{
|
|
|
|
if ( cff->charset.sids[n] == glyph_sid )
|
2015-02-20 08:35:32 +01:00
|
|
|
return (FT_Int)n;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
2002-08-15 14:10:48 +02:00
|
|
|
cff_get_glyph_data( TT_Face face,
|
|
|
|
FT_UInt glyph_index,
|
|
|
|
FT_Byte** pointer,
|
|
|
|
FT_ULong* length )
|
|
|
|
{
|
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
|
|
|
/* For incremental fonts get the character data using the */
|
|
|
|
/* callback function. */
|
|
|
|
if ( face->root.internal->incremental_interface )
|
2002-09-05 17:10:54 +02:00
|
|
|
{
|
|
|
|
FT_Data data;
|
|
|
|
FT_Error error =
|
|
|
|
face->root.internal->incremental_interface->funcs->get_glyph_data(
|
|
|
|
face->root.internal->incremental_interface->object,
|
|
|
|
glyph_index, &data );
|
|
|
|
|
|
|
|
|
2002-08-15 14:10:48 +02:00
|
|
|
*pointer = (FT_Byte*)data.pointer;
|
2015-02-20 08:35:32 +01:00
|
|
|
*length = (FT_ULong)data.length;
|
2002-09-05 17:10:54 +02:00
|
|
|
|
2002-08-15 14:10:48 +02:00
|
|
|
return error;
|
|
|
|
}
|
|
|
|
else
|
2002-08-16 01:07:18 +02:00
|
|
|
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
2002-08-15 14:10:48 +02:00
|
|
|
|
|
|
|
{
|
2002-08-23 12:08:38 +02:00
|
|
|
CFF_Font cff = (CFF_Font)(face->extra.data);
|
2002-09-05 17:10:54 +02:00
|
|
|
|
|
|
|
|
2002-08-15 14:10:48 +02:00
|
|
|
return cff_index_access_element( &cff->charstrings_index, glyph_index,
|
|
|
|
pointer, length );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
FT_LOCAL_DEF( void )
|
2002-08-15 14:10:48 +02:00
|
|
|
cff_free_glyph_data( TT_Face face,
|
|
|
|
FT_Byte** pointer,
|
|
|
|
FT_ULong length )
|
|
|
|
{
|
2002-08-15 14:58:21 +02:00
|
|
|
#ifndef FT_CONFIG_OPTION_INCREMENTAL
|
2002-08-16 01:07:18 +02:00
|
|
|
FT_UNUSED( length );
|
2002-08-15 14:58:21 +02:00
|
|
|
#endif
|
|
|
|
|
2002-08-15 14:10:48 +02:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
|
|
|
/* For incremental fonts get the character data using the */
|
|
|
|
/* callback function. */
|
|
|
|
if ( face->root.internal->incremental_interface )
|
2002-09-05 17:10:54 +02:00
|
|
|
{
|
2014-12-02 23:06:04 +01:00
|
|
|
FT_Data data;
|
2002-09-05 17:10:54 +02:00
|
|
|
|
|
|
|
|
|
|
|
data.pointer = *pointer;
|
2015-02-20 08:35:32 +01:00
|
|
|
data.length = (FT_Int)length;
|
2002-09-05 17:10:54 +02:00
|
|
|
|
2002-08-15 14:10:48 +02:00
|
|
|
face->root.internal->incremental_interface->funcs->free_glyph_data(
|
2010-01-27 10:04:50 +01:00
|
|
|
face->root.internal->incremental_interface->object, &data );
|
2002-08-15 14:10:48 +02:00
|
|
|
}
|
|
|
|
else
|
2002-08-16 01:07:18 +02:00
|
|
|
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
2002-08-15 14:10:48 +02:00
|
|
|
|
|
|
|
{
|
2002-09-05 17:10:54 +02:00
|
|
|
CFF_Font cff = (CFF_Font)(face->extra.data);
|
|
|
|
|
|
|
|
|
2002-08-15 14:10:48 +02:00
|
|
|
cff_index_forget_element( &cff->charstrings_index, pointer );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-06-03 12:41:58 +02:00
|
|
|
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
|
|
|
|
|
2001-06-27 21:46:12 +02:00
|
|
|
static FT_Error
|
|
|
|
cff_operator_seac( CFF_Decoder* decoder,
|
2009-11-04 07:21:15 +01:00
|
|
|
FT_Pos asb,
|
2001-06-27 21:46:12 +02:00
|
|
|
FT_Pos adx,
|
|
|
|
FT_Pos ady,
|
|
|
|
FT_Int bchar,
|
|
|
|
FT_Int achar )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2004-02-01 01:49:56 +01:00
|
|
|
FT_Error error;
|
|
|
|
CFF_Builder* builder = &decoder->builder;
|
|
|
|
FT_Int bchar_index, achar_index;
|
|
|
|
TT_Face face = decoder->builder.face;
|
|
|
|
FT_Vector left_bearing, advance;
|
|
|
|
FT_Byte* charstring;
|
|
|
|
FT_ULong charstring_len;
|
2009-11-04 07:21:15 +01:00
|
|
|
FT_Pos glyph_width;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2002-09-05 17:10:54 +02:00
|
|
|
|
2009-06-28 01:25:55 +02:00
|
|
|
if ( decoder->seac )
|
|
|
|
{
|
|
|
|
FT_ERROR(( "cff_operator_seac: invalid nested seac\n" ));
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Syntax_Error );
|
2009-06-28 01:25:55 +02:00
|
|
|
}
|
|
|
|
|
2009-11-04 07:21:15 +01:00
|
|
|
adx += decoder->builder.left_bearing.x;
|
|
|
|
ady += decoder->builder.left_bearing.y;
|
|
|
|
|
2002-08-23 12:08:38 +02:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
2002-09-05 17:10:54 +02:00
|
|
|
/* Incremental fonts don't necessarily have valid charsets. */
|
|
|
|
/* They use the character code, not the glyph index, in this case. */
|
2002-08-23 12:08:38 +02:00
|
|
|
if ( face->root.internal->incremental_interface )
|
2002-09-05 17:10:54 +02:00
|
|
|
{
|
2002-08-23 12:08:38 +02:00
|
|
|
bchar_index = bchar;
|
|
|
|
achar_index = achar;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
|
|
|
{
|
|
|
|
CFF_Font cff = (CFF_Font)(face->extra.data);
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2002-09-05 17:10:54 +02:00
|
|
|
|
2002-08-23 12:08:38 +02:00
|
|
|
bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
|
|
|
|
achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
|
2002-09-05 17:10:54 +02:00
|
|
|
}
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
if ( bchar_index < 0 || achar_index < 0 )
|
|
|
|
{
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_ERROR(( "cff_operator_seac:"
|
|
|
|
" invalid seac character code arguments\n" ));
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Syntax_Error );
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* If we are trying to load a composite glyph, do not load the */
|
|
|
|
/* accent character and return the array of subglyphs. */
|
2004-02-01 01:49:56 +01:00
|
|
|
if ( builder->no_recurse )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2004-02-01 01:49:56 +01:00
|
|
|
FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph;
|
2002-03-30 17:41:09 +01:00
|
|
|
FT_GlyphLoader loader = glyph->internal->loader;
|
2002-03-14 13:56:35 +01:00
|
|
|
FT_SubGlyph subg;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* reallocate subglyph array if necessary */
|
2002-03-14 13:56:35 +01:00
|
|
|
error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
subg = loader->current.subglyphs;
|
|
|
|
|
|
|
|
/* subglyph 0 = base character */
|
|
|
|
subg->index = bchar_index;
|
|
|
|
subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
|
|
|
|
FT_SUBGLYPH_FLAG_USE_MY_METRICS;
|
|
|
|
subg->arg1 = 0;
|
|
|
|
subg->arg2 = 0;
|
|
|
|
subg++;
|
|
|
|
|
|
|
|
/* subglyph 1 = accent character */
|
|
|
|
subg->index = achar_index;
|
|
|
|
subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
|
2004-02-01 01:49:56 +01:00
|
|
|
subg->arg1 = (FT_Int)( adx >> 16 );
|
|
|
|
subg->arg2 = (FT_Int)( ady >> 16 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* set up remaining glyph fields */
|
|
|
|
glyph->num_subglyphs = 2;
|
|
|
|
glyph->subglyphs = loader->base.subglyphs;
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
loader->current.num_subglyphs = 2;
|
|
|
|
}
|
|
|
|
|
2004-02-01 01:49:56 +01:00
|
|
|
FT_GlyphLoader_Prepare( builder->loader );
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
/* First load `bchar' in builder */
|
2015-02-20 08:35:32 +01:00
|
|
|
error = cff_get_glyph_data( face, (FT_UInt)bchar_index,
|
2002-08-15 14:10:48 +02:00
|
|
|
&charstring, &charstring_len );
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( !error )
|
|
|
|
{
|
2009-06-28 02:11:51 +02:00
|
|
|
/* the seac operator must not be nested */
|
|
|
|
decoder->seac = TRUE;
|
2002-08-23 12:08:38 +02:00
|
|
|
error = cff_decoder_parse_charstrings( decoder, charstring,
|
|
|
|
charstring_len );
|
2009-06-28 02:11:51 +02:00
|
|
|
decoder->seac = FALSE;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2010-06-27 13:03:54 +02:00
|
|
|
cff_free_glyph_data( face, &charstring, charstring_len );
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
|
2009-11-04 07:21:15 +01:00
|
|
|
/* Save the left bearing, advance and glyph width of the base */
|
|
|
|
/* character as they will be erased by the next load. */
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2004-02-01 01:49:56 +01:00
|
|
|
left_bearing = builder->left_bearing;
|
|
|
|
advance = builder->advance;
|
2009-11-04 07:21:15 +01:00
|
|
|
glyph_width = decoder->glyph_width;
|
2004-02-01 01:49:56 +01:00
|
|
|
|
|
|
|
builder->left_bearing.x = 0;
|
|
|
|
builder->left_bearing.y = 0;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2009-11-04 07:21:15 +01:00
|
|
|
builder->pos_x = adx - asb;
|
2004-02-01 01:49:56 +01:00
|
|
|
builder->pos_y = ady;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* Now load `achar' on top of the base outline. */
|
2015-02-20 08:35:32 +01:00
|
|
|
error = cff_get_glyph_data( face, (FT_UInt)achar_index,
|
2002-08-15 14:10:48 +02:00
|
|
|
&charstring, &charstring_len );
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( !error )
|
|
|
|
{
|
2009-06-28 02:11:51 +02:00
|
|
|
/* the seac operator must not be nested */
|
|
|
|
decoder->seac = TRUE;
|
2002-08-16 01:07:18 +02:00
|
|
|
error = cff_decoder_parse_charstrings( decoder, charstring,
|
|
|
|
charstring_len );
|
2009-06-28 02:11:51 +02:00
|
|
|
decoder->seac = FALSE;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2010-06-27 13:03:54 +02:00
|
|
|
cff_free_glyph_data( face, &charstring, charstring_len );
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
|
2009-11-04 07:21:15 +01:00
|
|
|
/* Restore the left side bearing, advance and glyph width */
|
|
|
|
/* of the base character. */
|
2004-02-01 01:49:56 +01:00
|
|
|
builder->left_bearing = left_bearing;
|
|
|
|
builder->advance = advance;
|
2009-11-04 07:21:15 +01:00
|
|
|
decoder->glyph_width = glyph_width;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2004-02-01 01:49:56 +01:00
|
|
|
builder->pos_x = 0;
|
|
|
|
builder->pos_y = 0;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
Exit:
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
/* cff_decoder_parse_charstrings */
|
2001-01-03 01:15:00 +01:00
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* Parses a given Type 2 charstrings program. */
|
|
|
|
/* */
|
|
|
|
/* <InOut> */
|
|
|
|
/* decoder :: The current Type 1 decoder. */
|
|
|
|
/* */
|
|
|
|
/* <Input> */
|
|
|
|
/* charstring_base :: The base of the charstring stream. */
|
|
|
|
/* */
|
|
|
|
/* charstring_len :: The length in bytes of the charstring stream. */
|
|
|
|
/* */
|
|
|
|
/* <Return> */
|
|
|
|
/* FreeType error code. 0 means success. */
|
|
|
|
/* */
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_decoder_parse_charstrings( CFF_Decoder* decoder,
|
2002-07-26 11:09:10 +02:00
|
|
|
FT_Byte* charstring_base,
|
* src/sfnt/ttpost.c (load_post_names, tt_face_free_ps_names,
tt_face_get_ps_name): Replace switch statement with if clauses to
make it more portable.
* src/cff/cffobjs.c (cff_face_init): Ditto.
* include/freetype/ftmodule.h (FT_Module_Class): Use `FT_Long' for
`module_size'.
* include/freetype/ftrender.h (FT_Glyph_Class_): Use `FT_Long' for
`glyph_size'.
* src/base/ftobjs.c (FT_Render_Glyph): Change second parameter to
`FT_Render_Mode'.
(FT_Render_Glyph_Internal): Change third parameter to
`FT_Render_Mode'.
* src/base/ftglyph.c (FT_Glyph_To_Bitmap): Change second parameter
to `FT_Render_Mode'.
* src/raster/ftrend1.c (ft_raster1_render): Change third parameter
to `FT_Render_Mode'.
* src/smooth/ftsmooth.c (ft_smooth_render, ft_smooth_render_lcd,
ft_smooth_render_lcd_v): Ditto.
(ft_smooth_render_generic): Change third and fifth parameter to
`FT_Render_Mode'.
* include/freetype/freetype.h, include/freetype/internal/ftobjs.h,
include/freetype/ftglyph.h: Updated.
* src/cff/cffdrivr.c (Load_Glyph), src/pcf/pcfdriver.c
(PCF_Glyph_Load), src/pfr/pfrobjs.c (pfr_slot_load),
src/winfonts/winfnt.c (FNT_Load_Glyph), src/t42/t42objs.c
(T42_GlyphSlot_Load), src/bdf/bdfdrivr.c (BDF_Glyph_Load): Change
fourth parameter to `FT_Int32'.
* src/pfr/pfrobjs.c (pfr_face_init): Add two missing parameters
and declare them as unused.
* src/cid/cidparse.h (CID_Parser): Use FT_Long for `postscript_len'.
* src/psnames/psnames.h (PS_Unicode_Value_Func): Change return
value to FT_UInt32.
* src/psnames/psmodule.c (ps_unicode_value, ps_build_unicode_table):
Updated accordingly.
* src/cff/cffdrivr.c (Get_Kerning): Use FT_Long for `middle'.
(cff_get_glyph_name): Use cast for result of ft_strlen.
* src/cff/cffparse.c (cff_parse_real): User cast for assigning
`exp'.
* src/cff/cffload.c (cff_index_get_pointers): Use FT_ULong for
some local variables.
(cff_charset_load, cff_encoding_load): Use casts to FT_UInt for some
switch statements.
(cff_font_load): Use cast in call to CFF_Load_FD_Select.
* src/cff/cffobjs.c (cff_size_init): Use more casts.
(cff_face_init): Use FT_Int32 for `flags'.
* src/cff/cffgload.c (cff_operator_seac): Use cast for assigning
`adx' and `ady'.
(cff_decoder_parse_charstrings): Use FT_ULong for third parameter.
Use more casts.
* src/cff/cffcmap.c (cff_cmap_unicode_init): Use cast for `count'.
* src/cid/cidload.c (cid_read_subrs): Use FT_ULong for `len'.
* src/cid/cidgload.c (cid_load_glyph): Add missing cast for
`cid_get_offset'.
* src/psaux/t1decode.c (t1_decoder_parse_charstrings) <18>: Use
cast for `num_points'.
(t1_decoder_init): Use cast for assigning `decoder->num_glyphs'.
* src/base/ftdebug.c (ft_debug_init): Use FT_Int.
* include/freetype/internal/ftdriver.h (FT_Slot_LoadFunc): Use
`FT_Int32' for fourth parameter.
* src/base/ftobjs.c (open_face): Use cast for calling
clazz->init_face.
* src/raster/ftraster.c (Set_High_Precision): Use `1' instead of
`1L'.
(Finalize_Profile_Table, Line_Up, ft_black_init): Use casts.
* src/raster/ftrend1.c (ft_raster1_render): Ditto.
* src/sfnt/sfnt_dir_check: Compare `magic' with unsigned long
constant.
* builds/amiga/include/freetype/config/ftmodule.h: Updated.
2002-09-27 13:09:23 +02:00
|
|
|
FT_ULong charstring_len )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2001-01-03 08:14:12 +01:00
|
|
|
FT_Error error;
|
2001-01-03 01:15:00 +01:00
|
|
|
CFF_Decoder_Zone* zone;
|
2001-01-03 08:14:12 +01:00
|
|
|
FT_Byte* ip;
|
|
|
|
FT_Byte* limit;
|
2001-01-03 01:15:00 +01:00
|
|
|
CFF_Builder* builder = &decoder->builder;
|
2001-01-03 08:14:12 +01:00
|
|
|
FT_Pos x, y;
|
|
|
|
FT_Fixed seed;
|
|
|
|
FT_Fixed* stack;
|
2009-11-04 07:21:15 +01:00
|
|
|
FT_Int charstring_type =
|
|
|
|
decoder->cff->top_font.font_dict.charstring_type;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2001-12-12 17:07:29 +01:00
|
|
|
T2_Hints_Funcs hinter;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2001-12-16 09:17:33 +01:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
/* set default width */
|
|
|
|
decoder->num_hints = 0;
|
|
|
|
decoder->read_width = 1;
|
|
|
|
|
|
|
|
/* compute random seed from stack address of parameter */
|
2015-02-20 08:35:32 +01:00
|
|
|
seed = (FT_Fixed)( ( (FT_Offset)(char*)&seed ^
|
|
|
|
(FT_Offset)(char*)&decoder ^
|
|
|
|
(FT_Offset)(char*)&charstring_base ) &
|
|
|
|
FT_ULONG_MAX );
|
2003-06-23 21:26:53 +02:00
|
|
|
seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( seed == 0 )
|
|
|
|
seed = 0x7384;
|
|
|
|
|
|
|
|
/* initialize the decoder */
|
|
|
|
decoder->top = decoder->stack;
|
|
|
|
decoder->zone = decoder->zones;
|
|
|
|
zone = decoder->zones;
|
|
|
|
stack = decoder->top;
|
|
|
|
|
2004-05-13 23:59:17 +02:00
|
|
|
hinter = (T2_Hints_Funcs)builder->hints_funcs;
|
2001-12-12 17:07:29 +01:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
builder->path_begun = 0;
|
|
|
|
|
|
|
|
zone->base = charstring_base;
|
|
|
|
limit = zone->limit = charstring_base + charstring_len;
|
|
|
|
ip = zone->cursor = zone->base;
|
|
|
|
|
2013-03-14 11:21:17 +01:00
|
|
|
error = FT_Err_Ok;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
x = builder->pos_x;
|
|
|
|
y = builder->pos_y;
|
|
|
|
|
2001-12-12 17:07:29 +01:00
|
|
|
/* begin hints recording session, if any */
|
|
|
|
if ( hinter )
|
|
|
|
hinter->open( hinter->hints );
|
|
|
|
|
2004-05-13 23:59:17 +02:00
|
|
|
/* now execute loop */
|
2001-01-03 01:15:00 +01:00
|
|
|
while ( ip < limit )
|
|
|
|
{
|
|
|
|
CFF_Operator op;
|
2001-01-03 08:14:12 +01:00
|
|
|
FT_Byte v;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
/********************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Decode operator or operand */
|
|
|
|
/* */
|
|
|
|
v = *ip++;
|
|
|
|
if ( v >= 32 || v == 28 )
|
|
|
|
{
|
|
|
|
FT_Int shift = 16;
|
|
|
|
FT_Int32 val;
|
|
|
|
|
|
|
|
|
|
|
|
/* this is an operand, push it on the stack */
|
Fix errors reported by clang's `sanitize' feature.
* include/freetype/internal/ftstream.h: Simplify and fix integer
extraction macros.
(FT_INT8_, FT_BYTE_I16, FT_BYTE_I32, FT_INT8_I16, FT_INT8_I32,
FT_INT8_I32, FT_INT8_U32): Removed.
(FT_PEEK_SHORT, FT_PEEK_LONG, FT_PEEK_OFF3, FT_PEEK_SHORT_LE,
FT_PEEK_LONG_LE, FT_PEEK_OFF3_LE): Use unsigned values for
computations and convert to signed as the last step.
* src/cff/cf2fixed.h (cf2_intToFixed, cf2_fixedToInt,
cf2_fracToFixed): Avoid shifts of negative values.
(cf2_intToFrac, cf2_fixedToFrac, cf2_fixedTo26Dot6): Removed,
unused.
* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdEXTENDEDNMBR,
default>: Use unsigned values for computations and convert to signed
as the last step.
Use proper types in tracing messages.
* src/cff/cffgload.c (cff_decoder_parse_charstrings): Use unsigned
values for computation of operands and convert to signed as the last
step.
Use proper type in tracing message.
2013-05-04 14:05:24 +02:00
|
|
|
|
|
|
|
/* if we use shifts, all computations are done with unsigned */
|
|
|
|
/* values; the conversion to a signed value is the last step */
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( v == 28 )
|
|
|
|
{
|
|
|
|
if ( ip + 1 >= limit )
|
|
|
|
goto Syntax_Error;
|
2013-05-04 18:57:56 +02:00
|
|
|
val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] );
|
2001-01-03 01:15:00 +01:00
|
|
|
ip += 2;
|
|
|
|
}
|
|
|
|
else if ( v < 247 )
|
2009-07-31 17:30:23 +02:00
|
|
|
val = (FT_Int32)v - 139;
|
2001-01-03 01:15:00 +01:00
|
|
|
else if ( v < 251 )
|
|
|
|
{
|
|
|
|
if ( ip >= limit )
|
|
|
|
goto Syntax_Error;
|
2009-07-31 17:30:23 +02:00
|
|
|
val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
else if ( v < 255 )
|
|
|
|
{
|
|
|
|
if ( ip >= limit )
|
|
|
|
goto Syntax_Error;
|
2009-07-31 17:30:23 +02:00
|
|
|
val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
2009-06-20 07:31:44 +02:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( ip + 3 >= limit )
|
|
|
|
goto Syntax_Error;
|
2013-05-04 18:57:56 +02:00
|
|
|
val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
|
|
|
|
( (FT_UInt32)ip[1] << 16 ) |
|
|
|
|
( (FT_UInt32)ip[2] << 8 ) |
|
|
|
|
(FT_UInt32)ip[3] );
|
2009-06-20 07:31:44 +02:00
|
|
|
ip += 4;
|
2009-11-04 07:21:15 +01:00
|
|
|
if ( charstring_type == 2 )
|
|
|
|
shift = 0;
|
2009-06-20 07:31:44 +02:00
|
|
|
}
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( decoder->top - stack >= CFF_MAX_OPERANDS )
|
|
|
|
goto Stack_Overflow;
|
|
|
|
|
Fix errors reported by clang's `sanitize' feature.
* include/freetype/internal/ftstream.h: Simplify and fix integer
extraction macros.
(FT_INT8_, FT_BYTE_I16, FT_BYTE_I32, FT_INT8_I16, FT_INT8_I32,
FT_INT8_I32, FT_INT8_U32): Removed.
(FT_PEEK_SHORT, FT_PEEK_LONG, FT_PEEK_OFF3, FT_PEEK_SHORT_LE,
FT_PEEK_LONG_LE, FT_PEEK_OFF3_LE): Use unsigned values for
computations and convert to signed as the last step.
* src/cff/cf2fixed.h (cf2_intToFixed, cf2_fixedToInt,
cf2_fracToFixed): Avoid shifts of negative values.
(cf2_intToFrac, cf2_fixedToFrac, cf2_fixedTo26Dot6): Removed,
unused.
* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdEXTENDEDNMBR,
default>: Use unsigned values for computations and convert to signed
as the last step.
Use proper types in tracing messages.
* src/cff/cffgload.c (cff_decoder_parse_charstrings): Use unsigned
values for computation of operands and convert to signed as the last
step.
Use proper type in tracing message.
2013-05-04 14:05:24 +02:00
|
|
|
val = (FT_Int32)( (FT_UInt32)val << shift );
|
2001-01-03 01:15:00 +01:00
|
|
|
*decoder->top++ = val;
|
|
|
|
|
|
|
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
2003-06-23 21:26:53 +02:00
|
|
|
if ( !( val & 0xFFFFL ) )
|
Fix errors reported by clang's `sanitize' feature.
* include/freetype/internal/ftstream.h: Simplify and fix integer
extraction macros.
(FT_INT8_, FT_BYTE_I16, FT_BYTE_I32, FT_INT8_I16, FT_INT8_I32,
FT_INT8_I32, FT_INT8_U32): Removed.
(FT_PEEK_SHORT, FT_PEEK_LONG, FT_PEEK_OFF3, FT_PEEK_SHORT_LE,
FT_PEEK_LONG_LE, FT_PEEK_OFF3_LE): Use unsigned values for
computations and convert to signed as the last step.
* src/cff/cf2fixed.h (cf2_intToFixed, cf2_fixedToInt,
cf2_fracToFixed): Avoid shifts of negative values.
(cf2_intToFrac, cf2_fixedToFrac, cf2_fixedTo26Dot6): Removed,
unused.
* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdEXTENDEDNMBR,
default>: Use unsigned values for computations and convert to signed
as the last step.
Use proper types in tracing messages.
* src/cff/cffgload.c (cff_decoder_parse_charstrings): Use unsigned
values for computation of operands and convert to signed as the last
step.
Use proper type in tracing message.
2013-05-04 14:05:24 +02:00
|
|
|
FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) ));
|
2001-01-03 01:15:00 +01:00
|
|
|
else
|
2001-03-16 14:35:56 +01:00
|
|
|
FT_TRACE4(( " %.2f", val / 65536.0 ));
|
2001-01-03 01:15:00 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2008-07-30 07:28:37 +02:00
|
|
|
/* The specification says that normally arguments are to be taken */
|
|
|
|
/* from the bottom of the stack. However, this seems not to be */
|
|
|
|
/* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */
|
|
|
|
/* arguments similar to a PS interpreter. */
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
FT_Fixed* args = decoder->top;
|
* src/sfnt/ttpost.c (load_post_names, tt_face_free_ps_names,
tt_face_get_ps_name): Replace switch statement with if clauses to
make it more portable.
* src/cff/cffobjs.c (cff_face_init): Ditto.
* include/freetype/ftmodule.h (FT_Module_Class): Use `FT_Long' for
`module_size'.
* include/freetype/ftrender.h (FT_Glyph_Class_): Use `FT_Long' for
`glyph_size'.
* src/base/ftobjs.c (FT_Render_Glyph): Change second parameter to
`FT_Render_Mode'.
(FT_Render_Glyph_Internal): Change third parameter to
`FT_Render_Mode'.
* src/base/ftglyph.c (FT_Glyph_To_Bitmap): Change second parameter
to `FT_Render_Mode'.
* src/raster/ftrend1.c (ft_raster1_render): Change third parameter
to `FT_Render_Mode'.
* src/smooth/ftsmooth.c (ft_smooth_render, ft_smooth_render_lcd,
ft_smooth_render_lcd_v): Ditto.
(ft_smooth_render_generic): Change third and fifth parameter to
`FT_Render_Mode'.
* include/freetype/freetype.h, include/freetype/internal/ftobjs.h,
include/freetype/ftglyph.h: Updated.
* src/cff/cffdrivr.c (Load_Glyph), src/pcf/pcfdriver.c
(PCF_Glyph_Load), src/pfr/pfrobjs.c (pfr_slot_load),
src/winfonts/winfnt.c (FNT_Load_Glyph), src/t42/t42objs.c
(T42_GlyphSlot_Load), src/bdf/bdfdrivr.c (BDF_Glyph_Load): Change
fourth parameter to `FT_Int32'.
* src/pfr/pfrobjs.c (pfr_face_init): Add two missing parameters
and declare them as unused.
* src/cid/cidparse.h (CID_Parser): Use FT_Long for `postscript_len'.
* src/psnames/psnames.h (PS_Unicode_Value_Func): Change return
value to FT_UInt32.
* src/psnames/psmodule.c (ps_unicode_value, ps_build_unicode_table):
Updated accordingly.
* src/cff/cffdrivr.c (Get_Kerning): Use FT_Long for `middle'.
(cff_get_glyph_name): Use cast for result of ft_strlen.
* src/cff/cffparse.c (cff_parse_real): User cast for assigning
`exp'.
* src/cff/cffload.c (cff_index_get_pointers): Use FT_ULong for
some local variables.
(cff_charset_load, cff_encoding_load): Use casts to FT_UInt for some
switch statements.
(cff_font_load): Use cast in call to CFF_Load_FD_Select.
* src/cff/cffobjs.c (cff_size_init): Use more casts.
(cff_face_init): Use FT_Int32 for `flags'.
* src/cff/cffgload.c (cff_operator_seac): Use cast for assigning
`adx' and `ady'.
(cff_decoder_parse_charstrings): Use FT_ULong for third parameter.
Use more casts.
* src/cff/cffcmap.c (cff_cmap_unicode_init): Use cast for `count'.
* src/cid/cidload.c (cid_read_subrs): Use FT_ULong for `len'.
* src/cid/cidgload.c (cid_load_glyph): Add missing cast for
`cid_get_offset'.
* src/psaux/t1decode.c (t1_decoder_parse_charstrings) <18>: Use
cast for `num_points'.
(t1_decoder_init): Use cast for assigning `decoder->num_glyphs'.
* src/base/ftdebug.c (ft_debug_init): Use FT_Int.
* include/freetype/internal/ftdriver.h (FT_Slot_LoadFunc): Use
`FT_Int32' for fourth parameter.
* src/base/ftobjs.c (open_face): Use cast for calling
clazz->init_face.
* src/raster/ftraster.c (Set_High_Precision): Use `1' instead of
`1L'.
(Finalize_Profile_Table, Line_Up, ft_black_init): Use casts.
* src/raster/ftrend1.c (ft_raster1_render): Ditto.
* src/sfnt/sfnt_dir_check: Compare `magic' with unsigned long
constant.
* builds/amiga/include/freetype/config/ftmodule.h: Updated.
2002-09-27 13:09:23 +02:00
|
|
|
FT_Int num_args = (FT_Int)( args - decoder->stack );
|
2001-01-03 01:15:00 +01:00
|
|
|
FT_Int req_args;
|
|
|
|
|
|
|
|
|
|
|
|
/* find operator */
|
|
|
|
op = cff_op_unknown;
|
|
|
|
|
|
|
|
switch ( v )
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
op = cff_op_hstem;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
op = cff_op_vstem;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
op = cff_op_vmoveto;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
op = cff_op_rlineto;
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
op = cff_op_hlineto;
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
op = cff_op_vlineto;
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
op = cff_op_rrcurveto;
|
|
|
|
break;
|
2007-12-06 18:17:30 +01:00
|
|
|
case 9:
|
|
|
|
op = cff_op_closepath;
|
|
|
|
break;
|
2001-01-03 01:15:00 +01:00
|
|
|
case 10:
|
|
|
|
op = cff_op_callsubr;
|
|
|
|
break;
|
|
|
|
case 11:
|
|
|
|
op = cff_op_return;
|
|
|
|
break;
|
|
|
|
case 12:
|
|
|
|
{
|
|
|
|
if ( ip >= limit )
|
|
|
|
goto Syntax_Error;
|
|
|
|
v = *ip++;
|
|
|
|
|
|
|
|
switch ( v )
|
|
|
|
{
|
2001-03-16 14:35:56 +01:00
|
|
|
case 0:
|
|
|
|
op = cff_op_dotsection;
|
|
|
|
break;
|
2009-11-04 07:21:15 +01:00
|
|
|
case 1: /* this is actually the Type1 vstem3 operator */
|
|
|
|
op = cff_op_vstem;
|
|
|
|
break;
|
|
|
|
case 2: /* this is actually the Type1 hstem3 operator */
|
|
|
|
op = cff_op_hstem;
|
|
|
|
break;
|
2001-01-03 01:15:00 +01:00
|
|
|
case 3:
|
|
|
|
op = cff_op_and;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
op = cff_op_or;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
op = cff_op_not;
|
|
|
|
break;
|
2009-11-04 07:21:15 +01:00
|
|
|
case 6:
|
|
|
|
op = cff_op_seac;
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
op = cff_op_sbw;
|
|
|
|
break;
|
2001-01-03 01:15:00 +01:00
|
|
|
case 8:
|
|
|
|
op = cff_op_store;
|
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
op = cff_op_abs;
|
|
|
|
break;
|
|
|
|
case 10:
|
|
|
|
op = cff_op_add;
|
|
|
|
break;
|
|
|
|
case 11:
|
|
|
|
op = cff_op_sub;
|
|
|
|
break;
|
|
|
|
case 12:
|
|
|
|
op = cff_op_div;
|
|
|
|
break;
|
|
|
|
case 13:
|
|
|
|
op = cff_op_load;
|
|
|
|
break;
|
|
|
|
case 14:
|
|
|
|
op = cff_op_neg;
|
|
|
|
break;
|
|
|
|
case 15:
|
|
|
|
op = cff_op_eq;
|
|
|
|
break;
|
2008-09-22 13:28:46 +02:00
|
|
|
case 16:
|
|
|
|
op = cff_op_callothersubr;
|
|
|
|
break;
|
|
|
|
case 17:
|
|
|
|
op = cff_op_pop;
|
|
|
|
break;
|
2001-01-03 01:15:00 +01:00
|
|
|
case 18:
|
|
|
|
op = cff_op_drop;
|
|
|
|
break;
|
|
|
|
case 20:
|
|
|
|
op = cff_op_put;
|
|
|
|
break;
|
|
|
|
case 21:
|
|
|
|
op = cff_op_get;
|
|
|
|
break;
|
|
|
|
case 22:
|
|
|
|
op = cff_op_ifelse;
|
|
|
|
break;
|
|
|
|
case 23:
|
|
|
|
op = cff_op_random;
|
|
|
|
break;
|
|
|
|
case 24:
|
|
|
|
op = cff_op_mul;
|
|
|
|
break;
|
|
|
|
case 26:
|
|
|
|
op = cff_op_sqrt;
|
|
|
|
break;
|
|
|
|
case 27:
|
|
|
|
op = cff_op_dup;
|
|
|
|
break;
|
|
|
|
case 28:
|
|
|
|
op = cff_op_exch;
|
|
|
|
break;
|
|
|
|
case 29:
|
|
|
|
op = cff_op_index;
|
|
|
|
break;
|
|
|
|
case 30:
|
|
|
|
op = cff_op_roll;
|
|
|
|
break;
|
2009-11-04 07:21:15 +01:00
|
|
|
case 33:
|
|
|
|
op = cff_op_setcurrentpoint;
|
|
|
|
break;
|
2001-01-03 01:15:00 +01:00
|
|
|
case 34:
|
|
|
|
op = cff_op_hflex;
|
|
|
|
break;
|
|
|
|
case 35:
|
|
|
|
op = cff_op_flex;
|
|
|
|
break;
|
|
|
|
case 36:
|
|
|
|
op = cff_op_hflex1;
|
|
|
|
break;
|
|
|
|
case 37:
|
|
|
|
op = cff_op_flex1;
|
|
|
|
break;
|
|
|
|
default:
|
2011-02-01 07:36:27 +01:00
|
|
|
FT_TRACE4(( " unknown op (12, %d)\n", v ));
|
|
|
|
break;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2007-12-06 18:17:30 +01:00
|
|
|
case 13:
|
|
|
|
op = cff_op_hsbw;
|
|
|
|
break;
|
2001-01-03 01:15:00 +01:00
|
|
|
case 14:
|
|
|
|
op = cff_op_endchar;
|
|
|
|
break;
|
|
|
|
case 16:
|
|
|
|
op = cff_op_blend;
|
|
|
|
break;
|
|
|
|
case 18:
|
|
|
|
op = cff_op_hstemhm;
|
|
|
|
break;
|
|
|
|
case 19:
|
|
|
|
op = cff_op_hintmask;
|
|
|
|
break;
|
|
|
|
case 20:
|
|
|
|
op = cff_op_cntrmask;
|
|
|
|
break;
|
|
|
|
case 21:
|
|
|
|
op = cff_op_rmoveto;
|
|
|
|
break;
|
|
|
|
case 22:
|
|
|
|
op = cff_op_hmoveto;
|
|
|
|
break;
|
|
|
|
case 23:
|
|
|
|
op = cff_op_vstemhm;
|
|
|
|
break;
|
|
|
|
case 24:
|
|
|
|
op = cff_op_rcurveline;
|
|
|
|
break;
|
|
|
|
case 25:
|
|
|
|
op = cff_op_rlinecurve;
|
|
|
|
break;
|
|
|
|
case 26:
|
|
|
|
op = cff_op_vvcurveto;
|
|
|
|
break;
|
|
|
|
case 27:
|
|
|
|
op = cff_op_hhcurveto;
|
|
|
|
break;
|
|
|
|
case 29:
|
|
|
|
op = cff_op_callgsubr;
|
|
|
|
break;
|
|
|
|
case 30:
|
|
|
|
op = cff_op_vhcurveto;
|
|
|
|
break;
|
|
|
|
case 31:
|
|
|
|
op = cff_op_hvcurveto;
|
|
|
|
break;
|
|
|
|
default:
|
2011-02-01 07:36:27 +01:00
|
|
|
FT_TRACE4(( " unknown op (%d)\n", v ));
|
2009-11-04 07:21:15 +01:00
|
|
|
break;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
2008-07-30 07:28:37 +02:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( op == cff_op_unknown )
|
2011-02-01 07:36:27 +01:00
|
|
|
continue;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* check arguments */
|
|
|
|
req_args = cff_argument_counts[op];
|
|
|
|
if ( req_args & CFF_COUNT_CHECK_WIDTH )
|
|
|
|
{
|
|
|
|
if ( num_args > 0 && decoder->read_width )
|
|
|
|
{
|
|
|
|
/* If `nominal_width' is non-zero, the number is really a */
|
|
|
|
/* difference against `nominal_width'. Else, the number here */
|
|
|
|
/* is truly a width, not a difference against `nominal_width'. */
|
|
|
|
/* If the font does not set `nominal_width', then */
|
|
|
|
/* `nominal_width' defaults to zero, and so we can set */
|
|
|
|
/* `glyph_width' to `nominal_width' plus number on the stack */
|
|
|
|
/* -- for either case. */
|
|
|
|
|
2004-02-10 17:02:20 +01:00
|
|
|
FT_Int set_width_ok;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
switch ( op )
|
|
|
|
{
|
|
|
|
case cff_op_hmoveto:
|
|
|
|
case cff_op_vmoveto:
|
|
|
|
set_width_ok = num_args & 2;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_hstem:
|
|
|
|
case cff_op_vstem:
|
|
|
|
case cff_op_hstemhm:
|
|
|
|
case cff_op_vstemhm:
|
|
|
|
case cff_op_rmoveto:
|
2004-02-10 17:02:20 +01:00
|
|
|
case cff_op_hintmask:
|
|
|
|
case cff_op_cntrmask:
|
2001-01-03 01:15:00 +01:00
|
|
|
set_width_ok = num_args & 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_endchar:
|
|
|
|
/* If there is a width specified for endchar, we either have */
|
|
|
|
/* 1 argument or 5 arguments. We like to argue. */
|
2008-07-26 23:22:20 +02:00
|
|
|
set_width_ok = ( num_args == 5 ) || ( num_args == 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
set_width_ok = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( set_width_ok )
|
|
|
|
{
|
|
|
|
decoder->glyph_width = decoder->nominal_width +
|
|
|
|
( stack[0] >> 16 );
|
|
|
|
|
2008-09-12 18:27:48 +02:00
|
|
|
if ( decoder->width_only )
|
* include/freetype/ftadvanc.h, src/base/ftadvanc.c,
include/freetype/config/ftheader.h, include/freetype/freetype.h,
src/base/Jamfile, src/base/rules.mk, src/cff/cffdrivr.c,
src/cff/cffgload.c, src/cff/cffgload.h, src/truetype/ttdriver.c,
src/truetype/ttgload.h, src/truetype/ttgload.c, src/type1/t1driver.c,
src/type1/t1gload.h, src/type1/t1gload.c:
Add a new header named FT_ADVANCES_H declaring some new APIs
to extract the advances of one or more glyphs without necessarily
loading their outlines. Also provide 'fast loaders' for the
TrueType, Type1 and CFF font drivers (more to come later)
* autogen.sh: add checks for minimum version of the 'autotools'
stuff.
2008-09-01 23:35:21 +02:00
|
|
|
{
|
2008-09-12 18:27:48 +02:00
|
|
|
/* we only want the advance width; stop here */
|
* include/freetype/ftadvanc.h, src/base/ftadvanc.c,
include/freetype/config/ftheader.h, include/freetype/freetype.h,
src/base/Jamfile, src/base/rules.mk, src/cff/cffdrivr.c,
src/cff/cffgload.c, src/cff/cffgload.h, src/truetype/ttdriver.c,
src/truetype/ttgload.h, src/truetype/ttgload.c, src/type1/t1driver.c,
src/type1/t1gload.h, src/type1/t1gload.c:
Add a new header named FT_ADVANCES_H declaring some new APIs
to extract the advances of one or more glyphs without necessarily
loading their outlines. Also provide 'fast loaders' for the
TrueType, Type1 and CFF font drivers (more to come later)
* autogen.sh: add checks for minimum version of the 'autotools'
stuff.
2008-09-01 23:35:21 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
/* Consumed an argument. */
|
|
|
|
num_args--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
decoder->read_width = 0;
|
|
|
|
req_args = 0;
|
|
|
|
}
|
|
|
|
|
2007-12-06 18:17:30 +01:00
|
|
|
req_args &= 0x000F;
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( num_args < req_args )
|
|
|
|
goto Stack_Underflow;
|
|
|
|
args -= req_args;
|
|
|
|
num_args -= req_args;
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
/* At this point, `args' points to the first argument of the */
|
|
|
|
/* operand in case `req_args' isn't zero. Otherwise, we have */
|
|
|
|
/* to adjust `args' manually. */
|
|
|
|
|
|
|
|
/* Note that we only pop arguments from the stack which we */
|
|
|
|
/* really need and can digest so that we can continue in case */
|
|
|
|
/* of superfluous stack elements. */
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
switch ( op )
|
|
|
|
{
|
|
|
|
case cff_op_hstem:
|
|
|
|
case cff_op_vstem:
|
|
|
|
case cff_op_hstemhm:
|
|
|
|
case cff_op_vstemhm:
|
2001-12-12 17:07:29 +01:00
|
|
|
/* the number of arguments is always even here */
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4((
|
|
|
|
op == cff_op_hstem ? " hstem\n" :
|
|
|
|
( op == cff_op_vstem ? " vstem\n" :
|
|
|
|
( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) ));
|
2001-12-14 15:52:58 +01:00
|
|
|
|
2001-12-12 17:07:29 +01:00
|
|
|
if ( hinter )
|
|
|
|
hinter->stems( hinter->hints,
|
2001-12-21 16:59:43 +01:00
|
|
|
( op == cff_op_hstem || op == cff_op_hstemhm ),
|
2001-12-16 09:17:33 +01:00
|
|
|
num_args / 2,
|
2008-07-30 07:28:37 +02:00
|
|
|
args - ( num_args & ~1 ) );
|
2001-12-14 15:52:58 +01:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
decoder->num_hints += num_args / 2;
|
|
|
|
args = stack;
|
|
|
|
break;
|
2001-12-14 15:52:58 +01:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
case cff_op_hintmask:
|
|
|
|
case cff_op_cntrmask:
|
2001-12-12 17:07:29 +01:00
|
|
|
FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" ));
|
2002-02-24 03:59:24 +01:00
|
|
|
|
2001-12-22 15:38:40 +01:00
|
|
|
/* implement vstem when needed -- */
|
2001-12-21 22:21:13 +01:00
|
|
|
/* the specification doesn't say it, but this also works */
|
2001-12-22 15:38:40 +01:00
|
|
|
/* with the 'cntrmask' operator */
|
2001-12-21 22:21:13 +01:00
|
|
|
/* */
|
2001-12-20 14:14:18 +01:00
|
|
|
if ( num_args > 0 )
|
|
|
|
{
|
|
|
|
if ( hinter )
|
|
|
|
hinter->stems( hinter->hints,
|
2001-12-21 16:59:43 +01:00
|
|
|
0,
|
2001-12-20 14:14:18 +01:00
|
|
|
num_args / 2,
|
2008-07-30 07:28:37 +02:00
|
|
|
args - ( num_args & ~1 ) );
|
2002-02-24 03:59:24 +01:00
|
|
|
|
2001-12-20 14:14:18 +01:00
|
|
|
decoder->num_hints += num_args / 2;
|
|
|
|
}
|
2001-03-16 14:35:56 +01:00
|
|
|
|
2010-07-05 06:40:02 +02:00
|
|
|
/* In a valid charstring there must be at least one byte */
|
|
|
|
/* after `hintmask' or `cntrmask' (e.g., for a `return' */
|
|
|
|
/* instruction). Additionally, there must be space for */
|
|
|
|
/* `num_hints' bits. */
|
2010-06-27 12:34:19 +02:00
|
|
|
|
2010-07-17 13:39:50 +02:00
|
|
|
if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit )
|
2010-06-27 15:41:02 +02:00
|
|
|
goto Syntax_Error;
|
2010-06-27 12:34:19 +02:00
|
|
|
|
2010-06-27 15:41:02 +02:00
|
|
|
if ( hinter )
|
|
|
|
{
|
2001-12-12 17:07:29 +01:00
|
|
|
if ( op == cff_op_hintmask )
|
|
|
|
hinter->hintmask( hinter->hints,
|
2015-02-20 08:35:32 +01:00
|
|
|
(FT_UInt)builder->current->n_points,
|
|
|
|
(FT_UInt)decoder->num_hints,
|
2001-12-12 17:07:29 +01:00
|
|
|
ip );
|
|
|
|
else
|
|
|
|
hinter->counter( hinter->hints,
|
2015-02-20 08:35:32 +01:00
|
|
|
(FT_UInt)decoder->num_hints,
|
2001-12-12 17:07:29 +01:00
|
|
|
ip );
|
|
|
|
}
|
2001-12-14 15:52:58 +01:00
|
|
|
|
2001-03-16 14:35:56 +01:00
|
|
|
#ifdef FT_DEBUG_LEVEL_TRACE
|
|
|
|
{
|
|
|
|
FT_UInt maskbyte;
|
|
|
|
|
2002-03-30 17:41:09 +01:00
|
|
|
|
2010-06-11 23:00:22 +02:00
|
|
|
FT_TRACE4(( " (maskbytes:" ));
|
2001-03-16 14:35:56 +01:00
|
|
|
|
* builds/win32/detekt.mk: Fix .PHONY target for Intel compiler.
Renamed "ftnames.h" to "ftsnames.h", and FT_NAMES_H to
FT_SFNT_NAMES_H.
* docs/docmaker.py: Added generation of INDEX link in table of
contents.
* INSTALL, docs/BUILD: Updated documentation to indicate that the
compilation process has changed slightly (no more `src' required in
* builds/*/*-def.mk: Changed the objects directory from "obj" to
"objs".
* include/freetype/config/ftheader.h: Removed obsolete macros like
FT_SOURCE_FILE, etc. and added cache-specific macro definitions that
were previously defined in <freetype/ftcache.h>. Added comments to
be included in a new API Reference section.
* src/*/*: Removed the use of FT_SOURCE_FILE, etc. Now, each
component needs to add its own directory to the include path at
compile time. Modified all "rules.mk" and "descrip.mms"
accordingly.
* src/cid/cidobjs.c, src/cid/cidload.c, src/pcf/pcfread.c,
src/type1/t1load.c, src/type1/t1objs.c: Added a few casts to remove
compiler warnings in pedantic modes.
* include/config/ft2build.h, include/config/ftheader.h: The file
top-level <ft2build.h>.
* include/config/ftheader.h: Added new section describing the #include
macros.
the Type 2 glyph charstring (used by conversion programs).
* docs/docmaker.py: Added cross-references generation as well as
seac emulation provided by the Type 2 endchar operator.
* src/cid/cidafm.c, src/cid/cidafm.h: removed un-needed files,
Added support for clipped direct rendering in the smooth renderer.
* src/cff/t2objs.c (T2_Init_Face): For pure CFF fonts, set
2001-03-20 23:58:56 +01:00
|
|
|
for ( maskbyte = 0;
|
2010-06-27 12:34:19 +02:00
|
|
|
maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 );
|
* builds/win32/detekt.mk: Fix .PHONY target for Intel compiler.
Renamed "ftnames.h" to "ftsnames.h", and FT_NAMES_H to
FT_SFNT_NAMES_H.
* docs/docmaker.py: Added generation of INDEX link in table of
contents.
* INSTALL, docs/BUILD: Updated documentation to indicate that the
compilation process has changed slightly (no more `src' required in
* builds/*/*-def.mk: Changed the objects directory from "obj" to
"objs".
* include/freetype/config/ftheader.h: Removed obsolete macros like
FT_SOURCE_FILE, etc. and added cache-specific macro definitions that
were previously defined in <freetype/ftcache.h>. Added comments to
be included in a new API Reference section.
* src/*/*: Removed the use of FT_SOURCE_FILE, etc. Now, each
component needs to add its own directory to the include path at
compile time. Modified all "rules.mk" and "descrip.mms"
accordingly.
* src/cid/cidobjs.c, src/cid/cidload.c, src/pcf/pcfread.c,
src/type1/t1load.c, src/type1/t1objs.c: Added a few casts to remove
compiler warnings in pedantic modes.
* include/config/ft2build.h, include/config/ftheader.h: The file
top-level <ft2build.h>.
* include/config/ftheader.h: Added new section describing the #include
macros.
the Type 2 glyph charstring (used by conversion programs).
* docs/docmaker.py: Added cross-references generation as well as
seac emulation provided by the Type 2 endchar operator.
* src/cid/cidafm.c, src/cid/cidafm.h: removed un-needed files,
Added support for clipped direct rendering in the smooth renderer.
* src/cff/t2objs.c (T2_Init_Face): For pure CFF fonts, set
2001-03-20 23:58:56 +01:00
|
|
|
maskbyte++, ip++ )
|
2010-06-11 23:00:22 +02:00
|
|
|
FT_TRACE4(( " 0x%02X", *ip ));
|
2008-07-26 23:22:20 +02:00
|
|
|
|
|
|
|
FT_TRACE4(( ")\n" ));
|
2001-03-16 14:35:56 +01:00
|
|
|
}
|
|
|
|
#else
|
2001-01-03 01:15:00 +01:00
|
|
|
ip += ( decoder->num_hints + 7 ) >> 3;
|
2001-03-16 14:35:56 +01:00
|
|
|
#endif
|
2001-01-03 01:15:00 +01:00
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_rmoveto:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " rmoveto\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_close_contour( builder );
|
2001-01-03 01:15:00 +01:00
|
|
|
builder->path_begun = 0;
|
2008-07-30 07:28:37 +02:00
|
|
|
x += args[-2];
|
|
|
|
y += args[-1];
|
2001-01-03 01:15:00 +01:00
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_vmoveto:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " vmoveto\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_close_contour( builder );
|
2001-01-03 01:15:00 +01:00
|
|
|
builder->path_begun = 0;
|
2008-07-30 07:28:37 +02:00
|
|
|
y += args[-1];
|
2001-01-03 01:15:00 +01:00
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_hmoveto:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " hmoveto\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_close_contour( builder );
|
2001-01-03 01:15:00 +01:00
|
|
|
builder->path_begun = 0;
|
2008-07-30 07:28:37 +02:00
|
|
|
x += args[-1];
|
2001-01-03 01:15:00 +01:00
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_rlineto:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " rlineto\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
if ( cff_builder_start_point( builder, x, y ) ||
|
|
|
|
cff_check_points( builder, num_args / 2 ) )
|
2004-05-13 23:59:17 +02:00
|
|
|
goto Fail;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( num_args < 2 )
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Stack_Underflow;
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
args -= num_args & ~1;
|
2001-01-03 01:15:00 +01:00
|
|
|
while ( args < decoder->top )
|
|
|
|
{
|
|
|
|
x += args[0];
|
|
|
|
y += args[1];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
args += 2;
|
|
|
|
}
|
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_hlineto:
|
|
|
|
case cff_op_vlineto:
|
|
|
|
{
|
|
|
|
FT_Int phase = ( op == cff_op_hlineto );
|
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n"
|
|
|
|
: " vlineto\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2010-12-09 23:16:18 +01:00
|
|
|
if ( num_args < 0 )
|
2008-07-30 07:28:37 +02:00
|
|
|
goto Stack_Underflow;
|
|
|
|
|
2010-12-09 23:16:18 +01:00
|
|
|
/* there exist subsetted fonts (found in PDFs) */
|
|
|
|
/* which call `hlineto' without arguments */
|
|
|
|
if ( num_args == 0 )
|
|
|
|
break;
|
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
if ( cff_builder_start_point( builder, x, y ) ||
|
|
|
|
cff_check_points( builder, num_args ) )
|
2004-05-13 23:59:17 +02:00
|
|
|
goto Fail;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args = stack;
|
2005-11-17 09:12:00 +01:00
|
|
|
while ( args < decoder->top )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
if ( phase )
|
|
|
|
x += args[0];
|
|
|
|
else
|
|
|
|
y += args[0];
|
|
|
|
|
2002-07-26 11:09:10 +02:00
|
|
|
if ( cff_builder_add_point1( builder, x, y ) )
|
2004-05-13 23:59:17 +02:00
|
|
|
goto Fail;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args++;
|
|
|
|
phase ^= 1;
|
|
|
|
}
|
|
|
|
args = stack;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_rrcurveto:
|
2008-07-30 07:28:37 +02:00
|
|
|
{
|
|
|
|
FT_Int nargs;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
FT_TRACE4(( " rrcurveto\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( num_args < 6 )
|
|
|
|
goto Stack_Underflow;
|
|
|
|
|
|
|
|
nargs = num_args - num_args % 6;
|
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
if ( cff_builder_start_point( builder, x, y ) ||
|
|
|
|
cff_check_points( builder, nargs / 2 ) )
|
2008-07-30 07:28:37 +02:00
|
|
|
goto Fail;
|
|
|
|
|
|
|
|
args -= nargs;
|
|
|
|
while ( args < decoder->top )
|
|
|
|
{
|
|
|
|
x += args[0];
|
|
|
|
y += args[1];
|
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
|
|
|
x += args[2];
|
|
|
|
y += args[3];
|
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
|
|
|
x += args[4];
|
|
|
|
y += args[5];
|
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
|
|
|
args += 6;
|
|
|
|
}
|
|
|
|
args = stack;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_vvcurveto:
|
2008-07-30 07:28:37 +02:00
|
|
|
{
|
|
|
|
FT_Int nargs;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
FT_TRACE4(( " vvcurveto\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( num_args < 4 )
|
|
|
|
goto Stack_Underflow;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
/* if num_args isn't of the form 4n or 4n+1, */
|
2012-02-29 13:45:24 +01:00
|
|
|
/* we enforce it by clearing the second bit */
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2012-02-29 13:45:24 +01:00
|
|
|
nargs = num_args & ~2;
|
2008-07-30 07:28:37 +02:00
|
|
|
|
|
|
|
if ( cff_builder_start_point( builder, x, y ) )
|
|
|
|
goto Fail;
|
|
|
|
|
|
|
|
args -= nargs;
|
|
|
|
|
|
|
|
if ( nargs & 1 )
|
|
|
|
{
|
|
|
|
x += args[0];
|
|
|
|
args++;
|
|
|
|
nargs--;
|
|
|
|
}
|
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
|
2008-07-30 07:28:37 +02:00
|
|
|
goto Fail;
|
|
|
|
|
|
|
|
while ( args < decoder->top )
|
|
|
|
{
|
|
|
|
y += args[0];
|
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
|
|
|
x += args[1];
|
|
|
|
y += args[2];
|
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
|
|
|
y += args[3];
|
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
|
|
|
args += 4;
|
|
|
|
}
|
|
|
|
args = stack;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_hhcurveto:
|
2008-07-30 07:28:37 +02:00
|
|
|
{
|
|
|
|
FT_Int nargs;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
FT_TRACE4(( " hhcurveto\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( num_args < 4 )
|
|
|
|
goto Stack_Underflow;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
/* if num_args isn't of the form 4n or 4n+1, */
|
2012-02-29 13:45:24 +01:00
|
|
|
/* we enforce it by clearing the second bit */
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2012-02-29 13:45:24 +01:00
|
|
|
nargs = num_args & ~2;
|
2008-07-30 07:28:37 +02:00
|
|
|
|
|
|
|
if ( cff_builder_start_point( builder, x, y ) )
|
|
|
|
goto Fail;
|
|
|
|
|
|
|
|
args -= nargs;
|
|
|
|
if ( nargs & 1 )
|
|
|
|
{
|
|
|
|
y += args[0];
|
|
|
|
args++;
|
|
|
|
nargs--;
|
|
|
|
}
|
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
|
2008-07-30 07:28:37 +02:00
|
|
|
goto Fail;
|
|
|
|
|
|
|
|
while ( args < decoder->top )
|
|
|
|
{
|
|
|
|
x += args[0];
|
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
|
|
|
x += args[1];
|
|
|
|
y += args[2];
|
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
|
|
|
x += args[3];
|
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
|
|
|
args += 4;
|
|
|
|
}
|
|
|
|
args = stack;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_vhcurveto:
|
|
|
|
case cff_op_hvcurveto:
|
|
|
|
{
|
|
|
|
FT_Int phase;
|
2008-07-30 07:28:37 +02:00
|
|
|
FT_Int nargs;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n"
|
|
|
|
: " hvcurveto\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2004-05-13 14:59:59 +02:00
|
|
|
if ( cff_builder_start_point( builder, x, y ) )
|
2004-05-13 23:59:17 +02:00
|
|
|
goto Fail;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( num_args < 4 )
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Stack_Underflow;
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
/* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */
|
2012-02-29 13:45:24 +01:00
|
|
|
/* we enforce it by clearing the second bit */
|
2008-07-30 07:28:37 +02:00
|
|
|
|
2012-02-29 13:45:24 +01:00
|
|
|
nargs = num_args & ~2;
|
2008-07-30 07:28:37 +02:00
|
|
|
|
|
|
|
args -= nargs;
|
2013-04-12 21:13:49 +02:00
|
|
|
if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) )
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Stack_Underflow;
|
|
|
|
|
|
|
|
phase = ( op == cff_op_hvcurveto );
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
while ( nargs >= 4 )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2008-07-30 07:28:37 +02:00
|
|
|
nargs -= 4;
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( phase )
|
|
|
|
{
|
|
|
|
x += args[0];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
x += args[1];
|
|
|
|
y += args[2];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
y += args[3];
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( nargs == 1 )
|
2001-01-03 01:15:00 +01:00
|
|
|
x += args[4];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
y += args[0];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
x += args[1];
|
|
|
|
y += args[2];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
x += args[3];
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( nargs == 1 )
|
2001-01-03 01:15:00 +01:00
|
|
|
y += args[4];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
args += 4;
|
|
|
|
phase ^= 1;
|
|
|
|
}
|
|
|
|
args = stack;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_rlinecurve:
|
|
|
|
{
|
2008-07-30 07:28:37 +02:00
|
|
|
FT_Int num_lines;
|
|
|
|
FT_Int nargs;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " rlinecurve\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( num_args < 8 )
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Stack_Underflow;
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
nargs = num_args & ~1;
|
|
|
|
num_lines = ( nargs - 6 ) / 2;
|
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
if ( cff_builder_start_point( builder, x, y ) ||
|
|
|
|
cff_check_points( builder, num_lines + 3 ) )
|
2004-05-13 23:59:17 +02:00
|
|
|
goto Fail;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
args -= nargs;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* first, add the line segments */
|
|
|
|
while ( num_lines > 0 )
|
|
|
|
{
|
|
|
|
x += args[0];
|
|
|
|
y += args[1];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
args += 2;
|
|
|
|
num_lines--;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* then the curve */
|
|
|
|
x += args[0];
|
|
|
|
y += args[1];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
x += args[2];
|
|
|
|
y += args[3];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
x += args[4];
|
|
|
|
y += args[5];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
args = stack;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_rcurveline:
|
|
|
|
{
|
2008-07-30 07:28:37 +02:00
|
|
|
FT_Int num_curves;
|
|
|
|
FT_Int nargs;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " rcurveline\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( num_args < 8 )
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Stack_Underflow;
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
nargs = num_args - 2;
|
|
|
|
nargs = nargs - nargs % 6 + 2;
|
|
|
|
num_curves = ( nargs - 2 ) / 6;
|
|
|
|
|
2013-04-12 21:13:49 +02:00
|
|
|
if ( cff_builder_start_point( builder, x, y ) ||
|
|
|
|
cff_check_points( builder, num_curves * 3 + 2 ) )
|
2004-05-13 23:59:17 +02:00
|
|
|
goto Fail;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
args -= nargs;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* first, add the curves */
|
|
|
|
while ( num_curves > 0 )
|
|
|
|
{
|
|
|
|
x += args[0];
|
|
|
|
y += args[1];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
x += args[2];
|
|
|
|
y += args[3];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
x += args[4];
|
|
|
|
y += args[5];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
args += 6;
|
|
|
|
num_curves--;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* then the final line */
|
|
|
|
x += args[0];
|
|
|
|
y += args[1];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
args = stack;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_hflex1:
|
|
|
|
{
|
|
|
|
FT_Pos start_y;
|
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " hflex1\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
/* adding five more points: 4 control points, 1 on-curve point */
|
|
|
|
/* -- make sure we have enough space for the start point if it */
|
2004-05-13 23:59:17 +02:00
|
|
|
/* needs to be added */
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
if ( cff_builder_start_point( builder, x, y ) ||
|
2013-04-12 21:13:49 +02:00
|
|
|
cff_check_points( builder, 6 ) )
|
2004-05-13 23:59:17 +02:00
|
|
|
goto Fail;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
/* record the starting point's y position for later use */
|
2001-01-03 01:15:00 +01:00
|
|
|
start_y = y;
|
|
|
|
|
|
|
|
/* first control point */
|
|
|
|
x += args[0];
|
|
|
|
y += args[1];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* second control point */
|
|
|
|
x += args[2];
|
|
|
|
y += args[3];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* join point; on curve, with y-value the same as the last */
|
|
|
|
/* control point's y-value */
|
|
|
|
x += args[4];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* third control point, with y-value the same as the join */
|
|
|
|
/* point's y-value */
|
|
|
|
x += args[5];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* fourth control point */
|
|
|
|
x += args[6];
|
|
|
|
y += args[7];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* ending point, with y-value the same as the start */
|
|
|
|
x += args[8];
|
|
|
|
y = start_y;
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case cff_op_hflex:
|
|
|
|
{
|
|
|
|
FT_Pos start_y;
|
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " hflex\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* adding six more points; 4 control points, 2 on-curve points */
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
if ( cff_builder_start_point( builder, x, y ) ||
|
2013-04-12 21:13:49 +02:00
|
|
|
cff_check_points( builder, 6 ) )
|
2004-05-13 23:59:17 +02:00
|
|
|
goto Fail;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* record the starting point's y-position for later use */
|
|
|
|
start_y = y;
|
|
|
|
|
|
|
|
/* first control point */
|
|
|
|
x += args[0];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* second control point */
|
|
|
|
x += args[1];
|
|
|
|
y += args[2];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* join point; on curve, with y-value the same as the last */
|
|
|
|
/* control point's y-value */
|
|
|
|
x += args[3];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* third control point, with y-value the same as the join */
|
|
|
|
/* point's y-value */
|
|
|
|
x += args[4];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* fourth control point */
|
|
|
|
x += args[5];
|
|
|
|
y = start_y;
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* ending point, with y-value the same as the start point's */
|
|
|
|
/* y-value -- we don't add this point, though */
|
|
|
|
x += args[6];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case cff_op_flex1:
|
|
|
|
{
|
2008-07-30 07:28:37 +02:00
|
|
|
FT_Pos start_x, start_y; /* record start x, y values for */
|
|
|
|
/* alter use */
|
|
|
|
FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */
|
|
|
|
/* algorithm below */
|
|
|
|
FT_Int horizontal, count;
|
|
|
|
FT_Fixed* temp;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " flex1\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* adding six more points; 4 control points, 2 on-curve points */
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
if ( cff_builder_start_point( builder, x, y ) ||
|
2013-04-12 21:13:49 +02:00
|
|
|
cff_check_points( builder, 6 ) )
|
2004-05-13 23:59:17 +02:00
|
|
|
goto Fail;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2007-02-01 08:58:02 +01:00
|
|
|
/* record the starting point's x, y position for later use */
|
2001-01-03 01:15:00 +01:00
|
|
|
start_x = x;
|
|
|
|
start_y = y;
|
|
|
|
|
|
|
|
/* XXX: figure out whether this is supposed to be a horizontal */
|
|
|
|
/* or vertical flex; the Type 2 specification is vague... */
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
temp = args;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* grab up to the last argument */
|
|
|
|
for ( count = 5; count > 0; count-- )
|
|
|
|
{
|
2008-07-30 07:28:37 +02:00
|
|
|
dx += temp[0];
|
|
|
|
dy += temp[1];
|
|
|
|
temp += 2;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( dx < 0 )
|
|
|
|
dx = -dx;
|
|
|
|
if ( dy < 0 )
|
|
|
|
dy = -dy;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* strange test, but here it is... */
|
|
|
|
horizontal = ( dx > dy );
|
|
|
|
|
|
|
|
for ( count = 5; count > 0; count-- )
|
|
|
|
{
|
|
|
|
x += args[0];
|
|
|
|
y += args[1];
|
2008-07-30 07:28:37 +02:00
|
|
|
cff_builder_add_point( builder, x, y,
|
|
|
|
(FT_Bool)( count == 3 ) );
|
2001-01-03 01:15:00 +01:00
|
|
|
args += 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* is last operand an x- or y-delta? */
|
|
|
|
if ( horizontal )
|
|
|
|
{
|
|
|
|
x += args[0];
|
|
|
|
y = start_y;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
x = start_x;
|
|
|
|
y += args[0];
|
|
|
|
}
|
|
|
|
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y, 1 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case cff_op_flex:
|
|
|
|
{
|
|
|
|
FT_UInt count;
|
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " flex\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
if ( cff_builder_start_point( builder, x, y ) ||
|
2013-04-12 21:13:49 +02:00
|
|
|
cff_check_points( builder, 6 ) )
|
2004-05-13 23:59:17 +02:00
|
|
|
goto Fail;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
for ( count = 6; count > 0; count-- )
|
|
|
|
{
|
|
|
|
x += args[0];
|
|
|
|
y += args[1];
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_builder_add_point( builder, x, y,
|
2004-02-01 01:49:56 +01:00
|
|
|
(FT_Bool)( count == 4 || count == 1 ) );
|
2001-01-03 01:15:00 +01:00
|
|
|
args += 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
args = stack;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2009-11-04 07:21:15 +01:00
|
|
|
case cff_op_seac:
|
|
|
|
FT_TRACE4(( " seac\n" ));
|
|
|
|
|
|
|
|
error = cff_operator_seac( decoder,
|
|
|
|
args[0], args[1], args[2],
|
|
|
|
(FT_Int)( args[3] >> 16 ),
|
|
|
|
(FT_Int)( args[4] >> 16 ) );
|
|
|
|
|
|
|
|
/* add current outline to the glyph slot */
|
|
|
|
FT_GlyphLoader_Add( builder->loader );
|
|
|
|
|
|
|
|
/* return now! */
|
|
|
|
FT_TRACE4(( "\n" ));
|
|
|
|
return error;
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
case cff_op_endchar:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " endchar\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* We are going to emulate the seac operator. */
|
2008-07-30 07:28:37 +02:00
|
|
|
if ( num_args >= 4 )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2004-02-10 17:02:20 +01:00
|
|
|
/* Save glyph width so that the subglyphs don't overwrite it. */
|
|
|
|
FT_Pos glyph_width = decoder->glyph_width;
|
|
|
|
|
2011-12-08 09:51:52 +01:00
|
|
|
|
2001-01-03 08:14:12 +01:00
|
|
|
error = cff_operator_seac( decoder,
|
2009-11-04 07:21:15 +01:00
|
|
|
0L, args[-4], args[-3],
|
2008-07-30 07:28:37 +02:00
|
|
|
(FT_Int)( args[-2] >> 16 ),
|
|
|
|
(FT_Int)( args[-1] >> 16 ) );
|
2004-02-10 17:02:20 +01:00
|
|
|
|
|
|
|
decoder->glyph_width = glyph_width;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
2004-02-01 01:49:56 +01:00
|
|
|
else
|
|
|
|
{
|
|
|
|
cff_builder_close_contour( builder );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2004-02-01 01:49:56 +01:00
|
|
|
/* close hints recording session */
|
|
|
|
if ( hinter )
|
|
|
|
{
|
2005-11-17 09:12:00 +01:00
|
|
|
if ( hinter->close( hinter->hints,
|
2015-02-20 08:35:32 +01:00
|
|
|
(FT_UInt)builder->current->n_points ) )
|
2004-02-01 01:49:56 +01:00
|
|
|
goto Syntax_Error;
|
|
|
|
|
|
|
|
/* apply hints to the loaded glyph outline now */
|
[Savannah bug #43682] Properly handle missing return errors.
The functions in this patch *do* return non-trivial errors that must
be taken care of.
* src/autofit/afloader.c (af_loader_load_g), src/base/ftobjs.c
(FT_Render_Glyph_Internal), src/base/ftoutln.c (FT_Outline_Render),
src/cff/cffgload.c (cff_decoder_parse_charstrings) <cff_op_endchar>,
src/psaux/psobjs.c (ps_parser_load_field_table), src/psaux/t1decode
(t1_decoder_parse_charstrings) <op_endchar>, src/truetype/ttgload.c
(load_truetype_glyph <subglyph loop>, tt_loader_init,
TT_Load_Glyph), src/truetype/ttgxvar.c (TT_Set_MM_Blend),
src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Do it.
2014-11-25 08:53:09 +01:00
|
|
|
error = hinter->apply( hinter->hints,
|
|
|
|
builder->current,
|
|
|
|
(PSH_Globals)builder->hints_globals,
|
|
|
|
decoder->hint_mode );
|
|
|
|
if ( error )
|
|
|
|
goto Fail;
|
2004-02-01 01:49:56 +01:00
|
|
|
}
|
2001-12-14 15:52:58 +01:00
|
|
|
|
2004-02-01 01:49:56 +01:00
|
|
|
/* add current outline to the glyph slot */
|
|
|
|
FT_GlyphLoader_Add( builder->loader );
|
2001-12-12 17:07:29 +01:00
|
|
|
}
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
/* return now! */
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( "\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
return error;
|
|
|
|
|
|
|
|
case cff_op_abs:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " abs\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
if ( args[0] < 0 )
|
|
|
|
args[0] = -args[0];
|
|
|
|
args++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_add:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " add\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args[0] += args[1];
|
|
|
|
args++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_sub:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " sub\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args[0] -= args[1];
|
|
|
|
args++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_div:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " div\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args[0] = FT_DivFix( args[0], args[1] );
|
|
|
|
args++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_neg:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " neg\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args[0] = -args[0];
|
|
|
|
args++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_random:
|
|
|
|
{
|
2002-04-14 02:54:32 +02:00
|
|
|
FT_Fixed Rand;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " rand\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2002-04-14 02:54:32 +02:00
|
|
|
Rand = seed;
|
2003-06-23 21:26:53 +02:00
|
|
|
if ( Rand >= 0x8000L )
|
2002-04-14 02:54:32 +02:00
|
|
|
Rand++;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2002-04-14 02:54:32 +02:00
|
|
|
args[0] = Rand;
|
2001-01-03 01:15:00 +01:00
|
|
|
seed = FT_MulFix( seed, 0x10000L - seed );
|
|
|
|
if ( seed == 0 )
|
|
|
|
seed += 0x2873;
|
|
|
|
args++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_mul:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " mul\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args[0] = FT_MulFix( args[0], args[1] );
|
|
|
|
args++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_sqrt:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " sqrt\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
if ( args[0] > 0 )
|
|
|
|
{
|
|
|
|
FT_Int count = 9;
|
|
|
|
FT_Fixed root = args[0];
|
|
|
|
FT_Fixed new_root;
|
|
|
|
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
2001-03-16 14:35:56 +01:00
|
|
|
new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( new_root == root || count <= 0 )
|
|
|
|
break;
|
|
|
|
root = new_root;
|
|
|
|
}
|
|
|
|
args[0] = new_root;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
args[0] = 0;
|
|
|
|
args++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_drop:
|
|
|
|
/* nothing */
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " drop\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_exch:
|
|
|
|
{
|
|
|
|
FT_Fixed tmp;
|
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " exch\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
tmp = args[0];
|
|
|
|
args[0] = args[1];
|
|
|
|
args[1] = tmp;
|
|
|
|
args += 2;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_index:
|
|
|
|
{
|
* src/sfnt/ttpost.c (load_post_names, tt_face_free_ps_names,
tt_face_get_ps_name): Replace switch statement with if clauses to
make it more portable.
* src/cff/cffobjs.c (cff_face_init): Ditto.
* include/freetype/ftmodule.h (FT_Module_Class): Use `FT_Long' for
`module_size'.
* include/freetype/ftrender.h (FT_Glyph_Class_): Use `FT_Long' for
`glyph_size'.
* src/base/ftobjs.c (FT_Render_Glyph): Change second parameter to
`FT_Render_Mode'.
(FT_Render_Glyph_Internal): Change third parameter to
`FT_Render_Mode'.
* src/base/ftglyph.c (FT_Glyph_To_Bitmap): Change second parameter
to `FT_Render_Mode'.
* src/raster/ftrend1.c (ft_raster1_render): Change third parameter
to `FT_Render_Mode'.
* src/smooth/ftsmooth.c (ft_smooth_render, ft_smooth_render_lcd,
ft_smooth_render_lcd_v): Ditto.
(ft_smooth_render_generic): Change third and fifth parameter to
`FT_Render_Mode'.
* include/freetype/freetype.h, include/freetype/internal/ftobjs.h,
include/freetype/ftglyph.h: Updated.
* src/cff/cffdrivr.c (Load_Glyph), src/pcf/pcfdriver.c
(PCF_Glyph_Load), src/pfr/pfrobjs.c (pfr_slot_load),
src/winfonts/winfnt.c (FNT_Load_Glyph), src/t42/t42objs.c
(T42_GlyphSlot_Load), src/bdf/bdfdrivr.c (BDF_Glyph_Load): Change
fourth parameter to `FT_Int32'.
* src/pfr/pfrobjs.c (pfr_face_init): Add two missing parameters
and declare them as unused.
* src/cid/cidparse.h (CID_Parser): Use FT_Long for `postscript_len'.
* src/psnames/psnames.h (PS_Unicode_Value_Func): Change return
value to FT_UInt32.
* src/psnames/psmodule.c (ps_unicode_value, ps_build_unicode_table):
Updated accordingly.
* src/cff/cffdrivr.c (Get_Kerning): Use FT_Long for `middle'.
(cff_get_glyph_name): Use cast for result of ft_strlen.
* src/cff/cffparse.c (cff_parse_real): User cast for assigning
`exp'.
* src/cff/cffload.c (cff_index_get_pointers): Use FT_ULong for
some local variables.
(cff_charset_load, cff_encoding_load): Use casts to FT_UInt for some
switch statements.
(cff_font_load): Use cast in call to CFF_Load_FD_Select.
* src/cff/cffobjs.c (cff_size_init): Use more casts.
(cff_face_init): Use FT_Int32 for `flags'.
* src/cff/cffgload.c (cff_operator_seac): Use cast for assigning
`adx' and `ady'.
(cff_decoder_parse_charstrings): Use FT_ULong for third parameter.
Use more casts.
* src/cff/cffcmap.c (cff_cmap_unicode_init): Use cast for `count'.
* src/cid/cidload.c (cid_read_subrs): Use FT_ULong for `len'.
* src/cid/cidgload.c (cid_load_glyph): Add missing cast for
`cid_get_offset'.
* src/psaux/t1decode.c (t1_decoder_parse_charstrings) <18>: Use
cast for `num_points'.
(t1_decoder_init): Use cast for assigning `decoder->num_glyphs'.
* src/base/ftdebug.c (ft_debug_init): Use FT_Int.
* include/freetype/internal/ftdriver.h (FT_Slot_LoadFunc): Use
`FT_Int32' for fourth parameter.
* src/base/ftobjs.c (open_face): Use cast for calling
clazz->init_face.
* src/raster/ftraster.c (Set_High_Precision): Use `1' instead of
`1L'.
(Finalize_Profile_Table, Line_Up, ft_black_init): Use casts.
* src/raster/ftrend1.c (ft_raster1_render): Ditto.
* src/sfnt/sfnt_dir_check: Compare `magic' with unsigned long
constant.
* builds/amiga/include/freetype/config/ftmodule.h: Updated.
2002-09-27 13:09:23 +02:00
|
|
|
FT_Int idx = (FT_Int)( args[0] >> 16 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " index\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
if ( idx < 0 )
|
|
|
|
idx = 0;
|
|
|
|
else if ( idx > num_args - 2 )
|
|
|
|
idx = num_args - 2;
|
|
|
|
args[0] = args[-( idx + 1 )];
|
2001-01-03 01:15:00 +01:00
|
|
|
args++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_roll:
|
|
|
|
{
|
|
|
|
FT_Int count = (FT_Int)( args[0] >> 16 );
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
FT_Int idx = (FT_Int)( args[1] >> 16 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " roll\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
if ( count <= 0 )
|
|
|
|
count = 1;
|
|
|
|
|
|
|
|
args -= count;
|
|
|
|
if ( args < stack )
|
|
|
|
goto Stack_Underflow;
|
|
|
|
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
if ( idx >= 0 )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
while ( idx > 0 )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
FT_Fixed tmp = args[count - 1];
|
|
|
|
FT_Int i;
|
|
|
|
|
|
|
|
|
|
|
|
for ( i = count - 2; i >= 0; i-- )
|
|
|
|
args[i + 1] = args[i];
|
|
|
|
args[0] = tmp;
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
idx--;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
while ( idx < 0 )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
FT_Fixed tmp = args[0];
|
|
|
|
FT_Int i;
|
|
|
|
|
|
|
|
|
|
|
|
for ( i = 0; i < count - 1; i++ )
|
|
|
|
args[i] = args[i + 1];
|
|
|
|
args[count - 1] = tmp;
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
idx++;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
args += count;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_dup:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " dup\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args[1] = args[0];
|
2009-10-18 10:47:11 +02:00
|
|
|
args += 2;
|
2001-01-03 01:15:00 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_put:
|
|
|
|
{
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
FT_Fixed val = args[0];
|
|
|
|
FT_Int idx = (FT_Int)( args[1] >> 16 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " put\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2009-10-19 21:09:13 +02:00
|
|
|
if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
decoder->buildchar[idx] = val;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_get:
|
|
|
|
{
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
FT_Int idx = (FT_Int)( args[0] >> 16 );
|
|
|
|
FT_Fixed val = 0;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " get\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2009-10-19 21:09:13 +02:00
|
|
|
if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
val = decoder->buildchar[idx];
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args[0] = val;
|
|
|
|
args++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_store:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " store\n"));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
goto Unimplemented;
|
|
|
|
|
|
|
|
case cff_op_load:
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " load\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
goto Unimplemented;
|
|
|
|
|
2001-03-20 12:14:24 +01:00
|
|
|
case cff_op_dotsection:
|
* builds/win32/detekt.mk: Fix .PHONY target for Intel compiler.
Renamed "ftnames.h" to "ftsnames.h", and FT_NAMES_H to
FT_SFNT_NAMES_H.
* docs/docmaker.py: Added generation of INDEX link in table of
contents.
* INSTALL, docs/BUILD: Updated documentation to indicate that the
compilation process has changed slightly (no more `src' required in
* builds/*/*-def.mk: Changed the objects directory from "obj" to
"objs".
* include/freetype/config/ftheader.h: Removed obsolete macros like
FT_SOURCE_FILE, etc. and added cache-specific macro definitions that
were previously defined in <freetype/ftcache.h>. Added comments to
be included in a new API Reference section.
* src/*/*: Removed the use of FT_SOURCE_FILE, etc. Now, each
component needs to add its own directory to the include path at
compile time. Modified all "rules.mk" and "descrip.mms"
accordingly.
* src/cid/cidobjs.c, src/cid/cidload.c, src/pcf/pcfread.c,
src/type1/t1load.c, src/type1/t1objs.c: Added a few casts to remove
compiler warnings in pedantic modes.
* include/config/ft2build.h, include/config/ftheader.h: The file
top-level <ft2build.h>.
* include/config/ftheader.h: Added new section describing the #include
macros.
the Type 2 glyph charstring (used by conversion programs).
* docs/docmaker.py: Added cross-references generation as well as
seac emulation provided by the Type 2 endchar operator.
* src/cid/cidafm.c, src/cid/cidafm.h: removed un-needed files,
Added support for clipped direct rendering in the smooth renderer.
* src/cff/t2objs.c (T2_Init_Face): For pure CFF fonts, set
2001-03-20 23:58:56 +01:00
|
|
|
/* this operator is deprecated and ignored by the parser */
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " dotsection\n" ));
|
2001-03-20 12:14:24 +01:00
|
|
|
break;
|
|
|
|
|
2007-12-06 18:17:30 +01:00
|
|
|
case cff_op_closepath:
|
|
|
|
/* this is an invalid Type 2 operator; however, there */
|
|
|
|
/* exist fonts which are incorrectly converted from probably */
|
|
|
|
/* Type 1 to CFF, and some parsers seem to accept it */
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " closepath (invalid op)\n" ));
|
2007-12-06 18:17:30 +01:00
|
|
|
|
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_hsbw:
|
|
|
|
/* this is an invalid Type 2 operator; however, there */
|
|
|
|
/* exist fonts which are incorrectly converted from probably */
|
|
|
|
/* Type 1 to CFF, and some parsers seem to accept it */
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " hsbw (invalid op)\n" ));
|
2007-12-06 18:17:30 +01:00
|
|
|
|
2009-11-04 07:21:15 +01:00
|
|
|
decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 );
|
|
|
|
|
|
|
|
decoder->builder.left_bearing.x = args[0];
|
|
|
|
decoder->builder.left_bearing.y = 0;
|
|
|
|
|
|
|
|
x = decoder->builder.pos_x + args[0];
|
|
|
|
y = decoder->builder.pos_y;
|
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_sbw:
|
|
|
|
/* this is an invalid Type 2 operator; however, there */
|
|
|
|
/* exist fonts which are incorrectly converted from probably */
|
|
|
|
/* Type 1 to CFF, and some parsers seem to accept it */
|
|
|
|
|
|
|
|
FT_TRACE4(( " sbw (invalid op)\n" ));
|
|
|
|
|
|
|
|
decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 );
|
|
|
|
|
|
|
|
decoder->builder.left_bearing.x = args[0];
|
|
|
|
decoder->builder.left_bearing.y = args[1];
|
|
|
|
|
|
|
|
x = decoder->builder.pos_x + args[0];
|
|
|
|
y = decoder->builder.pos_y + args[1];
|
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_setcurrentpoint:
|
|
|
|
/* this is an invalid Type 2 operator; however, there */
|
|
|
|
/* exist fonts which are incorrectly converted from probably */
|
|
|
|
/* Type 1 to CFF, and some parsers seem to accept it */
|
|
|
|
|
|
|
|
FT_TRACE4(( " setcurrentpoint (invalid op)\n" ));
|
|
|
|
|
|
|
|
x = decoder->builder.pos_x + args[0];
|
|
|
|
y = decoder->builder.pos_y + args[1];
|
2007-12-06 18:17:30 +01:00
|
|
|
args = stack;
|
|
|
|
break;
|
|
|
|
|
2008-09-22 13:28:46 +02:00
|
|
|
case cff_op_callothersubr:
|
|
|
|
/* this is an invalid Type 2 operator; however, there */
|
|
|
|
/* exist fonts which are incorrectly converted from probably */
|
|
|
|
/* Type 1 to CFF, and some parsers seem to accept it */
|
|
|
|
|
|
|
|
FT_TRACE4(( " callothersubr (invalid op)\n" ));
|
|
|
|
|
2009-11-04 07:21:15 +01:00
|
|
|
/* subsequent `pop' operands should add the arguments, */
|
|
|
|
/* this is the implementation described for `unknown' other */
|
|
|
|
/* subroutines in the Type1 spec. */
|
2010-08-06 06:55:09 +02:00
|
|
|
/* */
|
|
|
|
/* XXX Fix return arguments (see discussion below). */
|
2009-11-04 07:21:15 +01:00
|
|
|
args -= 2 + ( args[-2] >> 16 );
|
2010-06-09 09:14:09 +02:00
|
|
|
if ( args < stack )
|
|
|
|
goto Stack_Underflow;
|
2008-09-22 13:28:46 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_pop:
|
|
|
|
/* this is an invalid Type 2 operator; however, there */
|
|
|
|
/* exist fonts which are incorrectly converted from probably */
|
|
|
|
/* Type 1 to CFF, and some parsers seem to accept it */
|
|
|
|
|
|
|
|
FT_TRACE4(( " pop (invalid op)\n" ));
|
|
|
|
|
2010-08-06 06:55:09 +02:00
|
|
|
/* XXX Increasing `args' is wrong: After a certain number of */
|
|
|
|
/* `pop's we get a stack overflow. Reason for doing it is */
|
|
|
|
/* code like this (actually found in a CFF font): */
|
|
|
|
/* */
|
|
|
|
/* 17 1 3 callothersubr */
|
|
|
|
/* pop */
|
|
|
|
/* callsubr */
|
|
|
|
/* */
|
|
|
|
/* Since we handle `callothersubr' as a no-op, and */
|
|
|
|
/* `callsubr' needs at least one argument, `pop' can't be a */
|
|
|
|
/* no-op too as it basically should be. */
|
|
|
|
/* */
|
|
|
|
/* The right solution would be to provide real support for */
|
|
|
|
/* `callothersubr' as done in `t1decode.c', however, given */
|
|
|
|
/* the fact that CFF fonts with `pop' are invalid, it is */
|
|
|
|
/* questionable whether it is worth the time. */
|
2008-09-22 13:28:46 +02:00
|
|
|
args++;
|
|
|
|
break;
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
case cff_op_and:
|
|
|
|
{
|
|
|
|
FT_Fixed cond = args[0] && args[1];
|
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " and\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args[0] = cond ? 0x10000L : 0;
|
|
|
|
args++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_or:
|
|
|
|
{
|
|
|
|
FT_Fixed cond = args[0] || args[1];
|
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " or\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args[0] = cond ? 0x10000L : 0;
|
|
|
|
args++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_eq:
|
|
|
|
{
|
|
|
|
FT_Fixed cond = !args[0];
|
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " eq\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
args[0] = cond ? 0x10000L : 0;
|
|
|
|
args++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_ifelse:
|
|
|
|
{
|
2005-11-17 09:12:00 +01:00
|
|
|
FT_Fixed cond = ( args[2] <= args[3] );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-07-26 23:22:20 +02:00
|
|
|
FT_TRACE4(( " ifelse\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
if ( !cond )
|
|
|
|
args[0] = args[1];
|
|
|
|
args++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_callsubr:
|
|
|
|
{
|
2015-02-20 20:42:55 +01:00
|
|
|
FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) +
|
|
|
|
decoder->locals_bias );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2015-03-27 08:33:47 +01:00
|
|
|
FT_TRACE4(( " callsubr (idx %d, entering level %d)\n",
|
|
|
|
idx,
|
|
|
|
zone - decoder->zones + 1 ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
if ( idx >= decoder->num_locals )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_ERROR(( "cff_decoder_parse_charstrings:"
|
|
|
|
" invalid local subr index\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Syntax_Error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
|
|
|
|
{
|
2002-07-26 11:09:10 +02:00
|
|
|
FT_ERROR(( "cff_decoder_parse_charstrings:"
|
|
|
|
" too many nested subrs\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Syntax_Error;
|
|
|
|
}
|
|
|
|
|
|
|
|
zone->cursor = ip; /* save current instruction pointer */
|
|
|
|
|
|
|
|
zone++;
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
zone->base = decoder->locals[idx];
|
|
|
|
zone->limit = decoder->locals[idx + 1];
|
2001-01-03 01:15:00 +01:00
|
|
|
zone->cursor = zone->base;
|
|
|
|
|
2007-01-25 13:23:37 +01:00
|
|
|
if ( !zone->base || zone->limit == zone->base )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2002-07-26 11:09:10 +02:00
|
|
|
FT_ERROR(( "cff_decoder_parse_charstrings:"
|
2009-06-26 06:15:41 +02:00
|
|
|
" invoking empty subrs\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Syntax_Error;
|
|
|
|
}
|
|
|
|
|
|
|
|
decoder->zone = zone;
|
|
|
|
ip = zone->base;
|
|
|
|
limit = zone->limit;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_callgsubr:
|
|
|
|
{
|
2015-02-20 20:42:55 +01:00
|
|
|
FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) +
|
|
|
|
decoder->globals_bias );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2015-03-27 08:33:47 +01:00
|
|
|
FT_TRACE4(( " callgsubr (idx %d, entering level %d)\n",
|
|
|
|
idx,
|
|
|
|
zone - decoder->zones + 1 ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
if ( idx >= decoder->num_globals )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_ERROR(( "cff_decoder_parse_charstrings:"
|
|
|
|
" invalid global subr index\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Syntax_Error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
|
|
|
|
{
|
2002-07-26 11:09:10 +02:00
|
|
|
FT_ERROR(( "cff_decoder_parse_charstrings:"
|
|
|
|
" too many nested subrs\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Syntax_Error;
|
|
|
|
}
|
|
|
|
|
|
|
|
zone->cursor = ip; /* save current instruction pointer */
|
|
|
|
|
|
|
|
zone++;
|
* src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
* src/base/ftcalc.c (FT_MulFix): Ditto.
* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
CFF_GlyphSlot_Init): Ditto.
* src/cid/cidobjs.c (CID_GlyphSlot_Init,
CID_Size_Get_Globals_Funcs): Ditto.
* src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
Ditto.
* src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
* src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
variables.
* include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
to...
(T1_Builder_FuncsRec): This.
(T1_Builder_Funcs): New typedef.
(PSAux_Interface): Remove compiler warnings.
* src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
(t1_builder_funcs): Updated.
* src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
(PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
(PSH_AlignmentRec): Updated.
* include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
typo.
* include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
* src/base/ftstream (FT_Get_Char): Rename to...
(FT_Stream_Get_Char): This.
* src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
a built-in function in gcc, causing warning messages with gcc 3.0.
* src/autohint/ahglyph.c (ah_outline_load): Ditto.
* src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
* src/cache/ftcmanag.c (ftc_family_table_alloc,
ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
Ditto.
* src/cff/cffload.c (cff_new_index, cff_done_index,
cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
CFF_Done_Font): Ditto.
* src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
* src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
* src/pshinter/pshalgo1.c (psh1_hint_table_record,
psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
* src/pshinter/pshalgo2.c (psh2_hint_table_record,
psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
* src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
TT_Get_PS_Name): Ditto.
* src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
load_truetype_glyph): Ditto.
* src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
* src/type1/t1afm.c (T1_Get_Kerning): Ditto.
* include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
2002-03-07 22:59:59 +01:00
|
|
|
zone->base = decoder->globals[idx];
|
|
|
|
zone->limit = decoder->globals[idx + 1];
|
2001-01-03 01:15:00 +01:00
|
|
|
zone->cursor = zone->base;
|
|
|
|
|
2007-01-25 13:23:37 +01:00
|
|
|
if ( !zone->base || zone->limit == zone->base )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2002-07-26 11:09:10 +02:00
|
|
|
FT_ERROR(( "cff_decoder_parse_charstrings:"
|
2009-06-26 06:15:41 +02:00
|
|
|
" invoking empty subrs\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Syntax_Error;
|
|
|
|
}
|
|
|
|
|
|
|
|
decoder->zone = zone;
|
|
|
|
ip = zone->base;
|
|
|
|
limit = zone->limit;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case cff_op_return:
|
2015-03-27 08:33:47 +01:00
|
|
|
FT_TRACE4(( " return (leaving level %d)\n",
|
|
|
|
decoder->zone - decoder->zones ));
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
if ( decoder->zone <= decoder->zones )
|
|
|
|
{
|
2002-07-26 11:09:10 +02:00
|
|
|
FT_ERROR(( "cff_decoder_parse_charstrings:"
|
|
|
|
" unexpected return\n" ));
|
2001-01-03 01:15:00 +01:00
|
|
|
goto Syntax_Error;
|
|
|
|
}
|
|
|
|
|
|
|
|
decoder->zone--;
|
|
|
|
zone = decoder->zone;
|
|
|
|
ip = zone->cursor;
|
|
|
|
limit = zone->limit;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
Unimplemented:
|
|
|
|
FT_ERROR(( "Unimplemented opcode: %d", ip[-1] ));
|
|
|
|
|
|
|
|
if ( ip[-1] == 12 )
|
|
|
|
FT_ERROR(( " %d", ip[0] ));
|
|
|
|
FT_ERROR(( "\n" ));
|
|
|
|
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Unimplemented_Feature );
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
2010-08-04 14:43:29 +02:00
|
|
|
decoder->top = args;
|
|
|
|
|
|
|
|
if ( decoder->top - stack >= CFF_MAX_OPERANDS )
|
|
|
|
goto Stack_Overflow;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
} /* general operator processing */
|
|
|
|
|
|
|
|
} /* while ip < limit */
|
|
|
|
|
|
|
|
FT_TRACE4(( "..end..\n\n" ));
|
|
|
|
|
2004-05-13 23:59:17 +02:00
|
|
|
Fail:
|
2001-01-03 01:15:00 +01:00
|
|
|
return error;
|
|
|
|
|
|
|
|
Syntax_Error:
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" ));
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_File_Format );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
Stack_Underflow:
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" ));
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Too_Few_Arguments );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
Stack_Overflow:
|
2009-06-26 06:15:41 +02:00
|
|
|
FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" ));
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Stack_Overflow );
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
2013-06-03 12:41:58 +02:00
|
|
|
#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/********** *********/
|
|
|
|
/********** *********/
|
|
|
|
/********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/
|
|
|
|
/********** *********/
|
|
|
|
/********** The following code is in charge of computing *********/
|
|
|
|
/********** the maximum advance width of the font. It *********/
|
|
|
|
/********** quickly processes each glyph charstring to *********/
|
|
|
|
/********** extract the value from either a `sbw' or `seac' *********/
|
|
|
|
/********** operator. *********/
|
|
|
|
/********** *********/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#if 0 /* unused until we support pure CFF fonts */
|
|
|
|
|
|
|
|
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_compute_max_advance( TT_Face face,
|
2001-06-27 21:46:12 +02:00
|
|
|
FT_Int* max_advance )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2013-03-14 11:21:17 +01:00
|
|
|
FT_Error error = FT_Err_Ok;
|
2001-01-03 01:15:00 +01:00
|
|
|
CFF_Decoder decoder;
|
2001-01-03 08:14:12 +01:00
|
|
|
FT_Int glyph_index;
|
2002-03-30 17:41:09 +01:00
|
|
|
CFF_Font cff = (CFF_Font)face->other;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
|
|
|
*max_advance = 0;
|
|
|
|
|
|
|
|
/* Initialize load decoder */
|
2002-08-28 00:34:20 +02:00
|
|
|
cff_decoder_init( &decoder, face, 0, 0, 0, 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
decoder.builder.metrics_only = 1;
|
|
|
|
decoder.builder.load_points = 0;
|
|
|
|
|
|
|
|
/* For each glyph, parse the glyph charstring and extract */
|
|
|
|
/* the advance width. */
|
|
|
|
for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
|
|
|
|
glyph_index++ )
|
|
|
|
{
|
|
|
|
FT_Byte* charstring;
|
|
|
|
FT_ULong charstring_len;
|
|
|
|
|
|
|
|
|
|
|
|
/* now get load the unscaled outline */
|
2002-08-15 14:10:48 +02:00
|
|
|
error = cff_get_glyph_data( face, glyph_index,
|
|
|
|
&charstring, &charstring_len );
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( !error )
|
|
|
|
{
|
2008-05-15 01:05:38 +02:00
|
|
|
error = cff_decoder_prepare( &decoder, size, glyph_index );
|
2007-06-06 12:05:49 +02:00
|
|
|
if ( !error )
|
|
|
|
error = cff_decoder_parse_charstrings( &decoder,
|
|
|
|
charstring,
|
|
|
|
charstring_len );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2002-08-15 14:10:48 +02:00
|
|
|
cff_free_glyph_data( face, &charstring, &charstring_len );
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* ignore the error if one has occurred -- skip to next glyph */
|
2013-03-14 11:21:17 +01:00
|
|
|
error = FT_Err_Ok;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
*max_advance = decoder.builder.advance.x;
|
|
|
|
|
2013-03-14 11:21:17 +01:00
|
|
|
return FT_Err_Ok;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* 0 */
|
|
|
|
|
|
|
|
|
2002-03-01 03:26:22 +01:00
|
|
|
FT_LOCAL_DEF( FT_Error )
|
* src/cff/cffcmap.c, src/cff/cffcmap.h, Jamfile, rules.mk: new files added
to support charmaps for CFF fonts
* src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/cff/cffparse.c, src/cffparse.h, src/cff/cffgload.c,
src/cff/cffgload.h: adding support for CFF charmaps, reformatting the
sources, and removing some bugs in the Encoding and Charset loaders
2002-07-10 18:52:06 +02:00
|
|
|
cff_slot_load( CFF_GlyphSlot glyph,
|
|
|
|
CFF_Size size,
|
2006-03-21 19:41:40 +01:00
|
|
|
FT_UInt glyph_index,
|
2002-08-28 00:34:20 +02:00
|
|
|
FT_Int32 load_flags )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
2007-01-06 08:47:45 +01:00
|
|
|
FT_Error error;
|
|
|
|
CFF_Decoder decoder;
|
2008-10-02 12:17:32 +02:00
|
|
|
TT_Face face = (TT_Face)glyph->root.face;
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
FT_Bool hinting, scaled, force_scaling;
|
2008-10-02 12:17:32 +02:00
|
|
|
CFF_Font cff = (CFF_Font)face->extra.data;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2007-01-06 08:47:45 +01:00
|
|
|
FT_Matrix font_matrix;
|
|
|
|
FT_Vector font_offset;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2008-05-15 01:05:38 +02:00
|
|
|
force_scaling = FALSE;
|
|
|
|
|
2006-11-19 10:19:17 +01:00
|
|
|
/* in a CID-keyed font, consider `glyph_index' as a CID and map */
|
|
|
|
/* it immediately to the real glyph_index -- if it isn't a */
|
|
|
|
/* subsetted font, glyph_indices and CIDs are identical, though */
|
|
|
|
if ( cff->top_font.font_dict.cid_registry != 0xFFFFU &&
|
2008-05-15 01:05:38 +02:00
|
|
|
cff->charset.cids )
|
2006-11-19 10:19:17 +01:00
|
|
|
{
|
2008-10-02 12:17:32 +02:00
|
|
|
/* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */
|
|
|
|
if ( glyph_index != 0 )
|
|
|
|
{
|
|
|
|
glyph_index = cff_charset_cid_to_gindex( &cff->charset,
|
|
|
|
glyph_index );
|
|
|
|
if ( glyph_index == 0 )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2008-10-02 12:17:32 +02:00
|
|
|
}
|
2006-11-19 10:19:17 +01:00
|
|
|
}
|
|
|
|
else if ( glyph_index >= cff->num_glyphs )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2006-11-19 10:19:17 +01:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
if ( load_flags & FT_LOAD_NO_RECURSE )
|
|
|
|
load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
|
|
|
|
|
|
|
|
glyph->x_scale = 0x10000L;
|
|
|
|
glyph->y_scale = 0x10000L;
|
|
|
|
if ( size )
|
|
|
|
{
|
2004-03-03 09:21:12 +01:00
|
|
|
glyph->x_scale = size->root.metrics.x_scale;
|
|
|
|
glyph->y_scale = size->root.metrics.y_scale;
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
2004-03-03 09:21:12 +01:00
|
|
|
#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
|
|
|
|
|
|
|
|
/* try to load embedded bitmap if any */
|
|
|
|
/* */
|
|
|
|
/* XXX: The convention should be emphasized in */
|
|
|
|
/* the documents because it can be confusing. */
|
2004-04-16 11:56:30 +02:00
|
|
|
if ( size )
|
2004-03-03 09:21:12 +01:00
|
|
|
{
|
2004-04-16 11:56:30 +02:00
|
|
|
CFF_Face cff_face = (CFF_Face)size->root.face;
|
|
|
|
SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt;
|
|
|
|
FT_Stream stream = cff_face->root.stream;
|
2004-03-03 09:21:12 +01:00
|
|
|
|
|
|
|
|
2006-01-13 15:53:28 +01:00
|
|
|
if ( size->strike_index != 0xFFFFFFFFUL &&
|
Clean up the SFNT_Interface. Table loading functions are now named
after the tables' tags; `hdmx' is TrueType-specific and thus the code
is moved to the truetype module; `get_metrics' is moved here from the
truetype module so that the code can be shared with the cff module.
This pass involves no real changes. That is, the code is moved
verbatim mostly. The only exception is the return value of
`tt_face_get_metrics'.
* include/freetype/internal/sfnt.h, src/sfnt/rules.mk,
src/sfnt/sfdriver.c, src/sfnt/sfnt.c, src/sfnt/sfobjs.c,
src/sfnt/ttload.c, src/sfnt/ttload.h, src/sfnt/ttsbit.c,
src/sfnt/ttsbit.h, src/sfnt/ttsbit0.c: Clean up the SFNT_Interface.
* src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: Metrics-related tables' loading
and parsing code is moved here.
Move `tt_face_get_metrics' here from the truetype module. The return
value is changed from `void' to `FT_Error'.
* include/freetype/internal/fttrace.h: New trace: ttmtx.
* src/truetype/ttpload.c, src/truetype/ttpload.h: `hdmx' loading and
parsing code is moved here.
New function `tt_face_load_prep' splitted from `tt_face_load_fpgm'.
`tt_face_load_fpgm' returns `FT_Err_Ok' if `fpgm' doesn't exist.
* src/cff/cffgload.c, src/cff/cffobjs.c: Update.
* src/truetype/ttgload.c, src/truetype/ttobjs.c: Update.
2006-02-14 07:40:10 +01:00
|
|
|
sfnt->load_eblc &&
|
2004-04-16 11:56:30 +02:00
|
|
|
( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
|
2004-03-03 09:21:12 +01:00
|
|
|
{
|
2004-04-16 11:56:30 +02:00
|
|
|
TT_SBit_MetricsRec metrics;
|
2004-03-03 09:21:12 +01:00
|
|
|
|
|
|
|
|
2004-04-16 11:56:30 +02:00
|
|
|
error = sfnt->load_sbit_image( face,
|
* include/freetype/internal/sfnt.h (SFNT_Interface): New method
`load_strike_metrics' used to load the strike's metrics.
* src/sfnt/sfdriver.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h,
src/sfnt/ttsbit0.c: New function `tt_face_load_strike_metrics'.
* src/pfr/pfrobjs.c (pfr_face_init): Set FT_Bitmap_Size correctly.
* src/winfonts/winfnt.c (FNT_Face_Init): Use `nominal_point_size' for
nominal size unless it is obviously incorrect.
* include/freetype/freetype.h (FT_Bitmap_Size): Update the comments on
FNT driver.
Introduce new size selection interface.
* include/freetype/internal/ftdriver.h (struct FT_Driver_ClassRec_):
Replace `set_char_sizes' and `set_pixel_sizes' by `request_size' and
`select_size'.
* include/freetype/freetype.h (FT_Select_Size, FT_Size_Request_Type,
FT_Size_Request, FT_Request_Size, FT_Select_Size), src/base/ftobjs.c
(FT_Select_Size, FT_Request_Size): API additions to export the new
size selection interface.
* src/base/ftobjs.c (FT_Set_Char_Size, FT_Set_Pixel_Sizes): Use
`FT_Request_Size'.
* include/freetype/internal/ftobjs.h (FT_Match_Size),
src/base/ftobjs.c (FT_Match_Size): New function to match a size
request against `available_sizes'. Drivers supporting bitmap strikes
can use this function to implement `request_size'.
* src/bdf/bdfdrivr.c, src/cid/cidobjs.c, src/cid/cidobjs.h,
src/cid/cidriver.c, src/pcf/pcfdrivr.c, src/type1/t1driver.c,
src/type1/t1objs.c, src/type1/t1objs.h, src/type42/t42drivr.c,
src/type42/t42objs.c, src/type42/t42objs.h, src/winfonts/winfnt.c:
Update to new size selection interface.
* src/cff/cffdrivr.c, src/cff/cffgload.c, src/cff/cffobjs.c,
src/cff/cffobjs.h, src/truetype/ttdriver.c, src/truetype/ttgload.c,
src/truetype/ttobjs.c, src/truetype/ttobjs.h: Update to new size
selection interface.
Make `strike_index' FT_ULong and always defined.
Use `load_strike_metrics' provided by SFNT interface.
2006-01-13 13:21:31 +01:00
|
|
|
size->strike_index,
|
2006-03-21 19:41:40 +01:00
|
|
|
glyph_index,
|
2015-02-20 08:35:32 +01:00
|
|
|
(FT_UInt)load_flags,
|
2004-04-16 11:56:30 +02:00
|
|
|
stream,
|
|
|
|
&glyph->root.bitmap,
|
|
|
|
&metrics );
|
2004-03-03 09:21:12 +01:00
|
|
|
|
2004-04-16 11:56:30 +02:00
|
|
|
if ( !error )
|
|
|
|
{
|
2013-03-08 21:23:45 +01:00
|
|
|
FT_Bool has_vertical_info;
|
|
|
|
FT_UShort advance;
|
|
|
|
FT_Short dummy;
|
|
|
|
|
|
|
|
|
2004-04-16 11:56:30 +02:00
|
|
|
glyph->root.outline.n_points = 0;
|
|
|
|
glyph->root.outline.n_contours = 0;
|
2004-03-03 09:21:12 +01:00
|
|
|
|
2004-04-16 11:56:30 +02:00
|
|
|
glyph->root.metrics.width = (FT_Pos)metrics.width << 6;
|
|
|
|
glyph->root.metrics.height = (FT_Pos)metrics.height << 6;
|
2004-03-03 09:21:12 +01:00
|
|
|
|
2004-04-16 11:56:30 +02:00
|
|
|
glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
|
|
|
|
glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
|
|
|
|
glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6;
|
|
|
|
|
|
|
|
glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
|
|
|
|
glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
|
|
|
|
glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6;
|
|
|
|
|
|
|
|
glyph->root.format = FT_GLYPH_FORMAT_BITMAP;
|
|
|
|
|
|
|
|
if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
|
|
|
|
{
|
|
|
|
glyph->root.bitmap_left = metrics.vertBearingX;
|
|
|
|
glyph->root.bitmap_top = metrics.vertBearingY;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
glyph->root.bitmap_left = metrics.horiBearingX;
|
|
|
|
glyph->root.bitmap_top = metrics.horiBearingY;
|
|
|
|
}
|
2013-03-08 21:23:45 +01:00
|
|
|
|
|
|
|
/* compute linear advance widths */
|
|
|
|
|
2014-11-25 08:30:49 +01:00
|
|
|
(void)( (SFNT_Service)face->sfnt )->get_metrics( face, 0,
|
|
|
|
glyph_index,
|
|
|
|
&dummy,
|
|
|
|
&advance );
|
2013-03-08 21:23:45 +01:00
|
|
|
glyph->root.linearHoriAdvance = advance;
|
|
|
|
|
|
|
|
has_vertical_info = FT_BOOL(
|
|
|
|
face->vertical_info &&
|
|
|
|
face->vertical.number_Of_VMetrics > 0 );
|
|
|
|
|
2015-04-10 07:01:01 +02:00
|
|
|
/* get the vertical metrics from the vmtx table if we have one */
|
2013-03-08 21:23:45 +01:00
|
|
|
if ( has_vertical_info )
|
|
|
|
{
|
2014-11-25 08:30:49 +01:00
|
|
|
(void)( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
|
|
|
|
glyph_index,
|
|
|
|
&dummy,
|
|
|
|
&advance );
|
2013-03-08 21:23:45 +01:00
|
|
|
glyph->root.linearVertAdvance = advance;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* make up vertical ones */
|
|
|
|
if ( face->os2.version != 0xFFFFU )
|
|
|
|
glyph->root.linearVertAdvance = (FT_Pos)
|
|
|
|
( face->os2.sTypoAscender - face->os2.sTypoDescender );
|
|
|
|
else
|
|
|
|
glyph->root.linearVertAdvance = (FT_Pos)
|
|
|
|
( face->horizontal.Ascender - face->horizontal.Descender );
|
|
|
|
}
|
|
|
|
|
2004-04-16 11:56:30 +02:00
|
|
|
return error;
|
2004-03-03 09:21:12 +01:00
|
|
|
}
|
|
|
|
}
|
2004-04-16 11:56:30 +02:00
|
|
|
}
|
2004-03-03 09:21:12 +01:00
|
|
|
|
|
|
|
#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
|
|
|
|
|
|
|
|
/* return immediately if we only want the embedded bitmaps */
|
|
|
|
if ( load_flags & FT_LOAD_SBITS_ONLY )
|
2013-03-14 10:27:35 +01:00
|
|
|
return FT_THROW( Invalid_Argument );
|
2004-03-03 09:21:12 +01:00
|
|
|
|
2008-05-15 01:05:38 +02:00
|
|
|
/* if we have a CID subfont, use its matrix (which has already */
|
|
|
|
/* been multiplied with the root matrix) */
|
|
|
|
|
|
|
|
/* this scaling is only relevant if the PS hinter isn't active */
|
|
|
|
if ( cff->num_subfonts )
|
|
|
|
{
|
2015-02-20 08:35:32 +01:00
|
|
|
FT_Long top_upm, sub_upm;
|
|
|
|
FT_Byte fd_index = cff_fd_select_get( &cff->fd_select,
|
|
|
|
glyph_index );
|
2008-05-15 01:05:38 +02:00
|
|
|
|
2013-03-08 21:23:45 +01:00
|
|
|
|
2012-01-16 18:00:24 +01:00
|
|
|
if ( fd_index >= cff->num_subfonts )
|
2011-05-24 06:22:32 +02:00
|
|
|
fd_index = (FT_Byte)( cff->num_subfonts - 1 );
|
2010-05-18 11:00:39 +02:00
|
|
|
|
2015-02-20 08:35:32 +01:00
|
|
|
top_upm = (FT_Long)cff->top_font.font_dict.units_per_em;
|
|
|
|
sub_upm = (FT_Long)cff->subfonts[fd_index]->font_dict.units_per_em;
|
2008-05-15 01:05:38 +02:00
|
|
|
|
|
|
|
|
|
|
|
font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix;
|
|
|
|
font_offset = cff->subfonts[fd_index]->font_dict.font_offset;
|
|
|
|
|
|
|
|
if ( top_upm != sub_upm )
|
|
|
|
{
|
|
|
|
glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm );
|
|
|
|
glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm );
|
|
|
|
|
|
|
|
force_scaling = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
font_matrix = cff->top_font.font_dict.font_matrix;
|
|
|
|
font_offset = cff->top_font.font_dict.font_offset;
|
|
|
|
}
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
glyph->root.outline.n_points = 0;
|
|
|
|
glyph->root.outline.n_contours = 0;
|
|
|
|
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
/* top-level code ensures that FT_LOAD_NO_HINTING is set */
|
|
|
|
/* if FT_LOAD_NO_SCALE is active */
|
|
|
|
hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
|
|
|
|
scaled = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
glyph->hint = hinting;
|
|
|
|
glyph->scaled = scaled;
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
{
|
2013-06-03 12:41:58 +02:00
|
|
|
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( face );
|
2013-06-03 12:41:58 +02:00
|
|
|
#endif
|
|
|
|
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
FT_Byte* charstring;
|
|
|
|
FT_ULong charstring_len;
|
|
|
|
|
|
|
|
|
2002-08-28 00:34:20 +02:00
|
|
|
cff_decoder_init( &decoder, face, size, glyph, hinting,
|
2004-02-19 22:39:58 +01:00
|
|
|
FT_LOAD_TARGET_MODE( load_flags ) );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2008-09-12 18:27:48 +02:00
|
|
|
if ( load_flags & FT_LOAD_ADVANCE_ONLY )
|
2008-09-16 09:25:31 +02:00
|
|
|
decoder.width_only = TRUE;
|
* include/freetype/ftadvanc.h, src/base/ftadvanc.c,
include/freetype/config/ftheader.h, include/freetype/freetype.h,
src/base/Jamfile, src/base/rules.mk, src/cff/cffdrivr.c,
src/cff/cffgload.c, src/cff/cffgload.h, src/truetype/ttdriver.c,
src/truetype/ttgload.h, src/truetype/ttgload.c, src/type1/t1driver.c,
src/type1/t1gload.h, src/type1/t1gload.c:
Add a new header named FT_ADVANCES_H declaring some new APIs
to extract the advances of one or more glyphs without necessarily
loading their outlines. Also provide 'fast loaders' for the
TrueType, Type1 and CFF font drivers (more to come later)
* autogen.sh: add checks for minimum version of the 'autotools'
stuff.
2008-09-01 23:35:21 +02:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
decoder.builder.no_recurse =
|
2008-09-12 18:27:48 +02:00
|
|
|
(FT_Bool)( load_flags & FT_LOAD_NO_RECURSE );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* now load the unscaled outline */
|
2002-08-15 14:10:48 +02:00
|
|
|
error = cff_get_glyph_data( face, glyph_index,
|
|
|
|
&charstring, &charstring_len );
|
2010-08-05 10:10:32 +02:00
|
|
|
if ( error )
|
|
|
|
goto Glyph_Build_Finished;
|
|
|
|
|
|
|
|
error = cff_decoder_prepare( &decoder, size, glyph_index );
|
|
|
|
if ( error )
|
|
|
|
goto Glyph_Build_Finished;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2013-06-03 12:41:58 +02:00
|
|
|
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
/* choose which CFF renderer to use */
|
2013-06-03 12:41:58 +02:00
|
|
|
if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
|
|
|
|
error = cff_decoder_parse_charstrings( &decoder,
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
charstring,
|
|
|
|
charstring_len );
|
2013-06-03 12:41:58 +02:00
|
|
|
else
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
error = cf2_decoder_parse_charstrings( &decoder,
|
[cff] Add a new Type 2 interpreter and hinter.
This work, written by Dave Arnold <darnold@adobe.com> and fully
integrated into FreeType by me, is a donation by Adobe in
collaboration with Google. It is vastly superior to the old CFF
engine, and it will replace it soon. Right now, it is still off by
default, and you have to explicitly select it using the new
`hinting-engine' property of the cff driver.
For convenience, (most of) the new files are committed separately.
* include/freetype/config/ftheader.h (FT_CFF_DRIVER_H): New macro.
* include/freetype/ftcffdrv.h: New file to access CFF driver
properties.
* include/freetype/fterrdef.h (FT_Err_Glyph_Too_Big): New error
code.
* include/freetype/internal/fttrace.h: Add `cf2blues', `cf2hints',
and `cf2interp'.
* src/cff/cffgload.h (CFF_SubFont): New member `current_subfont'.
* src/cff/cffobjs.h (CFF_DriverRec): New members `hinting_engine'
and `no_stem_darkening'.
* src/cff/cfftypes.h (CFF_FontRec): New member `cf2_instance'.
* src/cff/cff.c: Include new files.
* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
`hinting-engine' and `no-stem-darkening' properties (only the Adobe
engine listens to them).
* src/cff/cffgload.c: Include `cf2ft.h'.
(cff_decoder_prepare): Initialize `current_subfont'.
(cff_build_add_point): Handle Adobe engine which uses 16.16
coordinates.
(cff_slot_load): Handle FT_LOAD_NO_SCALE and FT_LOAD_NO_HINTING
separately.
Choose rendering engine based on `hinting_engine' property.
* src/cff/cffload.c (cff_font_done): Call finalizer of the Adobe
engine.
* src/cff/cffobjs.c: Include FT_CFF_DRIVER_H.
(cff_driver_init): Set default property values.
* src/cff/rules.mk (CFF_DRV_SRC, CFF_DRV_H): Add new files.
* src/cff/cf2*.*: New files, containing the Adobe engine.
2013-04-13 18:53:28 +02:00
|
|
|
charstring,
|
|
|
|
charstring_len );
|
2010-08-05 10:10:32 +02:00
|
|
|
|
2013-06-03 12:41:58 +02:00
|
|
|
/* Adobe's engine uses 16.16 numbers everywhere; */
|
|
|
|
/* as a consequence, glyphs larger than 2000ppem get rejected */
|
|
|
|
if ( FT_ERR_EQ( error, Glyph_Too_Big ) )
|
|
|
|
{
|
2013-06-13 07:46:32 +02:00
|
|
|
/* this time, we retry unhinted and scale up the glyph later on */
|
|
|
|
/* (the engine uses and sets the hardcoded value 0x10000 / 64 = */
|
|
|
|
/* 0x400 for both `x_scale' and `y_scale' in this case) */
|
|
|
|
hinting = FALSE;
|
|
|
|
force_scaling = TRUE;
|
|
|
|
glyph->hint = hinting;
|
|
|
|
|
|
|
|
error = cf2_decoder_parse_charstrings( &decoder,
|
|
|
|
charstring,
|
|
|
|
charstring_len );
|
2013-06-03 12:41:58 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-05 10:10:32 +02:00
|
|
|
cff_free_glyph_data( face, &charstring, charstring_len );
|
2002-08-15 14:10:48 +02:00
|
|
|
|
2010-08-05 10:10:32 +02:00
|
|
|
if ( error )
|
|
|
|
goto Glyph_Build_Finished;
|
2001-03-05 17:22:25 +01:00
|
|
|
|
2002-08-15 14:10:48 +02:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
2010-08-05 10:10:32 +02:00
|
|
|
/* Control data and length may not be available for incremental */
|
|
|
|
/* fonts. */
|
|
|
|
if ( face->root.internal->incremental_interface )
|
|
|
|
{
|
2015-04-16 05:20:23 +02:00
|
|
|
glyph->root.control_data = NULL;
|
2010-08-05 10:10:32 +02:00
|
|
|
glyph->root.control_len = 0;
|
|
|
|
}
|
|
|
|
else
|
2002-08-16 01:07:18 +02:00
|
|
|
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
|
|
|
|
2010-08-05 10:10:32 +02:00
|
|
|
/* We set control_data and control_len if charstrings is loaded. */
|
|
|
|
/* See how charstring loads at cff_index_access_element() in */
|
|
|
|
/* cffload.c. */
|
|
|
|
{
|
|
|
|
CFF_Index csindex = &cff->charstrings_index;
|
2002-09-05 17:10:54 +02:00
|
|
|
|
2007-01-06 08:47:45 +01:00
|
|
|
|
2010-08-05 10:10:32 +02:00
|
|
|
if ( csindex->offsets )
|
|
|
|
{
|
|
|
|
glyph->root.control_data = csindex->bytes +
|
|
|
|
csindex->offsets[glyph_index] - 1;
|
2015-02-20 08:35:32 +01:00
|
|
|
glyph->root.control_len = (FT_Long)charstring_len;
|
2002-08-15 14:10:48 +02:00
|
|
|
}
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
2010-08-05 10:10:32 +02:00
|
|
|
Glyph_Build_Finished:
|
|
|
|
/* save new glyph tables, if no error */
|
|
|
|
if ( !error )
|
|
|
|
cff_builder_done( &decoder.builder );
|
|
|
|
/* XXX: anything to do for broken glyph entry? */
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
2003-12-11 18:55:58 +01:00
|
|
|
#ifdef FT_CONFIG_OPTION_INCREMENTAL
|
2003-02-13 18:49:27 +01:00
|
|
|
|
|
|
|
/* Incremental fonts can optionally override the metrics. */
|
2010-02-10 07:02:43 +01:00
|
|
|
if ( !error &&
|
|
|
|
face->root.internal->incremental_interface &&
|
2003-02-13 18:49:27 +01:00
|
|
|
face->root.internal->incremental_interface->funcs->get_glyph_metrics )
|
|
|
|
{
|
|
|
|
FT_Incremental_MetricsRec metrics;
|
|
|
|
|
2003-04-23 08:47:12 +02:00
|
|
|
|
2003-02-13 18:49:27 +01:00
|
|
|
metrics.bearing_x = decoder.builder.left_bearing.x;
|
2010-01-27 10:04:50 +01:00
|
|
|
metrics.bearing_y = 0;
|
2003-04-25 07:35:04 +02:00
|
|
|
metrics.advance = decoder.builder.advance.x;
|
2010-02-10 07:02:43 +01:00
|
|
|
metrics.advance_v = decoder.builder.advance.y;
|
2010-01-27 10:04:50 +01:00
|
|
|
|
2003-02-13 18:49:27 +01:00
|
|
|
error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
|
|
|
|
face->root.internal->incremental_interface->object,
|
|
|
|
glyph_index, FALSE, &metrics );
|
2010-01-27 10:04:50 +01:00
|
|
|
|
2003-02-13 18:49:27 +01:00
|
|
|
decoder.builder.left_bearing.x = metrics.bearing_x;
|
|
|
|
decoder.builder.advance.x = metrics.advance;
|
2010-02-10 07:02:43 +01:00
|
|
|
decoder.builder.advance.y = metrics.advance_v;
|
2003-02-13 18:49:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
|
|
|
|
|
2007-06-06 12:05:49 +02:00
|
|
|
if ( !error )
|
2005-04-18 09:13:07 +02:00
|
|
|
{
|
2007-06-06 12:05:49 +02:00
|
|
|
/* Now, set the metrics -- this is rather simple, as */
|
|
|
|
/* the left side bearing is the xMin, and the top side */
|
|
|
|
/* bearing the yMax. */
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* For composite glyphs, return only left side bearing and */
|
|
|
|
/* advance width. */
|
|
|
|
if ( load_flags & FT_LOAD_NO_RECURSE )
|
|
|
|
{
|
|
|
|
FT_Slot_Internal internal = glyph->root.internal;
|
2001-06-28 19:49:10 +02:00
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;
|
|
|
|
glyph->root.metrics.horiAdvance = decoder.glyph_width;
|
|
|
|
internal->glyph_matrix = font_matrix;
|
|
|
|
internal->glyph_delta = font_offset;
|
|
|
|
internal->glyph_transformed = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
FT_BBox cbox;
|
|
|
|
FT_Glyph_Metrics* metrics = &glyph->root.metrics;
|
2003-08-06 06:40:48 +02:00
|
|
|
FT_Vector advance;
|
2006-01-15 07:24:53 +01:00
|
|
|
FT_Bool has_vertical_info;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
|
2015-04-10 07:01:01 +02:00
|
|
|
if ( face->horizontal.number_Of_HMetrics )
|
|
|
|
{
|
|
|
|
FT_Short horiBearingX = 0;
|
|
|
|
FT_UShort horiAdvance = 0;
|
|
|
|
|
|
|
|
|
|
|
|
( (SFNT_Service)face->sfnt )->get_metrics( face, 0,
|
|
|
|
glyph_index,
|
|
|
|
&horiBearingX,
|
|
|
|
&horiAdvance );
|
|
|
|
metrics->horiAdvance = horiAdvance;
|
|
|
|
metrics->horiBearingX = horiBearingX;
|
|
|
|
glyph->root.linearHoriAdvance = horiAdvance;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* copy the _unscaled_ advance width */
|
|
|
|
metrics->horiAdvance = decoder.glyph_width;
|
|
|
|
glyph->root.linearHoriAdvance = decoder.glyph_width;
|
|
|
|
}
|
|
|
|
|
2001-01-03 01:15:00 +01:00
|
|
|
glyph->root.internal->glyph_transformed = 0;
|
|
|
|
|
2009-09-02 13:06:33 +02:00
|
|
|
has_vertical_info = FT_BOOL( face->vertical_info &&
|
|
|
|
face->vertical.number_Of_VMetrics > 0 );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2015-04-10 07:01:01 +02:00
|
|
|
/* get the vertical metrics from the vmtx table if we have one */
|
2006-01-15 07:24:53 +01:00
|
|
|
if ( has_vertical_info )
|
2005-11-17 09:12:00 +01:00
|
|
|
{
|
|
|
|
FT_Short vertBearingY = 0;
|
|
|
|
FT_UShort vertAdvance = 0;
|
|
|
|
|
|
|
|
|
2015-04-10 07:01:01 +02:00
|
|
|
( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
|
|
|
|
glyph_index,
|
|
|
|
&vertBearingY,
|
|
|
|
&vertAdvance );
|
2005-11-17 09:12:00 +01:00
|
|
|
metrics->vertBearingY = vertBearingY;
|
|
|
|
metrics->vertAdvance = vertAdvance;
|
|
|
|
}
|
2006-01-15 07:24:53 +01:00
|
|
|
else
|
|
|
|
{
|
|
|
|
/* make up vertical ones */
|
|
|
|
if ( face->os2.version != 0xFFFFU )
|
|
|
|
metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender -
|
|
|
|
face->os2.sTypoDescender );
|
|
|
|
else
|
|
|
|
metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender -
|
|
|
|
face->horizontal.Descender );
|
|
|
|
}
|
|
|
|
|
|
|
|
glyph->root.linearVertAdvance = metrics->vertAdvance;
|
2005-11-17 09:12:00 +01:00
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
glyph->root.outline.flags = 0;
|
2004-03-03 09:21:12 +01:00
|
|
|
if ( size && size->root.metrics.y_ppem < 24 )
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
* massive re-formatting changes to many, many source files. I don't
want to list them all here. The operations performed were all logical
transformations of the sources:
- trying to convert all enums and constants to CAPITALIZED_STYLE, with
#define definitions like
#define my_old_constants MY_NEW_CONSTANT
- big, big update of the documentation comments
* include/freetype/freetype.h, src/base/ftobjs.c, src/smooth/ftsmooth.c,
include/freetype/ftimage.h: adding support for LCD-optimized rendering
though the new constants/enums:
FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V
this is still work in progress, don't expect everything to work correctly
though most of the features have been implemented.
* adding new FT_LOAD_XXX flags, used to specify both hinting and rendering
targets:
FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
FT_LOAD_TARGET_MONO :: monochrome bitmaps
FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated hinting & rendering
FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated hinting & rendering
note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
behaviour of the font engine is _unchanged_.
2002-08-27 22:20:29 +02:00
|
|
|
glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2009-08-27 00:10:56 +02:00
|
|
|
if ( !( font_matrix.xx == 0x10000L &&
|
|
|
|
font_matrix.yy == 0x10000L &&
|
2007-06-20 09:07:55 +02:00
|
|
|
font_matrix.xy == 0 &&
|
|
|
|
font_matrix.yx == 0 ) )
|
2007-05-28 17:45:35 +02:00
|
|
|
FT_Outline_Transform( &glyph->root.outline, &font_matrix );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2007-06-20 09:07:55 +02:00
|
|
|
if ( !( font_offset.x == 0 &&
|
|
|
|
font_offset.y == 0 ) )
|
2007-05-28 17:45:35 +02:00
|
|
|
FT_Outline_Translate( &glyph->root.outline,
|
2007-05-29 09:00:23 +02:00
|
|
|
font_offset.x, font_offset.y );
|
2001-01-03 01:15:00 +01:00
|
|
|
|
2003-08-06 06:40:48 +02:00
|
|
|
advance.x = metrics->horiAdvance;
|
2003-08-06 19:27:14 +02:00
|
|
|
advance.y = 0;
|
|
|
|
FT_Vector_Transform( &advance, &font_matrix );
|
|
|
|
metrics->horiAdvance = advance.x + font_offset.x;
|
2005-11-17 09:12:00 +01:00
|
|
|
|
2003-08-06 19:27:14 +02:00
|
|
|
advance.x = 0;
|
2003-08-06 06:40:48 +02:00
|
|
|
advance.y = metrics->vertAdvance;
|
|
|
|
FT_Vector_Transform( &advance, &font_matrix );
|
2003-08-06 19:27:14 +02:00
|
|
|
metrics->vertAdvance = advance.y + font_offset.y;
|
2003-08-06 06:40:48 +02:00
|
|
|
|
2008-05-15 01:05:38 +02:00
|
|
|
if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
|
2001-01-03 01:15:00 +01:00
|
|
|
{
|
|
|
|
/* scale the outline and the metrics */
|
|
|
|
FT_Int n;
|
|
|
|
FT_Outline* cur = &glyph->root.outline;
|
|
|
|
FT_Vector* vec = cur->points;
|
|
|
|
FT_Fixed x_scale = glyph->x_scale;
|
|
|
|
FT_Fixed y_scale = glyph->y_scale;
|
|
|
|
|
|
|
|
|
|
|
|
/* First of all, scale the points */
|
2005-11-18 22:10:59 +01:00
|
|
|
if ( !hinting || !decoder.builder.hints_funcs )
|
2001-12-20 14:14:18 +01:00
|
|
|
for ( n = cur->n_points; n > 0; n--, vec++ )
|
|
|
|
{
|
|
|
|
vec->x = FT_MulFix( vec->x, x_scale );
|
|
|
|
vec->y = FT_MulFix( vec->y, y_scale );
|
|
|
|
}
|
2001-01-03 01:15:00 +01:00
|
|
|
|
|
|
|
/* Then scale the metrics */
|
2005-11-17 09:12:00 +01:00
|
|
|
metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
|
|
|
|
metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* compute the other metrics */
|
|
|
|
FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
|
|
|
|
|
|
|
|
metrics->width = cbox.xMax - cbox.xMin;
|
|
|
|
metrics->height = cbox.yMax - cbox.yMin;
|
|
|
|
|
2015-07-26 21:08:34 +02:00
|
|
|
metrics->horiBearingX = cbox.xMin;
|
2001-01-03 01:15:00 +01:00
|
|
|
metrics->horiBearingY = cbox.yMax;
|
2006-01-15 07:24:53 +01:00
|
|
|
|
|
|
|
if ( has_vertical_info )
|
2009-09-02 13:06:33 +02:00
|
|
|
metrics->vertBearingX = metrics->horiBearingX -
|
|
|
|
metrics->horiAdvance / 2;
|
2012-01-16 18:00:24 +01:00
|
|
|
else
|
2010-02-10 07:13:27 +01:00
|
|
|
{
|
|
|
|
if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
|
|
|
|
ft_synthesize_vertical_metrics( metrics,
|
|
|
|
metrics->vertAdvance );
|
|
|
|
}
|
2001-01-03 01:15:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* END */
|