Author: hdu Date: Tue Aug 6 13:14:19 2013 New Revision: 1510954 URL: http://svn.apache.org/r1510954 Log: #i122948# fill gaps in glyphs->chars mapping for usp10-layouts
using a heuristic that assumes a glyph with unknown char mapping is the continuation of the preceding glyph. If there is no known preceding mapping use the run bounds. Modified: openoffice/trunk/main/vcl/source/gdi/sallayout.cxx openoffice/trunk/main/vcl/win/source/gdi/winlayout.cxx Modified: openoffice/trunk/main/vcl/source/gdi/sallayout.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/vcl/source/gdi/sallayout.cxx?rev=1510954&r1=1510953&r2=1510954&view=diff ============================================================================== --- openoffice/trunk/main/vcl/source/gdi/sallayout.cxx (original) +++ openoffice/trunk/main/vcl/source/gdi/sallayout.cxx Tue Aug 6 13:14:19 2013 @@ -1869,12 +1869,7 @@ void MultiSalLayout::AdjustLayout( ImplL for( n = 0; n < nLevel; ++n ) maFallbackRuns[n].ResetPos(); // get the next codepoint index that needs fallback - // and limit it to the minindex..endindex bounds int nActiveCharPos = nCharPos[0]; - if( nActiveCharPos < mnMinCharPos) - nActiveCharPos = mnMinCharPos; - else if( nActiveCharPos >= rArgs.mnEndCharPos ) - nActiveCharPos = rArgs.mnEndCharPos - 1; // get the end index of the active run int nLastRunEndChar = (vRtl[nActiveCharPos - mnMinCharPos])? rArgs.mnEndCharPos : rArgs.mnMinCharPos - 1; @@ -2083,8 +2078,6 @@ void MultiSalLayout::AdjustLayout( ImplL } } } -// if( !maFallbackRuns[i].PosIsInRun( nActiveCharPos ) ) -// maFallbackRuns[i].NextRun(); } mpLayouts[0]->Simplify( true ); Modified: openoffice/trunk/main/vcl/win/source/gdi/winlayout.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/vcl/win/source/gdi/winlayout.cxx?rev=1510954&r1=1510953&r2=1510954&view=diff ============================================================================== --- openoffice/trunk/main/vcl/win/source/gdi/winlayout.cxx (original) +++ openoffice/trunk/main/vcl/win/source/gdi/winlayout.cxx Tue Aug 6 13:14:19 2013 @@ -1845,30 +1845,39 @@ int UniscribeLayout::GetNextGlyphs( int nXOffset += mpJustifications[ nStart ] - mpGlyphAdvances[ nStart ]; } - // create mpGlyphs2Chars[] if it is needed later - if( pCharPosAry && !mpGlyphs2Chars ) - { - // create and reset the new array - mpGlyphs2Chars = new int[ mnGlyphCapacity ]; - for( int i = 0; i < mnGlyphCount; ++i ) - mpGlyphs2Chars[i] = -1; - // calculate the char->glyph mapping - for( nItem = 0; nItem < mnItemCount; ++nItem ) - { - // ignore invisible visual items - const VisualItem& rVI = mpVisualItems[ nItem ]; - if( rVI.IsEmpty() ) - continue; - // calculate the mapping by using mpLogClusters[] - // mpGlyphs2Chars[] should obey the logical order - // => reversing the loop does this by overwriting higher logicals - for( c = rVI.mnEndCharPos; --c >= rVI.mnMinCharPos; ) - { - int i = mpLogClusters[c] + rVI.mnMinGlyphPos; - mpGlyphs2Chars[i] = c; - } - } - } + // create mpGlyphs2Chars[] if it is needed later + if( pCharPosAry && !mpGlyphs2Chars ) + { + // create and reset the new array + mpGlyphs2Chars = new int[ mnGlyphCapacity ]; + static const int CHARPOS_NONE = -1; + for( int i = 0; i < mnGlyphCount; ++i ) + mpGlyphs2Chars[i] = CHARPOS_NONE; + // calculate the char->glyph mapping + for( nItem = 0; nItem < mnItemCount; ++nItem ) + { + // ignore invisible visual items + const VisualItem& rVI = mpVisualItems[ nItem ]; + if( rVI.IsEmpty() ) + continue; + // calculate the mapping by using mpLogClusters[] + // mpGlyphs2Chars[] should obey the logical order + // => reversing the loop does this by overwriting higher logicals + for( c = rVI.mnEndCharPos; --c >= rVI.mnMinCharPos; ) + { + int i = mpLogClusters[c] + rVI.mnMinGlyphPos; + mpGlyphs2Chars[i] = c; + } + // use a heuristic to fill the gaps in the glyphs2chars array + c = !rVI.IsRTL() ? rVI.mnMinCharPos : rVI.mnEndCharPos - 1; + for( int i = rVI.mnMinGlyphPos; i < rVI.mnEndGlyphPos; ++i ) { + if( mpGlyphs2Chars[i] == CHARPOS_NONE ) + mpGlyphs2Chars[i] = c; + else + c = mpGlyphs2Chars[i]; + } + } + } // calculate the absolute position of the first result glyph in pixel units const GOFFSET aGOffset = mpGlyphOffsets[ nStart ];