14f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger/* 24f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * Copyright 2012 Google Inc. 34f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * 44f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 54f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * found in the LICENSE file. 64f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger */ 74f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 84f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "Test.h" 94f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkTypeface.h" 104f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkFontHost.h" 114f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 124f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger//#define DUMP_TABLES 134f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 144f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#define kFontTableTag_head SkSetFourByteTag('h', 'e', 'a', 'd') 154f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#define kFontTableTag_hhea SkSetFourByteTag('h', 'h', 'e', 'a') 164f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#define kFontTableTag_maxp SkSetFourByteTag('m', 'a', 'x', 'p') 174f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 184f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic const struct TagSize { 194f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkFontTableTag fTag; 204f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger size_t fSize; 214f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger} gKnownTableSizes[] = { 224f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger { kFontTableTag_head, 54 }, 234f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger { kFontTableTag_hhea, 36 }, 244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger { kFontTableTag_maxp, 32 }, 254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger}; 264f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 274f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic void test_tables(skiatest::Reporter* reporter, SkTypeface* face) { 284f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkFontID fontID = face->uniqueID(); 294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 304f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger int count = SkFontHost::CountTables(fontID); 314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 324f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkAutoTMalloc<SkFontTableTag> storage(count); 334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkFontTableTag* tags = storage.get(); 344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger int count2 = SkFontHost::GetTableTags(fontID, tags); 364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger REPORTER_ASSERT(reporter, count2 == count); 374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 384f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger for (int i = 0; i < count; ++i) { 394f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger size_t size = SkFontHost::GetTableSize(fontID, tags[i]); 404f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger REPORTER_ASSERT(reporter, size > 0); 414f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 424f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#ifdef DUMP_TABLES 434f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger char name[5]; 444f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger name[0] = (tags[i] >> 24) & 0xFF; 454f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger name[1] = (tags[i] >> 16) & 0xFF; 464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger name[2] = (tags[i] >> 8) & 0xFF; 474f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger name[3] = (tags[i] >> 0) & 0xFF; 484f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger name[4] = 0; 494f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkDebugf("%s %d\n", name, size); 504f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#endif 514f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger for (size_t j = 0; j < SK_ARRAY_COUNT(gKnownTableSizes); ++j) { 534f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger if (gKnownTableSizes[j].fTag == tags[i]) { 544f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger REPORTER_ASSERT(reporter, gKnownTableSizes[j].fSize == size); 554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 564f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 574f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger // do we get the same size from GetTableData and GetTableSize 594f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger { 604f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkAutoMalloc data(size); 614f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger size_t size2 = SkFontHost::GetTableData(fontID, tags[i], 0, size, 624f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger data.get()); 634f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger REPORTER_ASSERT(reporter, size2 == size); 644f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 654f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 664f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger} 674f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 684f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic void test_tables(skiatest::Reporter* reporter) { 694f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger static const char* const gNames[] = { 704f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger NULL, // default font 714f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger "Arial", "Times", "Times New Roman", "Helvetica", "Courier", 724f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger "Courier New", 734f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger }; 744f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 754f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(gNames); ++i) { 764f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkTypeface* face = SkTypeface::CreateFromName(gNames[i], 774f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkTypeface::kNormal); 784f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger if (face) { 794f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#ifdef DUMP_TABLES 804f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkDebugf("%s\n", gNames[i]); 814f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#endif 824f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger test_tables(reporter, face); 834f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger face->unref(); 844f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 854f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger } 864f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger} 874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 884f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic void TestFontHost(skiatest::Reporter* reporter) { 894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger test_tables(reporter); 904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger} 914f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 924f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger// need tests for SkStrSearch 934f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 944f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "TestClassDef.h" 954f1dae40e24d57d647db01443b8bf2410514b8b5Derek SollenbergerDEFINE_TESTCLASS("FontHost", FontHostTestClass, TestFontHost) 96