usp10: implement ScriptStringAnalyse, ScriptStringFree,
ScriptStringXtoCP, ScriptStringCPtoX
Vijay Kiran Kamuju
infyquest at gmail.com
Thu Dec 14 14:30:44 CST 2006
Hi,
It may be because you need to split it into smaller individual patches.
Its rather a one big patch.
Cheers,
VJ
On 12/14/06, Clinton Stimpson <cjstimpson at utwire.net> wrote:
>
> Hi,
>
> Can I get some feedback on this patch?
> It appears to have been rejected.
>
> Thanks,
> Clinton
>
>
> Clinton Stimpson wrote:
> >
> > This patch implements ScriptStringAnalyse, ScriptStringFree,
> > ScriptStringXtoCP, ScriptStringCPtoX.
> >
> > Also, many todo_wine's are removed.
> >
> >
> > Thanks,
> > Clinton Stimpson
> >
> > ChangeLog
> > Implement ScriptStringAnalyse, ScriptStringFree,
> > ScriptStringXtoCP, ScriptStringCPtoX
> >
> >
> > ------------------------------------------------------------------------
> >
> > Index: dlls/usp10/usp10.c
> > ===================================================================
> > RCS file: /home/wine/wine/dlls/usp10/usp10.c,v
> > retrieving revision 1.45
> > diff -u -r1.45 usp10.c
> > --- dlls/usp10/usp10.c 12 Dec 2006 20:30:48 -0000 1.45
> > +++ dlls/usp10/usp10.c 13 Dec 2006 03:28:30 -0000
> > @@ -73,6 +73,46 @@
> > HDC hdc;
> > } Scriptcache;
> >
> > +typedef struct {
> > + int numGlyphs;
> > + WORD* glyphs;
> > + WORD* pwLogClust;
> > + int* piAdvance;
> > + SCRIPT_VISATTR* psva;
> > + GOFFSET* pGoffset;
> > + ABC* abc;
> > +} StringGlyphs;
> > +
> > +typedef struct {
> > + BOOL invalid;
> > + HDC hdc;
> > + int cItems;
> > + int cMaxGlyphs;
> > + SCRIPT_ITEM* pItem;
> > + int numItems;
> > + StringGlyphs* glyphs;
> > + SIZE* sz;
> > +} StringAnalysis;
> > +
> > +static void ME_StringAnalysisFree(StringAnalysis* analysis)
> > +{
> > + int i;
> > + for(i=0; i<analysis->numItems; i++)
> > + {
> > + HeapFree(GetProcessHeap(), 0, analysis->glyphs[i].glyphs);
> > + HeapFree(GetProcessHeap(), 0, analysis->glyphs[i].pwLogClust);
> > + HeapFree(GetProcessHeap(), 0, analysis->glyphs[i].piAdvance);
> > + HeapFree(GetProcessHeap(), 0, analysis->glyphs[i].psva);
> > + HeapFree(GetProcessHeap(), 0, analysis->glyphs[i].pGoffset);
> > + HeapFree(GetProcessHeap(), 0, analysis->glyphs[i].abc);
> > + }
> > +
> > + HeapFree(GetProcessHeap(), 0, analysis->glyphs);
> > + HeapFree(GetProcessHeap(), 0, analysis->pItem);
> > +
> > + HeapFree(GetProcessHeap(), 0, analysis);
> > +}
> > +
> > /***********************************************************************
> > * DllMain
> > *
> > @@ -448,9 +488,16 @@
> > const BYTE *pbInClass,
> > SCRIPT_STRING_ANALYSIS *pssa)
> > {
> > - FIXME("(%p,%p,%d,%d,%d,0x%x,%d,%p,%p,%p,%p,%p,%p): stub\n",
> > - hdc, pString, cString, cGlyphs, iCharset, dwFlags,
> > - iReqWidth, psControl, psState, piDx, pTabdef, pbInClass, pssa);
> > + HRESULT hr;
> > + StringAnalysis* analysis;
> > + int numItemizedItems;
> > + int i;
> > + SCRIPT_CACHE* sc = 0;
> > +
> > + TRACE("(%p,%p,%d,%d,%d,0x%x,%d,%p,%p,%p,%p,%p,%p)\n",
> > + hdc, pString, cString, cGlyphs, iCharset, dwFlags,
> > + iReqWidth, psControl, psState, piDx, pTabdef, pbInClass, pssa);
> > +
> > if (1 > cString || NULL == pString) {
> > return E_INVALIDARG;
> > }
> > @@ -458,7 +505,64 @@
> > return E_PENDING;
> > }
> >
> > - return E_NOTIMPL;
> > + analysis = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
> > + sizeof(StringAnalysis));
> > +
> > + analysis->hdc = hdc;
> > + numItemizedItems = 255;
> > + analysis->pItem = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
> > + numItemizedItems*sizeof(SCRIPT_ITEM)+1);
> > +
> > + hr = ScriptItemize(pString, cString, numItemizedItems, psControl,
> > + psState, analysis->pItem, &analysis->numItems);
> > +
> > + while(hr == E_OUTOFMEMORY)
> > + {
> > + numItemizedItems *= 2;
> > + HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, analysis->pItem,
> > + numItemizedItems*sizeof(SCRIPT_ITEM)+1);
> > + hr = ScriptItemize(pString, cString, numItemizedItems, psControl,
> > + psState, analysis->pItem, &analysis->numItems);
> > + }
> > +
> > + analysis->glyphs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
> > + sizeof(StringGlyphs)*analysis->numItems);
> > + sc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SCRIPT_CACHE));
> > +
> > + for(i=0; i<analysis->numItems; i++)
> > + {
> > + int cChar = analysis->pItem[i+1].iCharPos - analysis->pItem[i].iCharPos;
> > + int numGlyphs = 1.5 * cChar + 16;
> > + WORD* glyphs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WORD)*numGlyphs);
> > + WORD* pwLogClust = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WORD)*cChar);
> > + int* piAdvance = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int)*numGlyphs);
> > + SCRIPT_VISATTR* psva = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SCRIPT_VISATTR)*cChar);
> > + GOFFSET* pGoffset = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GOFFSET)*numGlyphs);
> > + ABC* abc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ABC));
> > + int numGlyphsReturned;
> > +
> > + /* FIXME: non unicode strings */
> > + WCHAR* pStr = (WCHAR*)pString;
> > + hr = ScriptShape(hdc, sc, &pStr[analysis->pItem[i].iCharPos],
> > + cChar, numGlyphs, &analysis->pItem[i].a,
> > + glyphs, pwLogClust, psva, &numGlyphsReturned);
> > + hr = ScriptPlace(hdc, sc, glyphs, numGlyphsReturned, psva, &analysis->pItem[i].a,
> > + piAdvance, pGoffset, abc);
> > +
> > + analysis->glyphs[i].numGlyphs = numGlyphsReturned;
> > + analysis->glyphs[i].glyphs = glyphs;
> > + analysis->glyphs[i].pwLogClust = pwLogClust;
> > + analysis->glyphs[i].piAdvance = piAdvance;
> > + analysis->glyphs[i].psva = psva;
> > + analysis->glyphs[i].pGoffset = pGoffset;
> > + analysis->glyphs[i].abc = abc;
> > + }
> > +
> > + HeapFree(GetProcessHeap(), 0, sc);
> > +
> > + *pssa = analysis;
> > +
> > + return S_OK;
> > }
> >
> > /***********************************************************************
> > @@ -489,9 +593,46 @@
> > */
> > HRESULT WINAPI ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrailing, int* pX)
> > {
> > - FIXME("(%p), %d, %d, (%p): stub\n", ssa, icp, fTrailing, pX);
> > - *pX = 0; /* Set a reasonable value */
> > - return S_OK;
> > + int i, j;
> > + int runningX = 0;
> > + int runningCp = 0;
> > + StringAnalysis* analysis = ssa;
> > + TRACE("(%p), %d, %d, (%p)\n", ssa, icp, fTrailing, pX);
> > +
> > + if(!ssa || !pX)
> > + {
> > + return 1;
> > + }
> > +
> > + /* icp out of range */
> > + if(icp < 0)
> > + {
> > + analysis->invalid = TRUE;
> > + return E_INVALIDARG;
> > + }
> > +
> > + for(i=0; i<analysis->numItems; i++)
> > + {
> > + for(j=0; j<analysis->glyphs[i].numGlyphs; j++)
> > + {
> > + if(runningCp == icp && fTrailing == FALSE)
> > + {
> > + *pX = runningX;
> > + return S_OK;
> > + }
> > + runningX += analysis->glyphs[i].piAdvance[j];
> > + if(runningCp == icp && fTrailing == TRUE)
> > + {
> > + *pX = runningX;
> > + return S_OK;
> > + }
> > + runningCp++;
> > + }
> > + }
> > +
> > + /* icp out of range */
> > + analysis->invalid = TRUE;
> > + return E_INVALIDARG;
> > }
> >
> > /***********************************************************************
> > @@ -500,19 +641,79 @@
> > */
> > HRESULT WINAPI ScriptStringXtoCP(SCRIPT_STRING_ANALYSIS ssa, int iX, int* piCh, int* piTrailing)
> > {
> > - FIXME("(%p), %d, (%p), (%p): stub\n", ssa, iX, piCh, piTrailing);
> > - *piCh = 0; /* Set a reasonable value */
> > - *piTrailing = 0;
> > + StringAnalysis* analysis = ssa;
> > + int i;
> > + int j;
> > + int runningX = 0;
> > + int runningCp = 0;
> > + int width;
> > +
> > + TRACE("(%p), %d, (%p), (%p)\n", ssa, iX, piCh, piTrailing);
> > +
> > + if(!ssa || !piCh || !piTrailing)
> > + {
> > + return 1;
> > + }
> > +
> > + /* out of range */
> > + if(iX < 0)
> > + {
> > + *piCh = -1;
> > + *piTrailing = TRUE;
> > return S_OK;
> > + }
> > +
> > + for(i=0; i<analysis->numItems; i++)
> > + {
> > + for(j=0; j<analysis->glyphs[i].numGlyphs; j++)
> > + {
> > + width = analysis->glyphs[i].piAdvance[j];
> > + if(iX < (runningX + width))
> > + {
> > + *piCh = runningCp;
> > + if((iX - runningX) > width/2)
> > + *piTrailing = TRUE;
> > + else
> > + *piTrailing = FALSE;
> > + return S_OK;
> > + }
> > + runningX += width;
> > + runningCp++;
> > + }
> > + }
> > +
> > + /* out of range */
> > + *piCh = analysis->pItem[analysis->numItems].iCharPos;
> > + *piTrailing = FALSE;
> > +
> > + return S_OK;
> > }
> >
> > /***********************************************************************
> > * ScriptStringFree (USP10.@)
> > *
> > */
> > -HRESULT WINAPI ScriptStringFree(SCRIPT_STRING_ANALYSIS *pssa) {
> > - FIXME("(%p): stub\n",pssa);
> > - return S_OK;
> > +HRESULT WINAPI ScriptStringFree(SCRIPT_STRING_ANALYSIS *pssa)
> > +{
> > + StringAnalysis* analysis;
> > + BOOL invalid;
> > + TRACE("(%p)\n",pssa);
> > +
> > + if(!pssa)
> > + return E_INVALIDARG;
> > +
> > + analysis = *pssa;
> > + if(!analysis)
> > + return E_INVALIDARG;
> > +
> > + invalid = analysis->invalid;
> > +
> > + ME_StringAnalysisFree(analysis);
> > +
> > + if(invalid)
> > + return E_INVALIDARG;
> > +
> > + return S_OK;
> > }
> >
> > /***********************************************************************
> > Index: dlls/usp10/tests/usp10.c
> > ===================================================================
> > RCS file: /home/wine/wine/dlls/usp10/tests/usp10.c,v
> > retrieving revision 1.30
> > diff -u -r1.30 usp10.c
> > --- dlls/usp10/tests/usp10.c 12 Dec 2006 20:30:48 -0000 1.30
> > +++ dlls/usp10/tests/usp10.c 13 Dec 2006 03:28:30 -0000
> > @@ -701,21 +701,21 @@
> > hr = ScriptStringAnalyse( hdc, teststr, String, Glyphs, Charset, Flags,
> > ReqWidth, &Control, &State, Dx, &Tabdef,
> > &InClass, &ssa);
> > - todo_wine ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr);
> > + ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr);
> >
> > /* test makes sure that a call with a valid pssa still works */
> > hr = ScriptStringAnalyse( hdc, teststr, String, Glyphs, Charset, Flags,
> > ReqWidth, &Control, &State, Dx, &Tabdef,
> > &InClass, &ssa);
> > - todo_wine ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr);
> > - todo_wine ok(ssa != NULL, "ScriptStringAnalyse pssa should not be NULL\n");
> > + ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr);
> > + ok(ssa != NULL, "ScriptStringAnalyse pssa should not be NULL\n");
> >
> > if (hr == 0)
> > {
> > hr = ScriptStringOut(ssa, X, Y, Options, &rc, MinSel, MaxSel, Disabled);
> > todo_wine ok(hr == S_OK, "ScriptStringOut should return S_OK not %08x\n", hr);
> > hr = ScriptStringFree(&ssa);
> > - todo_wine ok(hr == S_OK, "ScriptStringFree should return S_OK not %08x\n", hr);
> > + ok(hr == S_OK, "ScriptStringFree should return S_OK not %08x\n", hr);
> > }
> > }
> >
> > @@ -774,8 +774,8 @@
> > hr = ScriptStringAnalyse( hdc, String, String_len, Glyphs, Charset, Flags,
> > ReqWidth, &Control, &State, NULL, &Tabdef,
> > &InClass, &ssa);
> > - todo_wine ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr);
> > - todo_wine ok(ssa != NULL, "ScriptStringAnalyse ssa should not be NULL\n");
> > + ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr);
> > + ok(ssa != NULL, "ScriptStringAnalyse ssa should not be NULL\n");
> > if (hr == 0)
> > {
> > /*
> > @@ -792,25 +792,25 @@
> > */
> > fTrailing = FALSE;
> > hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
> > - todo_wine ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
> > + ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
> > hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing);
> > - todo_wine ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
> > - todo_wine ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, X);
> > - todo_wine ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n",
> > + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
> > + ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, X);
> > + ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n",
> > iTrailing, X);
> > fTrailing = TRUE;
> > hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
> > - todo_wine ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
> > + ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
> > hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing);
> > - todo_wine ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
> > + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
> >
> > /*
> > * Check that character position returned by ScriptStringXtoCP in Ch matches the
> > * one input to ScriptStringCPtoX. This means that the Cp to X position and back
> > * again works
> > */
> > - todo_wine ok(Cp + 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp + 1, Ch, X);
> > - todo_wine ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n",
> > + ok(Cp + 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp + 1, Ch, X);
> > + ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n",
> > iTrailing, X);
> > }
> >
> > @@ -821,12 +821,12 @@
> > fTrailing = TRUE;
> > Cp = 3;
> > hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
> > - todo_wine ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
> > + ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
> > X--; /* put X just inside the trailing edge */
> > hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing);
> > - todo_wine ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
> > - todo_wine ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, X);
> > - todo_wine ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n",
> > + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
> > + ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, X);
> > + ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n",
> > iTrailing, X);
> >
> > /*
> > @@ -837,12 +837,12 @@
> > fTrailing = TRUE;
> > Cp = 3;
> > hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
> > - todo_wine ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
> > + ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
> > X++; /* put X just outside the trailing edge */
> > hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing);
> > - todo_wine ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
> > - todo_wine ok(Cp + 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp + 1, Ch, X);
> > - todo_wine ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n",
> > + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
> > + ok(Cp + 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp + 1, Ch, X);
> > + ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n",
> > iTrailing, X);
> >
> > /*
> > @@ -853,19 +853,19 @@
> > fTrailing = FALSE;
> > Cp = 3;
> > hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
> > - todo_wine ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
> > + ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr);
> > X--; /* put X just outside the leading edge */
> > hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing);
> > - todo_wine ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
> > - todo_wine ok(Cp - 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp - 1, Ch, X);
> > - todo_wine ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n",
> > + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr);
> > + ok(Cp - 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp - 1, Ch, X);
> > + ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n",
> > iTrailing, X);
> >
> > /*
> > * Cleanup the the SSA for the next round of tests
> > */
> > hr = ScriptStringFree(&ssa);
> > - todo_wine ok(hr == S_OK, "ScriptStringFree should return S_OK not %08x\n", hr);
> > + ok(hr == S_OK, "ScriptStringFree should return S_OK not %08x\n", hr);
> >
> > /*
> > * Test to see that exceeding the number of chars returns E_INVALIDARG. First
> > @@ -874,7 +874,7 @@
> > hr = ScriptStringAnalyse( hdc, String, String_len, Glyphs, Charset, Flags,
> > ReqWidth, &Control, &State, NULL, &Tabdef,
> > &InClass, &ssa);
> > - todo_wine ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr);
> > + ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr);
> >
> > /*
> > * When ScriptStringCPtoX is called with a character position Cp that exceeds the
> > @@ -884,13 +884,13 @@
> > fTrailing = FALSE;
> > Cp = String_len + 1;
> > hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
> > - todo_wine ok(hr == E_INVALIDARG, "ScriptStringCPtoX should return E_INVALIDARG not %08x\n", hr);
> > + ok(hr == E_INVALIDARG, "ScriptStringCPtoX should return E_INVALIDARG not %08x\n", hr);
> >
> > hr = ScriptStringFree(&ssa);
> > /*
> > * ScriptStringCPtoX should free ssa, hence ScriptStringFree should fail
> > */
> > - todo_wine ok(hr == E_INVALIDARG, "ScriptStringFree should return E_INVALIDARG not %08x\n", hr);
> > + ok(hr == E_INVALIDARG, "ScriptStringFree should return E_INVALIDARG not %08x\n", hr);
> > }
> > }
> >
> >
> >
> > ------------------------------------------------------------------------
> >
> >
>
>
>
>
More information about the wine-devel
mailing list