blob: e424a266bf725c3f27bab00d5d49642190e62a09 [file] [log] [blame]
Seigo Nonaka1f9c4612017-05-01 22:17:36 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gtest/gtest.h>
18
19#include <fcntl.h>
20#include <sys/mman.h>
21#include <sys/stat.h>
22#include <utils/Log.h>
23
24#include "SkFontMgr.h"
25#include "SkStream.h"
26
27#include "hwui/MinikinSkia.h"
28#include "hwui/Typeface.h"
29
30using namespace android;
31
32namespace {
33
34constexpr char kRobotoRegular[] = "/system/fonts/Roboto-Regular.ttf";
35constexpr char kRobotoBold[] = "/system/fonts/Roboto-Bold.ttf";
36constexpr char kRobotoItalic[] = "/system/fonts/Roboto-Italic.ttf";
37constexpr char kRobotoBoldItalic[] = "/system/fonts/Roboto-BoldItalic.ttf";
38
39void unmap(const void* ptr, void* context) {
40 void* p = const_cast<void*>(ptr);
41 size_t len = reinterpret_cast<size_t>(context);
42 munmap(p, len);
43}
44
45std::shared_ptr<minikin::FontFamily> buildFamily(const char* fileName) {
46 int fd = open(fileName, O_RDONLY);
47 LOG_ALWAYS_FATAL_IF(fd == -1, "Failed to open file %s", fileName);
48 struct stat st = {};
49 LOG_ALWAYS_FATAL_IF(fstat(fd, &st) == -1, "Failed to stat file %s", fileName);
50 void* data = mmap(nullptr, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
51 sk_sp<SkData> skData =
52 SkData::MakeWithProc(data, st.st_size, unmap, reinterpret_cast<void*>(st.st_size));
53 std::unique_ptr<SkStreamAsset> fontData(new SkMemoryStream(skData));
54 sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
Mike Reed839a1862017-09-26 16:06:34 -040055 sk_sp<SkTypeface> typeface(fm->makeFromStream(std::move(fontData)));
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070056 LOG_ALWAYS_FATAL_IF(typeface == nullptr, "Failed to make typeface from %s", fileName);
57 std::shared_ptr<minikin::MinikinFont> font = std::make_shared<MinikinFontSkia>(
58 std::move(typeface), data, st.st_size, 0, std::vector<minikin::FontVariation>());
Seigo Nonaka99d66f02018-01-30 15:01:26 -080059 std::vector<minikin::Font> fonts;
Seigo Nonaka0606a882018-01-31 19:29:40 -080060 fonts.push_back(minikin::Font::Builder(font).build());
Seigo Nonaka99d66f02018-01-30 15:01:26 -080061 return std::make_shared<minikin::FontFamily>(std::move(fonts));
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070062}
63
64std::vector<std::shared_ptr<minikin::FontFamily>> makeSingleFamlyVector(const char* fileName) {
John Reck1bcacfd2017-11-03 10:12:19 -070065 return std::vector<std::shared_ptr<minikin::FontFamily>>({buildFamily(fileName)});
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070066}
67
68TEST(TypefaceTest, resolveDefault_and_setDefaultTest) {
John Reck1bcacfd2017-11-03 10:12:19 -070069 std::unique_ptr<Typeface> regular(Typeface::createFromFamilies(
70 makeSingleFamlyVector(kRobotoRegular), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070071 EXPECT_EQ(regular.get(), Typeface::resolveDefault(regular.get()));
72
Seigo Nonaka318ca042017-08-01 16:36:18 -070073 // Keep the original to restore it later.
74 const Typeface* old = Typeface::resolveDefault(nullptr);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070075 ASSERT_NE(nullptr, old);
76
77 Typeface::setDefault(regular.get());
78 EXPECT_EQ(regular.get(), Typeface::resolveDefault(nullptr));
79
80 Typeface::setDefault(old); // Restore to the original.
81}
82
83TEST(TypefaceTest, createWithDifferentBaseWeight) {
84 std::unique_ptr<Typeface> bold(Typeface::createWithDifferentBaseWeight(nullptr, 700));
Seigo Nonakac52075e2017-11-17 15:40:06 -080085 EXPECT_EQ(700, bold->fStyle.weight());
86 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -040087 EXPECT_EQ(Typeface::kNormal, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070088
89 std::unique_ptr<Typeface> light(Typeface::createWithDifferentBaseWeight(nullptr, 300));
Seigo Nonakac52075e2017-11-17 15:40:06 -080090 EXPECT_EQ(300, light->fStyle.weight());
91 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, light->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -040092 EXPECT_EQ(Typeface::kNormal, light->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070093}
94
95TEST(TypefaceTest, createRelativeTest_fromRegular) {
96 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -040097 std::unique_ptr<Typeface> normal(Typeface::createRelative(nullptr, Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -080098 EXPECT_EQ(400, normal->fStyle.weight());
99 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400100 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700101
102 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400103 std::unique_ptr<Typeface> bold(Typeface::createRelative(nullptr, Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800104 EXPECT_EQ(700, bold->fStyle.weight());
105 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400106 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700107
108 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.ITALIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400109 std::unique_ptr<Typeface> italic(Typeface::createRelative(nullptr, Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800110 EXPECT_EQ(400, italic->fStyle.weight());
111 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400112 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700113
114 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700115 std::unique_ptr<Typeface> boldItalic(Typeface::createRelative(nullptr, Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800116 EXPECT_EQ(700, boldItalic->fStyle.weight());
117 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400118 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700119}
120
121TEST(TypefaceTest, createRelativeTest_BoldBase) {
122 std::unique_ptr<Typeface> base(Typeface::createWithDifferentBaseWeight(nullptr, 700));
123
Seigo Nonaka20866c12017-10-26 16:02:01 -0700124 // In Java, Typeface.create(Typeface.create("sans-serif-bold"),
125 // Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -0400126 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800127 EXPECT_EQ(700, normal->fStyle.weight());
128 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400129 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700130
Seigo Nonaka20866c12017-10-26 16:02:01 -0700131 // In Java, Typeface.create(Typeface.create("sans-serif-bold"),
132 // Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400133 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800134 EXPECT_EQ(1000, bold->fStyle.weight());
135 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400136 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700137
Seigo Nonaka20866c12017-10-26 16:02:01 -0700138 // In Java, Typeface.create(Typeface.create("sans-serif-bold"),
139 // Typeface.ITALIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400140 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800141 EXPECT_EQ(700, italic->fStyle.weight());
142 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400143 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700144
Seigo Nonaka20866c12017-10-26 16:02:01 -0700145 // In Java, Typeface.create(Typeface.create("sans-serif-bold"),
146 // Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700147 std::unique_ptr<Typeface> boldItalic(
148 Typeface::createRelative(base.get(), Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800149 EXPECT_EQ(1000, boldItalic->fStyle.weight());
150 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400151 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700152}
153
154TEST(TypefaceTest, createRelativeTest_LightBase) {
155 std::unique_ptr<Typeface> base(Typeface::createWithDifferentBaseWeight(nullptr, 300));
156
Seigo Nonaka20866c12017-10-26 16:02:01 -0700157 // In Java, Typeface.create(Typeface.create("sans-serif-light"),
158 // Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -0400159 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800160 EXPECT_EQ(300, normal->fStyle.weight());
161 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400162 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700163
Seigo Nonaka20866c12017-10-26 16:02:01 -0700164 // In Java, Typeface.create(Typeface.create("sans-serif-light"),
165 // Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400166 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800167 EXPECT_EQ(600, bold->fStyle.weight());
168 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400169 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700170
Seigo Nonaka20866c12017-10-26 16:02:01 -0700171 // In Java, Typeface.create(Typeface.create("sans-serif-light"),
172 // Typeface.ITLIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400173 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800174 EXPECT_EQ(300, italic->fStyle.weight());
175 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400176 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700177
Seigo Nonaka20866c12017-10-26 16:02:01 -0700178 // In Java, Typeface.create(Typeface.create("sans-serif-light"),
179 // Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700180 std::unique_ptr<Typeface> boldItalic(
181 Typeface::createRelative(base.get(), Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800182 EXPECT_EQ(600, boldItalic->fStyle.weight());
183 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400184 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700185}
186
187TEST(TypefaceTest, createRelativeTest_fromBoldStyled) {
Ben Wagner2763fb72017-10-06 17:36:23 -0400188 std::unique_ptr<Typeface> base(Typeface::createRelative(nullptr, Typeface::kBold));
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700189
Seigo Nonaka20866c12017-10-26 16:02:01 -0700190 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD),
191 // Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -0400192 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800193 EXPECT_EQ(400, normal->fStyle.weight());
194 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400195 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700196
Seigo Nonaka20866c12017-10-26 16:02:01 -0700197 // In Java Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD),
198 // Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400199 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800200 EXPECT_EQ(700, bold->fStyle.weight());
201 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400202 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700203
Seigo Nonaka20866c12017-10-26 16:02:01 -0700204 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD),
205 // Typeface.ITALIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400206 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800207 EXPECT_EQ(400, normal->fStyle.weight());
208 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400209 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700210
211 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700212 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD),
213 // Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700214 std::unique_ptr<Typeface> boldItalic(
215 Typeface::createRelative(base.get(), Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800216 EXPECT_EQ(700, boldItalic->fStyle.weight());
217 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400218 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700219}
220
221TEST(TypefaceTest, createRelativeTest_fromItalicStyled) {
Ben Wagner2763fb72017-10-06 17:36:23 -0400222 std::unique_ptr<Typeface> base(Typeface::createRelative(nullptr, Typeface::kItalic));
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700223
224 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700225 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC),
226 // Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -0400227 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800228 EXPECT_EQ(400, normal->fStyle.weight());
229 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400230 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700231
Seigo Nonaka20866c12017-10-26 16:02:01 -0700232 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT,
233 // Typeface.ITALIC), Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400234 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800235 EXPECT_EQ(700, bold->fStyle.weight());
236 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400237 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700238
239 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700240 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC),
241 // Typeface.ITALIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400242 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800243 EXPECT_EQ(400, italic->fStyle.weight());
244 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400245 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700246
247 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700248 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC),
249 // Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700250 std::unique_ptr<Typeface> boldItalic(
251 Typeface::createRelative(base.get(), Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800252 EXPECT_EQ(700, boldItalic->fStyle.weight());
253 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400254 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700255}
256
257TEST(TypefaceTest, createRelativeTest_fromSpecifiedStyled) {
258 std::unique_ptr<Typeface> base(Typeface::createAbsolute(nullptr, 400, false));
259
260 // In Java,
261 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
262 // .setWeight(700).setItalic(false).build();
263 // Typeface.create(typeface, Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -0400264 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800265 EXPECT_EQ(400, normal->fStyle.weight());
266 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400267 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700268
269 // In Java,
270 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
271 // .setWeight(700).setItalic(false).build();
272 // Typeface.create(typeface, Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400273 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800274 EXPECT_EQ(700, bold->fStyle.weight());
275 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400276 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700277
278 // In Java,
279 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
280 // .setWeight(700).setItalic(false).build();
281 // Typeface.create(typeface, Typeface.ITALIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400282 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800283 EXPECT_EQ(400, italic->fStyle.weight());
284 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400285 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700286
287 // In Java,
288 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
289 // .setWeight(700).setItalic(false).build();
290 // Typeface.create(typeface, Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700291 std::unique_ptr<Typeface> boldItalic(
292 Typeface::createRelative(base.get(), Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800293 EXPECT_EQ(700, boldItalic->fStyle.weight());
294 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400295 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700296}
297
298TEST(TypefaceTest, createAbsolute) {
299 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700300 // new
301 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(400).setItalic(false)
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700302 // .build();
303 std::unique_ptr<Typeface> regular(Typeface::createAbsolute(nullptr, 400, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800304 EXPECT_EQ(400, regular->fStyle.weight());
305 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, regular->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400306 EXPECT_EQ(Typeface::kNormal, regular->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700307
308 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700309 // new
310 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(700).setItalic(false)
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700311 // .build();
312 std::unique_ptr<Typeface> bold(Typeface::createAbsolute(nullptr, 700, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800313 EXPECT_EQ(700, bold->fStyle.weight());
314 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400315 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700316
317 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700318 // new
319 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(400).setItalic(true)
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700320 // .build();
321 std::unique_ptr<Typeface> italic(Typeface::createAbsolute(nullptr, 400, true));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800322 EXPECT_EQ(400, italic->fStyle.weight());
323 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400324 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700325
326 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700327 // new
328 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(700).setItalic(true)
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700329 // .build();
330 std::unique_ptr<Typeface> boldItalic(Typeface::createAbsolute(nullptr, 700, true));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800331 EXPECT_EQ(700, boldItalic->fStyle.weight());
332 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400333 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700334
335 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700336 // new
337 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(1100).setItalic(true)
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700338 // .build();
339 std::unique_ptr<Typeface> over1000(Typeface::createAbsolute(nullptr, 1100, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800340 EXPECT_EQ(1000, over1000->fStyle.weight());
341 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, over1000->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400342 EXPECT_EQ(Typeface::kBold, over1000->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700343}
344
345TEST(TypefaceTest, createFromFamilies_Single) {
Seigo Nonaka20866c12017-10-26 16:02:01 -0700346 // In Java, new
347 // Typeface.Builder("Roboto-Regular.ttf").setWeight(400).setItalic(false).build();
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700348 std::unique_ptr<Typeface> regular(
349 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoRegular), 400, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800350 EXPECT_EQ(400, regular->fStyle.weight());
351 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, regular->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400352 EXPECT_EQ(Typeface::kNormal, regular->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700353
Seigo Nonaka20866c12017-10-26 16:02:01 -0700354 // In Java, new
355 // Typeface.Builder("Roboto-Bold.ttf").setWeight(700).setItalic(false).build();
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700356 std::unique_ptr<Typeface> bold(
357 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold), 700, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800358 EXPECT_EQ(700, bold->fStyle.weight());
359 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400360 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700361
Seigo Nonaka20866c12017-10-26 16:02:01 -0700362 // In Java, new
363 // Typeface.Builder("Roboto-Italic.ttf").setWeight(400).setItalic(true).build();
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700364 std::unique_ptr<Typeface> italic(
365 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoItalic), 400, true));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800366 EXPECT_EQ(400, italic->fStyle.weight());
367 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400368 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700369
370 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700371 // new
372 // Typeface.Builder("Roboto-BoldItalic.ttf").setWeight(700).setItalic(true).build();
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700373 std::unique_ptr<Typeface> boldItalic(
374 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBoldItalic), 700, true));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800375 EXPECT_EQ(700, boldItalic->fStyle.weight());
376 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400377 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700378
379 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700380 // new
381 // Typeface.Builder("Roboto-BoldItalic.ttf").setWeight(1100).setItalic(false).build();
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700382 std::unique_ptr<Typeface> over1000(
383 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold), 1100, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800384 EXPECT_EQ(1000, over1000->fStyle.weight());
385 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, over1000->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400386 EXPECT_EQ(Typeface::kBold, over1000->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700387}
388
389TEST(TypefaceTest, createFromFamilies_Single_resolveByTable) {
390 // In Java, new Typeface.Builder("Roboto-Regular.ttf").build();
John Reck1bcacfd2017-11-03 10:12:19 -0700391 std::unique_ptr<Typeface> regular(Typeface::createFromFamilies(
392 makeSingleFamlyVector(kRobotoRegular), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800393 EXPECT_EQ(400, regular->fStyle.weight());
394 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, regular->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400395 EXPECT_EQ(Typeface::kNormal, regular->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700396
397 // In Java, new Typeface.Builder("Roboto-Bold.ttf").build();
John Reck1bcacfd2017-11-03 10:12:19 -0700398 std::unique_ptr<Typeface> bold(Typeface::createFromFamilies(
399 makeSingleFamlyVector(kRobotoBold), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800400 EXPECT_EQ(700, bold->fStyle.weight());
401 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400402 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700403
404 // In Java, new Typeface.Builder("Roboto-Italic.ttf").build();
John Reck1bcacfd2017-11-03 10:12:19 -0700405 std::unique_ptr<Typeface> italic(Typeface::createFromFamilies(
406 makeSingleFamlyVector(kRobotoItalic), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800407 EXPECT_EQ(400, italic->fStyle.weight());
408 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400409 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700410
411 // In Java, new Typeface.Builder("Roboto-BoldItalic.ttf").build();
412 std::unique_ptr<Typeface> boldItalic(
413 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBoldItalic),
John Reck1bcacfd2017-11-03 10:12:19 -0700414 RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800415 EXPECT_EQ(700, boldItalic->fStyle.weight());
416 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400417 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700418}
419
420TEST(TypefaceTest, createFromFamilies_Family) {
421 std::vector<std::shared_ptr<minikin::FontFamily>> families = {
422 buildFamily(kRobotoRegular), buildFamily(kRobotoBold), buildFamily(kRobotoItalic),
John Reck1bcacfd2017-11-03 10:12:19 -0700423 buildFamily(kRobotoBoldItalic)};
424 std::unique_ptr<Typeface> typeface(Typeface::createFromFamilies(
425 std::move(families), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800426 EXPECT_EQ(400, typeface->fStyle.weight());
427 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, typeface->fStyle.slant());
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700428}
429
430TEST(TypefaceTest, createFromFamilies_Family_withoutRegular) {
431 std::vector<std::shared_ptr<minikin::FontFamily>> families = {
John Reck1bcacfd2017-11-03 10:12:19 -0700432 buildFamily(kRobotoBold), buildFamily(kRobotoItalic), buildFamily(kRobotoBoldItalic)};
433 std::unique_ptr<Typeface> typeface(Typeface::createFromFamilies(
434 std::move(families), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800435 EXPECT_EQ(700, typeface->fStyle.weight());
436 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, typeface->fStyle.slant());
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700437}
438
439} // namespace