summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2010-04-23 13:32:03 -0400
committerBehdad Esfahbod <behdad@behdad.org>2010-04-23 13:32:03 -0400
commit1aa4666b914da7747fc58a8f6f2d913c94e3b8da (patch)
treedaa20c9729ebb0617c6eb018cc32f57a7fdd0d43
parentae4190cafe927649f8ff8be6a0082478d1298fda (diff)
Cleanup OpenTypeFontFile
-rw-r--r--src/hb-open-file-private.hh44
-rw-r--r--src/main.cc2
2 files changed, 27 insertions, 19 deletions
diff --git a/src/hb-open-file-private.hh b/src/hb-open-file-private.hh
index c7ddff9..7b2481b 100644
--- a/src/hb-open-file-private.hh
+++ b/src/hb-open-file-private.hh
@@ -104,8 +104,6 @@ typedef struct OffsetTable
return get_table (table_index);
}
- inline unsigned int get_face_count (void) const { return 1; }
-
public:
inline bool sanitize (SANITIZE_ARG_DEF, void *base) {
TRACE_SANITIZE ();
@@ -167,7 +165,7 @@ struct TTCHeader
switch (u.header.version) {
case 2: /* version 2 is compatible with version 1 */
case 1: return u.version1->get_face (i);
- default: return Null(OpenTypeFontFace);
+ default:return Null(OpenTypeFontFace);
}
}
@@ -199,43 +197,53 @@ struct TTCHeader
struct OpenTypeFontFile
{
- static const hb_tag_t TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 );
static const hb_tag_t CFFTag = HB_TAG ('O','T','T','O');
+ static const hb_tag_t TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 );
static const hb_tag_t TTCTag = HB_TAG ('t','t','c','f');
STATIC_DEFINE_GET_FOR_DATA (OpenTypeFontFile);
+ inline hb_tag_t get_tag (void) const { return u.tag; }
+
inline unsigned int get_face_count (void) const
{
- switch (tag) {
- case TrueTypeTag: case CFFTag: return Cast<OpenTypeFontFace> (*this).get_face_count ();
- case TTCTag: return Cast<TTCHeader> (*this).get_face_count ();
- default: return 0;
+ switch (u.tag) {
+ case CFFTag: /* All the non-collection tags */
+ case TrueTypeTag: return 1;
+ case TTCTag: return u.ttcHeader->get_face_count ();
+ default: return 0;
}
}
inline const OpenTypeFontFace& get_face (unsigned int i) const
{
- switch (tag) {
+ switch (u.tag) {
/* Note: for non-collection SFNT data we ignore index. This is because
* Apple dfont container is a container of SFNT's. So each SFNT is a
* non-TTC, but the index is more than zero. */
- case TrueTypeTag: case CFFTag: return Cast<OpenTypeFontFace> (*this);
- case TTCTag: return Cast<TTCHeader> (*this).get_face (i);
- default: return Null(OpenTypeFontFace);
+ case CFFTag: /* All the non-collection tags */
+ case TrueTypeTag: return u.fontFace[0];
+ case TTCTag: return u.ttcHeader->get_face (i);
+ default: return Null(OpenTypeFontFace);
}
}
inline bool sanitize (SANITIZE_ARG_DEF) {
TRACE_SANITIZE ();
- if (!SANITIZE_SELF ()) return false;
- switch (tag) {
- default: return true;
- case TrueTypeTag: case CFFTag: return SANITIZE_THIS (Cast<OpenTypeFontFace> (*this));
- case TTCTag: return SANITIZE (Cast<TTCHeader> (*this));
+ if (!SANITIZE (u.tag)) return false;
+ switch (u.tag) {
+ case CFFTag: /* All the non-collection tags */
+ case TrueTypeTag: return u.fontFace->sanitize (SANITIZE_ARG, CharP(this));
+ case TTCTag: return u.ttcHeader->sanitize (SANITIZE_ARG);
+ default: return true;
}
}
- Tag tag; /* 4-byte identifier. */
+ private:
+ union {
+ Tag tag; /* 4-byte identifier. */
+ OpenTypeFontFace fontFace[VAR];
+ TTCHeader ttcHeader[VAR];
+ } u;
};
ASSERT_SIZE (OpenTypeFontFile, 4);
diff --git a/src/main.cc b/src/main.cc
index b2aee2b..b4123b5 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -63,7 +63,7 @@ main (int argc, char **argv)
const OpenTypeFontFile &ot = OpenTypeFontFile::get_for_data (font_data);
- switch (ot.tag) {
+ switch (ot.get_tag ()) {
case OpenTypeFontFile::TrueTypeTag:
printf ("OpenType font with TrueType outlines\n");
break;