forked from minhngoc25a/freetype2
[vf] Add `vf' utility and `dvi' stack functions.
* src/vf/vflib.c: Add `vf_dv_stack' utility functions and `vf_read_info' function.
This commit is contained in:
parent
b9b1f22afe
commit
7305227c8c
|
@ -20,7 +20,7 @@
|
|||
|
||||
#include <ft2build.h>
|
||||
|
||||
#include "vflib.c"
|
||||
/* #include "vflib.c" */
|
||||
#include "vfdrivr.c"
|
||||
|
||||
|
||||
|
|
220
src/vf/vflib.c
220
src/vf/vflib.c
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue