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
This commit is contained in:
Michael Stahl 2012-12-22 01:53:09 +01:00
parent d6bbdaf02d
commit cec68bceba

View file

@ -1331,6 +1331,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;
}
@ -1785,7 +1791,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