add getUnitsPerEm() to SkTypeface
authorreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 31 Jul 2012 17:24:44 +0000 (17:24 +0000)
committerreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 31 Jul 2012 17:24:44 +0000 (17:24 +0000)
git-svn-id: http://skia.googlecode.com/svn/trunk@4863 2bbb7eff-a529-9590-31e7-b0007b416f81

include/core/SkTypeface.h
src/core/SkTypeface.cpp
tests/FontHostTest.cpp

index 9693219..73794db 100644 (file)
@@ -176,7 +176,13 @@ public:
      */
     size_t getTableData(SkFontTableTag tag, size_t offset, size_t length,
                         void* data) const;
-    
+
+    /**
+     *  Return the units-per-em value for this typeface, or zero if there is an
+     *  error.
+     */
+    int getUnitsPerEm() const;
+
 protected:
     /** uniqueID must be unique (please!) and non-zero
     */
index 66e7904..3a40e01 100644 (file)
@@ -117,3 +117,21 @@ size_t SkTypeface::getTableData(SkFontTableTag tag, size_t offset, size_t length
     return SkFontHost::GetTableData(fUniqueID, tag, offset, length, data);
 }
 
+int SkTypeface::getUnitsPerEm() const {
+    int upem = 0;
+
+#ifdef SK_BUILD_FOR_ANDROID
+    upem = SkFontHost::GetUnitsPerEm(fUniqueID);
+#else
+    SkAdvancedTypefaceMetrics* metrics;
+    metrics = SkFontHost::GetAdvancedTypefaceMetrics(fUniqueID,
+                                 SkAdvancedTypefaceMetrics::kNo_PerGlyphInfo,
+                                 NULL, 0);
+    if (metrics) {
+        upem = metrics->fEmSize;
+        metrics->unref();
+    }
+#endif
+    return upem;
+}
+
index 260956f..fcdeaba 100644 (file)
@@ -8,6 +8,7 @@
 #include "Test.h"
 #include "SkPaint.h"
 #include "SkTypeface.h"
+#include "SkEndian.h"
 
 //#define DUMP_TABLES
 
@@ -24,6 +25,21 @@ static const struct TagSize {
     {   kFontTableTag_maxp,         32 },
 };
 
+static void test_unitsPerEm(skiatest::Reporter* reporter, SkTypeface* face) {
+    int upem = face->getUnitsPerEm();
+    REPORTER_ASSERT(reporter, upem > 0);
+
+    size_t size = face->getTableSize(kFontTableTag_head);
+    if (size) {
+        SkAutoMalloc storage(size);
+        char* ptr = (char*)storage.get();
+        face->getTableData(kFontTableTag_head, 0, size, ptr);
+        // unitsPerEm is at offset 18 into the 'head' table.
+        int upem2 = SkEndian_SwapBE16(*(uint16_t*)&ptr[18]);
+        REPORTER_ASSERT(reporter, upem2 == upem);
+    }
+}
+
 static void test_tables(skiatest::Reporter* reporter, SkTypeface* face) {
     SkFontID fontID = face->uniqueID();
     if (false) { // avoid bit rot, suppress warning
@@ -82,6 +98,7 @@ static void test_tables(skiatest::Reporter* reporter) {
             SkDebugf("%s\n", gNames[i]);
 #endif
             test_tables(reporter, face);
+            test_unitsPerEm(reporter, face);
             face->unref();
         }
     }