Ticket #16212: 0002-Fontfallback-Add-Bold-style-check.patch

File 0002-Fontfallback-Add-Bold-style-check.patch, 2.7 KB (added by mt, 4 years ago)

Patch 2

  • src/servers/app/font/GlyphLayoutEngine.h

    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(  
    330330    // course the fallback font should a) contain the missing glyphs at all
    331331    // and b) be similar to the original font. So there should be a mapping
    332332    // 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},
    339344    };
    340345
    341346    fallbackEntry = NULL;
    GlyphLayoutEngine::_WriteLockAndAcquireFallbackEntry(  
    343348    // Try to get the glyph from the fallback fonts.
    344349    for (int c = 0; c < 3; c++) {
    345350        const char* fontStyle;
     351        uint16 fontFace = 0;
     352
    346353        if (c == 0)
    347354            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
    351367            fontStyle = NULL;
    352368
    353         for (int i = 0; fallbacks[i] != NULL; i++) {
     369        for (int i = 0; fallbacks[i].fontName != NULL; i++) {
    354370            BAutolock locker(gFontManager);
    355371            if (!locker.IsLocked())
    356372                continue;
    357373
    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,
    359385                fontStyle, 0xffff, 0);
    360386
    361387            if (fallbackStyle == NULL)