*/
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
*/
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;
+}
+
#include "Test.h"
#include "SkPaint.h"
#include "SkTypeface.h"
+#include "SkEndian.h"
//#define DUMP_TABLES
{ 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
SkDebugf("%s\n", gNames[i]);
#endif
test_tables(reporter, face);
+ test_unitsPerEm(reporter, face);
face->unref();
}
}