1/* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "Test.h" 9#include "SkTypeface.h" 10#include "SkFontHost.h" 11 12//#define DUMP_TABLES 13 14#define kFontTableTag_head SkSetFourByteTag('h', 'e', 'a', 'd') 15#define kFontTableTag_hhea SkSetFourByteTag('h', 'h', 'e', 'a') 16#define kFontTableTag_maxp SkSetFourByteTag('m', 'a', 'x', 'p') 17 18static const struct TagSize { 19 SkFontTableTag fTag; 20 size_t fSize; 21} gKnownTableSizes[] = { 22 { kFontTableTag_head, 54 }, 23 { kFontTableTag_hhea, 36 }, 24 { kFontTableTag_maxp, 32 }, 25}; 26 27static void test_tables(skiatest::Reporter* reporter, SkTypeface* face) { 28 SkFontID fontID = face->uniqueID(); 29 30 int count = SkFontHost::CountTables(fontID); 31 32 SkAutoTMalloc<SkFontTableTag> storage(count); 33 SkFontTableTag* tags = storage.get(); 34 35 int count2 = SkFontHost::GetTableTags(fontID, tags); 36 REPORTER_ASSERT(reporter, count2 == count); 37 38 for (int i = 0; i < count; ++i) { 39 size_t size = SkFontHost::GetTableSize(fontID, tags[i]); 40 REPORTER_ASSERT(reporter, size > 0); 41 42#ifdef DUMP_TABLES 43 char name[5]; 44 name[0] = (tags[i] >> 24) & 0xFF; 45 name[1] = (tags[i] >> 16) & 0xFF; 46 name[2] = (tags[i] >> 8) & 0xFF; 47 name[3] = (tags[i] >> 0) & 0xFF; 48 name[4] = 0; 49 SkDebugf("%s %d\n", name, size); 50#endif 51 52 for (size_t j = 0; j < SK_ARRAY_COUNT(gKnownTableSizes); ++j) { 53 if (gKnownTableSizes[j].fTag == tags[i]) { 54 REPORTER_ASSERT(reporter, gKnownTableSizes[j].fSize == size); 55 } 56 } 57 58 // do we get the same size from GetTableData and GetTableSize 59 { 60 SkAutoMalloc data(size); 61 size_t size2 = SkFontHost::GetTableData(fontID, tags[i], 0, size, 62 data.get()); 63 REPORTER_ASSERT(reporter, size2 == size); 64 } 65 } 66} 67 68static void test_tables(skiatest::Reporter* reporter) { 69 static const char* const gNames[] = { 70 NULL, // default font 71 "Arial", "Times", "Times New Roman", "Helvetica", "Courier", 72 "Courier New", 73 }; 74 75 for (size_t i = 0; i < SK_ARRAY_COUNT(gNames); ++i) { 76 SkTypeface* face = SkTypeface::CreateFromName(gNames[i], 77 SkTypeface::kNormal); 78 if (face) { 79#ifdef DUMP_TABLES 80 SkDebugf("%s\n", gNames[i]); 81#endif 82 test_tables(reporter, face); 83 face->unref(); 84 } 85 } 86} 87 88static void TestFontHost(skiatest::Reporter* reporter) { 89 test_tables(reporter); 90} 91 92// need tests for SkStrSearch 93 94#include "TestClassDef.h" 95DEFINE_TESTCLASS("FontHost", FontHostTestClass, TestFontHost) 96