|
|
/**
** 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));
|