Aric Stewart : usp10: Enable a second reorder step after basic shaping.
Alexandre Julliard
julliard at winehq.org
Thu Jun 16 14:28:50 CDT 2011
Module: wine
Branch: master
Commit: 4a6364d3c0e08334a005514c38c967359c4cfc40
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4a6364d3c0e08334a005514c38c967359c4cfc40
Author: Aric Stewart <aric at codeweavers.com>
Date: Thu Jun 16 11:28:47 2011 -0500
usp10: Enable a second reorder step after basic shaping.
---
dlls/usp10/shape.c | 62 ++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 51 insertions(+), 11 deletions(-)
diff --git a/dlls/usp10/shape.c b/dlls/usp10/shape.c
index b114618..92a5bb6 100644
--- a/dlls/usp10/shape.c
+++ b/dlls/usp10/shape.c
@@ -309,6 +309,8 @@ typedef struct tagConsonantComponents
WCHAR output;
} ConsonantComponents;
+typedef void (*second_reorder_function)(LPWSTR pwChar, IndicSyllable *syllable,WORD* pwGlyphs, IndicSyllable* glyph_index, lexical_function lex);
+
/* the orders of joined_forms and contextual_features need to line up */
static const char* contextual_features[] =
{
@@ -1858,6 +1860,30 @@ static void Reorder_Matra_precede_syllable(LPWSTR pwChar, IndicSyllable *s, lexi
}
}
+static void SecondReorder_Blwf_follows_matra(LPWSTR pwChar, IndicSyllable *s, WORD *glyphs, IndicSyllable *g, lexical_function lexical)
+{
+ if (s->blwf >= 0 && g->blwf > g->base)
+ {
+ int j,loc;
+ int g_offset;
+ for (loc = s->end; loc > s->blwf; loc--)
+ if (lexical(pwChar[loc]) == lex_Matra_below || lexical(pwChar[loc]) == lex_Matra_above || lexical(pwChar[loc]) == lex_Matra_post)
+ break;
+
+ g_offset = (loc - s->blwf) - 1;
+
+ if (loc != s->blwf)
+ {
+ WORD blwf = glyphs[g->blwf];
+ TRACE("Doing reorder of Below-base to %i (glyph offset %i)\n",loc,g_offset);
+ /* do not care about the pwChar array anymore, just the glyphs */
+ for (j = 0; j < g_offset; j++)
+ glyphs[g->blwf + j] = glyphs[g->blwf + j + 1];
+ glyphs[g->blwf + g_offset] = blwf;
+ }
+ }
+}
+
static void Reorder_Like_Sinhala(LPWSTR pwChar, IndicSyllable *s, lexical_function lexical)
{
TRACE("Syllable (%i..%i..%i)\n",s->start,s->base,s->end);
@@ -1908,6 +1934,16 @@ static void Reorder_Like_Malayalam(LPWSTR pwChar, IndicSyllable *s, lexical_func
Reorder_Matra_precede_base(pwChar, s, lexical);
}
+static void SecondReorder_Like_Telugu(LPWSTR pwChar, IndicSyllable *s, WORD* pwGlyphs, IndicSyllable *g, lexical_function lexical)
+{
+ TRACE("Syllable (%i..%i..%i)\n",s->start,s->base,s->end);
+ TRACE("Glyphs (%i..%i..%i)\n",g->start,g->base,g->end);
+ if (s->start == s->base && s->base == s->end) return;
+ if (lexical(pwChar[s->base]) == lex_Vowel) return;
+
+ SecondReorder_Blwf_follows_matra(pwChar, s, pwGlyphs, g, lexical);
+}
+
static inline void shift_syllable_glyph_indexs(IndicSyllable *glyph_index, INT index, INT shift)
{
if (shift == 0)
@@ -2042,7 +2078,7 @@ static void Apply_Indic_PostBase(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa
}
}
-static void ShapeIndicSyllables(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwChars, INT cChars, IndicSyllable *syllables, INT syllable_count, WORD *pwOutGlyphs, INT* pcGlyphs, WORD *pwLogClust, lexical_function lexical)
+static void ShapeIndicSyllables(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwChars, INT cChars, IndicSyllable *syllables, INT syllable_count, WORD *pwOutGlyphs, INT* pcGlyphs, WORD *pwLogClust, lexical_function lexical, second_reorder_function second_reorder)
{
int c;
int overall_shift = 0;
@@ -2081,6 +2117,7 @@ static void ShapeIndicSyllables(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa,
TRACE("applying feature akhn\n");
Apply_Indic_BasicForm(hdc, psc, psa, pwChars, cChars, &syllables[c], pwOutGlyphs, pcGlyphs, pwLogClust, lexical, &glyph_indexs, akhn);
}
+
if (rphf)
Apply_Indic_Rphf(hdc, psc, psa, pwChars, cChars, &syllables[c], pwOutGlyphs, pcGlyphs, pwLogClust, lexical, &glyph_indexs);
if (rkrf)
@@ -2110,6 +2147,9 @@ static void ShapeIndicSyllables(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa,
Apply_Indic_BasicForm(hdc, psc, psa, pwChars, cChars, &syllables[c], pwOutGlyphs, pcGlyphs, pwLogClust, lexical, &glyph_indexs, cjct);
}
+ if (second_reorder)
+ second_reorder(pwChars, &syllables[c], pwOutGlyphs, &glyph_indexs, lexical);
+
overall_shift += glyph_indexs.end - old_end;
}
}
@@ -2187,7 +2227,7 @@ static void ContextualShape_Sinhala(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *
/* Step 4: Base Form application to syllables */
GetGlyphIndicesW(hdc, input, cCount, pwOutGlyphs, 0);
*pcGlyphs = cCount;
- ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, sinhala_lex);
+ ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, sinhala_lex, NULL);
HeapFree(GetProcessHeap(),0,input);
HeapFree(GetProcessHeap(),0,syllables);
@@ -2266,7 +2306,7 @@ static void ContextualShape_Devanagari(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSI
*pcGlyphs = cCount;
/* Step 3: Base Form application to syllables */
- ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, devanagari_lex);
+ ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, devanagari_lex, NULL);
HeapFree(GetProcessHeap(),0,input);
HeapFree(GetProcessHeap(),0,syllables);
@@ -2356,7 +2396,7 @@ static void ContextualShape_Bengali(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *
}
/* Step 4: Base Form application to syllables */
- ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, bengali_lex);
+ ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, bengali_lex, NULL);
HeapFree(GetProcessHeap(),0,input);
HeapFree(GetProcessHeap(),0,syllables);
@@ -2427,7 +2467,7 @@ static void ContextualShape_Gurmukhi(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS
*pcGlyphs = cCount;
/* Step 3: Base Form application to syllables */
- ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, gurmukhi_lex);
+ ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, gurmukhi_lex, NULL);
HeapFree(GetProcessHeap(),0,input);
HeapFree(GetProcessHeap(),0,syllables);
@@ -2482,7 +2522,7 @@ static void ContextualShape_Gujarati(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS
*pcGlyphs = cCount;
/* Step 2: Base Form application to syllables */
- ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, gujarati_lex);
+ ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, gujarati_lex, NULL);
HeapFree(GetProcessHeap(),0,input);
HeapFree(GetProcessHeap(),0,syllables);
@@ -2563,7 +2603,7 @@ static void ContextualShape_Oriya(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *ps
*pcGlyphs = cCount;
/* Step 3: Base Form application to syllables */
- ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, oriya_lex);
+ ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, oriya_lex, NULL);
HeapFree(GetProcessHeap(),0,input);
HeapFree(GetProcessHeap(),0,syllables);
@@ -2625,7 +2665,7 @@ static void ContextualShape_Tamil(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *ps
*pcGlyphs = cCount;
/* Step 3: Base Form application to syllables */
- ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, tamil_lex);
+ ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, tamil_lex, NULL);
HeapFree(GetProcessHeap(),0,input);
HeapFree(GetProcessHeap(),0,syllables);
@@ -2687,7 +2727,7 @@ static void ContextualShape_Telugu(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *p
*pcGlyphs = cCount;
/* Step 3: Base Form application to syllables */
- ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, telugu_lex);
+ ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, telugu_lex, SecondReorder_Like_Telugu);
HeapFree(GetProcessHeap(),0,input);
HeapFree(GetProcessHeap(),0,syllables);
@@ -2754,7 +2794,7 @@ static void ContextualShape_Kannada(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *
*pcGlyphs = cCount;
/* Step 3: Base Form application to syllables */
- ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, kannada_lex);
+ ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, kannada_lex, SecondReorder_Like_Telugu);
HeapFree(GetProcessHeap(),0,input);
HeapFree(GetProcessHeap(),0,syllables);
@@ -2814,7 +2854,7 @@ static void ContextualShape_Malayalam(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS
*pcGlyphs = cCount;
/* Step 3: Base Form application to syllables */
- ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, malayalam_lex);
+ ShapeIndicSyllables(hdc, psc, psa, input, cCount, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, malayalam_lex, NULL);
HeapFree(GetProcessHeap(),0,input);
HeapFree(GetProcessHeap(),0,syllables);
More information about the wine-cvs
mailing list