GSUBGPOSHeader

This commit is contained in:
Behdad Esfahbod 2006-12-27 01:29:24 -05:00
parent eebabd8b2e
commit 71d62baab0
1 changed files with 98 additions and 5 deletions

View File

@ -162,6 +162,7 @@ struct Tag {
inline Tag (uint32_t v) { (ULONG&)(*this) = v; }
inline Tag (const char *c) { v[0] = c[0]; v[1] = c[1]; v[2] = c[2]; v[3] = c[3]; }
inline bool operator== (Tag o) const { return v[0]==o.v[0]&&v[1]==o.v[1]&&v[2]==o.v[2]&&v[3]==o.v[3]; }
inline bool operator== (const char *c) const { return v[0]==c[0]&&v[1]==c[1]&&v[2]==c[2]&&v[3]==c[3]; }
inline operator uint32_t(void) const { return (v[0]<<24)+(v[1]<<16) +(v[2]<<8)+v[3]; }
/* What the char* converters return is NOT nul-terminated. Print using "%.4s" */
inline operator const char* (void) const { return (const char *)this; }
@ -268,6 +269,20 @@ struct OpenTypeFontFile {
return (OpenTypeFontFile&)*font_data;
}
/* This is how you get a table */
inline const char* get_table (const OpenTypeTable& table) const {
return ((const char*)this) + table.offset;
}
inline char* get_table (const OpenTypeTable& table) {
return ((char*)this) + table.offset;
}
inline const char* operator[] (const OpenTypeTable& table) const {
return ((const char*)this) + table.offset;
}
inline char* operator[] (const OpenTypeTable& table) {
return ((char*)this) + table.offset;
}
/* Array interface sans get_size() */
inline unsigned int get_len (void) const {
switch (tag) {
@ -643,6 +658,45 @@ struct Device {
/*
*
* The Glyph Substitution Table
*
*/
#define DEFINE_LIST_ACCESSOR0(const, Type, name) \
inline const Type##List* get_##name##_list (void) const { \
assert (name##List); \
return (const Type##List *)((const char*)this + name##List); \
} \
inline const Type& name (unsigned int i) const { \
return (*get_##name##_list())[i]; \
}
#define DEFINE_LIST_ACCESSOR(Type, name) \
DEFINE_LIST_ACCESSOR0(const, Type, name) \
DEFINE_LIST_ACCESSOR0( , Type, name)
struct GSUBGPOSHeader {
DEFINE_LIST_ACCESSOR(Script, script); /* get_script_list and script(i) */
DEFINE_LIST_ACCESSOR(Feature, feature);/* get_feature_list and feature(i) */
DEFINE_LIST_ACCESSOR(Lookup, lookup); /* get_lookup_list and lookup(i) */
Fixed_Version version; /* Version of the GSUB table-initially set to
* 0x00010000 */
Offset scriptList; /* Offset to ScriptList table-from beginning of
* GSUB table */
Offset featureList; /* Offset to FeatureList table-from beginning of
* GSUB table */
Offset lookupList; /* Offset to LookupList table-from beginning of
* GSUB table */
};
struct GSUB : GSUBGPOSHeader {
};
#include <stdlib.h>
@ -686,16 +740,55 @@ main (int argc, char **argv)
printf ("Font %d of %d:\n", n_font+1, num_fonts);
int num_tables = font.get_len ();
printf ("%d table(s) found in font\n", num_tables);
printf (" %d table(s) found in font\n", num_tables);
for (int n_table = 0; n_table < num_tables; n_table++) {
const OpenTypeTable &table = font[n_table];
printf ("Table %2d of %2d: %.4s (0x%06x+0x%06x)\n", n_table+1, num_tables,
printf (" Table %2d of %2d: %.4s (0x%06x+0x%06x)\n", n_table+1, num_tables,
(const char *)table.tag, (int)table.offset, (int)table.length);
if (table.tag == "GSUB" || table.tag == "GPOS") {
const GSUBGPOSHeader &g = (const GSUBGPOSHeader&)*ot[table];
const ScriptList &scripts = *g.get_script_list();
int num_scripts = scripts.get_len ();
printf (" %d script(s) found in table\n", num_scripts);
for (int n_script = 0; n_script < num_scripts; n_script++) {
const Script &script = scripts[n_script];
printf (" Script %2d of %2d: %.4s\n", n_script+1, num_scripts,
(const char *)scripts.get_tag(n_script));
if (script.get_default_language_system () == NULL)
printf (" No default language system\n");
int num_langsys = script.get_len ();
printf (" %d language system(s) found in script\n", num_langsys);
for (int n_langsys = 0; n_langsys < num_langsys; n_langsys++) {
const LangSys &langsys = script[n_langsys];
printf (" Language System %2d of %2d: %.4s\n", n_langsys+1, num_langsys,
(const char *)script.get_tag(n_langsys));
}
}
Tag a;
a == ((Tag)"1234");
const FeatureList &features = *g.get_feature_list();
int num_features = features.get_len ();
printf (" %d feature(s) found in table\n", num_features);
for (int n_feature = 0; n_feature < num_features; n_feature++) {
const Feature &feature = features[n_feature];
printf (" Feature %2d of %2d: %.4s; %d lookup(s)\n", n_feature+1, num_features,
(const char *)features.get_tag(n_feature),
(int)feature.lookupCount);
}
const LookupList &lookups = *g.get_lookup_list();
int num_lookups = lookups.get_len ();
printf (" %d lookup(s) found in table\n", num_lookups);
for (int n_lookup = 0; n_lookup < num_lookups; n_lookup++) {
const Lookup &lookup = lookups[n_lookup];
printf (" Lookup %2d of %2d: type %d, flags %04x\n", n_lookup+1, num_lookups,
(int)lookup.lookupType, (unsigned int)lookup.lookupFlag);
}
}
}
}
return 0;
}