usp10: Implement and test ScriptStringGetOrder and ScriptString_pcOutChars.

This commit is contained in:
Hans Leidekker 2007-01-03 12:12:29 +01:00 committed by Alexandre Julliard
parent e0c38fd10f
commit f152153f15
3 changed files with 91 additions and 35 deletions

View File

@ -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)

View File

@ -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;
}

View File

@ -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