kbrown / rpms / libreoffice

Forked from rpms/libreoffice 2 years ago
Clone

Blame SOURCES/0001-Resolves-rhbz-968892-force-render-full-grapheme-with.patch

2135ec
From 78f93c2ef1acd324c289286fe3c13a429340839b Mon Sep 17 00:00:00 2001
2135ec
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
2135ec
Date: Tue, 4 Jun 2013 15:48:23 +0100
2135ec
Subject: [PATCH] Resolves: rhbz#968892 force render full grapheme with
2135ec
 fallback font
2135ec
2135ec
Change-Id: I5bb98c61d047e69d74666261b2c489d80f344502
2135ec
---
2135ec
 vcl/generic/glyphs/gcach_layout.cxx | 61 ++++++++++++++++++++++---------------
2135ec
 vcl/inc/generic/glyphcache.hxx      |  5 +++
2135ec
 2 files changed, 42 insertions(+), 24 deletions(-)
2135ec
2135ec
diff --git a/vcl/generic/glyphs/gcach_layout.cxx b/vcl/generic/glyphs/gcach_layout.cxx
2135ec
index 4fd4cf4..3c3c6de 100644
2135ec
--- a/vcl/generic/glyphs/gcach_layout.cxx
2135ec
+++ b/vcl/generic/glyphs/gcach_layout.cxx
2135ec
@@ -41,6 +41,10 @@
2135ec
 #include <unicode/uscript.h>
2135ec
 #include <unicode/ubidi.h>
2135ec
 
2135ec
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
2135ec
+#include <com/sun/star/i18n/CharacterIteratorMode.hpp>
2135ec
+#include <comphelper/processfactory.hxx>
2135ec
+
2135ec
 // =======================================================================
2135ec
 // layout implementation for ServerFont
2135ec
 // =======================================================================
2135ec
@@ -90,23 +94,42 @@ void ServerFontLayout::AdjustLayout( ImplLayoutArgs& rArgs )
2135ec
     }
2135ec
 }
2135ec
 
2135ec
-// =======================================================================
2135ec
-
2135ec
-static bool lcl_CharIsJoiner(sal_Unicode cChar)
2135ec
+void ServerFontLayout::setNeedFallback(ImplLayoutArgs& rArgs, sal_Int32 nCharPos,
2135ec
+    bool bRightToLeft)
2135ec
 {
2135ec
-    return ((cChar == 0x200C) || (cChar == 0x200D));
2135ec
-}
2135ec
+    if (nCharPos < 0)
2135ec
+        return;
2135ec
 
2135ec
-static bool needPreviousCode(sal_Unicode cChar)
2135ec
-{
2135ec
-    return lcl_CharIsJoiner(cChar) || U16_IS_LEAD(cChar);
2135ec
-}
2135ec
+    using namespace ::com::sun::star;
2135ec
 
2135ec
-static bool needNextCode(sal_Unicode cChar)
2135ec
-{
2135ec
-    return lcl_CharIsJoiner(cChar) || U16_IS_TRAIL(cChar);
2135ec
+    if (!mxBreak.is())
2135ec
+    {
2135ec
+        uno::Reference< lang::XMultiServiceFactory > xFactory =
2135ec
+            comphelper::getProcessServiceFactory();
2135ec
+        mxBreak = uno::Reference< i18n::XBreakIterator >(xFactory->createInstance(
2135ec
+            "com.sun.star.i18n.BreakIterator"), uno::UNO_QUERY);
2135ec
+    }
2135ec
+
2135ec
+    LanguageTag aLangTag(rArgs.meLanguage);
2135ec
+    lang::Locale aLocale(aLangTag.getLocale());
2135ec
+
2135ec
+    //if position nCharPos is missing in the font, grab the entire grapheme and
2135ec
+    //mark all glyphs as missing so the whole thing is rendered with the same
2135ec
+    //font
2135ec
+    OUString aRun(rArgs.mpStr);
2135ec
+    sal_Int32 nDone;
2135ec
+    sal_Int32 nGraphemeStartPos =
2135ec
+        mxBreak->previousCharacters(aRun, nCharPos+1, aLocale,
2135ec
+            i18n::CharacterIteratorMode::SKIPCELL, 1, nDone);
2135ec
+    sal_Int32 nGraphemeEndPos =
2135ec
+        mxBreak->nextCharacters(aRun, nCharPos, aLocale,
2135ec
+            i18n::CharacterIteratorMode::SKIPCELL, 1, nDone);
2135ec
+
2135ec
+    rArgs.NeedFallback(nGraphemeStartPos, nGraphemeEndPos, bRightToLeft);
2135ec
 }
