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