Define get_for_data() factories
This commit is contained in:
parent
b9d7688fb3
commit
600e5eb80f
|
@ -170,6 +170,9 @@ struct CaretValue {
|
||||||
DEFINE_ACCESSOR0( , Type, name, Name)
|
DEFINE_ACCESSOR0( , Type, name, Name)
|
||||||
|
|
||||||
struct GDEFHeader {
|
struct GDEFHeader {
|
||||||
|
static const hb_tag_t GDEFTag = HB_TAG ('G','D','E','F');
|
||||||
|
|
||||||
|
STATIC_DEFINE_GET_FOR_DATA (GDEFHeader);
|
||||||
|
|
||||||
DEFINE_ACCESSOR (ClassDef, get_glyph_class_def, glyphClassDef);
|
DEFINE_ACCESSOR (ClassDef, get_glyph_class_def, glyphClassDef);
|
||||||
DEFINE_ACCESSOR (AttachList, get_attach_list, attachList);
|
DEFINE_ACCESSOR (AttachList, get_attach_list, attachList);
|
||||||
|
|
|
@ -49,10 +49,6 @@
|
||||||
DEFINE_LEN(Type, array, num) \
|
DEFINE_LEN(Type, array, num) \
|
||||||
DEFINE_SIZE(Type, array, num)
|
DEFINE_SIZE(Type, array, num)
|
||||||
|
|
||||||
#define DEFINE_NON_INSTANTIABLE(Type) \
|
|
||||||
private: inline Type() {} /* cannot be instantiated */ \
|
|
||||||
public:
|
|
||||||
|
|
||||||
/* An array type is one that contains a variable number of objects
|
/* An array type is one that contains a variable number of objects
|
||||||
* as its last item. An array object is extended with len() and size()
|
* as its last item. An array object is extended with len() and size()
|
||||||
* methods, as well as overloaded [] operator. */
|
* methods, as well as overloaded [] operator. */
|
||||||
|
@ -98,6 +94,30 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class features
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* makes class uninstantiable. should be used for union classes that don't
|
||||||
|
* contain any complete type */
|
||||||
|
#define DEFINE_NON_INSTANTIABLE(Type) \
|
||||||
|
private: inline Type() {} /* cannot be instantiated */ \
|
||||||
|
public:
|
||||||
|
|
||||||
|
/* get_for_data() is a static class method returning a reference to an
|
||||||
|
* instance of Type located at the input data location. It's just a
|
||||||
|
* fancy cast! */
|
||||||
|
#define STATIC_DEFINE_GET_FOR_DATA0(const, Type) \
|
||||||
|
static inline const Type& get_for_data (const char *data) { \
|
||||||
|
return *(const Type*)data; \
|
||||||
|
}
|
||||||
|
#define STATIC_DEFINE_GET_FOR_DATA(Type) \
|
||||||
|
STATIC_DEFINE_GET_FOR_DATA0(const, Type) \
|
||||||
|
STATIC_DEFINE_GET_FOR_DATA0( , Type)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* The OpenType Font File
|
* The OpenType Font File
|
||||||
|
@ -293,15 +313,7 @@ struct OpenTypeFontFile {
|
||||||
static const hb_tag_t CFFTag = HB_TAG ('O','T','T','O');
|
static const hb_tag_t CFFTag = HB_TAG ('O','T','T','O');
|
||||||
static const hb_tag_t TTCTag = HB_TAG ('t','t','c','f');
|
static const hb_tag_t TTCTag = HB_TAG ('t','t','c','f');
|
||||||
|
|
||||||
/* Factory: ::get(font_data)
|
STATIC_DEFINE_GET_FOR_DATA (OpenTypeFontFile);
|
||||||
* This is how you get a handle to one of these
|
|
||||||
*/
|
|
||||||
static inline const OpenTypeFontFile& get (const char *font_data) {
|
|
||||||
return (const OpenTypeFontFile&)*font_data;
|
|
||||||
}
|
|
||||||
static inline OpenTypeFontFile& get (char *font_data) {
|
|
||||||
return (OpenTypeFontFile&)*font_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is how you get a table */
|
/* This is how you get a table */
|
||||||
inline const char* get_table (const OpenTypeTable& table) const {
|
inline const char* get_table (const OpenTypeTable& table) const {
|
||||||
|
@ -753,6 +765,10 @@ ASSERT_SIZE (Device, 6);
|
||||||
DEFINE_LIST_ACCESSOR0( , Type, name)
|
DEFINE_LIST_ACCESSOR0( , Type, name)
|
||||||
|
|
||||||
struct GSUBGPOSHeader {
|
struct GSUBGPOSHeader {
|
||||||
|
static const hb_tag_t GSUBTag = HB_TAG ('G','S','U','B');
|
||||||
|
static const hb_tag_t GPOSTag = HB_TAG ('G','P','O','S');
|
||||||
|
|
||||||
|
STATIC_DEFINE_GET_FOR_DATA (GSUBGPOSHeader);
|
||||||
|
|
||||||
DEFINE_LIST_ACCESSOR(Script, script); /* get_script_list, get_script(i) */
|
DEFINE_LIST_ACCESSOR(Script, script); /* get_script_list, get_script(i) */
|
||||||
DEFINE_LIST_ACCESSOR(Feature, feature);/* get_feature_list, get_feature(i) */
|
DEFINE_LIST_ACCESSOR(Feature, feature);/* get_feature_list, get_feature(i) */
|
||||||
|
|
10
src/main.cc
10
src/main.cc
|
@ -18,7 +18,7 @@ main (int argc, char **argv)
|
||||||
|
|
||||||
printf ("Opened font file %s: %d bytes long\n", argv[1], len);
|
printf ("Opened font file %s: %d bytes long\n", argv[1], len);
|
||||||
|
|
||||||
const OpenTypeFontFile &ot = OpenTypeFontFile::get (font_data);
|
const OpenTypeFontFile &ot = OpenTypeFontFile::get_for_data (font_data);
|
||||||
|
|
||||||
switch (ot.get_tag()) {
|
switch (ot.get_tag()) {
|
||||||
case OpenTypeFontFile::TrueTypeTag:
|
case OpenTypeFontFile::TrueTypeTag:
|
||||||
|
@ -49,7 +49,7 @@ main (int argc, char **argv)
|
||||||
(const char *)table.get_tag(), table.get_offset(), table.get_length());
|
(const char *)table.get_tag(), table.get_offset(), table.get_length());
|
||||||
|
|
||||||
if (table.get_tag() == "GSUB" || table.get_tag() == "GPOS") {
|
if (table.get_tag() == "GSUB" || table.get_tag() == "GPOS") {
|
||||||
const GSUBGPOSHeader &g = (const GSUBGPOSHeader&)*ot[table];
|
const GSUBGPOSHeader &g = GSUBGPOSHeader::get_for_data (ot[table]);
|
||||||
|
|
||||||
const ScriptList &scripts = *g.get_script_list();
|
const ScriptList &scripts = *g.get_script_list();
|
||||||
int num_scripts = scripts.get_len ();
|
int num_scripts = scripts.get_len ();
|
||||||
|
@ -92,15 +92,13 @@ main (int argc, char **argv)
|
||||||
lookup.get_type(), lookup.get_flag());
|
lookup.get_type(), lookup.get_flag());
|
||||||
}
|
}
|
||||||
} else if (table.get_tag() == "GDEF") {
|
} else if (table.get_tag() == "GDEF") {
|
||||||
const GDEFHeader &gdef = (const GDEFHeader&)*ot[table];
|
const GDEFHeader &gdef = GDEFHeader::get_for_data (ot[table]);
|
||||||
|
|
||||||
/*
|
for (int glyph = 0; glyph < 1; glyph++)
|
||||||
for (int glyph = 0; glyph < 1000; glyph++)
|
|
||||||
printf (" glyph %d has class %d and mark attachment type %d\n",
|
printf (" glyph %d has class %d and mark attachment type %d\n",
|
||||||
glyph,
|
glyph,
|
||||||
gdef.get_glyph_class (glyph),
|
gdef.get_glyph_class (glyph),
|
||||||
gdef.get_mark_attachment_type (glyph));
|
gdef.get_mark_attachment_type (glyph));
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue