[Libreoffice-commits] core.git: Branch 'distro/suse/suse-4.0' - 2 commits - tools/source vcl/win
Herbert Dürr
hdu at apache.org
Wed Apr 2 06:31:45 PDT 2014
tools/source/generic/poly.cxx | 13 +++++++++++++
vcl/win/source/gdi/winlayout.cxx | 17 ++++++++++++-----
2 files changed, 25 insertions(+), 5 deletions(-)
New commits:
commit 9c340d46b457cb54700cd2e8ccaab7001ee42b27
Author: Herbert Dürr <hdu at apache.org>
Date: Thu Mar 27 16:07:37 2014 +0000
Related: #i124516# handle bad surrogate pairs gracefully on Windows
When running into invalid Unicode surrogate pairs the text layout code on
Windows ran into massive problems like crashes. This change detects the
situation of an invalid surrogate pair and falls back to treat it as
a simple character instead of requesting a complex glyph fallback.
(cherry picked from commit 913f1fc4b1362f6e91595af5ae10c4cba79fd355)
Change-Id: I2988f4b64061d0a5df211f6f0f04b1f235fcd6a5
(cherry picked from commit 67688d3118b1a361d5dbdaa78e918815c163d75c)
diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index 5a55387..e7bdc11 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -385,12 +385,19 @@ bool SimpleWinLayout::LayoutText( ImplLayoutArgs& rArgs )
bool bSurrogate = ((nCharCode >= 0xD800) && (nCharCode <= 0xDFFF));
if( bSurrogate )
{
- if( nCharCode >= 0xDC00 ) // this part of a surrogate pair was already processed
+ // ignore high surrogates, they were already processed with their low surrogates
+ if( nCharCode >= 0xDC00 )
continue;
- nCharCode = 0x10000 + ((pCodes[0] - 0xD800) << 10) + (pCodes[1] - 0xDC00);
- }
+ // check the second half of the surrogate pair
+ bSurrogate &= (0xDC00 <= pCodes[1]) && (pCodes[1] <= 0xDFFF);
+ // calculate the UTF-32 code of valid surrogate pairs
+ if( bSurrogate )
+ nCharCode = 0x10000 + ((pCodes[0] - 0xD800) << 10) + (pCodes[1] - 0xDC00);
+ else // or fall back to a replacement character
+ nCharCode = '?';
+ }
- // get the advance width for the current UCS-4 code point
+ // get the advance width for the current UTF-32 code point
int nGlyphWidth = mrWinFontEntry.GetCachedGlyphWidth( nCharCode );
if( nGlyphWidth == -1 )
{
@@ -408,7 +415,7 @@ bool SimpleWinLayout::LayoutText( ImplLayoutArgs& rArgs )
mpGlyphAdvances[ i ] = nGlyphWidth;
mnWidth += nGlyphWidth;
- // remaining codes of surrogate pair get a zero width
+ // the second half of surrogate pair gets a zero width
if( bSurrogate && ((i+1) < mnGlyphCount) )
mpGlyphAdvances[ i+1 ] = 0;
commit 6ea4789e99c92994d083b13fd8efee8c35987561
Author: Jürgen Schmidt <jsc at apache.org>
Date: Fri Mar 28 10:52:29 2014 +0000
Resolves: #i124453# check if the resulting polygon...
has already exceeded the number of points (2^16) that can be handled by a tools
polygon
(cherry picked from commit 804e547d70552fd64e1344d538427f8898824b43)
Change-Id: I437a84493e264f7b650561599170e831da20c9aa
(cherry picked from commit a9582c05f854cad02710178ab7fa79498573269e)
(cherry picked from commit ab71a4512557b7290cd7b1b4923463052acf164e)
diff --git a/tools/source/generic/poly.cxx b/tools/source/generic/poly.cxx
index 585e915..6f2805b 100644
--- a/tools/source/generic/poly.cxx
+++ b/tools/source/generic/poly.cxx
@@ -910,6 +910,19 @@ void Polygon::AdaptiveSubdivide( Polygon& rResult, const double d ) const
}
*aPointIter++ = mpImplPolygon->mpPointAry[ i++ ];
+
+ if (aPoints.size() >= SAL_MAX_UINT16)
+ {
+ OSL_ENSURE(aPoints.size() < SAL_MAX_UINT16,
+ "Polygon::AdapativeSubdivision created polygon too many points;"
+ " using original polygon instead");
+
+ // The resulting polygon can not hold all the points
+ // that we have created so far. Stop the subdivision
+ // and return a copy of the unmodified polygon.
+ rResult = *this;
+ return;
+ }
}
// fill result polygon
More information about the Libreoffice-commits
mailing list