diff options
Diffstat (limited to 'tests/FontHostTest.cpp')
-rw-r--r-- | tests/FontHostTest.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/FontHostTest.cpp b/tests/FontHostTest.cpp new file mode 100644 index 0000000..8ab7ad3 --- /dev/null +++ b/tests/FontHostTest.cpp @@ -0,0 +1,95 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "Test.h" +#include "SkTypeface.h" +#include "SkFontHost.h" + +//#define DUMP_TABLES + +#define kFontTableTag_head SkSetFourByteTag('h', 'e', 'a', 'd') +#define kFontTableTag_hhea SkSetFourByteTag('h', 'h', 'e', 'a') +#define kFontTableTag_maxp SkSetFourByteTag('m', 'a', 'x', 'p') + +static const struct TagSize { + SkFontTableTag fTag; + size_t fSize; +} gKnownTableSizes[] = { + { kFontTableTag_head, 54 }, + { kFontTableTag_hhea, 36 }, + { kFontTableTag_maxp, 32 }, +}; + +static void test_tables(skiatest::Reporter* reporter, SkTypeface* face) { + SkFontID fontID = face->uniqueID(); + + int count = SkFontHost::CountTables(fontID); + + SkAutoTMalloc<SkFontTableTag> storage(count); + SkFontTableTag* tags = storage.get(); + + int count2 = SkFontHost::GetTableTags(fontID, tags); + REPORTER_ASSERT(reporter, count2 == count); + + for (int i = 0; i < count; ++i) { + size_t size = SkFontHost::GetTableSize(fontID, tags[i]); + REPORTER_ASSERT(reporter, size > 0); + +#ifdef DUMP_TABLES + char name[5]; + name[0] = (tags[i] >> 24) & 0xFF; + name[1] = (tags[i] >> 16) & 0xFF; + name[2] = (tags[i] >> 8) & 0xFF; + name[3] = (tags[i] >> 0) & 0xFF; + name[4] = 0; + SkDebugf("%s %d\n", name, size); +#endif + + for (size_t j = 0; j < SK_ARRAY_COUNT(gKnownTableSizes); ++j) { + if (gKnownTableSizes[j].fTag == tags[i]) { + REPORTER_ASSERT(reporter, gKnownTableSizes[j].fSize == size); + } + } + + // do we get the same size from GetTableData and GetTableSize + { + SkAutoMalloc data(size); + size_t size2 = SkFontHost::GetTableData(fontID, tags[i], 0, size, + data.get()); + REPORTER_ASSERT(reporter, size2 == size); + } + } +} + +static void test_tables(skiatest::Reporter* reporter) { + static const char* const gNames[] = { + NULL, // default font + "Arial", "Times", "Times New Roman", "Helvetica", "Courier", + "Courier New", + }; + + for (size_t i = 0; i < SK_ARRAY_COUNT(gNames); ++i) { + SkTypeface* face = SkTypeface::CreateFromName(gNames[i], + SkTypeface::kNormal); + if (face) { +#ifdef DUMP_TABLES + SkDebugf("%s\n", gNames[i]); +#endif + test_tables(reporter, face); + face->unref(); + } + } +} + +static void TestFontHost(skiatest::Reporter* reporter) { + test_tables(reporter); +} + +// need tests for SkStrSearch + +#include "TestClassDef.h" +DEFINE_TESTCLASS("FontHost", FontHostTestClass, TestFontHost) |