|
|
|
@ -17,10 +17,17 @@ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <ft2build.h> |
|
|
|
|
#include FT_FREETYPE_H |
|
|
|
|
#include FT_INTERNAL_STREAM_H |
|
|
|
|
#include FT_INTERNAL_DEBUG_H |
|
|
|
|
#include FT_INTERNAL_TFM_H |
|
|
|
|
|
|
|
|
|
#include "tfmobjs.h" |
|
|
|
|
#include "tfmmod.h" |
|
|
|
|
#include FT_INTERNAL_STREAM_H |
|
|
|
|
#include "tfmerrors.h" |
|
|
|
|
#include "tfmerr.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
@ -42,9 +49,9 @@ |
|
|
|
|
long tfm_read_intn(FT_Stream,int); |
|
|
|
|
unsigned long tfm_read_uintn(FT_Stream,int); |
|
|
|
|
|
|
|
|
|
#define READ_UINT2( stream ) (UINT1)tfm_read_uintn( stream, 2) |
|
|
|
|
#define READ_UINT4( stream ) (UINT1)tfm_read_uintn( stream, 4) |
|
|
|
|
#define READ_INT4( stream ) (INT4)tfm_read_intn( stream, 4) |
|
|
|
|
#define READ_UINT2( stream ) (FT_Byte)tfm_read_uintn( stream, 2) |
|
|
|
|
#define READ_UINT4( stream ) (FT_Byte)tfm_read_uintn( stream, 4) |
|
|
|
|
#define READ_INT4( stream ) (FT_Long)tfm_read_intn( stream, 4) |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Reading a Number from file |
|
|
|
@ -103,8 +110,6 @@ |
|
|
|
|
FT_Memory memory, |
|
|
|
|
FT_Stream stream ) |
|
|
|
|
{ |
|
|
|
|
FT_Error error; |
|
|
|
|
|
|
|
|
|
parser->memory = memory; |
|
|
|
|
parser->stream = stream; |
|
|
|
|
parser->FontInfo = NULL; |
|
|
|
@ -128,11 +133,12 @@ |
|
|
|
|
{ |
|
|
|
|
FT_Memory memory = parser->memory; |
|
|
|
|
TFM_FontInfo fi = parser->FontInfo; |
|
|
|
|
FT_Stream stream = parser->stream; |
|
|
|
|
FT_Error error = FT_ERR( Syntax_Error ); |
|
|
|
|
|
|
|
|
|
FT_ULong lf, lh, nc, nci, err; |
|
|
|
|
FT_ULong lf, lh, nc, nci; |
|
|
|
|
FT_ULong offset_header, offset_char_info, offset_param; |
|
|
|
|
FT_ULong nw, nh, nd, ni, nl, nk, neng, np, dir; |
|
|
|
|
FT_ULong nw, nh, nd, ni, nl, nk, neng, np; |
|
|
|
|
|
|
|
|
|
FT_Long *w, *h, *d; |
|
|
|
|
FT_ULong *ci, v; |
|
|
|
@ -146,18 +152,21 @@ |
|
|
|
|
fi->width = NULL; |
|
|
|
|
fi->height = NULL; |
|
|
|
|
fi->depth = NULL; |
|
|
|
|
ci = NULL; |
|
|
|
|
w = NULL; |
|
|
|
|
h = NULL; |
|
|
|
|
d = NULL; |
|
|
|
|
|
|
|
|
|
fi->font_bbx_w = 0.0; |
|
|
|
|
fi->font_bbx_h = 0.0; |
|
|
|
|
fi->font_bbx_xoff = 0.0; |
|
|
|
|
fi->font_bbx_yoff = 0.0; |
|
|
|
|
|
|
|
|
|
err = 0; |
|
|
|
|
/* rewind(fp); */ |
|
|
|
|
if( FT_STREAM_SEEK( 0 ) ) |
|
|
|
|
return error; |
|
|
|
|
|
|
|
|
|
lf = (UINT4)READ_UINT2( stream ); |
|
|
|
|
lf = (FT_ULong)READ_UINT2( stream ); |
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
if ((lf == 11) || (lf == 9)) |
|
|
|
@ -165,9 +174,9 @@ |
|
|
|
|
/* JFM file of Japanese TeX by ASCII Coop. */ |
|
|
|
|
tfm->type = METRIC_TYPE_JFM; |
|
|
|
|
tfm->type_aux = (lf == 11)?METRIC_TYPE_JFM_AUX_H:METRIC_TYPE_JFM_AUX_V; |
|
|
|
|
tfm->nt = (UINT4)READ_UINT2(fp); |
|
|
|
|
lf = (UINT4)READ_UINT2(fp); |
|
|
|
|
lh = (UINT4)READ_UINT2(fp); |
|
|
|
|
tfm->nt = (FT_ULong)READ_UINT2(fp); |
|
|
|
|
lf = (FT_ULong)READ_UINT2(fp); |
|
|
|
|
lh = (FT_ULong)READ_UINT2(fp); |
|
|
|
|
offset_header = 4*7; |
|
|
|
|
offset_char_info = 4*(7+tfm->nt+lh); |
|
|
|
|
} |
|
|
|
@ -194,6 +203,7 @@ |
|
|
|
|
else |
|
|
|
|
{ } |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* Traditional TeX Metric File */ |
|
|
|
|
lh = (int)READ_UINT2( stream ); |
|
|
|
|
offset_header = 4*6; |
|
|
|
@ -225,18 +235,19 @@ |
|
|
|
|
else |
|
|
|
|
{ } |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
fi->begin_char = (int)READ_UINT2( stream ); |
|
|
|
|
fi->end_char = (int)READ_UINT2( stream ); |
|
|
|
|
|
|
|
|
|
nw = (UINT4)READ_UINT2( stream ); |
|
|
|
|
nh = (UINT4)READ_UINT2( stream ); |
|
|
|
|
nd = (UINT4)READ_UINT2( stream ); |
|
|
|
|
nw = (FT_ULong)READ_UINT2( stream ); |
|
|
|
|
nh = (FT_ULong)READ_UINT2( stream ); |
|
|
|
|
nd = (FT_ULong)READ_UINT2( stream ); |
|
|
|
|
|
|
|
|
|
ni = (UINT4)READ_UINT2( stream ); |
|
|
|
|
nl = (UINT4)READ_UINT2( stream ); |
|
|
|
|
nk = (UINT4)READ_UINT2( stream ); |
|
|
|
|
neng = (UINT4)READ_UINT2( stream ); |
|
|
|
|
np = (UINT4)READ_UINT2( stream ); |
|
|
|
|
ni = (FT_ULong)READ_UINT2( stream ); |
|
|
|
|
nl = (FT_ULong)READ_UINT2( stream ); |
|
|
|
|
nk = (FT_ULong)READ_UINT2( stream ); |
|
|
|
|
neng = (FT_ULong)READ_UINT2( stream ); |
|
|
|
|
np = (FT_ULong)READ_UINT2( stream ); |
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
if (tfm->type == METRIC_TYPE_TFM) |
|
|
|
@ -252,28 +263,34 @@ |
|
|
|
|
/* fseek(fp, offset_header, SEEK_SET); */ |
|
|
|
|
if (FT_STREAM_SEEK( offset_header ) ) |
|
|
|
|
goto Exit; |
|
|
|
|
fi->cs = READ_UINT4( stream ); |
|
|
|
|
fi->ds = READ_UINT4( stream ); |
|
|
|
|
fi->design_size = (double)(fi->ds)/(double)(1<<20); |
|
|
|
|
fi->cs = READ_UINT4( stream ); /* Check Sum */ |
|
|
|
|
fi->ds = READ_UINT4( stream ); /* Design Size */ |
|
|
|
|
|
|
|
|
|
fi->design_size = (FT_ULong)((double)(fi->ds)/(double)(1<<20)); |
|
|
|
|
|
|
|
|
|
nc = fi->end_char - fi->begin_char + 1; |
|
|
|
|
nci = nc; |
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
if (tfm->type == METRIC_TYPE_OFM) |
|
|
|
|
nci *= 2; |
|
|
|
|
#endif |
|
|
|
|
ci = (UINT4*)calloc(nci, sizeof(UINT4)); |
|
|
|
|
w = (INT4*)calloc(nw, sizeof(UINT4)); |
|
|
|
|
h = (INT4*)calloc(nh, sizeof(UINT4)); |
|
|
|
|
d = (INT4*)calloc(nd, sizeof(UINT4)); |
|
|
|
|
|
|
|
|
|
ci = (FT_ULong*)calloc(nci, sizeof(FT_ULong)); |
|
|
|
|
w = (FT_Long*)calloc(nw, sizeof(FT_ULong)); |
|
|
|
|
h = (FT_Long*)calloc(nh, sizeof(FT_ULong)); |
|
|
|
|
d = (FT_Long*)calloc(nd, sizeof(FT_ULong)); |
|
|
|
|
|
|
|
|
|
if ((ci == NULL) || (w == NULL) || (h == NULL) || (d == NULL)) |
|
|
|
|
{ |
|
|
|
|
error = FT_THROW( Invalid_Argument ); |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* fseek(fp, offset_char_info, SEEK_SET); */ |
|
|
|
|
if( FT_STREAM_SEEK( offset_char_info ) ) |
|
|
|
|
if( FT_STREAM_SEEK( offset_char_info ) ) /* Skip over coding scheme and font family name */ |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < nci; i++) |
|
|
|
|
ci[i] = READ_UINT4( stream ); |
|
|
|
|
|
|
|
|
@ -287,18 +304,21 @@ |
|
|
|
|
for (i = 0; i < nd; i++) |
|
|
|
|
d[i] = READ_INT4( stream ); |
|
|
|
|
|
|
|
|
|
fi->width = (INT4*)calloc(nc, sizeof(INT4)); |
|
|
|
|
fi->height = (INT4*)calloc(nc, sizeof(INT4)); |
|
|
|
|
fi->depth = (INT4*)calloc(nc, sizeof(INT4)); |
|
|
|
|
fi->width = (FT_Long*)calloc(nc, sizeof(FT_Long)); |
|
|
|
|
fi->height = (FT_Long*)calloc(nc, sizeof(FT_Long)); |
|
|
|
|
fi->depth = (FT_Long*)calloc(nc, sizeof(FT_Long)); |
|
|
|
|
|
|
|
|
|
if ((fi->width == NULL) || (fi->height == NULL) || (fi->depth == NULL)) |
|
|
|
|
{ |
|
|
|
|
error = FT_THROW( Invalid_Argument ); |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bbxw = 0; |
|
|
|
|
bbxh = 0; |
|
|
|
|
xoff = 0; |
|
|
|
|
yoff = 0; |
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
if (tfm->type == METRIC_TYPE_OFM) |
|
|
|
|
{ |
|
|
|
@ -325,28 +345,28 @@ |
|
|
|
|
else |
|
|
|
|
{ } |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
for (i = 0; i < nc; i++) |
|
|
|
|
{ |
|
|
|
|
v = ci[i] / 0x10000L; |
|
|
|
|
fi->depth[i] = d[v & 0xf]; v >>= 4; |
|
|
|
|
fi->height[i] = h[v & 0xf]; v >>= 4; |
|
|
|
|
fi->width[i] = w[v & 0xff]; |
|
|
|
|
|
|
|
|
|
if (bbxw < fi->width[i]) |
|
|
|
|
bbxw = fi->width[i]; |
|
|
|
|
|
|
|
|
|
if (bbxh < (fi->height[i] + fi->depth[i])) |
|
|
|
|
bbxh = fi->height[i] + fi->depth[i]; |
|
|
|
|
|
|
|
|
|
if (yoff > -fi->depth[i]) |
|
|
|
|
yoff = -fi->depth[i]; |
|
|
|
|
#if 0 |
|
|
|
|
printf("** %.3f %.3f\n", |
|
|
|
|
(double)tfm->height[i]/(double)(1<<20), |
|
|
|
|
(double)tfm->depth[i]/(double)(1<<20)); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
fi->font_bbx_w = fi->design_size * ((double)bbxw / (double)(1<<20)); |
|
|
|
|
fi->font_bbx_h = fi->design_size * ((double)bbxh / (double)(1<<20)); |
|
|
|
|
fi->font_bbx_xoff = fi->design_size * ((double)xoff / (double)(1<<20)); |
|
|
|
|
fi->font_bbx_yoff = fi->design_size * ((double)yoff / (double)(1<<20)); |
|
|
|
|
|
|
|
|
|
fi->font_bbx_w = (FT_ULong)(fi->design_size * ((double)bbxw / (double)(1<<20))); |
|
|
|
|
fi->font_bbx_h = (FT_ULong)(fi->design_size * ((FT_ULong)bbxh / (double)(1<<20))); |
|
|
|
|
fi->font_bbx_xoff = (FT_ULong)(fi->design_size * ((double)xoff / (double)(1<<20))); |
|
|
|
|
fi->font_bbx_yoff = (FT_ULong)(fi->design_size * ((double)yoff / (double)(1<<20))); |
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
|
if (tfm->type == METRIC_TYPE_JFM) |
|
|
|
@ -375,13 +395,16 @@ |
|
|
|
|
return error; /* To be changed */ |
|
|
|
|
if (FT_READ_ULONG(fi->slant) ) |
|
|
|
|
return error; |
|
|
|
|
fi->slant = (double)fi->slant/(double)(1<<20); |
|
|
|
|
fi->slant = (FT_ULong)((double)fi->slant/(double)(1<<20)); |
|
|
|
|
|
|
|
|
|
Exit: |
|
|
|
|
FT_FREE(ci); |
|
|
|
|
FT_FREE(w); |
|
|
|
|
FT_FREE(h); |
|
|
|
|
FT_FREE(d); |
|
|
|
|
if( !ci || !w || !h || !d ) |
|
|
|
|
{ |
|
|
|
|
FT_FREE(ci); |
|
|
|
|
FT_FREE(w); |
|
|
|
|
FT_FREE(h); |
|
|
|
|
FT_FREE(d); |
|
|
|
|
} |
|
|
|
|
return error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|