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 "Resources.h"
9#include "SkFontMgr.h"
10#include "SkMutex.h"
11#include "SkOSFile.h"
12#include "SkTestScalerContext.h"
13#include "SkUtils.h"
14#include "sk_tool_utils.h"
15
16namespace sk_tool_utils {
17
18#include "test_font_monospace.inc"
19#include "test_font_sans_serif.inc"
20#include "test_font_serif.inc"
21#include "test_font_index.inc"
22
23void release_portable_typefaces() {
24    for (int index = 0; index < gTestFontsCount; ++index) {
25        SkTestFontData& fontData = gTestFonts[index];
26        fontData.fCachedFont.reset();
27    }
28}
29
30SK_DECLARE_STATIC_MUTEX(gTestFontMutex);
31
32sk_sp<SkTypeface> create_font(const char* name, SkFontStyle style) {
33    SkTestFontData* fontData = nullptr;
34    const SubFont* sub;
35    if (name) {
36        for (int index = 0; index < gSubFontsCount; ++index) {
37            sub = &gSubFonts[index];
38            if (!strcmp(name, sub->fName) && sub->fStyle == style) {
39                fontData = &sub->fFont;
40                break;
41            }
42        }
43        if (!fontData) {
44            // Once all legacy callers to portable fonts are converted, replace this with
45            // SK_ABORT();
46            SkDebugf("missing %s weight %d, width %d, slant %d\n",
47                     name, style.weight(), style.width(), style.slant());
48            // If we called SkTypeface::CreateFromName() here we'd recurse infinitely,
49            // so we reimplement its core logic here inline without the recursive aspect.
50            sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
51            return fm->legacyMakeTypeface(name, style);
52        }
53    } else {
54        sub = &gSubFonts[gDefaultFontIndex];
55        fontData = &sub->fFont;
56    }
57    sk_sp<SkTestFont> font;
58    {
59        SkAutoMutexAcquire ac(gTestFontMutex);
60        if (fontData->fCachedFont) {
61            font = fontData->fCachedFont;
62        } else {
63            font = sk_make_sp<SkTestFont>(*fontData);
64            fontData->fCachedFont = font;
65        }
66    }
67    return sk_make_sp<SkTestTypeface>(std::move(font), style);
68}
69
70}
71