forked from minhngoc25a/freetype2
a few updates to the OpenType Layout code
still far to go, but I'll dedicate most of my time on it next week
This commit is contained in:
parent
e608a3e0d2
commit
488cd71e4b
|
@ -477,20 +477,138 @@
|
|||
return result;
|
||||
}
|
||||
|
||||
/* compute a BaseCoord value */
|
||||
/* extract a BaseCoord value */
|
||||
LOCAL_FUNC
|
||||
TT_Int OTL_Get_Base_Coordinate( TT_Byte* base_coord,
|
||||
TT_UShort *format
|
||||
TT_UShort *ref_glyph_id,
|
||||
TT_Byte* *device )
|
||||
void OTL_Get_Base_Coordinate( TT_Byte* base_coord,
|
||||
OTL_ValueRecord* coord )
|
||||
{
|
||||
TT_Byte* p =base_coord;
|
||||
TT_Byte* p = base_coord;
|
||||
TT_Int result = 0;
|
||||
|
||||
*format = OTL_UShort(p);
|
||||
|
||||
switch (*format)
|
||||
coord->format = OTL_UShort(p);
|
||||
coord->coordinate = OTL_Short(p);
|
||||
coord->device = 0;
|
||||
|
||||
switch (coord->format)
|
||||
{
|
||||
case
|
||||
case 2: /* format 2 */
|
||||
coord->ref_glyph = OTL_UShort(p);
|
||||
coord->ref_point = OTL_UShort(p);
|
||||
break;
|
||||
|
||||
case 3: /* format 3 */
|
||||
coord->device = p - 4 + OTL_UShort(p);
|
||||
break;
|
||||
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* compute size of ValueRecord */
|
||||
LOCAL_FUNC
|
||||
TT_Int OTL_ValueRecord_Size( TT_UShort format )
|
||||
{
|
||||
TT_Int count;
|
||||
|
||||
/* each bit in the value format corresponds to a single ushort */
|
||||
/* we thus count the bits, and multiply the result by 2 */
|
||||
|
||||
count = (TT_Int)(format & 0xFF);
|
||||
count = ((count & 0xAA) >> 1) + (count & 0x55);
|
||||
count = ((count & 0xCC) >> 2) + (count & 0x33);
|
||||
count = ((count & 0xF0) >> 4) + (count & 0x0F);
|
||||
|
||||
return count*2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* extract ValueRecord */
|
||||
LOCAL_FUNC
|
||||
void OTL_Get_ValueRecord( TT_Byte* value_record,
|
||||
TT_UShort value_format,
|
||||
TT_Byte* pos_table,
|
||||
OTL_ValueRecord* record )
|
||||
{
|
||||
TT_Byte* p = value_record;
|
||||
|
||||
/* clear vectors */
|
||||
record->placement.x = 0;
|
||||
record->placement.y = 0;
|
||||
record->advance.x = 0;
|
||||
record->advance.y = 0;
|
||||
|
||||
record->device_pla_x = 0;
|
||||
record->device_pla_y = 0;
|
||||
record->device_adv_x = 0;
|
||||
record->device_adv_y = 0;
|
||||
|
||||
if (value_format & 1) record->placement.x = NEXT_Short(p);
|
||||
if (value_format & 2) record->placement.y = NEXT_Short(p);
|
||||
if (value_format & 4) record->advance.x = NEXT_Short(p);
|
||||
if (value_format & 8) record->advance.y = NEXT_Short(p);
|
||||
|
||||
if (value_format & 16) record->device_pla_x = pos_table + NEXT_UShort(p);
|
||||
if (value_format & 32) record->device_pla_y = pos_table + NEXT_UShort(p);
|
||||
if (value_format & 64) record->device_adv_x = pos_table + NEXT_UShort(p);
|
||||
if (value_format & 128) record->device_adv_y = pos_table + NEXT_UShort(p);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* extract Anchor */
|
||||
LOCAL_FUNC
|
||||
void OTL_Get_Anchor( TT_Byte* anchor_table,
|
||||
OTL_Anchor* anchor )
|
||||
{
|
||||
TT_Byte* p = anchor_table;
|
||||
|
||||
anchor->format = NEXT_UShort(p);
|
||||
anchor->coord.x = NEXT_Short(p);
|
||||
anchor->coord.y = NEXT_Short(p);
|
||||
anchor->point = 0;
|
||||
anchor->device_x = 0;
|
||||
anchor->device_y = 0;
|
||||
|
||||
switch (anchor->format)
|
||||
{
|
||||
case 2:
|
||||
anchor->point = NEXT_UShort(p);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
anchor->device_x = anchor_table + NEXT_UShort(p);
|
||||
anchor->device_y = anchor_table + NEXT_UShort(p);
|
||||
break;
|
||||
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* extract Mark from MarkArray */
|
||||
LOCAL_FUNC
|
||||
void OTL_Get_Mark( TT_Byte* mark_array,
|
||||
TT_UInt index,
|
||||
TT_UShort* clazz,
|
||||
OTL_Anchor* anchor )
|
||||
{
|
||||
TT_Byte* p = mark_array;
|
||||
TT_UInt count;
|
||||
|
||||
*clazz = 0;
|
||||
MEM_Set( anchor, 0, sizeof(*anchor) );
|
||||
|
||||
count = NEXT_UShort(p);
|
||||
if (index < count)
|
||||
{
|
||||
p += 4*index;
|
||||
*clazz = NEXT_UShort(p);
|
||||
OTL_Get_Anchor( mark_array + NEXT_UShort(p), anchor );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
*
|
||||
* max_features :: total number of features in table
|
||||
* feature_tags :: tags of all features for current script/language
|
||||
* features :: selection flags for all features in current script/lang
|
||||
*
|
||||
* max_lookups :: total number of lookups in table
|
||||
* lookups :: selection flags for all lookups for current
|
||||
|
@ -81,6 +82,40 @@
|
|||
} OTL_Table;
|
||||
|
||||
|
||||
typedef struct OTL_BaseCoord_
|
||||
{
|
||||
TT_UShort format;
|
||||
TT_Short coordinate;
|
||||
TT_UShort ref_glyph;
|
||||
TT_UShort ref_point;
|
||||
TT_Byte* device;
|
||||
|
||||
} OTL_BaseCoord;
|
||||
|
||||
|
||||
typedef struct OTL_ValueRecord_
|
||||
{
|
||||
TT_Vector placement;
|
||||
TT_Vector advance;
|
||||
|
||||
TT_Byte* device_pla_x;
|
||||
TT_Byte* device_pla_y;
|
||||
TT_Byte* device_adv_x;
|
||||
TT_Byte* device_adv_y;
|
||||
|
||||
} OTL_ValueRecord;
|
||||
|
||||
|
||||
typedef struct OTL_Anchor_
|
||||
{
|
||||
TT_UInt format;
|
||||
TT_Vector coord;
|
||||
TT_UInt anchor_point;
|
||||
TT_Byte* device_x;
|
||||
TT_Byte* device_y;
|
||||
|
||||
} OTL_Anchor;
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Error OTL_Table_Init( OTL_Table* table,
|
||||
FT_Memory memory );
|
||||
|
@ -222,10 +257,47 @@
|
|||
|
||||
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Long OTL_Get_Coverage_Index( TT_Byte* coverage,
|
||||
TT_UInt glyph_id );
|
||||
|
||||
LOCAL_DEF
|
||||
TT_UInt OTL_Get_Glyph_Class( TT_Byte* class_def,
|
||||
TT_UInt glyph_id );
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Int OTL_Get_Device_Adjustment( TT_Byte* device,
|
||||
TT_UInt size );
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Get_Base_Coordinate( TT_Byte* base_coord,
|
||||
OTL_BaseCoord* coord );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
TT_Int OTL_ValueRecord_Size( TT_UShort value_format );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Get_ValueRecord( TT_Byte* value_record,
|
||||
TT_UShort value_format,
|
||||
TT_Byte* pos_table,
|
||||
OTL_ValueRecord* record );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Get_Anchor( TT_Byte* anchor_table,
|
||||
OTL_Anchor* anchor );
|
||||
|
||||
|
||||
LOCAL_DEF
|
||||
void OTL_Get_Mark( TT_Byte* mark_array,
|
||||
TT_UInt index,
|
||||
TT_UShort* clazz,
|
||||
OTL_Anchor* anchor );
|
||||
|
||||
|
||||
|
||||
#define OTL_Byte(p) (p++, p[-1])
|
||||
|
||||
|
|
Loading…
Reference in New Issue