494 lines
11 KiB
C
494 lines
11 KiB
C
/**
|
|
** Description:
|
|
** This is a module of the T1 to TT font converter. This is a
|
|
** sub-module of Hint module. This modules deals with the
|
|
** the font program fo the font.
|
|
**
|
|
** Author: Michael Jansson
|
|
**
|
|
** Created: 8/24/93
|
|
**
|
|
***/
|
|
|
|
|
|
#ifndef _ARGS
|
|
# define IN const
|
|
# define OUT
|
|
# define INOUT
|
|
# define _ARGS(arg) arg
|
|
#endif
|
|
|
|
#define HIBYTE(v) (UBYTE)((USHORT)(v)>>8)
|
|
#define LOBYTE(v) (UBYTE)((USHORT)(v)&0xff)
|
|
|
|
#define TWILIGHT 0
|
|
#define GLYPHZONE 1
|
|
|
|
#define TMPCVT 0L
|
|
#define TMPPNT 0L
|
|
#define TMPPNT1 1L
|
|
|
|
#define STORAGE_DIAG 3
|
|
|
|
#define ONEPIXEL 64L
|
|
|
|
#define INFINITY (USHORT)SHRT_MAX
|
|
|
|
|
|
#define MAXPTS 10 /* Max num of pts on a stem hint side. */
|
|
|
|
|
|
/* IP bucket - Used for collecting points that should be
|
|
interpolated within the zones defined by the stem hints. */
|
|
typedef struct Extremas {
|
|
short rp1;
|
|
short rp2;
|
|
short n;
|
|
short pts[MAXPTS];
|
|
} Extremas;
|
|
|
|
|
|
|
|
enum aligntype {
|
|
at_side1,
|
|
at_side2,
|
|
at_relative1,
|
|
at_relative2,
|
|
at_centered
|
|
};
|
|
|
|
|
|
|
|
/***
|
|
**
|
|
** Description:
|
|
** This file contains op-codes for a sub-set of the
|
|
** TrueType instruction set.
|
|
**
|
|
** Author: Michael Jansson
|
|
**
|
|
** Created: 10/14/93
|
|
**
|
|
***/
|
|
|
|
|
|
/* TrueType sub-op codes. */
|
|
#define SUBOP_Y 0x00
|
|
#define SUBOP_X 0x01
|
|
|
|
#define SUBOP_R 0x01
|
|
|
|
#define SUBOP_MOVE 0x10
|
|
#define SUBOP_MINDIST 0x08
|
|
#define SUBOP_ROUND 0x04
|
|
#define SUBOP_GRAY 0x00
|
|
|
|
#define SUBOP_mMRGR SUBOP_MINDIST | SUBOP_ROUND | SUBOP_GRAY
|
|
#define SUBOP_MmRGR SUBOP_MOVE | SUBOP_ROUND | SUBOP_GRAY
|
|
|
|
|
|
/* TrueType op codes. */
|
|
enum {
|
|
op_mps = 0x4c,
|
|
op_spvtl = 0x07,
|
|
op_roll = 0x8a,
|
|
op_gteq = 0x53,
|
|
op_cindex = 0x25,
|
|
op_rtdg = 0x3d,
|
|
op_clear = 0x22,
|
|
op_szp0 = 0x13,
|
|
op_szp1 = 0x14,
|
|
op_szp2 = 0x15,
|
|
op_szps = 0x16,
|
|
op_loopcall = 0x2a,
|
|
op_shz = 0x36,
|
|
op_smd = 0x1a,
|
|
op_rutg = 0x7c,
|
|
op_rdtg = 0x7d,
|
|
op_pop = 0x21,
|
|
op_abs = 0x64,
|
|
op_scvtci = 0x1d,
|
|
op_rs = 0x43,
|
|
op_spvfs = 0x0a,
|
|
op_shp = 0x33,
|
|
op_roff = 0x7a,
|
|
op_md = 0x49,
|
|
op_ssw = 0x1f,
|
|
op_mul = 0x63,
|
|
op_odd = 0x56,
|
|
op_gc = 0x46,
|
|
op_dup = 0x20,
|
|
op_min = 0x8c,
|
|
op_max = 0x8b,
|
|
op_neg = 0x65,
|
|
op_sfvtl = 0x08,
|
|
op_spvtca = 0x06,
|
|
op_swap = 0x23,
|
|
op_mdrp = 0xc0,
|
|
op_mdap = 0x2e,
|
|
op_miap = 0x3e,
|
|
op_mirp = 0xe0,
|
|
op_alignrp = 0x3c,
|
|
op_iup = 0x30,
|
|
op_svcta = 0x00,
|
|
op_sloop = 0x17,
|
|
op_npushb = 0x40,
|
|
op_npushw = 0x41,
|
|
op_mppem = 0x4b,
|
|
op_lt = 0x50,
|
|
op_gt = 0x52,
|
|
op_if = 0x58,
|
|
op_scfs = 0x48,
|
|
op_else = 0x1b,
|
|
op_wcvtf = 0x70,
|
|
op_wcvtp = 0x44,
|
|
op_pushw1 = 0xb8,
|
|
op_pushb1 = 0xb0,
|
|
op_eif = 0x59,
|
|
op_shpix = 0x38,
|
|
op_srp0 = 0x10,
|
|
op_srp1 = 0x11,
|
|
op_srp2 = 0x12,
|
|
op_ip = 0x39,
|
|
op_rcvt = 0x45,
|
|
op_round = 0x68,
|
|
op_rtg = 0x18,
|
|
op_rthg = 0x19,
|
|
op_add = 0x60,
|
|
op_div = 0x62,
|
|
op_scanctrl = 0x85,
|
|
op_ws = 0x42,
|
|
op_sswci = 0x1e,
|
|
op_scantype = 0x8d,
|
|
op_sub = 0x61,
|
|
op_fdef = 0x2c,
|
|
op_endf = 0x2d,
|
|
op_call = 0x2b,
|
|
op_getinfo = 0x88
|
|
};
|
|
|
|
|
|
|
|
/***
|
|
** Function: GetTopPos
|
|
**
|
|
** Description:
|
|
** This function allocates a cvt entry for the
|
|
** top side of a horizontal stem;
|
|
***/
|
|
short GetTopPos _ARGS((IN Blues *blues,
|
|
INOUT AlignmentControl *align,
|
|
IN funit pos));
|
|
/***
|
|
** Function: GetBottomPos
|
|
**
|
|
** Description:
|
|
** This function allocates a cvt entry for the
|
|
** top side of a horizontal stem;
|
|
***/
|
|
short GetBottomPos _ARGS((IN Blues *blues,
|
|
INOUT AlignmentControl *align,
|
|
IN funit pos));
|
|
/***
|
|
** Function: CutInSize
|
|
**
|
|
** Description:
|
|
** This function computes the cut in size
|
|
** of a stem, given a master width and the
|
|
** width of the stem. This is done with the
|
|
** StdVW==2.0 pixel treshold and the thinn
|
|
** and wide cut in values.
|
|
***/
|
|
USHORT CutInSize _ARGS((IN funit width,
|
|
IN funit master,
|
|
IN USHORT tresh,
|
|
IN funit upem));
|
|
|
|
/***
|
|
** Function: SnapStemArgs
|
|
**
|
|
** Description:
|
|
**
|
|
***/
|
|
USHORT SnapStemArgs _ARGS((OUT short *args,
|
|
INOUT USHORT ta,
|
|
IN funit width,
|
|
IN USHORT std_cvt,
|
|
IN USHORT snap_cvt,
|
|
IN USHORT std_ci,
|
|
IN USHORT snap_ci,
|
|
IN USHORT storage));
|
|
/***
|
|
** Function: StdStemArgs
|
|
**
|
|
** Description:
|
|
**
|
|
***/
|
|
USHORT StdStemArgs _ARGS((OUT short *args,
|
|
INOUT USHORT ta,
|
|
IN funit width,
|
|
IN USHORT std_cvt,
|
|
IN USHORT std_ci,
|
|
IN USHORT storage));
|
|
/***
|
|
** Function: CreateStdStems
|
|
**
|
|
** Description:
|
|
**
|
|
***/
|
|
USHORT CreateStdStems _ARGS((INOUT UBYTE *prep,
|
|
INOUT USHORT tp,
|
|
IN short cnt));
|
|
/***
|
|
** Function: CreateSnapStems
|
|
**
|
|
** Description:
|
|
**
|
|
***/
|
|
USHORT CreateSnapStems _ARGS((INOUT UBYTE *prep,
|
|
INOUT USHORT tp,
|
|
IN short cnt));
|
|
/***
|
|
** Function: tt_GetFontProg
|
|
**
|
|
** Description:
|
|
** This function returns the static font
|
|
** font program.
|
|
***/
|
|
const UBYTE *tt_GetFontProg _ARGS((void));
|
|
|
|
|
|
/***
|
|
** Function: tt_GetNumFuns
|
|
**
|
|
** Description:
|
|
** This function returns the number of functions
|
|
** defined in the static font program.
|
|
***/
|
|
USHORT tt_GetNumFuns _ARGS((void));
|
|
|
|
|
|
/***
|
|
** Function: tt_GetFontProgSize
|
|
**
|
|
** Description:
|
|
** This function returns the size of the
|
|
** static font program.
|
|
***/
|
|
USHORT tt_GetFontProgSize _ARGS((void));
|
|
|
|
|
|
/***
|
|
** Function: SetZone
|
|
**
|
|
** Description:
|
|
** This function initiate an alignment zone
|
|
** by creating an appropriate point in the
|
|
** twilight zone.
|
|
***/
|
|
USHORT SetZone _ARGS((INOUT UBYTE *prep,
|
|
INOUT USHORT tp,
|
|
IN short cvt));
|
|
/***
|
|
** Function: CopyZone
|
|
**
|
|
** Description:
|
|
** This function copies a cvt entry, representing an
|
|
** alignment zone, to the cvt used for a particular hstem.
|
|
***/
|
|
USHORT CopyZone _ARGS((INOUT UBYTE *prep,
|
|
INOUT short tp,
|
|
INOUT short *args,
|
|
IN short ta));
|
|
/***
|
|
** Function: CopyFamilyBlue
|
|
**
|
|
** Description:
|
|
** This function copies a cvt entry, representing a
|
|
** family blue zone, to the cvt used for a particular hstem.
|
|
***/
|
|
USHORT CopyFamilyBlue _ARGS((INOUT UBYTE *prep,
|
|
INOUT short tp,
|
|
INOUT short *args,
|
|
IN short ta));
|
|
/***
|
|
** Function: AlignFlat
|
|
**
|
|
** Description:
|
|
** This function creates a cvt entry for
|
|
** a particular hstem.
|
|
***/
|
|
USHORT AlignFlat _ARGS((INOUT UBYTE *prep,
|
|
INOUT short tp,
|
|
INOUT short *args,
|
|
IN short ta));
|
|
/***
|
|
** Function: AlignOvershoot
|
|
**
|
|
** Description:
|
|
** This function creates a cvt entry for
|
|
** a particular hstem.
|
|
***/
|
|
USHORT AlignOvershoot _ARGS((INOUT UBYTE *prep,
|
|
INOUT short tp,
|
|
INOUT short *args,
|
|
IN short ta));
|
|
/***
|
|
** Function: EmitFlex
|
|
**
|
|
** Description:
|
|
** Convert a T1 flex hint into a TrueType IP[]
|
|
** intruction sequence that will reduce a flex
|
|
** that is flatter than a given height.
|
|
***/
|
|
errcode EmitFlex _ARGS((INOUT short *args,
|
|
INOUT short *pcd,
|
|
IN funit height,
|
|
IN short start,
|
|
IN short mid,
|
|
IN short last));
|
|
/***
|
|
** Function: ReduceDiagonals
|
|
**
|
|
** Description:
|
|
** This function generates the TT instructions
|
|
** that will shrink the outline, in order to
|
|
** control the width of diagonals. This implementation
|
|
** can probably be improved.
|
|
***/
|
|
short ReduceDiagonals _ARGS((IN Outline *paths,
|
|
INOUT UBYTE *pgm,
|
|
INOUT short *pc,
|
|
INOUT short *args,
|
|
INOUT short *pcd));
|
|
/***
|
|
** Function: ScaleDown3
|
|
**
|
|
** Description:
|
|
** This function generates the TT instructions
|
|
** that will scale down points 3%.
|
|
***/
|
|
void ScaleDown3 _ARGS((IN Extremas *extr,
|
|
IN short xcnt,
|
|
INOUT UBYTE *pgm,
|
|
INOUT short *pc,
|
|
INOUT short *args,
|
|
INOUT short *pcd));
|
|
/***
|
|
** Function: EmitIP
|
|
**
|
|
** Description:
|
|
** This function generates the TT instructions
|
|
** that will interpolate points that are either
|
|
** within or between stem sides.
|
|
***/
|
|
void EmitIP _ARGS((IN Extremas *extr,
|
|
IN short xcnt,
|
|
INOUT UBYTE *pgm,
|
|
INOUT short *pc,
|
|
INOUT short *args,
|
|
INOUT short *pcd,
|
|
IN short scale3offset));
|
|
/***
|
|
** Function: EmitVerticalStem
|
|
**
|
|
** Description:
|
|
** This function generates the code that
|
|
** will initiate the graphics state of the
|
|
** TrueType interpreter for the grid fitting
|
|
** of vertical stems.
|
|
***/
|
|
void EmitVerticalStems _ARGS((INOUT UBYTE *pgm,
|
|
INOUT short *pc,
|
|
INOUT short *args,
|
|
INOUT short *pcd));
|
|
/***
|
|
** Function: EmitHorizontalStem
|
|
**
|
|
** Description:
|
|
** This function generates the code that
|
|
** will initiate the graphics state of the
|
|
** TrueType interpreter for the grid fitting
|
|
** of vertical stems.
|
|
***/
|
|
void EmitHorizontalStems _ARGS((INOUT UBYTE *pgm,
|
|
INOUT short *pc,
|
|
INOUT short *args,
|
|
INOUT short *pcd));
|
|
/***
|
|
** Function: EmitVStem
|
|
**
|
|
** Description:
|
|
** This function generates the code that
|
|
** will create and grid fit points in the
|
|
** twilight zone, corresponding to a vstem.
|
|
***/
|
|
errcode EmitVStem _ARGS((INOUT UBYTE *pgm,
|
|
INOUT short *pc,
|
|
INOUT short *args,
|
|
INOUT short *pcd,
|
|
INOUT struct T1Metrics *t1m,
|
|
IN funit width,
|
|
IN funit real_side1,
|
|
IN funit real_side2,
|
|
IN funit side1,
|
|
IN funit side2,
|
|
IN short rp,
|
|
IN enum aligntype align,
|
|
IN short ref));
|
|
/***
|
|
** Function: EmitHStem
|
|
**
|
|
** Description:
|
|
** This function generates the code that
|
|
** will create and grid fit points in the
|
|
** twilight zone, corresponding to a hstem.
|
|
***/
|
|
errcode EmitHStem _ARGS((INOUT UBYTE *pgm,
|
|
INOUT short *pc,
|
|
INOUT short *args,
|
|
INOUT short *pcd,
|
|
INOUT struct T1Metrics *t1m,
|
|
IN funit width,
|
|
IN funit side1,
|
|
IN funit side2,
|
|
IN short rp,
|
|
IN enum aligntype align,
|
|
IN short ref));
|
|
/***
|
|
** Function: FamilyCutIn
|
|
**
|
|
** Description:
|
|
** This function generates a branch in the
|
|
** pre-program.
|
|
***/
|
|
USHORT FamilyCutIn _ARGS((INOUT UBYTE *pgm,
|
|
INOUT USHORT tp,
|
|
IN short cis));
|
|
/***
|
|
** Function: SetProjection
|
|
**
|
|
** Description:
|
|
** This function generates the TrueType code that
|
|
** changes the projection vector in oblique typefaces.
|
|
***/
|
|
void SetProjection _ARGS((INOUT UBYTE *pgm,
|
|
INOUT short *pc,
|
|
INOUT short *args,
|
|
INOUT short *pcd,
|
|
IN funit x,
|
|
IN funit y));
|
|
/***
|
|
** Function: AssembleArgs
|
|
**
|
|
** Description:
|
|
** This function takes a sequence of arguments and
|
|
** assembles them into a sequence of PUSHB1[], PUSHW1[],
|
|
** NPUSHB[] and NPUSHW[] instructions.
|
|
***/
|
|
void AssembleArgs _ARGS((INOUT short *args,
|
|
IN short pcd,
|
|
OUT UBYTE *is,
|
|
INOUT short *cnt));
|
|
|