Formatting; adding file headers.
This commit is contained in:
parent
fe2ad2d755
commit
ad46b8892f
41
ChangeLog
41
ChangeLog
|
@ -7,21 +7,38 @@
|
|||
|
||||
2002-10-05 David Turner <david@freetype.org>
|
||||
|
||||
* src/pfr/pfrsbit.h, src/pfr/pfrsbit.c, src/pfr/pfrload.c,
|
||||
src/pfr/pfrgload.c, src/pfr/pfrobjs.c, src/pfr/pfrtypes.h,
|
||||
Jamfile, src/base/ftobjs.c: adding support for embedded bitmaps to
|
||||
the PFR driver, and rewriting its kerning loader / handler to use all
|
||||
kerning pairs in a physical font (and not just the first item).
|
||||
Adding support for embedded bitmaps to the PFR driver, and rewriting
|
||||
its kerning loader/handler to use all kerning pairs in a physical
|
||||
font (and not just the first item).
|
||||
|
||||
* src/tools/docmaker/content.py, src/tools/docmaker/sources.py,
|
||||
src/tools/docmaker/tohtml.py: fixing a few nasty bugs
|
||||
* src/pfr/pfr.c: Include `pfrsbit.c'.
|
||||
* src/pfr/pfrgload.c: Include `pfrsbit.h'.
|
||||
* src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): Rewritten.
|
||||
(pfr_phy_font_done, pfr_phy_font_load): Updated.
|
||||
* src/pfr/pfrobks.c: Include `pfrsbit.h'.
|
||||
(pfr_face_init): Handle kerning and embedded bitmaps.
|
||||
(pfr_slot_load): Load embedded bitmaps.
|
||||
(PFR_KERN_INDEX): Removed.
|
||||
(pfr_face_get_kerning): Rewritten.
|
||||
* src/pfr/pfrsbit.c, src/pfr/pfrsbit.h: New files.
|
||||
* src/pfr/pfrtypes.h (PFR_KernItemRec): New structure.
|
||||
(PFR_KERN_INDEX): New macro.
|
||||
(PFR_PhyFontRec): Add items for kerning and embedded bitmaps.
|
||||
* src/pfr/Jamfile (_sources) [FT2_MULTI]: Add `pfrsbit'.
|
||||
|
||||
* src/sfnt/ttcmap0.c: the validator for format 4 sub-tables is
|
||||
now capable of dealing with invalid "length" fields at the start
|
||||
of the sub-table. This allows fonts like "mg______.ttf" (i.e.
|
||||
Marriage) to return accurate charmaps.
|
||||
* src/base/ftobjs.c (FT_Load_Glyph): Don't load bitmap fonts if
|
||||
FT_LOAD_NO_RECURSE is set.
|
||||
Load embedded bitmaps only if FT_LOAD_NO_BITMAP isn't set.
|
||||
|
||||
* docs/CHANGES: updating
|
||||
* src/tools/docmaker/content.py, src/tools/docmaker/sources.py,
|
||||
src/tools/docmaker/tohtml.py: Fixing a few nasty bugs.
|
||||
|
||||
* src/sfnt/ttcmap0.c (tt_cmap4_validate): The validator for format 4
|
||||
sub-tables is now capable of dealing with invalid "length" fields at
|
||||
the start of the sub-table. This allows fonts like "mg______.ttf"
|
||||
(i.e. Marriage) to return accurate charmaps.
|
||||
|
||||
* docs/CHANGES: Updated.
|
||||
|
||||
2002-10-05 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
|
|
|
@ -72,9 +72,9 @@ LATEST CHANGES BETWEEN 2.1.3 and 2.1.2
|
|||
has been updated to support LCD-optimized display on non-paletted
|
||||
displays (under Win32 and X11)
|
||||
|
||||
- the PFR driver now supports embedded bitmaps (all formats supported)
|
||||
- The PFR driver now supports embedded bitmaps (all formats supported).
|
||||
|
||||
- the TrueType charmap loader now supports certain "broken" fonts that
|
||||
- The TrueType charmap loader now supports certain "broken" fonts that
|
||||
load under Windows without problems.
|
||||
|
||||
- The cache API has been slightly modified (it's still a beta!):
|
||||
|
|
|
@ -467,7 +467,7 @@
|
|||
/* XXX: This is really a temporary hack that should disappear */
|
||||
/* promptly with FreeType 2.1! */
|
||||
/* */
|
||||
if ( FT_HAS_FIXED_SIZES( face ) &&
|
||||
if ( FT_HAS_FIXED_SIZES( face ) &&
|
||||
( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
|
||||
{
|
||||
error = driver->clazz->load_glyph( slot, face->size,
|
||||
|
|
|
@ -44,3 +44,6 @@ FT_END_HEADER
|
|||
|
||||
|
||||
#endif /* __PFRGLOAD_H__ */
|
||||
|
||||
|
||||
/* END */
|
||||
|
|
|
@ -501,8 +501,8 @@
|
|||
}
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
|
||||
/* load kerning pair data */
|
||||
FT_CALLBACK_DEF( FT_Error )
|
||||
pfr_extra_item_load_kerning_pairs( FT_Byte* p,
|
||||
|
@ -582,7 +582,9 @@
|
|||
"invalid kerning pairs table\n" ));
|
||||
goto Exit;
|
||||
}
|
||||
#else
|
||||
|
||||
#else /* 0 */
|
||||
|
||||
/* load kerning pair data */
|
||||
FT_CALLBACK_DEF( FT_Error )
|
||||
pfr_extra_item_load_kerning_pairs( FT_Byte* p,
|
||||
|
@ -593,6 +595,7 @@
|
|||
FT_Error error = 0;
|
||||
FT_Memory memory = phy_font->memory;
|
||||
|
||||
|
||||
FT_TRACE2(( "pfr_extra_item_load_kerning_pairs()\n" ));
|
||||
|
||||
if ( FT_NEW( item ) )
|
||||
|
@ -624,33 +627,34 @@
|
|||
FT_UInt char1, char2;
|
||||
FT_Byte* q;
|
||||
|
||||
|
||||
if ( item->flags & PFR_KERN_2BYTE_CHAR )
|
||||
{
|
||||
q = p;
|
||||
char1 = PFR_NEXT_USHORT(q);
|
||||
char2 = PFR_NEXT_USHORT(q);
|
||||
char1 = PFR_NEXT_USHORT( q );
|
||||
char2 = PFR_NEXT_USHORT( q );
|
||||
|
||||
item->pair1 = PFR_KERN_INDEX(char1,char2);
|
||||
item->pair1 = PFR_KERN_INDEX( char1, char2 );
|
||||
|
||||
q = p + item->pair_size*(item->pair_count-1);
|
||||
char1 = PFR_NEXT_USHORT(q);
|
||||
char2 = PFR_NEXT_USHORT(q);
|
||||
q = p + item->pair_size * ( item->pair_count - 1 );
|
||||
char1 = PFR_NEXT_USHORT( q );
|
||||
char2 = PFR_NEXT_USHORT( q );
|
||||
|
||||
item->pair2 = PFR_KERN_INDEX(char1,char2);
|
||||
item->pair2 = PFR_KERN_INDEX( char1, char2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
q = p;
|
||||
char1 = PFR_NEXT_BYTE(q);
|
||||
char2 = PFR_NEXT_BYTE(q);
|
||||
char1 = PFR_NEXT_BYTE( q );
|
||||
char2 = PFR_NEXT_BYTE( q );
|
||||
|
||||
item->pair1 = PFR_KERN_INDEX(char1,char2);
|
||||
item->pair1 = PFR_KERN_INDEX( char1, char2 );
|
||||
|
||||
q = p + item->pair_size*(item->pair_count-1);
|
||||
char1 = PFR_NEXT_BYTE(q);
|
||||
char2 = PFR_NEXT_BYTE(q);
|
||||
q = p + item->pair_size * ( item->pair_count - 1 );
|
||||
char1 = PFR_NEXT_BYTE( q );
|
||||
char2 = PFR_NEXT_BYTE( q );
|
||||
|
||||
item->pair2 = PFR_KERN_INDEX(char1,char2);
|
||||
item->pair2 = PFR_KERN_INDEX( char1, char2 );
|
||||
}
|
||||
|
||||
/* add new item to the current list */
|
||||
|
@ -661,7 +665,7 @@
|
|||
}
|
||||
else
|
||||
{
|
||||
/* empty item !! */
|
||||
/* empty item! */
|
||||
FT_FREE( item );
|
||||
}
|
||||
|
||||
|
@ -676,7 +680,8 @@
|
|||
"invalid kerning pairs table\n" ));
|
||||
goto Exit;
|
||||
}
|
||||
#endif
|
||||
#endif /* 0 */
|
||||
|
||||
|
||||
static const PFR_ExtraItemRec pfr_phy_font_extra_items[] =
|
||||
{
|
||||
|
@ -715,8 +720,9 @@
|
|||
{
|
||||
PFR_KernItem item, next;
|
||||
|
||||
|
||||
item = phy_font->kern_items;
|
||||
while (item)
|
||||
while ( item )
|
||||
{
|
||||
next = item->next;
|
||||
FT_FREE( item );
|
||||
|
@ -725,6 +731,7 @@
|
|||
phy_font->kern_items = NULL;
|
||||
phy_font->kern_items_tail = NULL;
|
||||
}
|
||||
|
||||
phy_font->num_kern_pairs = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -248,7 +248,7 @@
|
|||
FT_ASSERT( gindex < face->phy_font.num_chars );
|
||||
|
||||
/* try to load an embedded bitmap */
|
||||
if ( (load_flags & (FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP)) == 0 )
|
||||
if ( ( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP ) ) == 0 )
|
||||
{
|
||||
error = pfr_slot_load_bitmap( slot, size, gindex );
|
||||
if ( error == 0 )
|
||||
|
@ -356,6 +356,7 @@
|
|||
sure */
|
||||
|
||||
#if 0
|
||||
|
||||
/* find the kerning for a given glyph pair */
|
||||
FT_LOCAL_DEF( FT_Error )
|
||||
pfr_face_get_kerning( PFR_Face face,
|
||||
|
@ -398,7 +399,9 @@
|
|||
Exit:
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
||||
#else /* 0 */
|
||||
|
||||
/* find the kerning for a given glyph pair */
|
||||
FT_LOCAL_DEF( FT_Error )
|
||||
pfr_face_get_kerning( PFR_Face face,
|
||||
|
@ -411,6 +414,7 @@
|
|||
PFR_KernItem item = phy_font->kern_items;
|
||||
FT_UInt32 idx = PFR_KERN_INDEX( glyph1, glyph2 );
|
||||
|
||||
|
||||
kerning->x = 0;
|
||||
kerning->y = 0;
|
||||
|
||||
|
@ -433,6 +437,7 @@
|
|||
FT_Stream stream = face->root.stream;
|
||||
FT_Byte* p;
|
||||
|
||||
|
||||
if ( FT_STREAM_SEEK( item->offset ) ||
|
||||
FT_FRAME_ENTER( item->pair_count * item->pair_size ) )
|
||||
goto Exit;
|
||||
|
@ -443,32 +448,33 @@
|
|||
{
|
||||
FT_UInt char1, char2, charcode;
|
||||
|
||||
mid = (min + max) >> 1;
|
||||
|
||||
mid = ( min + max ) >> 1;
|
||||
p = stream->cursor + mid*item->pair_size;
|
||||
|
||||
if ( item->flags & PFR_KERN_2BYTE_CHAR )
|
||||
{
|
||||
char1 = FT_NEXT_USHORT(p);
|
||||
char2 = FT_NEXT_USHORT(p);
|
||||
char1 = FT_NEXT_USHORT( p );
|
||||
char2 = FT_NEXT_USHORT( p );
|
||||
}
|
||||
else
|
||||
{
|
||||
char1 = FT_NEXT_USHORT(p);
|
||||
char2 = FT_NEXT_USHORT(p);
|
||||
char1 = FT_NEXT_USHORT( p );
|
||||
char2 = FT_NEXT_USHORT( p );
|
||||
}
|
||||
charcode = PFR_KERN_INDEX(char1,char2);
|
||||
charcode = PFR_KERN_INDEX( char1, char2 );
|
||||
|
||||
if ( idx == charcode )
|
||||
{
|
||||
if ( item->flags & PFR_KERN_2BYTE_ADJ )
|
||||
kerning->x = item->base_adj + FT_NEXT_SHORT(p);
|
||||
kerning->x = item->base_adj + FT_NEXT_SHORT( p );
|
||||
else
|
||||
kerning->x = item->base_adj + FT_NEXT_CHAR(p);
|
||||
kerning->x = item->base_adj + FT_NEXT_CHAR( p );
|
||||
|
||||
break;
|
||||
}
|
||||
if ( idx > charcode )
|
||||
min = mid+1;
|
||||
min = mid + 1;
|
||||
else
|
||||
max = mid;
|
||||
}
|
||||
|
|
|
@ -91,3 +91,6 @@ FT_BEGIN_HEADER
|
|||
FT_END_HEADER
|
||||
|
||||
#endif /* __PFROBJS_H__ */
|
||||
|
||||
|
||||
/* END */
|
||||
|
|
|
@ -1,3 +1,21 @@
|
|||
/***************************************************************************/
|
||||
/* */
|
||||
/* pfrsbit.c */
|
||||
/* */
|
||||
/* FreeType PFR bitmap loader (body). */
|
||||
/* */
|
||||
/* Copyright 2002 by */
|
||||
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||
/* */
|
||||
/* This file is part of the FreeType project, and may only be used, */
|
||||
/* modified, and distributed under the terms of the FreeType project */
|
||||
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
|
||||
/* this file you indicate that you have read the license and */
|
||||
/* understand and accept it fully. */
|
||||
/* */
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
#include "pfrsbit.h"
|
||||
#include "pfrload.h"
|
||||
#include FT_INTERNAL_DEBUG_H
|
||||
|
@ -8,6 +26,7 @@
|
|||
#undef FT_COMPONENT
|
||||
#define FT_COMPONENT trace_pfr
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
/***** *****/
|
||||
|
@ -16,7 +35,7 @@
|
|||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
typedef struct PFR_BitWriter_
|
||||
typedef struct PFR_BitWriter_
|
||||
{
|
||||
FT_Byte* line; /* current line start */
|
||||
FT_Int pitch; /* line size in bytes */
|
||||
|
@ -58,7 +77,8 @@
|
|||
FT_UInt val = 0;
|
||||
FT_UInt c = 0;
|
||||
|
||||
n = (FT_Int)(limit - p)*8;
|
||||
|
||||
n = (FT_Int)( limit - p ) * 8;
|
||||
if ( n > writer->total )
|
||||
n = writer->total;
|
||||
|
||||
|
@ -66,7 +86,7 @@
|
|||
|
||||
for ( ; n > 0; n-- )
|
||||
{
|
||||
if ( (n & 7) == reload )
|
||||
if ( ( n & 7 ) == reload )
|
||||
val = *p++;
|
||||
|
||||
if ( val & 0x80 )
|
||||
|
@ -77,7 +97,7 @@
|
|||
|
||||
if ( --left <= 0 )
|
||||
{
|
||||
cur[0] = (FT_Byte) c;
|
||||
cur[0] = (FT_Byte)c;
|
||||
left = writer->width;
|
||||
mask = 0x80;
|
||||
|
||||
|
@ -110,6 +130,7 @@
|
|||
FT_UInt mask = 0x80;
|
||||
FT_UInt c = 0;
|
||||
|
||||
|
||||
n = writer->total;
|
||||
|
||||
phase = 1;
|
||||
|
@ -128,12 +149,13 @@
|
|||
{
|
||||
FT_Int v;
|
||||
|
||||
|
||||
if ( p >= limit )
|
||||
break;
|
||||
|
||||
v = *p++;
|
||||
counts[0] = (v >> 4);
|
||||
counts[1] = (v & 15);
|
||||
counts[0] = v >> 4;
|
||||
counts[1] = v & 15;
|
||||
phase = 0;
|
||||
count = counts[0];
|
||||
}
|
||||
|
@ -142,8 +164,8 @@
|
|||
phase = 1;
|
||||
count = counts[1];
|
||||
}
|
||||
}
|
||||
while ( count == 0 );
|
||||
|
||||
} while ( count == 0 );
|
||||
}
|
||||
|
||||
if ( phase )
|
||||
|
@ -188,11 +210,12 @@
|
|||
FT_UInt mask = 0x80;
|
||||
FT_UInt c = 0;
|
||||
|
||||
|
||||
n = writer->total;
|
||||
|
||||
phase = 1;
|
||||
count = 0;
|
||||
reload = 1;
|
||||
phase = 1;
|
||||
count = 0;
|
||||
reload = 1;
|
||||
|
||||
for ( ; n > 0; n-- )
|
||||
{
|
||||
|
@ -205,8 +228,8 @@
|
|||
|
||||
count = *p++;
|
||||
phase = phase ^ 1;
|
||||
}
|
||||
while ( count == 0 );
|
||||
|
||||
} while ( count == 0 );
|
||||
}
|
||||
|
||||
if ( phase )
|
||||
|
@ -249,40 +272,44 @@
|
|||
/*************************************************************************/
|
||||
|
||||
static void
|
||||
pfr_lookup_bitmap_data( FT_Byte* base,
|
||||
FT_Byte* limit,
|
||||
FT_Int count,
|
||||
FT_Byte flags,
|
||||
FT_UInt char_code,
|
||||
FT_ULong* found_offset,
|
||||
FT_ULong* found_size )
|
||||
pfr_lookup_bitmap_data( FT_Byte* base,
|
||||
FT_Byte* limit,
|
||||
FT_Int count,
|
||||
FT_Byte flags,
|
||||
FT_UInt char_code,
|
||||
FT_ULong* found_offset,
|
||||
FT_ULong* found_size )
|
||||
{
|
||||
FT_UInt left, right, char_len;
|
||||
FT_Bool two = (flags & 1);
|
||||
FT_Byte* buff;
|
||||
FT_UInt left, right, char_len;
|
||||
FT_Bool two = flags & 1;
|
||||
FT_Byte* buff;
|
||||
|
||||
|
||||
char_len = 4;
|
||||
if ( two ) char_len += 1;
|
||||
if ( flags & 2) char_len += 1;
|
||||
if ( flags & 4) char_len += 1;
|
||||
if ( two ) char_len += 1;
|
||||
if ( flags & 2 ) char_len += 1;
|
||||
if ( flags & 4 ) char_len += 1;
|
||||
|
||||
left = 0;
|
||||
right = count;
|
||||
left = 0;
|
||||
right = count;
|
||||
|
||||
while ( left < right )
|
||||
{
|
||||
FT_UInt middle, code;
|
||||
|
||||
middle = (left + right) >> 1;
|
||||
buff = base + middle*char_len;
|
||||
|
||||
/* check that we're not outside of the table */
|
||||
/* this is possible with broken fonts... */
|
||||
middle = ( left + right ) >> 1;
|
||||
buff = base + middle * char_len;
|
||||
|
||||
/* check that we are not outside of the table -- */
|
||||
/* this is possible with broken fonts... */
|
||||
if ( buff + char_len > limit )
|
||||
goto Fail;
|
||||
|
||||
if (two) code = PFR_NEXT_USHORT(buff);
|
||||
else code = PFR_NEXT_BYTE(buff);
|
||||
if ( two )
|
||||
code = PFR_NEXT_USHORT( buff );
|
||||
else
|
||||
code = PFR_NEXT_BYTE( buff );
|
||||
|
||||
if ( code == char_code )
|
||||
goto Found_It;
|
||||
|
@ -300,37 +327,42 @@
|
|||
return;
|
||||
|
||||
Found_It:
|
||||
if (flags & 2) *found_size = PFR_NEXT_USHORT(buff);
|
||||
else *found_size = PFR_NEXT_BYTE(buff);
|
||||
if ( flags & 2 )
|
||||
*found_size = PFR_NEXT_USHORT( buff );
|
||||
else
|
||||
*found_size = PFR_NEXT_BYTE( buff );
|
||||
|
||||
if (flags & 4) *found_offset = PFR_NEXT_ULONG(buff);
|
||||
else *found_offset = PFR_NEXT_USHORT(buff);
|
||||
if ( flags & 4 )
|
||||
*found_offset = PFR_NEXT_ULONG( buff );
|
||||
else
|
||||
*found_offset = PFR_NEXT_USHORT( buff );
|
||||
}
|
||||
|
||||
|
||||
/* load bitmap metrics. "*padvance" must be set to the default value */
|
||||
/* before calling this function... */
|
||||
/* */
|
||||
/* load bitmap metrics. "*padvance" must be set to the default value */
|
||||
/* before calling this function... */
|
||||
/* */
|
||||
static FT_Error
|
||||
pfr_load_bitmap_metrics( FT_Byte** pdata,
|
||||
FT_Byte* limit,
|
||||
FT_Long scaled_advance,
|
||||
FT_Long *axpos,
|
||||
FT_Long *aypos,
|
||||
FT_UInt *axsize,
|
||||
FT_UInt *aysize,
|
||||
FT_Long *aadvance,
|
||||
FT_UInt *aformat )
|
||||
pfr_load_bitmap_metrics( FT_Byte** pdata,
|
||||
FT_Byte* limit,
|
||||
FT_Long scaled_advance,
|
||||
FT_Long *axpos,
|
||||
FT_Long *aypos,
|
||||
FT_UInt *axsize,
|
||||
FT_UInt *aysize,
|
||||
FT_Long *aadvance,
|
||||
FT_UInt *aformat )
|
||||
{
|
||||
FT_Error error = 0;
|
||||
FT_Byte flags;
|
||||
FT_Char b;
|
||||
FT_Byte* p = *pdata;
|
||||
FT_Long xpos, ypos, advance;
|
||||
FT_UInt xsize, ysize;
|
||||
FT_Byte flags;
|
||||
FT_Char b;
|
||||
FT_Byte* p = *pdata;
|
||||
FT_Long xpos, ypos, advance;
|
||||
FT_UInt xsize, ysize;
|
||||
|
||||
PFR_CHECK(1);
|
||||
flags = PFR_NEXT_BYTE(p);
|
||||
|
||||
PFR_CHECK( 1 );
|
||||
flags = PFR_NEXT_BYTE( p );
|
||||
|
||||
xpos = 0;
|
||||
ypos = 0;
|
||||
|
@ -338,93 +370,93 @@
|
|||
ysize = 0;
|
||||
advance = 0;
|
||||
|
||||
switch (flags & 3)
|
||||
switch ( flags & 3 )
|
||||
{
|
||||
case 0:
|
||||
PFR_CHECK(1);
|
||||
b = PFR_NEXT_INT8(p);
|
||||
xpos = b >> 4;
|
||||
ypos = ((FT_Char)(b << 4)) >> 4;
|
||||
break;
|
||||
case 0:
|
||||
PFR_CHECK( 1 );
|
||||
b = PFR_NEXT_INT8( p );
|
||||
xpos = b >> 4;
|
||||
ypos = ( (FT_Char)( b << 4 ) ) >> 4;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
PFR_CHECK(2);
|
||||
xpos = PFR_NEXT_INT8(p);
|
||||
ypos = PFR_NEXT_INT8(p);
|
||||
break;
|
||||
case 1:
|
||||
PFR_CHECK( 2 );
|
||||
xpos = PFR_NEXT_INT8( p );
|
||||
ypos = PFR_NEXT_INT8( p );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
PFR_CHECK(4);
|
||||
xpos = PFR_NEXT_SHORT(p);
|
||||
ypos = PFR_NEXT_SHORT(p);
|
||||
break;
|
||||
case 2:
|
||||
PFR_CHECK( 4 );
|
||||
xpos = PFR_NEXT_SHORT( p );
|
||||
ypos = PFR_NEXT_SHORT( p );
|
||||
break;
|
||||
|
||||
case 3:
|
||||
PFR_CHECK(6);
|
||||
xpos = PFR_NEXT_LONG(p);
|
||||
ypos = PFR_NEXT_LONG(p);
|
||||
break;
|
||||
case 3:
|
||||
PFR_CHECK( 6 );
|
||||
xpos = PFR_NEXT_LONG( p );
|
||||
ypos = PFR_NEXT_LONG( p );
|
||||
break;
|
||||
|
||||
default:
|
||||
;
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
||||
flags >>= 2;
|
||||
switch (flags & 3)
|
||||
switch ( flags & 3 )
|
||||
{
|
||||
case 0:
|
||||
/* blank image */
|
||||
xsize = 0;
|
||||
ysize = 0;
|
||||
break;
|
||||
case 0:
|
||||
/* blank image */
|
||||
xsize = 0;
|
||||
ysize = 0;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
PFR_CHECK(1);
|
||||
b = PFR_NEXT_BYTE(p);
|
||||
xsize = (b >> 4) & 0xF;
|
||||
ysize = b & 0xF;
|
||||
break;
|
||||
case 1:
|
||||
PFR_CHECK( 1 );
|
||||
b = PFR_NEXT_BYTE( p );
|
||||
xsize = ( b >> 4 ) & 0xF;
|
||||
ysize = b & 0xF;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
PFR_CHECK(2);
|
||||
xsize = PFR_NEXT_BYTE(p);
|
||||
ysize = PFR_NEXT_BYTE(p);
|
||||
break;
|
||||
case 2:
|
||||
PFR_CHECK( 2 );
|
||||
xsize = PFR_NEXT_BYTE( p );
|
||||
ysize = PFR_NEXT_BYTE( p );
|
||||
break;
|
||||
|
||||
case 3:
|
||||
PFR_CHECK(4);
|
||||
xsize = PFR_NEXT_USHORT(p);
|
||||
ysize = PFR_NEXT_USHORT(p);
|
||||
break;
|
||||
case 3:
|
||||
PFR_CHECK( 4 );
|
||||
xsize = PFR_NEXT_USHORT( p );
|
||||
ysize = PFR_NEXT_USHORT( p );
|
||||
break;
|
||||
|
||||
default:
|
||||
;
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
||||
flags >>= 2;
|
||||
switch (flags & 3)
|
||||
switch ( flags & 3 )
|
||||
{
|
||||
case 0:
|
||||
advance = scaled_advance;
|
||||
break;
|
||||
case 0:
|
||||
advance = scaled_advance;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
PFR_CHECK(1);
|
||||
advance = PFR_NEXT_INT8(p) << 8;
|
||||
break;
|
||||
case 1:
|
||||
PFR_CHECK( 1 );
|
||||
advance = PFR_NEXT_INT8( p ) << 8;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
PFR_CHECK(2);
|
||||
advance = PFR_NEXT_SHORT(p);
|
||||
break;
|
||||
case 2:
|
||||
PFR_CHECK( 2 );
|
||||
advance = PFR_NEXT_SHORT( p );
|
||||
break;
|
||||
|
||||
case 3:
|
||||
PFR_CHECK(3);
|
||||
advance = PFR_NEXT_LONG(p);
|
||||
break;
|
||||
case 3:
|
||||
PFR_CHECK( 3 );
|
||||
advance = PFR_NEXT_LONG( p );
|
||||
break;
|
||||
|
||||
default:
|
||||
;
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
||||
*axpos = xpos;
|
||||
|
@ -446,36 +478,37 @@
|
|||
|
||||
|
||||
static FT_Error
|
||||
pfr_load_bitmap_bits( FT_Byte* p,
|
||||
FT_Byte* limit,
|
||||
FT_UInt format,
|
||||
FT_UInt decreasing,
|
||||
FT_Bitmap* target )
|
||||
pfr_load_bitmap_bits( FT_Byte* p,
|
||||
FT_Byte* limit,
|
||||
FT_UInt format,
|
||||
FT_UInt decreasing,
|
||||
FT_Bitmap* target )
|
||||
{
|
||||
FT_Error error = 0;
|
||||
PFR_BitWriterRec writer;
|
||||
|
||||
|
||||
if ( target->rows > 0 && target->width > 0 )
|
||||
{
|
||||
pfr_bitwriter_init( &writer, target, decreasing );
|
||||
|
||||
switch (format)
|
||||
switch ( format )
|
||||
{
|
||||
case 0: /* packed bits */
|
||||
pfr_bitwriter_decode_bytes( &writer, p, limit );
|
||||
break;
|
||||
case 0: /* packed bits */
|
||||
pfr_bitwriter_decode_bytes( &writer, p, limit );
|
||||
break;
|
||||
|
||||
case 1: /* RLE1 */
|
||||
pfr_bitwriter_decode_rle1( &writer, p, limit );
|
||||
break;
|
||||
case 1: /* RLE1 */
|
||||
pfr_bitwriter_decode_rle1( &writer, p, limit );
|
||||
break;
|
||||
|
||||
case 2: /* RLE2 */
|
||||
pfr_bitwriter_decode_rle2( &writer, p, limit );
|
||||
break;
|
||||
case 2: /* RLE2 */
|
||||
pfr_bitwriter_decode_rle2( &writer, p, limit );
|
||||
break;
|
||||
|
||||
default:
|
||||
FT_ERROR(( "pfr_read_bitmap_data: invalid image type\n" ));
|
||||
error = FT_Err_Invalid_File_Format;
|
||||
default:
|
||||
FT_ERROR(( "pfr_read_bitmap_data: invalid image type\n" ));
|
||||
error = FT_Err_Invalid_File_Format;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -505,22 +538,24 @@
|
|||
PFR_Char character;
|
||||
PFR_Strike strike;
|
||||
|
||||
|
||||
character = &phys->chars[glyph_index];
|
||||
|
||||
/* Look-up a bitmap strike corresponding to the current */
|
||||
/* character dimensions */
|
||||
|
||||
{
|
||||
FT_UInt n;
|
||||
FT_UInt n;
|
||||
|
||||
|
||||
strike = phys->strikes;
|
||||
for ( n = 0; n < phys->num_strikes; n++ )
|
||||
{
|
||||
if ( strike->x_ppm == (FT_UInt) size->root.metrics.x_ppem &&
|
||||
strike->y_ppm == (FT_UInt) size->root.metrics.y_ppem )
|
||||
if ( strike->x_ppm == (FT_UInt)size->root.metrics.x_ppem &&
|
||||
strike->y_ppm == (FT_UInt)size->root.metrics.y_ppem )
|
||||
{
|
||||
goto Found_Strike;
|
||||
}
|
||||
|
||||
strike++;
|
||||
}
|
||||
|
||||
|
@ -532,7 +567,8 @@
|
|||
|
||||
/* Now lookup the glyph's position within the file */
|
||||
{
|
||||
FT_UInt char_len;
|
||||
FT_UInt char_len;
|
||||
|
||||
|
||||
char_len = 4;
|
||||
if ( strike->flags & 1 ) char_len += 1;
|
||||
|
@ -541,7 +577,7 @@
|
|||
|
||||
/* Access data directly in the frame to speed lookups */
|
||||
if ( FT_STREAM_SEEK( phys->bct_offset + strike->bct_offset ) ||
|
||||
FT_FRAME_ENTER( char_len * strike->num_bitmaps ) )
|
||||
FT_FRAME_ENTER( char_len * strike->num_bitmaps ) )
|
||||
goto Exit;
|
||||
|
||||
pfr_lookup_bitmap_data( stream->cursor,
|
||||
|
@ -554,7 +590,7 @@
|
|||
|
||||
FT_FRAME_EXIT();
|
||||
|
||||
if (gps_size == 0)
|
||||
if ( gps_size == 0 )
|
||||
{
|
||||
/* Could not find a bitmap program string for this glyph */
|
||||
error = FT_Err_Invalid_Argument;
|
||||
|
@ -568,14 +604,15 @@
|
|||
FT_UInt xsize, ysize, format;
|
||||
FT_Byte* p;
|
||||
|
||||
|
||||
advance = FT_MulDiv( size->root.metrics.x_ppem << 8,
|
||||
character->advance,
|
||||
phys->metrics_resolution );
|
||||
|
||||
/* XXX: handle linearHoriAdvance correctly !! */
|
||||
/* XXX: handle linearHoriAdvance correctly! */
|
||||
|
||||
if ( FT_STREAM_SEEK( face->header.gps_section_offset + gps_offset ) ||
|
||||
FT_FRAME_ENTER( gps_size ) )
|
||||
FT_FRAME_ENTER( gps_size ) )
|
||||
goto Exit;
|
||||
|
||||
p = stream->cursor;
|
||||
|
@ -589,16 +626,16 @@
|
|||
glyph->root.format = FT_GLYPH_FORMAT_BITMAP;
|
||||
|
||||
/* Set up glyph bitmap and metrics */
|
||||
glyph->root.bitmap.width = (FT_Int) xsize;
|
||||
glyph->root.bitmap.rows = (FT_Int) ysize;
|
||||
glyph->root.bitmap.pitch = (FT_Long)(xsize+7) >> 3;
|
||||
glyph->root.bitmap.width = (FT_Int)xsize;
|
||||
glyph->root.bitmap.rows = (FT_Int)ysize;
|
||||
glyph->root.bitmap.pitch = (FT_Long)( xsize + 7 ) >> 3;
|
||||
glyph->root.bitmap.pixel_mode = FT_PIXEL_MODE_MONO;
|
||||
|
||||
glyph->root.metrics.width = (FT_Long)xsize << 6;
|
||||
glyph->root.metrics.height = (FT_Long)ysize << 6;
|
||||
glyph->root.metrics.horiBearingX = xpos << 6;
|
||||
glyph->root.metrics.horiBearingY = ypos << 6;
|
||||
glyph->root.metrics.horiAdvance = ((advance >> 2) + 32) & -64;
|
||||
glyph->root.metrics.horiAdvance = ( ( advance >> 2 ) + 32 ) & -64;
|
||||
glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1;
|
||||
glyph->root.metrics.vertBearingY = 0;
|
||||
glyph->root.metrics.vertAdvance = size->root.metrics.height;
|
||||
|
@ -609,21 +646,25 @@
|
|||
/* Allocate and read bitmap data */
|
||||
{
|
||||
FT_Memory memory = face->root.memory;
|
||||
FT_Long len = glyph->root.bitmap.pitch*ysize;
|
||||
FT_Long len = glyph->root.bitmap.pitch * ysize;
|
||||
|
||||
|
||||
if ( !FT_ALLOC( glyph->root.bitmap.buffer, len ) )
|
||||
{
|
||||
error = pfr_load_bitmap_bits( p,
|
||||
stream->limit,
|
||||
format,
|
||||
(face->header.color_flags & 2),
|
||||
face->header.color_flags & 2,
|
||||
&glyph->root.bitmap );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FT_FRAME_EXIT();
|
||||
}
|
||||
|
||||
Exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
/* END */
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/***************************************************************************/
|
||||
/* */
|
||||
/* pfrsbit.c */
|
||||
/* pfrsbit.h */
|
||||
/* */
|
||||
/* FreeType PFR bitmap loader */
|
||||
/* FreeType PFR bitmap loader (specification). */
|
||||
/* */
|
||||
/* Copyright 2002 by */
|
||||
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
||||
|
@ -15,6 +15,7 @@
|
|||
/* */
|
||||
/***************************************************************************/
|
||||
|
||||
|
||||
#ifndef __PFRSBIT_H__
|
||||
#define __PFRSBIT_H__
|
||||
|
||||
|
@ -30,3 +31,6 @@ FT_BEGIN_HEADER
|
|||
FT_END_HEADER
|
||||
|
||||
#endif /* __PFR_SBIT_H__ */
|
||||
|
||||
|
||||
/* END */
|
||||
|
|
|
@ -192,7 +192,8 @@ FT_BEGIN_HEADER
|
|||
/************************************************************************/
|
||||
|
||||
typedef struct PFR_KernItemRec_* PFR_KernItem;
|
||||
typedef struct PFR_KernItemRec_
|
||||
|
||||
typedef struct PFR_KernItemRec_
|
||||
{
|
||||
PFR_KernItem next;
|
||||
FT_UInt pair_count;
|
||||
|
@ -205,7 +206,8 @@ FT_BEGIN_HEADER
|
|||
|
||||
} PFR_KernItemRec;
|
||||
|
||||
#define PFR_KERN_INDEX( g1, g2 ) ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) )
|
||||
#define PFR_KERN_INDEX( g1, g2 ) \
|
||||
( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) )
|
||||
|
||||
typedef struct PFR_KernPairRec_
|
||||
{
|
||||
|
|
|
@ -597,8 +597,9 @@
|
|||
FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids;
|
||||
FT_UInt num_segs;
|
||||
|
||||
/* in certain fonts, the 'length' field is invalid and goes */
|
||||
/* out of bound. We try to correct this here... */
|
||||
|
||||
/* in certain fonts, the `length' field is invalid and goes */
|
||||
/* out of bound. We try to correct this here... */
|
||||
if ( length < 16 )
|
||||
FT_INVALID_TOO_SHORT;
|
||||
|
||||
|
|
Loading…
Reference in New Issue