1 /* 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 30 using namespace android; 31 32 namespace { 33 34 constexpr char kRobotoRegular[] = "/system/fonts/Roboto-Regular.ttf"; 35 constexpr char kRobotoBold[] = "/system/fonts/Roboto-Bold.ttf"; 36 constexpr char kRobotoItalic[] = "/system/fonts/Roboto-Italic.ttf"; 37 constexpr char kRobotoBoldItalic[] = "/system/fonts/Roboto-BoldItalic.ttf"; 38 39 void 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 45 std::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()); 55 sk_sp<SkTypeface> typeface(fm->makeFromStream(std::move(fontData))); 56 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>()); 59 std::vector<minikin::Font> fonts; 60 fonts.push_back(minikin::Font::Builder(font).build()); 61 return std::make_shared<minikin::FontFamily>(std::move(fonts)); 62 } 63 64 std::vector<std::shared_ptr<minikin::FontFamily>> makeSingleFamlyVector(const char* fileName) { 65 return std::vector<std::shared_ptr<minikin::FontFamily>>({buildFamily(fileName)}); 66 } 67 68 TEST(TypefaceTest, resolveDefault_and_setDefaultTest) { 69 std::unique_ptr<Typeface> regular(Typeface::createFromFamilies( 70 makeSingleFamlyVector(kRobotoRegular), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)); 71 EXPECT_EQ(regular.get(), Typeface::resolveDefault(regular.get())); 72 73 // Keep the original to restore it later. 74 const Typeface* old = Typeface::resolveDefault(nullptr); 75 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 83 TEST(TypefaceTest, createWithDifferentBaseWeight) { 84 std::unique_ptr<Typeface> bold(Typeface::createWithDifferentBaseWeight(nullptr, 700)); 85 EXPECT_EQ(700, bold->fStyle.weight()); 86 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant()); 87 EXPECT_EQ(Typeface::kNormal, bold->fAPIStyle); 88 89 std::unique_ptr<Typeface> light(Typeface::createWithDifferentBaseWeight(nullptr, 300)); 90 EXPECT_EQ(300, light->fStyle.weight()); 91 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, light->fStyle.slant()); 92 EXPECT_EQ(Typeface::kNormal, light->fAPIStyle); 93 } 94 95 TEST(TypefaceTest, createRelativeTest_fromRegular) { 96 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.NORMAL); 97 std::unique_ptr<Typeface> normal(Typeface::createRelative(nullptr, Typeface::kNormal)); 98 EXPECT_EQ(400, normal->fStyle.weight()); 99 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant()); 100 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle); 101 102 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.BOLD); 103 std::unique_ptr<Typeface> bold(Typeface::createRelative(nullptr, Typeface::kBold)); 104 EXPECT_EQ(700, bold->fStyle.weight()); 105 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant()); 106 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle); 107 108 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.ITALIC); 109 std::unique_ptr<Typeface> italic(Typeface::createRelative(nullptr, Typeface::kItalic)); 110 EXPECT_EQ(400, italic->fStyle.weight()); 111 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant()); 112 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 113 114 // In Java, Typeface.create(Typeface.DEFAULT, Typeface.BOLD_ITALIC); 115 std::unique_ptr<Typeface> boldItalic(Typeface::createRelative(nullptr, Typeface::kBoldItalic)); 116 EXPECT_EQ(700, boldItalic->fStyle.weight()); 117 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant()); 118 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle); 119 } 120 121 TEST(TypefaceTest, createRelativeTest_BoldBase) { 122 std::unique_ptr<Typeface> base(Typeface::createWithDifferentBaseWeight(nullptr, 700)); 123 124 // In Java, Typeface.create(Typeface.create("sans-serif-bold"), 125 // Typeface.NORMAL); 126 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal)); 127 EXPECT_EQ(700, normal->fStyle.weight()); 128 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant()); 129 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle); 130 131 // In Java, Typeface.create(Typeface.create("sans-serif-bold"), 132 // Typeface.BOLD); 133 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold)); 134 EXPECT_EQ(1000, bold->fStyle.weight()); 135 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant()); 136 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle); 137 138 // In Java, Typeface.create(Typeface.create("sans-serif-bold"), 139 // Typeface.ITALIC); 140 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic)); 141 EXPECT_EQ(700, italic->fStyle.weight()); 142 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant()); 143 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 144 145 // In Java, Typeface.create(Typeface.create("sans-serif-bold"), 146 // Typeface.BOLD_ITALIC); 147 std::unique_ptr<Typeface> boldItalic( 148 Typeface::createRelative(base.get(), Typeface::kBoldItalic)); 149 EXPECT_EQ(1000, boldItalic->fStyle.weight()); 150 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant()); 151 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle); 152 } 153 154 TEST(TypefaceTest, createRelativeTest_LightBase) { 155 std::unique_ptr<Typeface> base(Typeface::createWithDifferentBaseWeight(nullptr, 300)); 156 157 // In Java, Typeface.create(Typeface.create("sans-serif-light"), 158 // Typeface.NORMAL); 159 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal)); 160 EXPECT_EQ(300, normal->fStyle.weight()); 161 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant()); 162 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle); 163 164 // In Java, Typeface.create(Typeface.create("sans-serif-light"), 165 // Typeface.BOLD); 166 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold)); 167 EXPECT_EQ(600, bold->fStyle.weight()); 168 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant()); 169 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle); 170 171 // In Java, Typeface.create(Typeface.create("sans-serif-light"), 172 // Typeface.ITLIC); 173 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic)); 174 EXPECT_EQ(300, italic->fStyle.weight()); 175 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant()); 176 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 177 178 // In Java, Typeface.create(Typeface.create("sans-serif-light"), 179 // Typeface.BOLD_ITALIC); 180 std::unique_ptr<Typeface> boldItalic( 181 Typeface::createRelative(base.get(), Typeface::kBoldItalic)); 182 EXPECT_EQ(600, boldItalic->fStyle.weight()); 183 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant()); 184 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle); 185 } 186 187 TEST(TypefaceTest, createRelativeTest_fromBoldStyled) { 188 std::unique_ptr<Typeface> base(Typeface::createRelative(nullptr, Typeface::kBold)); 189 190 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 191 // Typeface.NORMAL); 192 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal)); 193 EXPECT_EQ(400, normal->fStyle.weight()); 194 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant()); 195 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle); 196 197 // In Java Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 198 // Typeface.BOLD); 199 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold)); 200 EXPECT_EQ(700, bold->fStyle.weight()); 201 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant()); 202 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle); 203 204 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 205 // Typeface.ITALIC); 206 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic)); 207 EXPECT_EQ(400, normal->fStyle.weight()); 208 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant()); 209 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 210 211 // In Java, 212 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 213 // Typeface.BOLD_ITALIC); 214 std::unique_ptr<Typeface> boldItalic( 215 Typeface::createRelative(base.get(), Typeface::kBoldItalic)); 216 EXPECT_EQ(700, boldItalic->fStyle.weight()); 217 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant()); 218 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle); 219 } 220 221 TEST(TypefaceTest, createRelativeTest_fromItalicStyled) { 222 std::unique_ptr<Typeface> base(Typeface::createRelative(nullptr, Typeface::kItalic)); 223 224 // In Java, 225 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), 226 // Typeface.NORMAL); 227 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal)); 228 EXPECT_EQ(400, normal->fStyle.weight()); 229 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant()); 230 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle); 231 232 // In Java, Typeface.create(Typeface.create(Typeface.DEFAULT, 233 // Typeface.ITALIC), Typeface.BOLD); 234 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold)); 235 EXPECT_EQ(700, bold->fStyle.weight()); 236 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant()); 237 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle); 238 239 // In Java, 240 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), 241 // Typeface.ITALIC); 242 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic)); 243 EXPECT_EQ(400, italic->fStyle.weight()); 244 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant()); 245 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 246 247 // In Java, 248 // Typeface.create(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC), 249 // Typeface.BOLD_ITALIC); 250 std::unique_ptr<Typeface> boldItalic( 251 Typeface::createRelative(base.get(), Typeface::kBoldItalic)); 252 EXPECT_EQ(700, boldItalic->fStyle.weight()); 253 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant()); 254 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle); 255 } 256 257 TEST(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); 264 std::unique_ptr<Typeface> normal(Typeface::createRelative(base.get(), Typeface::kNormal)); 265 EXPECT_EQ(400, normal->fStyle.weight()); 266 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, normal->fStyle.slant()); 267 EXPECT_EQ(Typeface::kNormal, normal->fAPIStyle); 268 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); 273 std::unique_ptr<Typeface> bold(Typeface::createRelative(base.get(), Typeface::kBold)); 274 EXPECT_EQ(700, bold->fStyle.weight()); 275 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant()); 276 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle); 277 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); 282 std::unique_ptr<Typeface> italic(Typeface::createRelative(base.get(), Typeface::kItalic)); 283 EXPECT_EQ(400, italic->fStyle.weight()); 284 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant()); 285 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 286 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); 291 std::unique_ptr<Typeface> boldItalic( 292 Typeface::createRelative(base.get(), Typeface::kBoldItalic)); 293 EXPECT_EQ(700, boldItalic->fStyle.weight()); 294 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant()); 295 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle); 296 } 297 298 TEST(TypefaceTest, createAbsolute) { 299 // In Java, 300 // new 301 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(400).setItalic(false) 302 // .build(); 303 std::unique_ptr<Typeface> regular(Typeface::createAbsolute(nullptr, 400, false)); 304 EXPECT_EQ(400, regular->fStyle.weight()); 305 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, regular->fStyle.slant()); 306 EXPECT_EQ(Typeface::kNormal, regular->fAPIStyle); 307 308 // In Java, 309 // new 310 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(700).setItalic(false) 311 // .build(); 312 std::unique_ptr<Typeface> bold(Typeface::createAbsolute(nullptr, 700, false)); 313 EXPECT_EQ(700, bold->fStyle.weight()); 314 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant()); 315 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle); 316 317 // In Java, 318 // new 319 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(400).setItalic(true) 320 // .build(); 321 std::unique_ptr<Typeface> italic(Typeface::createAbsolute(nullptr, 400, true)); 322 EXPECT_EQ(400, italic->fStyle.weight()); 323 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant()); 324 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 325 326 // In Java, 327 // new 328 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(700).setItalic(true) 329 // .build(); 330 std::unique_ptr<Typeface> boldItalic(Typeface::createAbsolute(nullptr, 700, true)); 331 EXPECT_EQ(700, boldItalic->fStyle.weight()); 332 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant()); 333 EXPECT_EQ(Typeface::kBoldItalic, boldItalic->fAPIStyle); 334 335 // In Java, 336 // new 337 // Typeface.Builder(invalid).setFallback("sans-serif").setWeight(1100).setItalic(true) 338 // .build(); 339 std::unique_ptr<Typeface> over1000(Typeface::createAbsolute(nullptr, 1100, false)); 340 EXPECT_EQ(1000, over1000->fStyle.weight()); 341 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, over1000->fStyle.slant()); 342 EXPECT_EQ(Typeface::kBold, over1000->fAPIStyle); 343 } 344 345 TEST(TypefaceTest, createFromFamilies_Single) { 346 // In Java, new 347 // Typeface.Builder("Roboto-Regular.ttf").setWeight(400).setItalic(false).build(); 348 std::unique_ptr<Typeface> regular( 349 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoRegular), 400, false)); 350 EXPECT_EQ(400, regular->fStyle.weight()); 351 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, regular->fStyle.slant()); 352 EXPECT_EQ(Typeface::kNormal, regular->fAPIStyle); 353 354 // In Java, new 355 // Typeface.Builder("Roboto-Bold.ttf").setWeight(700).setItalic(false).build(); 356 std::unique_ptr<Typeface> bold( 357 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold), 700, false)); 358 EXPECT_EQ(700, bold->fStyle.weight()); 359 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant()); 360 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle); 361 362 // In Java, new 363 // Typeface.Builder("Roboto-Italic.ttf").setWeight(400).setItalic(true).build(); 364 std::unique_ptr<Typeface> italic( 365 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoItalic), 400, true)); 366 EXPECT_EQ(400, italic->fStyle.weight()); 367 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant()); 368 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 369 370 // In Java, 371 // new 372 // Typeface.Builder("Roboto-BoldItalic.ttf").setWeight(700).setItalic(true).build(); 373 std::unique_ptr<Typeface> boldItalic( 374 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBoldItalic), 700, true)); 375 EXPECT_EQ(700, boldItalic->fStyle.weight()); 376 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant()); 377 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 378 379 // In Java, 380 // new 381 // Typeface.Builder("Roboto-BoldItalic.ttf").setWeight(1100).setItalic(false).build(); 382 std::unique_ptr<Typeface> over1000( 383 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBold), 1100, false)); 384 EXPECT_EQ(1000, over1000->fStyle.weight()); 385 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, over1000->fStyle.slant()); 386 EXPECT_EQ(Typeface::kBold, over1000->fAPIStyle); 387 } 388 389 TEST(TypefaceTest, createFromFamilies_Single_resolveByTable) { 390 // In Java, new Typeface.Builder("Roboto-Regular.ttf").build(); 391 std::unique_ptr<Typeface> regular(Typeface::createFromFamilies( 392 makeSingleFamlyVector(kRobotoRegular), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)); 393 EXPECT_EQ(400, regular->fStyle.weight()); 394 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, regular->fStyle.slant()); 395 EXPECT_EQ(Typeface::kNormal, regular->fAPIStyle); 396 397 // In Java, new Typeface.Builder("Roboto-Bold.ttf").build(); 398 std::unique_ptr<Typeface> bold(Typeface::createFromFamilies( 399 makeSingleFamlyVector(kRobotoBold), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)); 400 EXPECT_EQ(700, bold->fStyle.weight()); 401 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, bold->fStyle.slant()); 402 EXPECT_EQ(Typeface::kBold, bold->fAPIStyle); 403 404 // In Java, new Typeface.Builder("Roboto-Italic.ttf").build(); 405 std::unique_ptr<Typeface> italic(Typeface::createFromFamilies( 406 makeSingleFamlyVector(kRobotoItalic), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)); 407 EXPECT_EQ(400, italic->fStyle.weight()); 408 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, italic->fStyle.slant()); 409 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 410 411 // In Java, new Typeface.Builder("Roboto-BoldItalic.ttf").build(); 412 std::unique_ptr<Typeface> boldItalic( 413 Typeface::createFromFamilies(makeSingleFamlyVector(kRobotoBoldItalic), 414 RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)); 415 EXPECT_EQ(700, boldItalic->fStyle.weight()); 416 EXPECT_EQ(minikin::FontStyle::Slant::ITALIC, boldItalic->fStyle.slant()); 417 EXPECT_EQ(Typeface::kItalic, italic->fAPIStyle); 418 } 419 420 TEST(TypefaceTest, createFromFamilies_Family) { 421 std::vector<std::shared_ptr<minikin::FontFamily>> families = { 422 buildFamily(kRobotoRegular), buildFamily(kRobotoBold), buildFamily(kRobotoItalic), 423 buildFamily(kRobotoBoldItalic)}; 424 std::unique_ptr<Typeface> typeface(Typeface::createFromFamilies( 425 std::move(families), RESOLVE_BY_FONT_TABLE, RESOLVE_BY_FONT_TABLE)); 426 EXPECT_EQ(400, typeface->fStyle.weight()); 427 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, typeface->fStyle.slant()); 428 } 429 430 TEST(TypefaceTest, createFromFamilies_Family_withoutRegular) { 431 std::vector<std::shared_ptr<minikin::FontFamily>> families = { 432 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)); 435 EXPECT_EQ(700, typeface->fStyle.weight()); 436 EXPECT_EQ(minikin::FontStyle::Slant::UPRIGHT, typeface->fStyle.slant()); 437 } 438 439 } // namespace 440