2135ec
 
2135ec
+// =======================================================================
2135ec
+
2135ec
 std::ostream &operator <<(std::ostream& s, ServerFont* pFont)
2135ec
 {
2135ec
 #ifndef SAL_LOG_INFO
2135ec
@@ -401,9 +424,7 @@ bool HbLayoutEngine::layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
2135ec
             // if needed request glyph fallback by updating LayoutArgs
2135ec
             if (!nGlyphIndex)
2135ec
             {
2135ec
-                if (nCharPos >= 0)
2135ec
-                    rArgs.NeedFallback(nCharPos, bRightToLeft);
2135ec
-
2135ec
+                rLayout.setNeedFallback(rArgs, nCharPos, bRightToLeft);
2135ec
                 if (SAL_LAYOUT_FOR_FALLBACK & rArgs.mnFlags)
2135ec
                     continue;
2135ec
             }
2135ec
@@ -1006,15 +1027,7 @@ bool IcuLayoutEngine::layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
2135ec
             // if needed request glyph fallback by updating LayoutArgs
2135ec
             if( !nGlyphIndex )
2135ec
             {
2135ec
-                if( nCharPos >= 0 )
2135ec
-                {
2135ec
-                    rArgs.NeedFallback( nCharPos, bRightToLeft );
2135ec
-                    if ( (nCharPos > 0) && needPreviousCode(rArgs.mpStr[nCharPos-1]) )
2135ec
-                        rArgs.NeedFallback( nCharPos-1, bRightToLeft );
2135ec
-                    else if ( (nCharPos + 1 < nEndRunPos) && needNextCode(rArgs.mpStr[nCharPos+1]) )
2135ec
-                        rArgs.NeedFallback( nCharPos+1, bRightToLeft );
2135ec
-                }
2135ec
-
2135ec
+                rLayout.setNeedFallback(rArgs, nCharPos, bRightToLeft);
2135ec
                 if( SAL_LAYOUT_FOR_FALLBACK & rArgs.mnFlags )
2135ec
                     continue;
2135ec
             }
2135ec
diff --git a/vcl/inc/generic/glyphcache.hxx b/vcl/inc/generic/glyphcache.hxx
2135ec
index a7363f9..d6cdee1 100644
2135ec
--- a/vcl/inc/generic/glyphcache.hxx
2135ec
+++ b/vcl/inc/generic/glyphcache.hxx
2135ec
@@ -37,6 +37,7 @@
2135ec
 #include <boost/unordered_map.hpp>
2135ec
 #include <boost/unordered_set.hpp>
2135ec
 #include <boost/shared_ptr.hpp>
2135ec
+#include <com/sun/star/i18n/XBreakIterator.hpp>
2135ec
 
2135ec
 namespace basegfx { class B2DPolyPolygon; }
2135ec
 
2135ec
@@ -311,6 +312,7 @@
2135ec
 {
2135ec
 private:
2135ec
     ServerFont&     mrServerFont;
2135ec
+    com::sun::star::uno::Reference<com::sun::star::i18n::XBreakIterator> mxBreak;
2135ec
 
2135ec
     // enforce proper copy semantic
2135ec
     SAL_DLLPRIVATE  ServerFontLayout( const ServerFontLayout& );
2135ec
@@ -324,5 +326,7 @@
2135ec
     virtual void    AdjustLayout( ImplLayoutArgs& );
2135ec
     virtual void    DrawText( SalGraphics& ) const;
2135ec
+    void            setNeedFallback(ImplLayoutArgs& rArgs, sal_Int32 nIndex,
2135ec
+                        bool bRightToLeft);
2135ec
     ServerFont&     GetServerFont() const   { return mrServerFont; }
2135ec
 };
2135ec