1/* 2 * Copyright 2014 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 "tools/ToolUtils.h" 9 10#include "include/core/SkFontMgr.h" 11#include "include/core/SkFontStyle.h" 12#include "include/core/SkTypeface.h" 13#include "include/private/SkMutex.h" 14#include "include/utils/SkCustomTypeface.h" 15#include "src/core/SkOSFile.h" 16#include "src/utils/SkUTF.h" 17#include "tools/Resources.h" 18#include "tools/fonts/TestFontMgr.h" 19 20namespace ToolUtils { 21 22sk_sp<SkTypeface> planet_typeface() { 23 static const sk_sp<SkTypeface> planetTypeface = []() { 24 const char* filename; 25#if defined(SK_BUILD_FOR_WIN) 26 filename = "fonts/planetcolr.ttf"; 27#elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) 28 filename = "fonts/planetsbix.ttf"; 29#else 30 filename = "fonts/planetcbdt.ttf"; 31#endif 32 sk_sp<SkTypeface> typeface = MakeResourceAsTypeface(filename); 33 if (typeface) { 34 return typeface; 35 } 36 return SkTypeface::MakeFromName("Planet", SkFontStyle()); 37 }(); 38 return planetTypeface; 39} 40 41sk_sp<SkTypeface> emoji_typeface() { 42 static const sk_sp<SkTypeface> emojiTypeface = []() { 43 const char* filename; 44#if defined(SK_BUILD_FOR_WIN) 45 filename = "fonts/colr.ttf"; 46#elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) 47 filename = "fonts/sbix.ttf"; 48#else 49 filename = "fonts/cbdt.ttf"; 50#endif 51 sk_sp<SkTypeface> typeface = MakeResourceAsTypeface(filename); 52 if (typeface) { 53 return typeface; 54 } 55 return SkTypeface::MakeFromName("Emoji", SkFontStyle()); 56 }(); 57 return emojiTypeface; 58} 59 60const char* emoji_sample_text() { 61 return "\xF0\x9F\x98\x80" 62 " " 63 "\xE2\x99\xA2"; // ♢ 64} 65 66sk_sp<SkTypeface> sample_user_typeface() { 67 SkCustomTypefaceBuilder builder; 68 SkFont font; 69 const float upem = 200; 70 71 { 72 SkFontMetrics metrics; 73 metrics.fFlags = 0; 74 metrics.fTop = -200; 75 metrics.fAscent = -150; 76 metrics.fDescent = 50; 77 metrics.fBottom = -75; 78 metrics.fLeading = 10; 79 metrics.fAvgCharWidth = 150; 80 metrics.fMaxCharWidth = 300; 81 metrics.fXMin = -20; 82 metrics.fXMax = 290; 83 metrics.fXHeight = -100; 84 metrics.fCapHeight = 0; 85 metrics.fUnderlineThickness = 5; 86 metrics.fUnderlinePosition = 2; 87 metrics.fStrikeoutThickness = 5; 88 metrics.fStrikeoutPosition = -50; 89 builder.setMetrics(metrics, 1.0f/upem); 90 } 91 builder.setFontStyle(SkFontStyle(367, 3, SkFontStyle::kOblique_Slant)); 92 93 const SkMatrix scale = SkMatrix::Scale(1.0f/upem, 1.0f/upem); 94 for (SkGlyphID index = 0; index <= 67; ++index) { 95 SkScalar width; 96 width = 100; 97 98 builder.setGlyph(index, width/upem, SkPath::Circle(50, -50, 75).makeTransform(scale)); 99 } 100 101 return builder.detach(); 102} 103 104static sk_sp<SkTypeface> create_font(const char* name, SkFontStyle style) { 105 static sk_sp<SkFontMgr> portableFontMgr = MakePortableFontMgr(); 106 return portableFontMgr->legacyMakeTypeface(name, style); 107} 108 109sk_sp<SkTypeface> create_portable_typeface(const char* name, SkFontStyle style) { 110 return create_font(name, style); 111} 112} // namespace ToolUtils 113