From 53970c398e9112804652425e8328a7136c5b9450 Mon Sep 17 00:00:00 2001
From: orouge <orouge@gmail.com>
Date: Sat, 26 May 2012 22:20:52 +0300
Subject: [PATCH] Update src/hpdf_fontdef_tt.c

---
 src/hpdf_fontdef_tt.c | 67 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 51 insertions(+), 16 deletions(-)

diff --git a/src/hpdf_fontdef_tt.c b/src/hpdf_fontdef_tt.c
index 251e014..ad9085f 100644
--- a/src/hpdf_fontdef_tt.c
+++ b/src/hpdf_fontdef_tt.c
@@ -1678,6 +1678,7 @@ ParseOS2  (HPDF_FontDef  fontdef)
     HPDF_TTFontDefAttr attr = (HPDF_TTFontDefAttr)fontdef->attr;
     HPDF_TTFTable *tbl = FindTable (fontdef, "OS/2");
     HPDF_STATUS ret;
+    HPDF_UINT16 version;
     HPDF_UINT len;
 
     HPDF_PTRACE ((" ParseOS2\n"));
@@ -1685,11 +1686,19 @@ ParseOS2  (HPDF_FontDef  fontdef)
     if (!tbl)
         return HPDF_SetError (fontdef->error, HPDF_TTF_MISSING_TABLE, 0);
 
-    ret = HPDF_Stream_Seek (attr->stream, tbl->offset + 8, HPDF_SEEK_SET);
+    /* get the number version. */
+    ret = HPDF_Stream_Seek (attr->stream, tbl->offset, HPDF_SEEK_SET);
     if (ret != HPDF_OK)
         return ret;
 
+    if ((ret = GetUINT16 (attr->stream, &version)) != HPDF_OK)
+        return ret;
+
     /* check whether the font is allowed to be embedded. */
+    ret = HPDF_Stream_Seek (attr->stream, tbl->offset + 8, HPDF_SEEK_SET);
+    if (ret != HPDF_OK)
+        return ret;
+
     if ((ret = GetUINT16 (attr->stream, &attr->fs_type)) != HPDF_OK)
         return ret;
 
@@ -1697,32 +1706,59 @@ ParseOS2  (HPDF_FontDef  fontdef)
         return HPDF_SetError (fontdef->error, HPDF_TTF_CANNOT_EMBEDDING_FONT,
                 0);
 
-    if ((ret = HPDF_Stream_Seek (attr->stream, tbl->offset + 20, HPDF_SEEK_SET))
+    /* get fields sfamilyclass and panose. */
+    if ((ret = HPDF_Stream_Seek (attr->stream, tbl->offset + 30, HPDF_SEEK_SET))
             != HPDF_OK)
         return ret;
 
-    len = 12;
+    len = 2;
+    if ((ret = HPDF_Stream_Read (attr->stream, attr->sfamilyclass, &len)) != HPDF_OK)
+        return ret;
+
+    len = 10;
     if ((ret = HPDF_Stream_Read (attr->stream, attr->panose, &len)) != HPDF_OK)
         return ret;
 
-    HPDF_PTRACE((" ParseOS2 PANOSE=%u-%u "
-            "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n",
+    HPDF_PTRACE((" ParseOS2 sFamilyClass=%d-%d "
+            "Panose=%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n",
+        attr->sfamilyclass[0], attr->sfamilyclass[1],
         attr->panose[0], attr->panose[1], attr->panose[2], attr->panose[3],
         attr->panose[4], attr->panose[5], attr->panose[6], attr->panose[7],
-        attr->panose[8], attr->panose[9], attr->panose[10], attr->panose[11]));
-
-    if (attr->panose[0] == 1 || attr->panose[0] == 4)
+        attr->panose[8], attr->panose[9]));
+
+    /* Class ID = 1   Oldstyle Serifs
+       Class ID = 2   Transitional Serifs
+       Class ID = 3   Modern Serifs
+       Class ID = 4   Clarendon Serifs
+       Class ID = 5   Slab Serifs
+       Class ID = 6   (reserved for future use)
+       Class ID = 7   Freeform Serifs
+       Class ID = 8   Sans Serif
+       Class ID = 9   Ornamentals
+       Class ID = 10  Scripts
+       Class ID = 11  (reserved for future use)
+       Class ID = 12  Symbolic */
+    if ((attr->sfamilyclass[0] > 0 && attr->sfamilyclass[0] < 6)
+        || (attr->sfamilyclass[0] == 7))
         fontdef->flags = fontdef->flags | HPDF_FONT_SERIF;
 
-    /* get ulCodePageRange1 */
-    if ((ret = HPDF_Stream_Seek (attr->stream, 78, HPDF_SEEK_CUR)) != HPDF_OK)
-        return ret;
+    if (attr->sfamilyclass[0] == 10)
+        fontdef->flags = fontdef->flags | HPDF_FONT_SCRIPT;
 
-    if ((ret = GetUINT32 (attr->stream, &attr->code_page_range1)) != HPDF_OK)
-        return ret;
+    if (attr->sfamilyclass[0] == 12)
+        fontdef->flags = fontdef->flags | HPDF_FONT_SYMBOLIC;
 
-    if ((ret = GetUINT32 (attr->stream, &attr->code_page_range2)) != HPDF_OK)
-        return ret;
+    /* get fields ulCodePageRange1 and ulCodePageRange2 */
+    if(version > 0) {
+        if ((ret = HPDF_Stream_Seek (attr->stream, 36, HPDF_SEEK_CUR)) != HPDF_OK)
+            return ret;
+
+        if ((ret = GetUINT32 (attr->stream, &attr->code_page_range1)) != HPDF_OK)
+            return ret;
+
+        if ((ret = GetUINT32 (attr->stream, &attr->code_page_range2)) != HPDF_OK)
+            return ret;
+    }
 
     HPDF_PTRACE(("  ParseOS2 CodePageRange1=%08X CodePageRange2=%08X\n",
                 (HPDF_UINT)attr->code_page_range1,
@@ -2228,4 +2264,3 @@ INT16Swap (HPDF_INT16  *value)
     HPDF_MemCpy (b, (HPDF_BYTE *)value, 2);
     *value = (HPDF_INT16)((HPDF_INT16)b[0] << 8 | (HPDF_INT16)b[1]);
 }
-
-- 
2.21.1 (Apple Git-122.3)

