Home | History | Annotate | Download | only in tests
      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"
     15 static 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  */
     56 static 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 
     81 static 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 
    114 DEFINE_bool(verboseFontMgr, false, "run verbose fontmgr tests.");
    115 
    116 DEF_TEST(FontMgr, reporter) {
    117     test_fontiter(reporter, FLAGS_verboseFontMgr);
    118     test_alias_names(reporter);
    119     test_font(reporter);
    120 }
    121