183165a5f71319b04beb561afb7c968493027bcbdreed@google.com/* 283165a5f71319b04beb561afb7c968493027bcbdreed@google.com * Copyright 2013 Google Inc. 383165a5f71319b04beb561afb7c968493027bcbdreed@google.com * 483165a5f71319b04beb561afb7c968493027bcbdreed@google.com * Use of this source code is governed by a BSD-style license that can be 583165a5f71319b04beb561afb7c968493027bcbdreed@google.com * found in the LICENSE file. 683165a5f71319b04beb561afb7c968493027bcbdreed@google.com */ 783165a5f71319b04beb561afb7c968493027bcbdreed@google.com 883165a5f71319b04beb561afb7c968493027bcbdreed@google.com#include "SkCommandLineFlags.h" 983165a5f71319b04beb561afb7c968493027bcbdreed@google.com#include "SkFontMgr.h" 1083165a5f71319b04beb561afb7c968493027bcbdreed@google.com#include "SkTypeface.h" 118f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h" 1283165a5f71319b04beb561afb7c968493027bcbdreed@google.com 1343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com#include "SkFont.h" 1443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com#include "SkPaint.h" 1543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.comstatic void test_font(skiatest::Reporter* reporter) { 1643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com uint32_t flags = 0; 1743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkAutoTUnref<SkFont> font(SkFont::Create(NULL, 24, SkFont::kA8_MaskType, flags)); 18e1d94437585dad1c195d7cf095f8a5a8219d196askia.committer@gmail.com 1943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, NULL != font->getTypeface()); 2043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, 24 == font->getSize()); 2143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, 1 == font->getScaleX()); 2243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, 0 == font->getSkewX()); 2343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, SkFont::kA8_MaskType == font->getMaskType()); 2443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 2543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com uint16_t glyphs[5]; 2643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com sk_bzero(glyphs, sizeof(glyphs)); 2743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 2843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com int count = font->textToGlyphs("Hello", 5, kUTF8_SkTextEncoding, glyphs, SK_ARRAY_COUNT(glyphs)); 2943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 3043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, 5 == count); 3143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com for (int i = 0; i < count; ++i) { 3243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, 0 != glyphs[i]); 3343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com } 3443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, glyphs[0] != glyphs[1]); // 'h' != 'e' 3543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, glyphs[2] == glyphs[3]); // 'l' == 'l' 36e1d94437585dad1c195d7cf095f8a5a8219d196askia.committer@gmail.com 3743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkAutoTUnref<SkFont> newFont(font->cloneWithSize(36)); 3843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, newFont.get()); 3943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, font->getTypeface() == newFont->getTypeface()); 4043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, 36 == newFont->getSize()); // double check we haven't changed 4143c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, 24 == font->getSize()); // double check we haven't changed 4243c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 4343c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com SkPaint paint; 4443c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com paint.setTextSize(18); 4543c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com font.reset(SkFont::Testing_CreateFromPaint(paint)); 4643c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, font.get()); 4743c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, font->getSize() == paint.getTextSize()); 4843c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com REPORTER_ASSERT(reporter, SkFont::kBW_MaskType == font->getMaskType()); 4943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com} 5043c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com 51d44d988127841cf9180bb7ba91b6eba8127af467reed@google.com/* 52d44d988127841cf9180bb7ba91b6eba8127af467reed@google.com * If the font backend is going to "alias" some font names to other fonts 53d44d988127841cf9180bb7ba91b6eba8127af467reed@google.com * (e.g. sans -> Arial) then we want to at least get the same typeface back 54d44d988127841cf9180bb7ba91b6eba8127af467reed@google.com * if we request the alias name multiple times. 55d44d988127841cf9180bb7ba91b6eba8127af467reed@google.com */ 56c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.comstatic void test_alias_names(skiatest::Reporter* reporter) { 57c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com const char* inNames[] = { 58c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com "sans", "sans-serif", "serif", "monospace", "times", "helvetica" 59c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com }; 60f91e3d4f54de9976b6538decadd977b19e49eaddskia.committer@gmail.com 61c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(inNames); ++i) { 62c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com SkAutoTUnref<SkTypeface> first(SkTypeface::CreateFromName(inNames[i], 63c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com SkTypeface::kNormal)); 64c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com if (NULL == first.get()) { 65c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com continue; 66c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com } 67c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com for (int j = 0; j < 10; ++j) { 68c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com SkAutoTUnref<SkTypeface> face(SkTypeface::CreateFromName(inNames[i], 69c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com SkTypeface::kNormal)); 70c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com #if 0 71c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com SkString name; 72c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com face->getFamilyName(&name); 73c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com printf("request %s, received %s, first id %x received %x\n", 74c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com inNames[i], name.c_str(), first->uniqueID(), face->uniqueID()); 75c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com #endif 76c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com REPORTER_ASSERT(reporter, first->uniqueID() == face->uniqueID()); 77c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com } 78d44d988127841cf9180bb7ba91b6eba8127af467reed@google.com } 79d44d988127841cf9180bb7ba91b6eba8127af467reed@google.com} 80d44d988127841cf9180bb7ba91b6eba8127af467reed@google.com 8183165a5f71319b04beb561afb7c968493027bcbdreed@google.comstatic void test_fontiter(skiatest::Reporter* reporter, bool verbose) { 8283165a5f71319b04beb561afb7c968493027bcbdreed@google.com SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault()); 8383165a5f71319b04beb561afb7c968493027bcbdreed@google.com int count = fm->countFamilies(); 8483165a5f71319b04beb561afb7c968493027bcbdreed@google.com 8583165a5f71319b04beb561afb7c968493027bcbdreed@google.com for (int i = 0; i < count; ++i) { 8683165a5f71319b04beb561afb7c968493027bcbdreed@google.com SkString fname; 8783165a5f71319b04beb561afb7c968493027bcbdreed@google.com fm->getFamilyName(i, &fname); 8883165a5f71319b04beb561afb7c968493027bcbdreed@google.com 897103344b64f3f0df88e76857c16edc8eedb58366bungeman@google.com SkAutoTUnref<SkFontStyleSet> fnset(fm->matchFamily(fname.c_str())); 9083165a5f71319b04beb561afb7c968493027bcbdreed@google.com SkAutoTUnref<SkFontStyleSet> set(fm->createStyleSet(i)); 917103344b64f3f0df88e76857c16edc8eedb58366bungeman@google.com REPORTER_ASSERT(reporter, fnset->count() == set->count()); 9283165a5f71319b04beb561afb7c968493027bcbdreed@google.com 9383165a5f71319b04beb561afb7c968493027bcbdreed@google.com if (verbose) { 9483165a5f71319b04beb561afb7c968493027bcbdreed@google.com SkDebugf("[%2d] %s\n", i, fname.c_str()); 9583165a5f71319b04beb561afb7c968493027bcbdreed@google.com } 9683165a5f71319b04beb561afb7c968493027bcbdreed@google.com 9783165a5f71319b04beb561afb7c968493027bcbdreed@google.com for (int j = 0; j < set->count(); ++j) { 9883165a5f71319b04beb561afb7c968493027bcbdreed@google.com SkString sname; 9983165a5f71319b04beb561afb7c968493027bcbdreed@google.com SkFontStyle fs; 10083165a5f71319b04beb561afb7c968493027bcbdreed@google.com set->getStyle(j, &fs, &sname); 101eb02957a5ff4e7b639263b2071e5e2522c7bc4fareed@google.com// REPORTER_ASSERT(reporter, sname.size() > 0); 10283165a5f71319b04beb561afb7c968493027bcbdreed@google.com 10383165a5f71319b04beb561afb7c968493027bcbdreed@google.com SkAutoTUnref<SkTypeface> face(set->createTypeface(j)); 104c1ccda3af8c462dc99d5893806baac3bd85fa5d3reed@google.com// REPORTER_ASSERT(reporter, face.get()); 10583165a5f71319b04beb561afb7c968493027bcbdreed@google.com 10683165a5f71319b04beb561afb7c968493027bcbdreed@google.com if (verbose) { 10783165a5f71319b04beb561afb7c968493027bcbdreed@google.com SkDebugf("\t[%d] %s [%3d %d %d]\n", j, sname.c_str(), 10883165a5f71319b04beb561afb7c968493027bcbdreed@google.com fs.weight(), fs.width(), fs.isItalic()); 10983165a5f71319b04beb561afb7c968493027bcbdreed@google.com } 11083165a5f71319b04beb561afb7c968493027bcbdreed@google.com } 11183165a5f71319b04beb561afb7c968493027bcbdreed@google.com } 11283165a5f71319b04beb561afb7c968493027bcbdreed@google.com} 11383165a5f71319b04beb561afb7c968493027bcbdreed@google.com 11466c9f9995ec581f578aa7de4f0defe7dd728fa7ereed@google.comDEFINE_bool(verboseFontMgr, false, "run verbose fontmgr tests."); 11583165a5f71319b04beb561afb7c968493027bcbdreed@google.com 116e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(FontMgr, reporter) { 11783165a5f71319b04beb561afb7c968493027bcbdreed@google.com test_fontiter(reporter, FLAGS_verboseFontMgr); 118c1a81ebec52bc5dff8c9461570e1212afe09506freed@google.com test_alias_names(reporter); 11943c27586e8b02243c16649de1cd7d95dcea0a712reed@google.com test_font(reporter); 12083165a5f71319b04beb561afb7c968493027bcbdreed@google.com} 121