|
|
|
@ -168,6 +168,224 @@ |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/* TO-DO */ |
|
|
|
|
FT_LOCAL_DEF( FT_Error ) |
|
|
|
|
vf_read_info( FT_Stream stream, |
|
|
|
|
FT_Memory extmemory, |
|
|
|
|
VF vf) |
|
|
|
|
{ |
|
|
|
|
FT_Byte id, a, l; |
|
|
|
|
FT_ULong k, c, s, d; |
|
|
|
|
VF_SUBFONT sf, sf0, sf_next; |
|
|
|
|
struct s_vf_subfont subfont; |
|
|
|
|
FT_ULong scale; |
|
|
|
|
FT_Int fid, name_len, i; |
|
|
|
|
FT_Char subfont_name[1024]; |
|
|
|
|
FT_Error error = FT_Err_Ok; |
|
|
|
|
|
|
|
|
|
if( READ_UINT1( stream ) != VFINST_PRE ) |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
id = READ_UINT1( stream ); |
|
|
|
|
|
|
|
|
|
switch (id) |
|
|
|
|
{ |
|
|
|
|
case VFINST_ID_BYTE: |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
k = READ_UINT1( stream ); |
|
|
|
|
if ( FT_STREAM_SKIP( k ) ) |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
vf->cs = READ_UINT4( stream ); |
|
|
|
|
vf->ds = READ_UINT4( stream ); |
|
|
|
|
|
|
|
|
|
if ((vf->cs != vf->tfm->cs) || (vf->ds != vf->tfm->ds)) |
|
|
|
|
{ |
|
|
|
|
error = FT_THROW( Unknown_File_Format ); |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
vf->design_size = (FT_ULong)(vf->ds)/(FT_ULong)(1<<20); |
|
|
|
|
vf->subfonts_opened = 1; |
|
|
|
|
vf->default_subfont = -1; |
|
|
|
|
|
|
|
|
|
subfont.next = NULL; |
|
|
|
|
|
|
|
|
|
for ( sf0 = &subfont ; ; sf0 = sf ) |
|
|
|
|
{ |
|
|
|
|
if( FT_ALLOC( sf, sizeof(struct s_vf_subfont) ) ) |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
sf0->next = sf; |
|
|
|
|
switch ( READ_UINT1( stream ) ) |
|
|
|
|
{ |
|
|
|
|
default: |
|
|
|
|
vf->offs_char_packet = stream->pos - 1; |
|
|
|
|
sf0->next = NULL; |
|
|
|
|
FT_FREE( sf ); |
|
|
|
|
goto end_fontdef; |
|
|
|
|
case VFINST_FNTDEF1: |
|
|
|
|
k = (FT_ULong)READ_UINT1( stream ); |
|
|
|
|
c = READ_UINT4( stream ); s = READ_UINT4( stream ); d = READ_UINT4( stream ); |
|
|
|
|
a = READ_UINT1( stream ); l = READ_UINT1( stream ); |
|
|
|
|
break; |
|
|
|
|
case VFINST_FNTDEF2: |
|
|
|
|
k = (FT_ULong)READ_UINT2( stream ); |
|
|
|
|
c = READ_UINT4( stream ); s = READ_UINT4( stream ); d = READ_UINT4( stream ); |
|
|
|
|
a = READ_UINT1( stream ); l = READ_UINT1( stream ); |
|
|
|
|
break; |
|
|
|
|
case VFINST_FNTDEF3: |
|
|
|
|
k = (FT_ULong)READ_UINT3( stream ); |
|
|
|
|
c = READ_UINT4( stream ); s = READ_UINT4( stream ); d = READ_UINT4( stream ); |
|
|
|
|
a = READ_UINT1( stream ); l = READ_UINT1( stream ); |
|
|
|
|
break; |
|
|
|
|
case VFINST_FNTDEF4: |
|
|
|
|
k = (FT_ULong)READ_UINT4( stream ); |
|
|
|
|
c = READ_UINT4( stream ); s = READ_UINT4( stream ); d = READ_UINT4( stream ); |
|
|
|
|
a = READ_UINT1( stream ); l = READ_UINT1( stream ); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
name_len = a + l; |
|
|
|
|
sf->k = k; |
|
|
|
|
sf->s = s; |
|
|
|
|
sf->d = d; |
|
|
|
|
sf->a = a; |
|
|
|
|
sf->l = l; |
|
|
|
|
sf->next = NULL; |
|
|
|
|
|
|
|
|
|
scale = (FT_ULong)sf->s/(FT_ULong)(1<<20); |
|
|
|
|
|
|
|
|
|
if ((sf->n = (char*)malloc(name_len + 1)) == NULL) |
|
|
|
|
{ |
|
|
|
|
goto Exit; |
|
|
|
|
} |
|
|
|
|
for (i = 0; i < name_len; i++) |
|
|
|
|
sf->n[i] = (char)READ_UINT1( stream ); |
|
|
|
|
sf->n[i] = '\0'; |
|
|
|
|
|
|
|
|
|
/* sprintf(subfont_name, "%s", &sf->n[sf->a]);
|
|
|
|
|
|
|
|
|
|
if (vf_debug('s')) |
|
|
|
|
{ |
|
|
|
|
printf("VFlib Virtual Font: subfont %d: %s, scaled %f\n", |
|
|
|
|
(int)sf->k, subfont_name, scale); |
|
|
|
|
} |
|
|
|
|
*/ /* To add tracing*/ |
|
|
|
|
|
|
|
|
|
end_fontdef: |
|
|
|
|
if (vf->subfonts_opened == 0) |
|
|
|
|
{ |
|
|
|
|
/*
|
|
|
|
|
if (open_style == TEX_OPEN_STYLE_REQUIRE) |
|
|
|
|
{ |
|
|
|
|
if (vf_debug('s')) |
|
|
|
|
printf("VFlib Virtual Font: all subfonts are required but failed\n"); |
|
|
|
|
goto error_exit; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (vf_debug('s')) |
|
|
|
|
printf("VFlib Virtual Font: not all fonts are opened; continue.\n"); |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
vf->subfonts = subfont.next; |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
Exit: |
|
|
|
|
for (sf = subfont.next; sf != NULL; sf = sf_next) |
|
|
|
|
{ |
|
|
|
|
sf_next = sf->next; |
|
|
|
|
FT_FREE(sf->n); |
|
|
|
|
FT_FREE(sf); |
|
|
|
|
} |
|
|
|
|
vf->subfonts = NULL; |
|
|
|
|
return error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
|
* |
|
|
|
|
* DVI stack utility functions. |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
FT_Int |
|
|
|
|
vf_dvi_stack_init(VF vf, VF_DVI_STACK stack, FT_Memory memory) |
|
|
|
|
{ |
|
|
|
|
VF_DVI_STACK top; |
|
|
|
|
if( FT_ALLOC( top, sizeof(struct s_vf_dvi_stack) ) ) |
|
|
|
|
return 0; |
|
|
|
|
top->h = top->v = top->w = top->x = top->y = top->z = 0; |
|
|
|
|
top->f = vf->default_subfont; |
|
|
|
|
top->font_id = vf->subfonts->font_id; |
|
|
|
|
top->next = NULL; |
|
|
|
|
stack->next = top; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FT_Int |
|
|
|
|
vf_dvi_stack_deinit(VF vf, VF_DVI_STACK stack, FT_Memory memory) |
|
|
|
|
{ |
|
|
|
|
VF_DVI_STACK elem, elem_next; |
|
|
|
|
elem = stack->next; |
|
|
|
|
while (elem != NULL) |
|
|
|
|
{ |
|
|
|
|
elem_next = elem->next; |
|
|
|
|
FT_FREE(elem); |
|
|
|
|
elem = elem_next; |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FT_Int |
|
|
|
|
vf_dvi_stack_push(VF vf, VF_DVI_STACK stack) |
|
|
|
|
{ |
|
|
|
|
VF_DVI_STACK new_elem, top; |
|
|
|
|
if( FT_ALLOC( new_elem, sizeof(struct s_vf_dvi_stack) ) ) |
|
|
|
|
return 0; |
|
|
|
|
top = stack->next; |
|
|
|
|
new_elem->h = top->h; |
|
|
|
|
new_elem->v = top->v; |
|
|
|
|
new_elem->w = top->w; |
|
|
|
|
new_elem->x = top->x; |
|
|
|
|
new_elem->y = top->y; |
|
|
|
|
new_elem->z = top->z; |
|
|
|
|
new_elem->f = top->f; |
|
|
|
|
new_elem->font_id = top->font_id; |
|
|
|
|
new_elem->next = top; |
|
|
|
|
stack->next = new_elem; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FT_Int |
|
|
|
|
vf_dvi_stack_pop(VF vf, VF_DVI_STACK stack, FT_Memory memory) |
|
|
|
|
{ |
|
|
|
|
VF_DVI_STACK top; |
|
|
|
|
|
|
|
|
|
top = stack->next; |
|
|
|
|
if (top == NULL) |
|
|
|
|
{ |
|
|
|
|
/*Add trace and error message here*/ |
|
|
|
|
/* fprintf(stderr, "VFlib warning: VF DVI stack under flow: %s\n",
|
|
|
|
|
vf->vf_path);*/ |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
stack->next = top->next; |
|
|
|
|
FT_FREE(top); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
|
* |
|
|
|
|
* DVI interpreter. |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/* END */ |
|
|
|
|