add getUnitsPerEm() to SkTypeface

git-svn-id: http://skia.googlecode.com/svn/trunk@4863 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2012-07-31 17:24:44 +00:00
parent 777e789093
commit 4b2af9c91d
3 changed files with 42 additions and 1 deletions

View 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
*/

View 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;
}

View 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();
}
}