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