Aric Stewart : usp10: Improve selection drawing if selection starts in the middle of a cluster.
Alexandre Julliard
julliard at winehq.org
Tue Dec 20 13:43:26 CST 2011
Module: wine
Branch: master
Commit: dbe168fe9991e0dc8783a3cc468d880c4ff71dae
URL: http://source.winehq.org/git/wine.git/?a=commit;h=dbe168fe9991e0dc8783a3cc468d880c4ff71dae
Author: Aric Stewart <aric at codeweavers.com>
Date: Tue Dec 20 08:38:24 2011 -0600
usp10: Improve selection drawing if selection starts in the middle of a cluster.
---
dlls/usp10/usp10.c | 25 ++++++++++++++++++++++++-
1 files changed, 24 insertions(+), 1 deletions(-)
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index 4f532f5..93d7b0f 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -1877,6 +1877,8 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa,
INT runStart, runEnd;
INT iGlyph, cGlyphs;
HFONT oldFont = 0x0;
+ RECT crc;
+ int i;
TRACE("(%p,%d,%d,%d,%d,%d, 0x%1x, %d, %d)\n",
ssa, iX, iY, iItem, cStart, cEnd, uOptions, fSelected, fDisabled);
@@ -1887,6 +1889,7 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa,
(cEnd >= 0 && analysis->pItem[iItem].iCharPos >= cEnd))
return S_OK;
+ CopyRect(&crc,prc);
if (fSelected)
{
BkMode = GetBkMode(analysis->hdc);
@@ -1917,6 +1920,7 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa,
ScriptStringCPtoX(ssa, cEnd, FALSE, &off_x);
else
ScriptStringCPtoX(ssa, analysis->pItem[iItem+1].iCharPos-1, TRUE, &off_x);
+ crc.left = iX + off_x;
}
else
{
@@ -1924,6 +1928,7 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa,
ScriptStringCPtoX(ssa, cStart, FALSE, &off_x);
else
ScriptStringCPtoX(ssa, analysis->pItem[iItem].iCharPos, FALSE, &off_x);
+ crc.left = iX + off_x;
}
if (analysis->pItem[iItem].a.fRTL)
@@ -1938,6 +1943,24 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa,
cGlyphs++;
+ /* adjust for cluster glyphs when starting */
+ if (analysis->pItem[iItem].a.fRTL)
+ i = analysis->pItem[iItem+1].iCharPos - 1;
+ else
+ i = analysis->pItem[iItem].iCharPos;
+
+ for (; i >=analysis->pItem[iItem].iCharPos && i < analysis->pItem[iItem+1].iCharPos; (analysis->pItem[iItem].a.fRTL)?i--:i++)
+ {
+ if (analysis->glyphs[iItem].pwLogClust[i - analysis->pItem[iItem].iCharPos] == iGlyph)
+ {
+ if (analysis->pItem[iItem].a.fRTL)
+ ScriptStringCPtoX(ssa, i, TRUE, &off_x);
+ else
+ ScriptStringCPtoX(ssa, i, FALSE, &off_x);
+ break;
+ }
+ }
+
if (cEnd < 0 || scriptInformation[analysis->pItem[iItem].a.eScript].props.fNeedsCaretInfo)
{
INT direction;
@@ -1959,7 +1982,7 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa,
hr = ScriptTextOut(analysis->hdc,
(SCRIPT_CACHE *)&analysis->glyphs[iItem].sc, iX + off_x,
- iY, uOptions, prc, &analysis->pItem[iItem].a, NULL, 0,
+ iY, uOptions, &crc, &analysis->pItem[iItem].a, NULL, 0,
&analysis->glyphs[iItem].glyphs[iGlyph], cGlyphs,
&analysis->glyphs[iItem].piAdvance[iGlyph], NULL,
&analysis->glyphs[iItem].pGoffset[iGlyph]);
More information about the wine-cvs
mailing list