From d6198fe7d001a8c688cee7786f8967bb1ced7384 Mon Sep 17 00:00:00 2001
From: Murai Takashi <tmurai01@gmail.com>
Date: Mon, 8 Jun 2020 20:52:16 +0900
Subject: [PATCH 2/2] Fontfallback: Add Bold style check.
Change-Id: I85139c3b74bdcc1a31920d5c685e2cee6282be0d
---
src/servers/app/font/GlyphLayoutEngine.h | 48 ++++++++++++++++++------
1 file changed, 37 insertions(+), 11 deletions(-)
diff --git a/src/servers/app/font/GlyphLayoutEngine.h b/src/servers/app/font/GlyphLayoutEngine.h
index aba9d49ff2..03b7ba7032 100644
a
|
b
|
GlyphLayoutEngine::_WriteLockAndAcquireFallbackEntry(
|
330 | 330 | // course the fallback font should a) contain the missing glyphs at all |
331 | 331 | // and b) be similar to the original font. So there should be a mapping |
332 | 332 | // of some kind to know the most suitable fallback font. |
333 | | static const char* fallbacks[] = { |
334 | | "Noto Sans Display", |
335 | | "Noto Sans Thai", |
336 | | "Noto Sans CJK JP", |
337 | | "Noto Sans Symbols", |
338 | | NULL |
| 333 | typedef struct fallback { |
| 334 | const char * fontName; |
| 335 | bool hasItalic; |
| 336 | }fallback_t; |
| 337 | |
| 338 | static const fallback_t fallbacks[] = { |
| 339 | {"Noto Sans Display", true}, |
| 340 | {"Noto Sans Thai", false}, |
| 341 | {"Noto Sans CJK JP", false}, |
| 342 | {"Noto Sans Symbols", false}, |
| 343 | {NULL, false}, |
339 | 344 | }; |
340 | 345 | |
341 | 346 | fallbackEntry = NULL; |
… |
… |
GlyphLayoutEngine::_WriteLockAndAcquireFallbackEntry(
|
343 | 348 | // Try to get the glyph from the fallback fonts. |
344 | 349 | for (int c = 0; c < 3; c++) { |
345 | 350 | const char* fontStyle; |
| 351 | uint16 fontFace = 0; |
| 352 | |
346 | 353 | if (c == 0) |
347 | 354 | fontStyle = font.Style(); |
348 | | else if (c == 1) |
349 | | fontStyle = "Regular"; |
350 | | else |
| 355 | else if (c == 1) { |
| 356 | fontFace = font.Face(); |
| 357 | if ((fontFace & B_BOLD_FACE) && (fontFace & B_ITALIC_FACE)) { |
| 358 | fontStyle = "Bold Italic"; |
| 359 | } else if (fontFace & B_BOLD_FACE) { |
| 360 | fontStyle = "Bold"; |
| 361 | } else if (fontFace & B_ITALIC_FACE) { |
| 362 | fontStyle = "Italic"; |
| 363 | } else { |
| 364 | fontStyle = "Regular"; |
| 365 | } |
| 366 | } else |
351 | 367 | fontStyle = NULL; |
352 | 368 | |
353 | | for (int i = 0; fallbacks[i] != NULL; i++) { |
| 369 | for (int i = 0; fallbacks[i].fontName != NULL; i++) { |
354 | 370 | BAutolock locker(gFontManager); |
355 | 371 | if (!locker.IsLocked()) |
356 | 372 | continue; |
357 | 373 | |
358 | | FontStyle* fallbackStyle = gFontManager->GetStyle(fallbacks[i], |
| 374 | // Noto Sans Thai, CJK JP and Symbols don't have Italic. |
| 375 | if (c == 1 && !fallbacks[i].hasItalic && fontStyle != NULL) { |
| 376 | if ((fontFace & B_BOLD_FACE) && (fontFace & B_ITALIC_FACE)) { |
| 377 | fontStyle = "Bold"; |
| 378 | } else if (fontFace & B_ITALIC_FACE) { |
| 379 | fontStyle = "Regular"; |
| 380 | } |
| 381 | } |
| 382 | |
| 383 | FontStyle* fallbackStyle = |
| 384 | gFontManager->GetStyle(fallbacks[i].fontName, |
359 | 385 | fontStyle, 0xffff, 0); |
360 | 386 | |
361 | 387 | if (fallbackStyle == NULL) |