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