Resolves: rhbz#968892 block entire grapheme together for glyph fallback

f41
Caolán McNamara 12 years ago
parent a7c0fe816e
commit d9629dea62

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

@ -43,7 +43,7 @@ Summary: Free Software Productivity Suite
Name: libreoffice
Epoch: 1
Version: %{libo_version}.0
Release: 4%{?libo_prerelease}%{?dist}
Release: 5%{?libo_prerelease}%{?dist}
License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic and MPLv2.0
Group: Applications/Productivity
URL: http://www.documentfoundation.org/develop
@ -252,6 +252,7 @@ Patch19: 0001-fix-syntax-errors-in-python-wizards.patch
Patch20: 0001-don-t-run-autogen.sh-if-building-from-tarballs.patch
Patch21: 0001-autosize-the-frame-direction-listbox.patch
Patch22: 0001-setting-max-line-count-should-allow-extra-values-to-.patch
Patch23: 0001-Resolves-rhbz-968892-force-render-full-grapheme-with.patch
%define instdir %{_libdir}
%define baseinstdir %{instdir}/libreoffice
@ -993,6 +994,7 @@ mv -f redhat.soc extras/source/palettes/standard.soc
%patch20 -p1 -b .don-t-run-autogen.sh-if-building-from-tarballs.patch
%patch21 -p1 -b .autosize-the-frame-direction-listbox.patch
%patch22 -p1 -b .setting-max-line-count-should-allow-extra-values-to-.patch
%patch23 -p1 -b .rhbz-968892-force-render-full-grapheme-with.patch
# TODO: check this
# these are horribly incomplete--empty translations and copied english
@ -2056,6 +2058,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
%endif
%changelog
* Tue Jun 04 2013 Caolán McNamara <caolanm@redhat.com> - 1:4.1.0.0-5.beta1
- Resolves: rhbz#968892 block entire grapheme together for glyph fallback
* Fri May 31 2013 Caolán McNamara <caolanm@redhat.com> - 1:4.1.0.0-4.beta1
- Resolves: rhbz#968976 fix dropdown list autosizing

Loading…
Cancel
Save