blob: b645aeb550744eca70b1d508fe68a5158744c980 [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>(
Seigo Nonaka54c6a272018-10-25 15:44:32 -070058 std::move(typeface), data, st.st_size, fileName, 0,
59 std::vector<minikin::FontVariation>());
Seigo Nonaka99d66f02018-01-30 15:01:26 -080060 std::vector<minikin::Font> fonts;
Seigo Nonaka0606a882018-01-31 19:29:40 -080061 fonts.push_back(minikin::Font::Builder(font).build());
Seigo Nonaka99d66f02018-01-30 15:01:26 -080062 return std::make_shared<minikin::FontFamily>(std::move(fonts));
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070063}
64
65std::vector<std::shared_ptr<minikin::FontFamily>> makeSingleFamlyVector(const char* fileName) {
John Reck1bcacfd2017-11-03 10:12:19 -070066 return std::vector<std::shared_ptr<minikin::FontFamily>>({buildFamily(fileName)});
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070067}
68
69TEST(TypefaceTest, resolveDefault_and_setDefaultTest) {
John Reck1bcacfd2017-11-03 10:12:19 -070070 std::unique_ptr<Typeface> regular(Typeface::createFromFamilies(
71 makeSingleFamlyVector(kRobotoRegular), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070072 EXPECT_EQ(regular.get(), Typeface::resolveDefault(regular.get()));
73
Seigo Nonaka318ca042017-08-01 16:36:18 -070074 // Keep the original to restore it later.
75 const Typeface* old = Typeface::resolveDefault(nullptr);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070076 ASSERT_NE(nullptr, old);
77
78 Typeface::setDefault(regular.get());
79 EXPECT_EQ(regular.get(), Typeface::resolveDefault(nullptr));
80
81 Typeface::setDefault(old); // Restore to the original.
82}
83
84TEST(TypefaceTest, createWithDifferentBaseWeight) {
85 std::unique_ptr<Typeface> bold(Typeface::createWithDifferentBaseWeight(nullptr, 700));
Seigo Nonakac52075e2017-11-17 15:40:06 -080086 EXPECT_EQ(700, bold->fStyle.weight());
87 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -040088 EXPECT_EQ(Typeface::kNormal, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070089
90 std::unique_ptr<Typeface> light(Typeface::createWithDifferentBaseWeight(nullptr, 300));
Seigo Nonakac52075e2017-11-17 15:40:06 -080091 EXPECT_EQ(300, light->fStyle.weight());
92 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, light->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -040093 EXPECT_EQ(Typeface::kNormal, light->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -070094}
95
96TEST(TypefaceTest, createRelativeTest_fromRegular) {
97 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -040098 std::unique_ptr<Typeface> normal(Typeface::createRelative(nullptr, Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -080099 EXPECT_EQ(400, normal->fStyle.weight());
100 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400101 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700102
103 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400104 std::unique_ptr<Typeface> bold(Typeface::createRelative(nullptr, Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800105 EXPECT_EQ(700, bold->fStyle.weight());
106 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400107 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700108
109 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.ITALIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400110 std::unique_ptr<Typeface> italic(Typeface::createRelative(nullptr, Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800111 EXPECT_EQ(400, italic->fStyle.weight());
112 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400113 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700114
115 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700116 std::unique_ptr<Typeface> boldItalic(Typeface::createRelative(nullptr, Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800117 EXPECT_EQ(700, boldItalic->fStyle.weight());
118 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400119 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700120}
121
122TEST(TypefaceTest, createRelativeTest_BoldBase) {
123 std::unique_ptr<Typeface> base(Typeface::createWithDifferentBaseWeight(nullptr, 700));
124
Seigo Nonaka20866c12017-10-26 16:02:01 -0700125 // In Java, Typeface.create(Typeface.create("sans-serif-bold"),
126 // Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -0400127 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800128 EXPECT_EQ(700, normal->fStyle.weight());
129 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400130 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700131
Seigo Nonaka20866c12017-10-26 16:02:01 -0700132 // In Java, Typeface.create(Typeface.create("sans-serif-bold"),
133 // Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400134 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800135 EXPECT_EQ(1000, bold->fStyle.weight());
136 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400137 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700138
Seigo Nonaka20866c12017-10-26 16:02:01 -0700139 // In Java, Typeface.create(Typeface.create("sans-serif-bold"),
140 // Typeface.ITALIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400141 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800142 EXPECT_EQ(700, italic->fStyle.weight());
143 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400144 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700145
Seigo Nonaka20866c12017-10-26 16:02:01 -0700146 // In Java, Typeface.create(Typeface.create("sans-serif-bold"),
147 // Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700148 std::unique_ptr<Typeface> boldItalic(
149 Typeface::createRelative(base.get(), Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800150 EXPECT_EQ(1000, boldItalic->fStyle.weight());
151 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400152 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700153}
154
155TEST(TypefaceTest, createRelativeTest_LightBase) {
156 std::unique_ptr<Typeface> base(Typeface::createWithDifferentBaseWeight(nullptr, 300));
157
Seigo Nonaka20866c12017-10-26 16:02:01 -0700158 // In Java, Typeface.create(Typeface.create("sans-serif-light"),
159 // Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -0400160 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800161 EXPECT_EQ(300, normal->fStyle.weight());
162 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400163 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700164
Seigo Nonaka20866c12017-10-26 16:02:01 -0700165 // In Java, Typeface.create(Typeface.create("sans-serif-light"),
166 // Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400167 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800168 EXPECT_EQ(600, bold->fStyle.weight());
169 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400170 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700171
Seigo Nonaka20866c12017-10-26 16:02:01 -0700172 // In Java, Typeface.create(Typeface.create("sans-serif-light"),
173 // Typeface.ITLIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400174 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800175 EXPECT_EQ(300, italic->fStyle.weight());
176 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400177 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700178
Seigo Nonaka20866c12017-10-26 16:02:01 -0700179 // In Java, Typeface.create(Typeface.create("sans-serif-light"),
180 // Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700181 std::unique_ptr<Typeface> boldItalic(
182 Typeface::createRelative(base.get(), Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800183 EXPECT_EQ(600, boldItalic->fStyle.weight());
184 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400185 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700186}
187
188TEST(TypefaceTest, createRelativeTest_fromBoldStyled) {
Ben Wagner2763fb72017-10-06 17:36:23 -0400189 std::unique_ptr<Typeface> base(Typeface::createRelative(nullptr, Typeface::kBold));
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700190
Seigo Nonaka20866c12017-10-26 16:02:01 -0700191 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD),
192 // Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -0400193 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800194 EXPECT_EQ(400, normal->fStyle.weight());
195 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400196 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700197
Seigo Nonaka20866c12017-10-26 16:02:01 -0700198 // In Java Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD),
199 // Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400200 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800201 EXPECT_EQ(700, bold->fStyle.weight());
202 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400203 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700204
Seigo Nonaka20866c12017-10-26 16:02:01 -0700205 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD),
206 // Typeface.ITALIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400207 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800208 EXPECT_EQ(400, normal->fStyle.weight());
209 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400210 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700211
212 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700213 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD),
214 // Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700215 std::unique_ptr<Typeface> boldItalic(
216 Typeface::createRelative(base.get(), Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800217 EXPECT_EQ(700, boldItalic->fStyle.weight());
218 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400219 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700220}
221
222TEST(TypefaceTest, createRelativeTest_fromItalicStyled) {
Ben Wagner2763fb72017-10-06 17:36:23 -0400223 std::unique_ptr<Typeface> base(Typeface::createRelative(nullptr, Typeface::kItalic));
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700224
225 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700226 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC),
227 // Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -0400228 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800229 EXPECT_EQ(400, normal->fStyle.weight());
230 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400231 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700232
Seigo Nonaka20866c12017-10-26 16:02:01 -0700233 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT,
234 // Typeface.ITALIC), Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400235 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800236 EXPECT_EQ(700, bold->fStyle.weight());
237 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400238 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700239
240 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700241 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC),
242 // Typeface.ITALIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400243 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800244 EXPECT_EQ(400, italic->fStyle.weight());
245 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400246 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700247
248 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700249 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC),
250 // Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700251 std::unique_ptr<Typeface> boldItalic(
252 Typeface::createRelative(base.get(), Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800253 EXPECT_EQ(700, boldItalic->fStyle.weight());
254 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400255 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700256}
257
258TEST(TypefaceTest, createRelativeTest_fromSpecifiedStyled) {
259 std::unique_ptr<Typeface> base(Typeface::createAbsolute(nullptr, 400, false));
260
261 // In Java,
262 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
263 // .setWeight(700).setItalic(false).build();
264 // Typeface.create(typeface, Typeface.NORMAL);
Ben Wagner2763fb72017-10-06 17:36:23 -0400265 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800266 EXPECT_EQ(400, normal->fStyle.weight());
267 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400268 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700269
270 // In Java,
271 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
272 // .setWeight(700).setItalic(false).build();
273 // Typeface.create(typeface, Typeface.BOLD);
Ben Wagner2763fb72017-10-06 17:36:23 -0400274 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800275 EXPECT_EQ(700, bold->fStyle.weight());
276 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400277 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700278
279 // In Java,
280 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
281 // .setWeight(700).setItalic(false).build();
282 // Typeface.create(typeface, Typeface.ITALIC);
Ben Wagner2763fb72017-10-06 17:36:23 -0400283 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800284 EXPECT_EQ(400, italic->fStyle.weight());
285 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400286 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700287
288 // In Java,
289 // Typeface typeface = new Typeface.Builder(invalid).setFallback("sans-serif")
290 // .setWeight(700).setItalic(false).build();
291 // Typeface.create(typeface, Typeface.BOLD_ITALIC);
John Reck1bcacfd2017-11-03 10:12:19 -0700292 std::unique_ptr<Typeface> boldItalic(
293 Typeface::createRelative(base.get(), Typeface::kBoldItalic));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800294 EXPECT_EQ(700, boldItalic->fStyle.weight());
295 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400296 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700297}
298
299TEST(TypefaceTest, createAbsolute) {
300 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700301 // new
302 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(400).setItalic(false)
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700303 // .build();
304 std::unique_ptr<Typeface> regular(Typeface::createAbsolute(nullptr, 400, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800305 EXPECT_EQ(400, regular->fStyle.weight());
306 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, regular->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400307 EXPECT_EQ(Typeface::kNormal, regular->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700308
309 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700310 // new
311 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(700).setItalic(false)
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700312 // .build();
313 std::unique_ptr<Typeface> bold(Typeface::createAbsolute(nullptr, 700, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800314 EXPECT_EQ(700, bold->fStyle.weight());
315 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400316 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700317
318 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700319 // new
320 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(400).setItalic(true)
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700321 // .build();
322 std::unique_ptr<Typeface> italic(Typeface::createAbsolute(nullptr, 400, true));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800323 EXPECT_EQ(400, italic->fStyle.weight());
324 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400325 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700326
327 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700328 // new
329 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(700).setItalic(true)
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700330 // .build();
331 std::unique_ptr<Typeface> boldItalic(Typeface::createAbsolute(nullptr, 700, true));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800332 EXPECT_EQ(700, boldItalic->fStyle.weight());
333 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400334 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700335
336 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700337 // new
338 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(1100).setItalic(true)
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700339 // .build();
340 std::unique_ptr<Typeface> over1000(Typeface::createAbsolute(nullptr, 1100, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800341 EXPECT_EQ(1000, over1000->fStyle.weight());
342 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, over1000->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400343 EXPECT_EQ(Typeface::kBold, over1000->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700344}
345
346TEST(TypefaceTest, createFromFamilies_Single) {
Seigo Nonaka20866c12017-10-26 16:02:01 -0700347 // In Java, new
348 // Typeface.Builder("Roboto-Regular.ttf").setWeight(400).setItalic(false).build();
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700349 std::unique_ptr<Typeface> regular(
350 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoRegular), 400, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800351 EXPECT_EQ(400, regular->fStyle.weight());
352 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, regular->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400353 EXPECT_EQ(Typeface::kNormal, regular->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700354
Seigo Nonaka20866c12017-10-26 16:02:01 -0700355 // In Java, new
356 // Typeface.Builder("Roboto-Bold.ttf").setWeight(700).setItalic(false).build();
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700357 std::unique_ptr<Typeface> bold(
358 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold), 700, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800359 EXPECT_EQ(700, bold->fStyle.weight());
360 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400361 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700362
Seigo Nonaka20866c12017-10-26 16:02:01 -0700363 // In Java, new
364 // Typeface.Builder("Roboto-Italic.ttf").setWeight(400).setItalic(true).build();
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700365 std::unique_ptr<Typeface> italic(
366 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoItalic), 400, true));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800367 EXPECT_EQ(400, italic->fStyle.weight());
368 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400369 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700370
371 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700372 // new
373 // Typeface.Builder("Roboto-BoldItalic.ttf").setWeight(700).setItalic(true).build();
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700374 std::unique_ptr<Typeface> boldItalic(
375 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBoldItalic), 700, true));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800376 EXPECT_EQ(700, boldItalic->fStyle.weight());
377 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400378 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700379
380 // In Java,
Seigo Nonaka20866c12017-10-26 16:02:01 -0700381 // new
382 // Typeface.Builder("Roboto-BoldItalic.ttf").setWeight(1100).setItalic(false).build();
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700383 std::unique_ptr<Typeface> over1000(
384 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold), 1100, false));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800385 EXPECT_EQ(1000, over1000->fStyle.weight());
386 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, over1000->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400387 EXPECT_EQ(Typeface::kBold, over1000->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700388}
389
390TEST(TypefaceTest, createFromFamilies_Single_resolveByTable) {
391 // In Java, new Typeface.Builder("Roboto-Regular.ttf").build();
John Reck1bcacfd2017-11-03 10:12:19 -0700392 std::unique_ptr<Typeface> regular(Typeface::createFromFamilies(
393 makeSingleFamlyVector(kRobotoRegular), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800394 EXPECT_EQ(400, regular->fStyle.weight());
395 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, regular->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400396 EXPECT_EQ(Typeface::kNormal, regular->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700397
398 // In Java, new Typeface.Builder("Roboto-Bold.ttf").build();
John Reck1bcacfd2017-11-03 10:12:19 -0700399 std::unique_ptr<Typeface> bold(Typeface::createFromFamilies(
400 makeSingleFamlyVector(kRobotoBold), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800401 EXPECT_EQ(700, bold->fStyle.weight());
402 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400403 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700404
405 // In Java, new Typeface.Builder("Roboto-Italic.ttf").build();
John Reck1bcacfd2017-11-03 10:12:19 -0700406 std::unique_ptr<Typeface> italic(Typeface::createFromFamilies(
407 makeSingleFamlyVector(kRobotoItalic), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800408 EXPECT_EQ(400, italic->fStyle.weight());
409 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400410 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700411
412 // In Java, new Typeface.Builder("Roboto-BoldItalic.ttf").build();
413 std::unique_ptr<Typeface> boldItalic(
414 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBoldItalic),
John Reck1bcacfd2017-11-03 10:12:19 -0700415 RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800416 EXPECT_EQ(700, boldItalic->fStyle.weight());
417 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant());
Ben Wagner2763fb72017-10-06 17:36:23 -0400418 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle);
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700419}
420
421TEST(TypefaceTest, createFromFamilies_Family) {
422 std::vector<std::shared_ptr<minikin::FontFamily>> families = {
423 buildFamily(kRobotoRegular), buildFamily(kRobotoBold), buildFamily(kRobotoItalic),
John Reck1bcacfd2017-11-03 10:12:19 -0700424 buildFamily(kRobotoBoldItalic)};
425 std::unique_ptr<Typeface> typeface(Typeface::createFromFamilies(
426 std::move(families), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800427 EXPECT_EQ(400, typeface->fStyle.weight());
428 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, typeface->fStyle.slant());
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700429}
430
431TEST(TypefaceTest, createFromFamilies_Family_withoutRegular) {
432 std::vector<std::shared_ptr<minikin::FontFamily>> families = {
John Reck1bcacfd2017-11-03 10:12:19 -0700433 buildFamily(kRobotoBold), buildFamily(kRobotoItalic), buildFamily(kRobotoBoldItalic)};
434 std::unique_ptr<Typeface> typeface(Typeface::createFromFamilies(
435 std::move(families), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE));
Seigo Nonakac52075e2017-11-17 15:40:06 -0800436 EXPECT_EQ(700, typeface->fStyle.weight());
437 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, typeface->fStyle.slant());
Seigo Nonaka1f9c4612017-05-01 22:17:36 -0700438}
439
440} // namespace