From f152153f15de09acbee08d890f8b8ebab04f5dfe Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Wed, 3 Jan 2007 12:12:29 +0100 Subject: [PATCH] usp10: Implement and test ScriptStringGetOrder and ScriptString_pcOutChars. --- dlls/usp10/tests/usp10.c | 42 +++++++++++++------------ dlls/usp10/usp10.c | 80 ++++++++++++++++++++++++++++++++++++++++-------- dlls/usp10/usp10.spec | 4 +-- 3 files changed, 91 insertions(+), 35 deletions(-) diff --git a/dlls/usp10/tests/usp10.c b/dlls/usp10/tests/usp10.c index a4d6e6e7514..42a4da756dc 100644 --- a/dlls/usp10/tests/usp10.c +++ b/dlls/usp10/tests/usp10.c @@ -617,8 +617,8 @@ static void test_ScriptString(HDC hdc) HRESULT hr; WCHAR teststr[] = {'T','e','s','t','1',' ','a','2','b','3', '\0'}; - int String = (sizeof(teststr)/sizeof(WCHAR))-1; - int Glyphs = String * 2 + 16; + int len = (sizeof(teststr) / sizeof(WCHAR)) - 1; + int Glyphs = len * 2 + 16; int Charset; DWORD Flags = SSA_GLYPHS; int ReqWidth = 100; @@ -633,49 +633,51 @@ static void test_ScriptString(HDC hdc) int Y = 100; UINT Options = 0; const RECT rc = {0, 50, 100, 100}; - int MinSel = 0; + int MinSel = 0; int MaxSel = 0; BOOL Disabled = FALSE; + const int *clip_len; + UINT *order, i; - LOGFONTA lf; - - lstrcpyA(lf.lfFaceName, "Symbol"); - lf.lfHeight = 10; - lf.lfItalic = 0; - lf.lfEscapement = 0; - lf.lfOrientation = 0; - lf.lfUnderline = 0; - lf.lfStrikeOut = 0; - lf.lfWeight = 300; - lf.lfWidth = 10; Charset = -1; /* this flag indicates unicode input */ /* Test without hdc to get E_PENDING */ - hr = ScriptStringAnalyse( NULL, teststr, String, Glyphs, Charset, Flags, + hr = ScriptStringAnalyse( NULL, teststr, len, Glyphs, Charset, Flags, ReqWidth, &Control, &State, Dx, &Tabdef, &InClass, &ssa); ok(hr == E_PENDING, "ScriptStringAnalyse Stub should return E_PENDING not %08x\n", hr); /* test with hdc, this should be a valid test */ - hr = ScriptStringAnalyse( hdc, teststr, String, Glyphs, Charset, Flags, + hr = ScriptStringAnalyse( hdc, teststr, len, Glyphs, Charset, Flags, ReqWidth, &Control, &State, Dx, &Tabdef, &InClass, &ssa); 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, + hr = ScriptStringAnalyse( hdc, teststr, len, Glyphs, Charset, Flags, ReqWidth, &Control, &State, Dx, &Tabdef, &InClass, &ssa); 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) + if (hr == S_OK) { hr = ScriptStringOut(ssa, X, Y, Options, &rc, MinSel, MaxSel, Disabled); ok(hr == S_OK, "ScriptStringOut should return S_OK not %08x\n", hr); - hr = ScriptStringFree(&ssa); - ok(hr == S_OK, "ScriptStringFree should return S_OK not %08x\n", hr); } + + clip_len = ScriptString_pcOutChars(ssa); + ok(*clip_len == len, "ScriptString_pcOutChars failed, got %d, expected %d\n", *clip_len, len); + + order = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *clip_len * sizeof(UINT)); + hr = ScriptStringGetOrder(ssa, order); + ok(hr == S_OK, "ScriptStringGetOrder failed, got %08x, expected S_OK\n", hr); + + for (i = 0; i < *clip_len; i++) ok(order[i] == i, "%d: got %d expected %d\n", i, order[i], i); + HeapFree(GetProcessHeap(), 0, order); + + hr = ScriptStringFree(&ssa); + ok(hr == S_OK, "ScriptStringFree should return S_OK not %08x\n", hr); } static void test_ScriptStringXtoCP_CPtoX(HDC hdc) diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c index ca713bdc4ab..3afaadd8c23 100644 --- a/dlls/usp10/usp10.c +++ b/dlls/usp10/usp10.c @@ -159,6 +159,7 @@ typedef struct { typedef struct { BOOL invalid; + int clip_len; ScriptCache *sc; int cItems; int cMaxGlyphs; @@ -520,19 +521,12 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem * ScriptStringAnalyse (USP10.@) * */ -HRESULT WINAPI ScriptStringAnalyse(HDC hdc, - const void *pString, - int cString, - int cGlyphs, - int iCharset, - DWORD dwFlags, - int iReqWidth, - SCRIPT_CONTROL *psControl, - SCRIPT_STATE *psState, - const int *piDx, - SCRIPT_TABDEF *pTabdef, - const BYTE *pbInClass, - SCRIPT_STRING_ANALYSIS *pssa) +HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString, + int cGlyphs, int iCharset, DWORD dwFlags, + int iReqWidth, SCRIPT_CONTROL *psControl, + SCRIPT_STATE *psState, const int *piDx, + SCRIPT_TABDEF *pTabdef, const BYTE *pbInClass, + SCRIPT_STRING_ANALYSIS *pssa) { HRESULT hr = E_OUTOFMEMORY; StringAnalysis *analysis = NULL; @@ -542,12 +536,20 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, hdc, pString, cString, cGlyphs, iCharset, dwFlags, iReqWidth, psControl, psState, piDx, pTabdef, pbInClass, pssa); + if (iCharset != -1) + { + FIXME("Only Unicode strings are supported\n"); + return E_INVALIDARG; + } if (cString < 1 || !pString) return E_INVALIDARG; if ((dwFlags & SSA_GLYPHS) && !hdc) return E_PENDING; if (!(analysis = usp_zero_alloc(sizeof(StringAnalysis)))) return E_OUTOFMEMORY; if (!(analysis->pItem = usp_zero_alloc(num_items * sizeof(SCRIPT_ITEM) + 1))) goto error; + /* FIXME: handle clipping */ + analysis->clip_len = cString; + hr = ScriptItemize(pString, cString, num_items, psControl, psState, analysis->pItem, &analysis->numItems); @@ -1567,3 +1569,55 @@ const SCRIPT_LOGATTR * WINAPI ScriptString_pLogAttr(SCRIPT_STRING_ANALYSIS ssa) if (!analysis) return NULL; return analysis->logattrs; } + +/*********************************************************************** + * ScriptString_pcOutChars (USP10.@) + * + * Retrieve the length of a string after clipping. + * + * PARAMS + * ssa [I] String analysis. + * + * RETURNS + * Success: Pointer to the length. + * Failure: NULL + */ +const int * WINAPI ScriptString_pcOutChars(SCRIPT_STRING_ANALYSIS ssa) +{ + StringAnalysis *analysis = ssa; + + TRACE("(%p)\n", ssa); + + if (!analysis) return NULL; + return &analysis->clip_len; +} + +/*********************************************************************** + * ScriptStringGetOrder (USP10.@) + * + * Retrieve a glyph order map. + * + * PARAMS + * ssa [I] String analysis. + * order [I/O] Array of glyph positions. + * + * RETURNS + * Success: S_OK + * Failure: a non-zero HRESULT. + */ +HRESULT WINAPI ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS ssa, UINT *order) +{ + unsigned int i, j, k; + StringAnalysis *analysis = ssa; + + TRACE("(%p)\n", ssa); + + if (!analysis) return S_FALSE; + + /* FIXME: handle RTL scripts */ + for (i = 0, k = 0; i < analysis->numItems; i++) + for (j = 0; j < analysis->glyphs[i].numGlyphs; j++, k++) + order[k] = k; + + return S_OK; +} diff --git a/dlls/usp10/usp10.spec b/dlls/usp10/usp10.spec index 8051da23351..df07f43bc08 100644 --- a/dlls/usp10/usp10.spec +++ b/dlls/usp10/usp10.spec @@ -21,13 +21,13 @@ @ stdcall ScriptStringCPtoX(ptr long long ptr) @ stdcall ScriptStringFree(ptr) @ stdcall ScriptStringGetLogicalWidths(ptr ptr) -@ stub ScriptStringGetOrder +@ stdcall ScriptStringGetOrder(ptr ptr) @ stdcall ScriptStringOut(ptr long long long ptr long long long) @ stdcall ScriptStringValidate(ptr) @ stdcall ScriptStringXtoCP(ptr long ptr ptr) @ stdcall ScriptString_pLogAttr(ptr) @ stdcall ScriptString_pSize(ptr) -@ stub ScriptString_pcOutChars +@ stdcall ScriptString_pcOutChars(ptr) @ stdcall ScriptTextOut(ptr ptr long long long ptr ptr ptr long ptr long ptr ptr ptr) @ stdcall ScriptXtoCP(long long long ptr ptr ptr ptr ptr ptr) @ stub UspAllocCache -- 2.11.4.GIT