vcl/quartz/salgdi.cxx |   20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

New commits:
commit e083f38ab8f2ee864b9e20829bf9fe45c415ddff
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Tue May 10 16:44:27 2022 +0100
Commit:     Adolfo Jayme Barrientos <fit...@ubuntu.com>
CommitDate: Sat May 14 11:23:40 2022 +0200

    tdf#148470 if macOS glyph fallback provided a partial result flag what 
failed
    
    so another font can be attempted for the remainder
    
    Change-Id: Ie2c67c7c63510d02c99f2377c0c43ed6050ccd86
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134131
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    (cherry picked from commit 4b693a0c594fb3b73f4a4c1e03e9916f1a107012)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134070
    Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com>

diff --git a/vcl/quartz/salgdi.cxx b/vcl/quartz/salgdi.cxx
index 9928cc4df3a2..b54c6da5119a 100644
--- a/vcl/quartz/salgdi.cxx
+++ b/vcl/quartz/salgdi.cxx
@@ -30,6 +30,7 @@
 #include <osl/process.h>
 #include <rtl/bootstrap.h>
 #include <rtl/strbuf.hxx>
+#include <rtl/ustrbuf.hxx>
 #include <tools/long.hxx>
 #include <comphelper/lok.hxx>
 
@@ -73,6 +74,12 @@ public:
     bool FindFontSubstitute(vcl::font::FontSelectPattern&, 
LogicalFontInstance* pLogicalFont, OUString&) const override;
 };
 
+bool FontHasCharacter(CTFontRef pFont, const OUString& rString, sal_Int32 
nIndex, sal_Int32 nLen)
+{
+    CGGlyph glyphs[nLen];
+    return CTFontGetGlyphsForCharacters(pFont, reinterpret_cast<const 
UniChar*>(rString.getStr() + nIndex), glyphs, nLen);
+}
+
 }
 
 bool 
CoreTextGlyphFallbackSubstititution::FindFontSubstitute(vcl::font::FontSelectPattern&
 rPattern, LogicalFontInstance* pLogicalFont,
@@ -89,6 +96,19 @@ bool 
CoreTextGlyphFallbackSubstititution::FindFontSubstitute(vcl::font::FontSele
         {
             bFound = true;
 
+            // tdf#148470 remove the resolved chars from rMissing to flag 
which ones are still missing
+            // for an attempt with another font
+            OUStringBuffer aStillMissingChars;
+            for (sal_Int32 nStrIndex = 0; nStrIndex < 
rMissingChars.getLength();)
+            {
+                sal_Int32 nOldStrIndex = nStrIndex;
+                rMissingChars.iterateCodePoints(&nStrIndex);
+                sal_Int32 nCharLength = nStrIndex - nOldStrIndex;
+                if (!FontHasCharacter(pFallback, rMissingChars, nOldStrIndex, 
nCharLength))
+                    aStillMissingChars.append(rMissingChars.getStr() + 
nOldStrIndex, nCharLength);
+            }
+            rMissingChars = aStillMissingChars.toString();
+
             CTFontDescriptorRef pDesc = CTFontCopyFontDescriptor(pFallback);
             FontAttributes rAttr = DevFontFromCTFontDescriptor(pDesc, nullptr);
 

Reply via email to