Module: wine Branch: master Commit: 6fb71f53541d14afe125912e567b6186b7acdb64 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6fb71f53541d14afe125912e56...
Author: Aric Stewart aric@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;