1/*
2 * Copyright 2013 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 "SkCommandLineFlags.h"
9#include "SkFontMgr.h"
10#include "SkTypeface.h"
11#include "Test.h"
12
13#include "SkFont.h"
14#include "SkPaint.h"
15static void test_font(skiatest::Reporter* reporter) {
16    uint32_t flags = 0;
17    SkAutoTUnref<SkFont> font(SkFont::Create(NULL, 24, SkFont::kA8_MaskType, flags));
18
19    REPORTER_ASSERT(reporter, font->getTypeface());
20    REPORTER_ASSERT(reporter, 24 == font->getSize());
21    REPORTER_ASSERT(reporter, 1 == font->getScaleX());
22    REPORTER_ASSERT(reporter, 0 == font->getSkewX());
23    REPORTER_ASSERT(reporter, SkFont::kA8_MaskType == font->getMaskType());
24
25    uint16_t glyphs[5];
26    sk_bzero(glyphs, sizeof(glyphs));
27
28    int count = font->textToGlyphs("Hello", 5, kUTF8_SkTextEncoding, glyphs, SK_ARRAY_COUNT(glyphs));
29
30    REPORTER_ASSERT(reporter, 5 == count);
31    for (int i = 0; i < count; ++i) {
32        REPORTER_ASSERT(reporter, 0 != glyphs[i]);
33    }
34    REPORTER_ASSERT(reporter, glyphs[0] != glyphs[1]); // 'h' != 'e'
35    REPORTER_ASSERT(reporter, glyphs[2] == glyphs[3]); // 'l' == 'l'
36
37    SkAutoTUnref<SkFont> newFont(font->cloneWithSize(36));
38    REPORTER_ASSERT(reporter, newFont.get());
39    REPORTER_ASSERT(reporter, font->getTypeface() == newFont->getTypeface());
40    REPORTER_ASSERT(reporter, 36 == newFont->getSize());   // double check we haven't changed
41    REPORTER_ASSERT(reporter, 24 == font->getSize());   // double check we haven't changed
42
43    SkPaint paint;
44    paint.setTextSize(18);
45    font.reset(SkFont::Testing_CreateFromPaint(paint));
46    REPORTER_ASSERT(reporter, font.get());
47    REPORTER_ASSERT(reporter, font->getSize() == paint.getTextSize());
48    REPORTER_ASSERT(reporter, SkFont::kBW_MaskType == font->getMaskType());
49}
50
51/*
52 *  If the font backend is going to "alias" some font names to other fonts
53 *  (e.g. sans -> Arial) then we want to at least get the same typeface back
54 *  if we request the alias name multiple times.
55 */
56static void test_alias_names(skiatest::Reporter* reporter) {
57    const char* inNames[] = {
58        "sans", "sans-serif", "serif", "monospace", "times", "helvetica"
59    };
60
61    for (size_t i = 0; i < SK_ARRAY_COUNT(inNames); ++i) {
62        SkAutoTUnref<SkTypeface> first(SkTypeface::CreateFromName(inNames[i],
63                                                          SkTypeface::kNormal));
64        if (NULL == first.get()) {
65            continue;
66        }
67        for (int j = 0; j < 10; ++j) {
68            SkAutoTUnref<SkTypeface> face(SkTypeface::CreateFromName(inNames[i],
69                                                         SkTypeface::kNormal));
70    #if 0
71            SkString name;
72            face->getFamilyName(&name);
73            printf("request %s, received %s, first id %x received %x\n",
74                   inNames[i], name.c_str(), first->uniqueID(), face->uniqueID());
75    #endif
76            REPORTER_ASSERT(reporter, first->uniqueID() == face->uniqueID());
77        }
78    }
79}
80
81static void test_fontiter(skiatest::Reporter* reporter, bool verbose) {
82    SkAutoTUnref<SkFontMgr> fm(SkFontMgr::RefDefault());
83    int count = fm->countFamilies();
84
85    for (int i = 0; i < count; ++i) {
86        SkString fname;
87        fm->getFamilyName(i, &fname);
88
89        SkAutoTUnref<SkFontStyleSet> fnset(fm->matchFamily(fname.c_str()));
90        SkAutoTUnref<SkFontStyleSet> set(fm->createStyleSet(i));
91        REPORTER_ASSERT(reporter, fnset->count() == set->count());
92
93        if (verbose) {
94            SkDebugf("[%2d] %s\n", i, fname.c_str());
95        }
96
97        for (int j = 0; j < set->count(); ++j) {
98            SkString sname;
99            SkFontStyle fs;
100            set->getStyle(j, &fs, &sname);
101//            REPORTER_ASSERT(reporter, sname.size() > 0);
102
103            SkAutoTUnref<SkTypeface> face(set->createTypeface(j));
104//            REPORTER_ASSERT(reporter, face.get());
105
106            if (verbose) {
107                SkDebugf("\t[%d] %s [%3d %d %d]\n", j, sname.c_str(),
108                         fs.weight(), fs.width(), fs.isItalic());
109            }
110        }
111    }
112}
113
114DEFINE_bool(verboseFontMgr, false, "run verbose fontmgr tests.");
115
116DEF_TEST(FontMgr, reporter) {
117    test_fontiter(reporter, FLAGS_verboseFontMgr);
118    test_alias_names(reporter);
119    test_font(reporter);
120}
121