1373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka/*
2373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka * Copyright (C) 2017 The Android Open Source Project
3373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka *
4373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License");
5373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka * you may not use this file except in compliance with the License.
6373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka * You may obtain a copy of the License at
7373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka *
8373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka *      http://www.apache.org/licenses/LICENSE-2.0
9373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka *
10373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka * Unless required by applicable law or agreed to in writing, software
11373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS,
12373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka * See the License for the specific language governing permissions and
14373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka * limitations under the License.
15373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka */
16373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
17373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka#include <gtest/gtest.h>
18373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
19373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka#include <fcntl.h>
20373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka#include <sys/mman.h>
21373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka#include <sys/stat.h>
22373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka#include <utils/Log.h>
23373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
24373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka#include "SkFontMgr.h"
25373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka#include "SkStream.h"
26373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
27373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka#include "hwui/MinikinSkia.h"
28373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka#include "hwui/Typeface.h"
29373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
30373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonakausing namespace android;
31373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
32373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonakanamespace {
33373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
34373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonakaconstexpr char kRobotoRegular[] = "/system/fonts/Roboto-Regular.ttf";
35373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonakaconstexpr char kRobotoBold[] = "/system/fonts/Roboto-Bold.ttf";
36373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonakaconstexpr char kRobotoItalic[] = "/system/fonts/Roboto-Italic.ttf";
37373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonakaconstexpr char kRobotoBoldItalic[] = "/system/fonts/Roboto-BoldItalic.ttf";
38373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
39373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonakavoid unmap(const void* ptr, void* context) {
40373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    void* p = const_cast<void*>(ptr);
41373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    size_t len = reinterpret_cast<size_t>(context);
42373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    munmap(p, len);
43373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
44373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
45373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonakastd::shared_ptr<minikin::FontFamily> buildFamily(const char* fileName) {
46373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    int fd = open(fileName, O_RDONLY);
47373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    LOG_ALWAYS_FATAL_IF(fd == -1, "Failed to open file %s", fileName);
48373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    struct stat st = {};
49373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    LOG_ALWAYS_FATAL_IF(fstat(fd, &st) == -1, "Failed to stat file %s", fileName);
50373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    void* data = mmap(nullptr, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
51373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    sk_sp<SkData> skData =
52373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            SkData::MakeWithProc(data, st.st_size, unmap, reinterpret_cast<void*>(st.st_size));
53373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<SkStreamAsset> fontData(new SkMemoryStream(skData));
54373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
55373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    sk_sp<SkTypeface> typeface(fm->createFromStream(fontData.release()));
56373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    LOG_ALWAYS_FATAL_IF(typeface == nullptr, "Failed to make typeface from %s", fileName);
57373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::shared_ptr<minikin::MinikinFont> font = std::make_shared<MinikinFontSkia>(
58373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            std::move(typeface), data, st.st_size, 0, std::vector<minikin::FontVariation>());
59373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    return std::make_shared<minikin::FontFamily>(
60373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            std::vector<minikin::Font>({ minikin::Font(std::move(font), minikin::FontStyle()) }));
61373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
62373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
63373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonakastd::vector<std::shared_ptr<minikin::FontFamily>> makeSingleFamlyVector(const char* fileName) {
64373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    return std::vector<std::shared_ptr<minikin::FontFamily>>({ buildFamily(fileName) });
65373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
66373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
67373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, resolveDefault_and_setDefaultTest) {
68373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> regular(
69373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoRegular),
70373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka                    RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
71373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(regular.get(), Typeface::resolveDefault(regular.get()));
72373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
73373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    Typeface* old = Typeface::resolveDefault(nullptr);  // Keep the original to restore it later.
74373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    ASSERT_NE(nullptr, old);
75373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
76373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    Typeface::setDefault(regular.get());
77373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(regular.get(), Typeface::resolveDefault(nullptr));
78373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
79373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    Typeface::setDefault(old);  // Restore to the original.
80373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
81373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
82373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createWithDifferentBaseWeight) {
83373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> bold(Typeface::createWithDifferentBaseWeight(nullptr, 700));
84373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, bold->fStyle.getWeight());
85373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(bold->fStyle.getItalic());
86373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, bold->fSkiaStyle);
87373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
88373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> light(Typeface::createWithDifferentBaseWeight(nullptr, 300));
89373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(3, light->fStyle.getWeight());
90373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(light->fStyle.getItalic());
91373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, light->fSkiaStyle);
92373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
93373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
94373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createRelativeTest_fromRegular) {
95373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.DEFAULT, Typeface.NORMAL);
96373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> normal(Typeface::createRelative(nullptr, SkTypeface::kNormal));
97373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, normal->fStyle.getWeight());
98373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(normal->fStyle.getItalic());
99373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
100373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
101373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.DEFAULT, Typeface.BOLD);
102373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> bold(Typeface::createRelative(nullptr, SkTypeface::kBold));
103373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, bold->fStyle.getWeight());
104373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(bold->fStyle.getItalic());
105373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
106373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
107373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.DEFAULT, Typeface.ITALIC);
108373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> italic(Typeface::createRelative(nullptr, SkTypeface::kItalic));
109373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, italic->fStyle.getWeight());
110373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(italic->fStyle.getItalic());
111373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
112373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
113373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.DEFAULT, Typeface.BOLD_ITALIC);
114373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> boldItalic(
115373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createRelative(nullptr, SkTypeface::kBoldItalic));
116373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, boldItalic->fStyle.getWeight());
117373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(boldItalic->fStyle.getItalic());
118373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
119373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
120373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
121373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createRelativeTest_BoldBase) {
122373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> base(Typeface::createWithDifferentBaseWeight(nullptr, 700));
123373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
124373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create("sans-serif-bold"), Typeface.NORMAL);
125373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), SkTypeface::kNormal));
126373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, normal->fStyle.getWeight());
127373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(normal->fStyle.getItalic());
128373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
129373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
130373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create("sans-serif-bold"), Typeface.BOLD);
131373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), SkTypeface::kBold));
132373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(10, bold->fStyle.getWeight());
133373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(bold->fStyle.getItalic());
134373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
135373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
136373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create("sans-serif-bold"), Typeface.ITALIC);
137373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), SkTypeface::kItalic));
138373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, italic->fStyle.getWeight());
139373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(italic->fStyle.getItalic());
140373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
141373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
142373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create("sans-serif-bold"), Typeface.BOLD_ITALIC);
143373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface>
144373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            boldItalic(Typeface::createRelative(base.get(), SkTypeface::kBoldItalic));
145373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(10, boldItalic->fStyle.getWeight());
146373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(boldItalic->fStyle.getItalic());
147373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
148373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
149373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
150373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createRelativeTest_LightBase) {
151373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> base(Typeface::createWithDifferentBaseWeight(nullptr, 300));
152373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
153373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create("sans-serif-light"), Typeface.NORMAL);
154373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), SkTypeface::kNormal));
155373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(3, normal->fStyle.getWeight());
156373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(normal->fStyle.getItalic());
157373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
158373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
159373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create("sans-serif-light"), Typeface.BOLD);
160373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), SkTypeface::kBold));
161373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(6, bold->fStyle.getWeight());
162373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(bold->fStyle.getItalic());
163373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
164373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
165373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create("sans-serif-light"), Typeface.ITLIC);
166373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), SkTypeface::kItalic));
167373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(3, italic->fStyle.getWeight());
168373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(italic->fStyle.getItalic());
169373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
170373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
171373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create("sans-serif-light"), Typeface.BOLD_ITALIC);
172373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface>
173373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            boldItalic(Typeface::createRelative(base.get(), SkTypeface::kBoldItalic));
174373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(6, boldItalic->fStyle.getWeight());
175373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(boldItalic->fStyle.getItalic());
176373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
177373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
178373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
179373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createRelativeTest_fromBoldStyled) {
180373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> base(Typeface::createRelative(nullptr, SkTypeface::kBold));
181373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
182373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), Typeface.NORMAL);
183373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), SkTypeface::kNormal));
184373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, normal->fStyle.getWeight());
185373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(normal->fStyle.getItalic());
186373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
187373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
188373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), Typeface.BOLD);
189373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), SkTypeface::kBold));
190373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, bold->fStyle.getWeight());
191373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(bold->fStyle.getItalic());
192373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
193373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
194373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), Typeface.ITALIC);
195373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), SkTypeface::kItalic));
196373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, normal->fStyle.getWeight());
197373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(italic->fStyle.getItalic());
198373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
199373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
200373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
201373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), Typeface.BOLD_ITALIC);
202373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface>
203373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            boldItalic(Typeface::createRelative(base.get(), SkTypeface::kBoldItalic));
204373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, boldItalic->fStyle.getWeight());
205373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(boldItalic->fStyle.getItalic());
206373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
207373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
208373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
209373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createRelativeTest_fromItalicStyled) {
210373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> base(Typeface::createRelative(nullptr, SkTypeface::kItalic));
211373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
212373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
213373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), Typeface.NORMAL);
214373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), SkTypeface::kNormal));
215373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, normal->fStyle.getWeight());
216373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(normal->fStyle.getItalic());
217373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
218373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
219373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), Typeface.BOLD);
220373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), SkTypeface::kBold));
221373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, bold->fStyle.getWeight());
222373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(bold->fStyle.getItalic());
223373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
224373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
225373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
226373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), Typeface.ITALIC);
227373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), SkTypeface::kItalic));
228373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, italic->fStyle.getWeight());
229373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(italic->fStyle.getItalic());
230373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
231373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
232373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
233373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), Typeface.BOLD_ITALIC);
234373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface>
235373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            boldItalic(Typeface::createRelative(base.get(), SkTypeface::kBoldItalic));
236373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, boldItalic->fStyle.getWeight());
237373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(boldItalic->fStyle.getItalic());
238373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
239373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
240373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
241373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createRelativeTest_fromSpecifiedStyled) {
242373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> base(Typeface::createAbsolute(nullptr, 400, false));
243373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
244373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
245373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
246373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    //     .setWeight(700).setItalic(false).build();
247373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface.create(typeface, Typeface.NORMAL);
248373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), SkTypeface::kNormal));
249373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, normal->fStyle.getWeight());
250373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(normal->fStyle.getItalic());
251373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, normal->fSkiaStyle);
252373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
253373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
254373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
255373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    //     .setWeight(700).setItalic(false).build();
256373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface.create(typeface, Typeface.BOLD);
257373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), SkTypeface::kBold));
258373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, bold->fStyle.getWeight());
259373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(bold->fStyle.getItalic());
260373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
261373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
262373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
263373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
264373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    //     .setWeight(700).setItalic(false).build();
265373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface.create(typeface, Typeface.ITALIC);
266373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), SkTypeface::kItalic));
267373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, italic->fStyle.getWeight());
268373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(italic->fStyle.getItalic());
269373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
270373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
271373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
272373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
273373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    //     .setWeight(700).setItalic(false).build();
274373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // Typeface.create(typeface, Typeface.BOLD_ITALIC);
275373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface>
276373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            boldItalic(Typeface::createRelative(base.get(), SkTypeface::kBoldItalic));
277373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, boldItalic->fStyle.getWeight());
278373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(boldItalic->fStyle.getItalic());
279373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
280373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
281373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
282373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createAbsolute) {
283373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
284373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // new Typeface.Builder(invalid).setFallback("sans-serif").setWeight(400).setItalic(false)
285373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    //     .build();
286373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> regular(Typeface::createAbsolute(nullptr, 400, false));
287373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, regular->fStyle.getWeight());
288373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(regular->fStyle.getItalic());
289373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, regular->fSkiaStyle);
290373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
291373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
292373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // new Typeface.Builder(invalid).setFallback("sans-serif").setWeight(700).setItalic(false)
293373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    //     .build();
294373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> bold(Typeface::createAbsolute(nullptr, 700, false));
295373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, bold->fStyle.getWeight());
296373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(bold->fStyle.getItalic());
297373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
298373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
299373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
300373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // new Typeface.Builder(invalid).setFallback("sans-serif").setWeight(400).setItalic(true)
301373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    //     .build();
302373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> italic(Typeface::createAbsolute(nullptr, 400, true));
303373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, italic->fStyle.getWeight());
304373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(italic->fStyle.getItalic());
305373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
306373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
307373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
308373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // new Typeface.Builder(invalid).setFallback("sans-serif").setWeight(700).setItalic(true)
309373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    //     .build();
310373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> boldItalic(Typeface::createAbsolute(nullptr, 700, true));
311373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, boldItalic->fStyle.getWeight());
312373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(boldItalic->fStyle.getItalic());
313373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBoldItalic, boldItalic->fSkiaStyle);
314373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
315373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
316373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // new Typeface.Builder(invalid).setFallback("sans-serif").setWeight(1100).setItalic(true)
317373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    //     .build();
318373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> over1000(Typeface::createAbsolute(nullptr, 1100, false));
319373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(10, over1000->fStyle.getWeight());
320373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(over1000->fStyle.getItalic());
321373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, over1000->fSkiaStyle);
322373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
323373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
324373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createFromFamilies_Single) {
325373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, new Typeface.Builder("Roboto-Regular.ttf").setWeight(400).setItalic(false).build();
326373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> regular(
327373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoRegular), 400, false));
328373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, regular->fStyle.getWeight());
329373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(regular->fStyle.getItalic());
330373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, regular->fSkiaStyle);
331373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
332373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, new Typeface.Builder("Roboto-Bold.ttf").setWeight(700).setItalic(false).build();
333373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> bold(
334373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold), 700, false));
335373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, bold->fStyle.getWeight());
336373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(bold->fStyle.getItalic());
337373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
338373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
339373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, new Typeface.Builder("Roboto-Italic.ttf").setWeight(400).setItalic(true).build();
340373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> italic(
341373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoItalic), 400, true));
342373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, italic->fStyle.getWeight());
343373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(italic->fStyle.getItalic());
344373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
345373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
346373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
347373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // new Typeface.Builder("Roboto-BoldItalic.ttf").setWeight(700).setItalic(true).build();
348373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> boldItalic(
349373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBoldItalic), 700, true));
350373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, boldItalic->fStyle.getWeight());
351373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(boldItalic->fStyle.getItalic());
352373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
353373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
354373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java,
355373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // new Typeface.Builder("Roboto-BoldItalic.ttf").setWeight(1100).setItalic(false).build();
356373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> over1000(
357373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold), 1100, false));
358373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(10, over1000->fStyle.getWeight());
359373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(over1000->fStyle.getItalic());
360373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, over1000->fSkiaStyle);
361373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
362373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
363373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createFromFamilies_Single_resolveByTable) {
364373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, new Typeface.Builder("Roboto-Regular.ttf").build();
365373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> regular(
366373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoRegular),
367373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka                    RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
368373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, regular->fStyle.getWeight());
369373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(regular->fStyle.getItalic());
370373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kNormal, regular->fSkiaStyle);
371373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
372373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, new Typeface.Builder("Roboto-Bold.ttf").build();
373373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> bold(
374373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold),
375373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka                    RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
376373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, bold->fStyle.getWeight());
377373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(bold->fStyle.getItalic());
378373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kBold, bold->fSkiaStyle);
379373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
380373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, new Typeface.Builder("Roboto-Italic.ttf").build();
381373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> italic(
382373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoItalic),
383373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka                    RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
384373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, italic->fStyle.getWeight());
385373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(italic->fStyle.getItalic());
386373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
387373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
388373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    // In Java, new Typeface.Builder("Roboto-BoldItalic.ttf").build();
389373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> boldItalic(
390373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBoldItalic),
391373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka                    RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
392373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, boldItalic->fStyle.getWeight());
393373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_TRUE(boldItalic->fStyle.getItalic());
394373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(SkTypeface::kItalic, italic->fSkiaStyle);
395373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
396373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
397373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createFromFamilies_Family) {
398373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::vector<std::shared_ptr<minikin::FontFamily>> families = {
399373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            buildFamily(kRobotoRegular), buildFamily(kRobotoBold), buildFamily(kRobotoItalic),
400373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            buildFamily(kRobotoBoldItalic)
401373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    };
402373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> typeface(Typeface::createFromFamilies(std::move(families),
403373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka                    RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
404373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(4, typeface->fStyle.getWeight());
405373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(typeface->fStyle.getItalic());
406373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
407373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
408373b15bda93c8b400c5e1271bc93cbef26af503fSeigo NonakaTEST(TypefaceTest, createFromFamilies_Family_withoutRegular) {
409373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::vector<std::shared_ptr<minikin::FontFamily>> families = {
410373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka            buildFamily(kRobotoBold), buildFamily(kRobotoItalic), buildFamily(kRobotoBoldItalic)
411373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    };
412373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    std::unique_ptr<Typeface> typeface(Typeface::createFromFamilies(std::move(families),
413373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka                    RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
414373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_EQ(7, typeface->fStyle.getWeight());
415373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka    EXPECT_FALSE(typeface->fStyle.getItalic());
416373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}
417373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka
418373b15bda93c8b400c5e1271bc93cbef26af503fSeigo Nonaka}  // namespace
419