summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2012-12-22 01:53:09 +0100
committerMiklos Vajna <vmiklos@suse.cz>2013-01-02 12:21:06 +0000
commit49dcb4794c838d5f1cf61060f216fc67f36c1618 (patch)
tree6801a963986c187f8d9ac3162d68070034712a33
parentbe09d157c3dc114e4933c85499baa41bfa0510a7 (diff)
fdo#47553: UniscribeLayout: adjust mnSubStringMin
... to actual minimum so that the fix for fdo#33090 in UniscribeLayout::GetNextGlyphs subtracts exactly the right number. The original value of mnSubStringMin is guessed and may be up to 8 smaller than the actual start of the first VisualItem. For the bugdoc it happens that sometimes it's too small by 8 and then the wrong entries in mpGlyphs2Chars are initialized and then apparently there are single glyphs that represent multiple characters and so GetNextGlyphs returns a -1 character which is invalid. ->GetNextGlyphs dir 1 36 mnSubStringMin 28 ->GetNextGlyphs g2c #1 [8] = 36 ->GetNextGlyphs g2c #1 [9] = 37 ->GetNextGlyphs g2c #1 [10] = 38 ->GetNextGlyphs g2c #1 [11] = 39 ->GetNextGlyphs g2c #1 [12] = 40 ->GetNextGlyphs g2c #2 [4] = 40 ->GetNextGlyphs g2c #2 [3] = 39 ->GetNextGlyphs g2c #2 [1] = 38 ->GetNextGlyphs g2c #2 [1] = 37 ->GetNextGlyphs g2c #2 [0] = 36 ... ->GetNextGlyphs init nCharPos -1 ->GetNextGlyphs g2c [2] nCharPos -1 ->GetNextGlyphs set pCharPosAry -1 layout[0]->GetNextGlyphs 768,1024 a1800 c-1 0 Change-Id: Ie33ec797a412aa898bec3f4e8f97b88dcfed4d11 (cherry picked from commit cec68bceba9aa1e984d74897fcd7bf4db702d14b) Reviewed-on: https://gerrit.libreoffice.org/1467 Reviewed-by: Miklos Vajna <vmiklos@suse.cz> Tested-by: Miklos Vajna <vmiklos@suse.cz>
-rw-r--r--vcl/win/source/gdi/winlayout.cxx9
1 files changed, 9 insertions, 0 deletions
diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index 1df1a75816a6..4ebdd0631ddf 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -1339,6 +1339,12 @@ bool UniscribeLayout::LayoutText( ImplLayoutArgs& rArgs )
{
for( int j = rVisualItem.mnMinCharPos; j < rVisualItem.mnEndCharPos; ++j )
mpLogClusters[j] = sal::static_int_cast<WORD>(~0U);
+ if (rArgs.mnMinCharPos >= rVisualItem.mnEndCharPos)
+ { // fdo#47553 adjust "guessed" min (maybe up to -8 off) to
+ // actual min so it can be used properly in GetNextGlyphs
+ assert(mnSubStringMin <= rVisualItem.mnEndCharPos);
+ mnSubStringMin = rVisualItem.mnEndCharPos;
+ }
continue;
}
@@ -1793,7 +1799,10 @@ int UniscribeLayout::GetNextGlyphs( int nLen, sal_GlyphId* pGlyphs, Point& rPos,
int nGlyphWidth = pGlyphWidths[ nStart ];
int nCharPos = -1; // no need to determine charpos
if( mpGlyphs2Chars ) // unless explicitly requested+provided
+ {
nCharPos = mpGlyphs2Chars[ nStart ];
+ assert(-1 != nCharPos);
+ }
// inject kashida glyphs if needed
if( !mbDisableGlyphInjection