提交 2b737451 编写于 作者: B Behdad Esfahbod

Device tables.

上级 eb32e374
...@@ -82,7 +82,7 @@ typedef uint32_t hb_tag_t; ...@@ -82,7 +82,7 @@ typedef uint32_t hb_tag_t;
#define DEFINE_OFFSET_INDEX_OPERATOR(const, Type, array, num) \ #define DEFINE_OFFSET_INDEX_OPERATOR(const, Type, array, num) \
inline const Type& operator[] (unsigned int i) const { \ inline const Type& operator[] (unsigned int i) const { \
assert (i < num); \ assert (i < num); \
assert (array[i]); \ assert (array[i]); /* TODO: should just skip them */ \
return *(const Type *)((const char*)this + array[i]); \ return *(const Type *)((const char*)this + array[i]); \
} }
...@@ -93,7 +93,7 @@ typedef uint32_t hb_tag_t; ...@@ -93,7 +93,7 @@ typedef uint32_t hb_tag_t;
#define DEFINE_RECORD_ACCESSOR(const, Type, array, num) \ #define DEFINE_RECORD_ACCESSOR(const, Type, array, num) \
inline const Type& operator[] (unsigned int i) const { \ inline const Type& operator[] (unsigned int i) const { \
assert (i < num); \ assert (i < num); \
assert (array[i].offset); \ assert (array[i].offset); /* TODO: should just skip them */ \
return *(const Type *)((const char*)this + array[i].offset); \ return *(const Type *)((const char*)this + array[i].offset); \
} \ } \
inline const Tag& get_tag (unsigned int i) const { \ inline const Tag& get_tag (unsigned int i) const { \
...@@ -441,7 +441,7 @@ struct Lookup { ...@@ -441,7 +441,7 @@ struct Lookup {
}; };
/* /*
* Coverage * Coverage Table
*/ */
struct CoverageFormat1 { struct CoverageFormat1 {
...@@ -521,7 +521,7 @@ struct Coverage { ...@@ -521,7 +521,7 @@ struct Coverage {
}; };
/* /*
* Class Definition * Class Definition Table
*/ */
struct ClassDefFormat1 { struct ClassDefFormat1 {
...@@ -597,7 +597,48 @@ struct ClassDef { ...@@ -597,7 +597,48 @@ struct ClassDef {
USHORT classFormat; /* Format identifier */ USHORT classFormat; /* Format identifier */
}; };
/*
* Device Tables
*/
struct Device {
inline unsigned int get_size (void) const {
int count = endSize - startSize + 1;
if (count < 0) count = 0;
switch (deltaFormat) {
case 1: return sizeof (Device) + sizeof (USHORT) * ((count+7)/8);
case 2: return sizeof (Device) + sizeof (USHORT) * ((count+3)/4);
case 3: return sizeof (Device) + sizeof (USHORT) * ((count+1)/2);
default:return sizeof (Device);
}
}
inline int get_delta (int ppem_size) {
if (ppem_size >= startSize && ppem_size <= endSize &&
deltaFormat >= 1 && deltaFormat <= 3) {
int s = ppem_size - startSize;
int f = deltaFormat;
uint16_t byte = deltaValue[s >> (4 - f)];
uint16_t bits = byte >> (16 - (((s & ((1 << (4 - f)) - 1)) + 1) << f));
uint16_t mask = 0xFFFF >> (16 - (1 << f));
int delta = bits & mask;
if (delta >= ((mask + 1) >> 1))
delta -= mask + 1;
return delta;
}
return 0;
}
USHORT startSize; /* Smallest size to correct--in ppem */
USHORT endSize; /* Largest size to correct--in ppem */
USHORT deltaFormat; /* Format of DeltaValue array data: 1, 2, or 3 */
USHORT deltaValue[]; /* Array of compressed data */
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册