Aric Stewart : usp10: Break out get_cluster_size and use it to correct ScriptStringGetLogicalWidths for clusters .
Alexandre Julliard
julliard at winehq.org
Tue Oct 18 12:56:26 CDT 2011
Module: wine
Branch: master
Commit: 6fb71f53541d14afe125912e567b6186b7acdb64
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6fb71f53541d14afe125912e567b6186b7acdb64
Author: Aric Stewart <aric at codeweavers.com>
Date: Mon Oct 17 10:40:46 2011 -0500
usp10: Break out get_cluster_size and use it to correct ScriptStringGetLogicalWidths for clusters.
---
dlls/usp10/usp10.c | 69 +++++++++++++++++++++++++++++++--------------------
1 files changed, 42 insertions(+), 27 deletions(-)
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index 3f323b2..941b918 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -1617,6 +1617,30 @@ HRESULT WINAPI ScriptStringFree(SCRIPT_STRING_ANALYSIS *pssa)
return S_OK;
}
+static inline int get_cluster_size(const WORD *pwLogClust, int cChars, int item,
+ int direction, int* iCluster, int *check_out)
+{
+ int clust_size = 1;
+ int check;
+ WORD clust = pwLogClust[item];
+
+ for (check = item+direction; check < cChars && check >= 0; check+=direction)
+ {
+ if (pwLogClust[check] == clust)
+ {
+ clust_size ++;
+ if (iCluster && *iCluster == -1)
+ *iCluster = item;
+ }
+ else break;
+ }
+
+ if (check_out)
+ *check_out = check;
+
+ return clust_size;
+}
+
/***********************************************************************
* ScriptCPtoX (USP10.@)
*
@@ -1674,19 +1698,9 @@ HRESULT WINAPI ScriptCPtoX(int iCP,
int check;
int clust = pwLogClust[item];
- clust_size = 1;
iCluster = -1;
-
- for (check = item+1; check < cChars; check++)
- {
- if (pwLogClust[check] == clust)
- {
- clust_size ++;
- if (iCluster == -1)
- iCluster = item;
- }
- else break;
- }
+ clust_size = get_cluster_size(pwLogClust, cChars, item, 1, &iCluster,
+ &check);
if (check >= cChars && !iMaxPos)
{
@@ -1812,20 +1826,10 @@ HRESULT WINAPI ScriptXtoCP(int iX,
int check;
int clust = pwLogClust[item];
- clust_size = 1;
iCluster = -1;
cjump = 0;
-
- for (check = item+direction; check < cChars && check >= 0; check+=direction)
- {
- if (pwLogClust[check] == clust)
- {
- clust_size ++;
- if (iCluster == -1)
- iCluster = item;
- }
- else break;
- }
+ clust_size = get_cluster_size(pwLogClust, cChars, item, direction,
+ &iCluster, &check);
if (check >= cChars && direction > 0)
{
@@ -2569,12 +2573,23 @@ HRESULT WINAPI ScriptStringGetLogicalWidths(SCRIPT_STRING_ANALYSIS ssa, int *piD
for (i = 0; i < analysis->numItems; i++)
{
int cChar = analysis->pItem[i+1].iCharPos - analysis->pItem[i].iCharPos;
+ int direction = 1;
+
+ if (analysis->pItem[i].a.fRTL && ! analysis->pItem[i].a.fLogicalOrder)
+ direction = -1;
+
for (j = 0; j < cChar; j++)
{
-
+ int k;
int glyph = analysis->glyphs[i].pwLogClust[j];
- piDx[next] = analysis->glyphs[i].piAdvance[glyph];
- next++;
+ int clust_size = get_cluster_size(analysis->glyphs[i].pwLogClust,
+ cChar, j, direction, NULL, NULL);
+ for (k = 0; k < clust_size; k++)
+ {
+ piDx[next] = analysis->glyphs[i].piAdvance[glyph] / clust_size;
+ next++;
+ if (k) j++;
+ }
}
}
return S_OK;
More information about the wine-cvs
mailing list