summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xvcl/win/source/gdi/winlayout.cxx122
1 files changed, 107 insertions, 15 deletions
diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index 341fdf1901a0..4b5d1221a65a 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.2 $
+ * $Revision: 1.3 $
*
- * last change: $Author: hdu $ $Date: 2002-02-26 13:11:31 $
+ * last change: $Author: hdu $ $Date: 2002-02-28 12:51:27 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -588,29 +588,39 @@ void UniscribeLayout::Draw() const
int nMaxIndex = mpGlyphCounts[ nItem ] - 1;
SCRIPT_ITEM& rScriptItem = mpScriptItems[ nItem ];
- int nLimit = mpScriptItems[ nItem+1 ].iCharPos;
+ int nCharIndexLimit = mpScriptItems[ nItem+1 ].iCharPos;
- if( (rScriptItem.iCharPos < mnFirstCharIndex) || (mnEndCharIndex < nLimit) )
+ if( (rScriptItem.iCharPos < mnFirstCharIndex) || (mnEndCharIndex < nCharIndexLimit) )
{
// get glyph range from char range by looking at cluster boundries
nStartIndex = mnGlyphCapacity;
nMaxIndex = 0;
- if( nLimit > mnEndCharIndex )
- nLimit = mnEndCharIndex;
- nLimit -= rScriptItem.iCharPos;
-
- int i = mnFirstCharIndex - rScriptItem.iCharPos;
- if( i < 0 )
- i = 0;
- for(; i < nLimit; ++i )
+ int i = mnFirstCharIndex;
+ if( i < rScriptItem.iCharPos )
+ i = rScriptItem.iCharPos;
+ if( nCharIndexLimit > mnEndCharIndex )
+ nCharIndexLimit = mnEndCharIndex;
+ for(; i < nCharIndexLimit; ++i )
{
- int n = mpLogClusters[ rScriptItem.iCharPos + i ];
+ int n = mpLogClusters[ i ];
if( nStartIndex > n )
nStartIndex = n;
if( nMaxIndex < n )
nMaxIndex = n;
}
+
+ // adjust draw position relative to cluster start
+ if( !rScriptItem.a.fRTL )
+ {
+ i = mnFirstCharIndex;
+ while( (--i >= rScriptItem.iCharPos) && (nStartIndex == mpLogClusters[i]) )
+ aRelPos -= Point( mpCharWidths[i], 0 );
+ }
+ else
+ {
+ // TODO: implement adjustment for RTL case
+ }
}
// display if there is something to display
@@ -660,8 +670,90 @@ void UniscribeLayout::Draw() const
bool UniscribeLayout::GetOutline( SalGraphics& rSalGraphics, PolyPolygon& rPolyPoly ) const
{
- // TODO
- return false;
+ long nWidth = 0;
+
+ int nGlyphsProcessed = 0;
+ for( int nItem = 0; nItem < mnItemCount; ++nItem )
+ {
+ // default: all characters in range => all glyphs in range
+ int nStartIndex = 0;
+ int nMaxIndex = mpGlyphCounts[ nItem ] - 1;
+
+ SCRIPT_ITEM& rScriptItem = mpScriptItems[ nItem ];
+ int nCharIndexLimit = mpScriptItems[ nItem+1 ].iCharPos;
+
+ if( (rScriptItem.iCharPos < mnFirstCharIndex) || (mnEndCharIndex < nCharIndexLimit) )
+ {
+ // get glyph range from char range by looking at cluster boundries
+ nStartIndex = mnGlyphCapacity;
+ nMaxIndex = 0;
+
+ int i = mnFirstCharIndex;
+ if( i < rScriptItem.iCharPos )
+ i = rScriptItem.iCharPos;
+ if( nCharIndexLimit > mnEndCharIndex )
+ nCharIndexLimit = mnEndCharIndex;
+ for(; i < nCharIndexLimit; ++i )
+ {
+ int n = mpLogClusters[ i ];
+ if( nStartIndex > n )
+ nStartIndex = n;
+ if( nMaxIndex < n )
+ nMaxIndex = n;
+ }
+
+ // adjust draw position relative to cluster start
+ if( !rScriptItem.a.fRTL )
+ {
+ i = mnFirstCharIndex;
+ while( (--i >= rScriptItem.iCharPos) && (nStartIndex == mpLogClusters[i]) )
+ nWidth -= mpCharWidths[i];
+ }
+ else
+ {
+ // TODO: implement adjustment for RTL case
+ }
+ }
+
+ // display if there is something to display
+ int nEndIndex = nMaxIndex + 1;
+ if( nStartIndex < nEndIndex )
+ {
+ // account for multiple glyphs at rightmost character
+ // test only needed when rightmost glyph isn't referenced
+ if( nEndIndex < mpGlyphCounts[ nItem ] )
+ {
+ nEndIndex = mpGlyphCounts[ nItem ];
+ int nCharCount = mpScriptItems[ nItem+1 ].iCharPos - rScriptItem.iCharPos;
+ for( int i = 0; i < nCharCount; ++i )
+ {
+ int n = mpLogClusters[ rScriptItem.iCharPos + i ];
+ if( (n < nEndIndex) && (n > nMaxIndex) )
+ nEndIndex = n;
+ }
+ }
+
+ // now we know the matching glyphs in this item
+ nStartIndex += nGlyphsProcessed;
+ nEndIndex += nGlyphsProcessed;
+ }
+
+ for( int i = nStartIndex; i < nEndIndex; ++i )
+ {
+ // get outline of individual glyph
+ PolyPolygon aGlyphOutline;
+ if( !rSalGraphics.GetGlyphOutline( mpOutGlyphs[i], aGlyphOutline ) )
+ return false;
+
+ // insert outline at correct position
+ aGlyphOutline.Move( nWidth, 0 );
+ nWidth += mpGlyphAdvances[i];
+ for( int j = 0; j < aGlyphOutline.Count(); ++j )
+ rPolyPoly.Insert( aGlyphOutline[j] );
+ }
+ }
+
+ return true;
}
// -----------------------------------------------------------------------