summaryrefslogtreecommitdiff
path: root/vcl/win
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2004-11-26 15:23:20 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2004-11-26 15:23:20 +0000
commit15d272a8cc18729f31abc6a5060038e05b23d5e7 (patch)
tree032992974849de32efe22ae51af96229b4adf12e /vcl/win
parent788bbfb77d50fb5bf1ff47a48aebf0a8d9c906a3 (diff)
INTEGRATION: CWS vcl31 (1.85.34); FILE MERGED
2004/11/11 20:04:18 hdu 1.85.34.2: #110548# improved glyph fallback for SimpleWinLayout 2004/11/10 13:15:28 hdu 1.85.34.1: #110548# improved glyph fallback for SimpleWinLayout
Diffstat (limited to 'vcl/win')
-rwxr-xr-xvcl/win/source/gdi/winlayout.cxx130
1 files changed, 65 insertions, 65 deletions
diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index 195154a9beed..f4ea20b8eafc 100755
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: winlayout.cxx,v $
*
- * $Revision: 1.87 $
+ * $Revision: 1.88 $
*
- * last change: $Author: hr $ $Date: 2004-11-26 16:16:02 $
+ * last change: $Author: hr $ $Date: 2004-11-26 16:23:20 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -501,31 +501,27 @@ bool SimpleWinLayout::LayoutText( ImplLayoutArgs& rArgs )
{
mnWidth += mpGlyphAdvances[i];
- // we are only interested in notdef candidates
+ // check with the font face whether it supports the unicode
+ sal_Unicode cChar;
+ int nCharPos;
if( mbDisableGlyphs )
{
- // TODO: improve heurisitics for non-GlyphIndexing NotDef detection
- if( mpGlyphAdvances[i] != 0 )
- continue;
+ nCharPos = mpGlyphs2Chars ? mpGlyphs2Chars[i]: i + rArgs.mnMinCharPos;
+ cChar = mpOutGlyphs[i];
}
else
{
- // TODO: improve heuristic below
- // problem is that some fonts seem to have NotDef at glyphids 0,3,4
- if( (mpGlyphAdvances[i] != 0) || (mpOutGlyphs[i] > 4) )
+ if( mpGlyphAdvances[i] != 0 )
if( mpOutGlyphs[i] != 0 )
continue;
+ nCharPos = mpGlyphs2Chars ? mpGlyphs2Chars[i]: i + rArgs.mnMinCharPos;
+ cChar = rArgs.mpStr[ nCharPos ];
}
+ if( mrWinFontData.HasChar( cChar ) )
+ continue;
+ // request glyph fallback at this position in the string
bool bRTL = mpGlyphRTLFlags ? mpGlyphRTLFlags[i] : false;
- int nCharPos = mpGlyphs2Chars ? mpGlyphs2Chars[i]: i + rArgs.mnMinCharPos;
-
- // double check with the font face, if it has support for the unicode
- sal_Unicode cChar = rArgs.mpStr[ nCharPos ];
- if( mrWinFontData.HasChar( cChar ) )
- continue;
-
- // request glyph fallback at this position
rArgs.NeedFallback( nCharPos, bRTL );
if( rArgs.mnFlags & SAL_LAYOUT_FOR_FALLBACK )
@@ -643,7 +639,7 @@ int SimpleWinLayout::GetNextGlyphs( int nLen, long* pGlyphs, Point& rPos, int& n
int nCount = 0;
while( nCount < nLen )
{
- // update return values (nGlyphIndex,nCharPos,nGlyphAdvance)
+ // update return values {nGlyphIndex,nCharPos,nGlyphAdvance}
long nGlyphIndex = mpOutGlyphs[ nStart ];
if( mbDisableGlyphs )
{
@@ -973,28 +969,28 @@ void SimpleWinLayout::ApplyDXArray( const ImplLayoutArgs& rArgs )
void SimpleWinLayout::MoveGlyph( int nStart, long nNewXPos )
{
- if( nStart >= mnGlyphCount )
+ if( nStart >= mnGlyphCount )
return;
+
+ // calculate the current x-position of the requested glyph
// TODO: cache absolute positions
- int nDelta = mnBaseAdv;
+ int nXPos = mnBaseAdv;
for( int i = 0; i < nStart; ++i )
- nDelta += mpGlyphAdvances[ i ];
- nDelta = nNewXPos - nDelta;
+ nXPos += mpGlyphAdvances[i];
+
+ // calculate the difference to the current glyph position
+ int nDelta = nNewXPos - nXPos;
+
+ // adjust the width of the layout if it was already cached
if( mnWidth )
- {
- // when width is cached it needs to be adjusted
mnWidth += nDelta;
- }
+
+ // depending on whether the requested glyph is leftmost in the layout
+ // adjust either the layout's or the requested glyph's relative position
if( nStart > 0 )
- {
- // adjust virtual width when inbetween
mpGlyphAdvances[ nStart-1 ] += nDelta;
- }
else
- {
- // change offset when first glyph has fallback
- mnBaseAdv = nNewXPos;
- }
+ mnBaseAdv += nDelta;
}
// -----------------------------------------------------------------------
@@ -1002,19 +998,21 @@ void SimpleWinLayout::MoveGlyph( int nStart, long nNewXPos )
void SimpleWinLayout::DropGlyph( int nStart )
{
mpOutGlyphs[ nStart ] = DROPPED_OUTGLYPH;
+ if( mnWidth )
+ mnWidth -= mpGlyphAdvances[ nStart ];
}
// -----------------------------------------------------------------------
void SimpleWinLayout::Simplify( bool bIsBase )
{
- // return early if no glyph is dropped
+ // return early if no glyph has been dropped
int i = mnGlyphCount;
while( (--i >= 0) && (mpOutGlyphs[ i ] != DROPPED_OUTGLYPH) );
if( i < 0 )
return;
- // convert to sparse layout when glyphs are dropped
+ // convert the layout to a sparse layout if it is not already
if( !mpGlyphs2Chars )
{
mpGlyphs2Chars = new int[ mnGlyphCount ];
@@ -1022,24 +1020,25 @@ void SimpleWinLayout::Simplify( bool bIsBase )
// assertion: mnGlyphCount == mnCharCount
for( int k = 0; k < mnGlyphCount; ++k )
{
- mpGlyphs2Chars[ k ] = k + mnMinCharPos;
+ mpGlyphs2Chars[ k ] = mnMinCharPos + k;
mpCharWidths[ k ] = mpGlyphAdvances[ k ];
}
}
- // when glyphs at end have been removed => reduce width
+ // remove dropped glyphs that are rightmost in the layout
for( i = mnGlyphCount; --i >= 0; )
{
if( mpOutGlyphs[ i ] != DROPPED_OUTGLYPH )
break;
- mnWidth -= mpGlyphAdvances[ i ];
- int c = mpGlyphs2Chars[ i ] - mnMinCharPos;
- if( c >= 0 )
- mpCharWidths[ c ] = 0;
+ if( mnWidth )
+ mnWidth -= mpGlyphAdvances[ i ];
+ int nRelCharPos = mpGlyphs2Chars[ i ] - mnMinCharPos;
+ if( nRelCharPos >= 0 )
+ mpCharWidths[ nRelCharPos ] = 0;
}
mnGlyphCount = i + 1;
- // keep original widths around
+ // keep original glyph widths around
if( !mpGlyphOrigAdvs )
{
mpGlyphOrigAdvs = new int[ mnGlyphCount ];
@@ -1047,36 +1046,37 @@ void SimpleWinLayout::Simplify( bool bIsBase )
mpGlyphOrigAdvs[ k ] = mpGlyphAdvances[ k ];
}
- // skip to first dropped glyph
+ // remove dropped glyphs inside the layout
+ int nNewGC = 0;
for( i = 0; i < mnGlyphCount; ++i )
- if( mpOutGlyphs[ i ] == DROPPED_OUTGLYPH )
- break;
-
- // remove dropped glyphs inbetween
- int nNewGC = i;
- for(; i < mnGlyphCount; ++i )
{
- mpOutGlyphs[ nNewGC ] = mpOutGlyphs[ i ];
- mpGlyphAdvances[ nNewGC ] = mpGlyphAdvances[ i ];
- mpGlyphOrigAdvs[ nNewGC ] = mpGlyphOrigAdvs[ i ];
- mpGlyphs2Chars[ nNewGC ] = mpGlyphs2Chars[ i ];
+ if( mpOutGlyphs[ i ] == DROPPED_OUTGLYPH )
+ {
+ // adjust relative position to last valid glyph
+ int nDroppedWidth = mpGlyphAdvances[ i ];
+ mpGlyphAdvances[ i ] = 0;
+ if( nNewGC > 0 )
+ mpGlyphAdvances[ nNewGC-1 ] += nDroppedWidth;
+ else
+ mnBaseAdv += nDroppedWidth;
- if( mpOutGlyphs[ i ] != DROPPED_OUTGLYPH )
+ // zero the virtual char width for the char that has a fallback
+ int nRelCharPos = mpGlyphs2Chars[ i ] - mnMinCharPos;
+ if( nRelCharPos >= 0 )
+ mpCharWidths[ nRelCharPos ] = 0;
+ }
+ else
{
+ if( nNewGC != i )
+ {
+ // rearrange the glyph array to get rid of the dropped glyph
+ mpOutGlyphs[ nNewGC ] = mpOutGlyphs[ i ];
+ mpGlyphAdvances[ nNewGC ] = mpGlyphAdvances[ i ];
+ mpGlyphOrigAdvs[ nNewGC ] = mpGlyphOrigAdvs[ i ];
+ mpGlyphs2Chars[ nNewGC ] = mpGlyphs2Chars[ i ];
+ }
++nNewGC;
- continue;
}
-
- // zero virtual char width for fallback char
- int c = mpGlyphs2Chars[ i ] - mnMinCharPos;
- if( c >= 0 )
- mpCharWidths[ c ] = 0;
-
- // adjust positions for dropped glyph
- if( nNewGC > 0 )
- mpGlyphAdvances[ nNewGC-1 ] += mpGlyphAdvances[ i ];
- else
- mnBaseAdv += mpGlyphAdvances[ i ];
}
mnGlyphCount = nNewGC;