usp10: Add functionality for ScriptXtoCP and ScriptCPtoX calls.
This commit is contained in:
parent
2308d49bcb
commit
8d139c8b96
|
@ -487,6 +487,96 @@ void test_ScriptTextOut(void)
|
|||
DestroyWindow(hwnd);
|
||||
}
|
||||
|
||||
static void test_ScriptXtoX(void)
|
||||
/****************************************************************************************
|
||||
* This routine tests the ScriptXtoCP and ScriptCPtoX functions using static variables *
|
||||
****************************************************************************************/
|
||||
{
|
||||
int iX, iCP;
|
||||
int cChars;
|
||||
int cGlyphs;
|
||||
WORD pwLogClust[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
SCRIPT_VISATTR psva[10];
|
||||
int piAdvance[10] = {200, 190, 210, 180, 170, 204, 189, 195, 212, 203};
|
||||
SCRIPT_ANALYSIS psa;
|
||||
int piCP, piX;
|
||||
int piTrailing;
|
||||
BOOL fTrailing;
|
||||
HRESULT hr;
|
||||
|
||||
iX = -1;
|
||||
cChars = 10;
|
||||
cGlyphs = 10;
|
||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piCP, &piTrailing);
|
||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %d\n", (unsigned int) hr);
|
||||
ok(piCP == -1, "Negative iX should return piCP=-1 not %d\n", piCP);
|
||||
ok(piTrailing == TRUE, "Negative iX should return piTrailing=TRUE not %d", piTrailing);
|
||||
iX = 1954;
|
||||
cChars = 10;
|
||||
cGlyphs = 10;
|
||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piCP, &piTrailing);
|
||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %d\n", (unsigned int) hr);
|
||||
ok(piCP == 10, "Excessive iX should return piCP=10 not %d\n", piCP);
|
||||
ok(piTrailing == FALSE, "Excessive iX should return piTrailing=FALSE not %d\n", piTrailing);
|
||||
iX = 779;
|
||||
cChars = 10;
|
||||
cGlyphs = 10;
|
||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piCP, &piTrailing);
|
||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %d\n", (unsigned int) hr);
|
||||
ok(piCP == 3, "iX=%d should return piCP=3 not %d\n", iX, piCP);
|
||||
ok(piTrailing == 1, "iX=%d should return piTrailing=1 not %d\n", iX, piTrailing);
|
||||
iX = 780;
|
||||
cChars = 10;
|
||||
cGlyphs = 10;
|
||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piCP, &piTrailing);
|
||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %d\n", (unsigned int) hr);
|
||||
ok(piCP == 3, "iX=%d should return piCP=3 not %d\n", iX, piCP);
|
||||
ok(piTrailing == 1, "iX=%d should return piTrailing=1 not %d\n", iX, piTrailing);
|
||||
iX = 868;
|
||||
cChars = 10;
|
||||
cGlyphs = 10;
|
||||
hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piCP, &piTrailing);
|
||||
ok(hr == S_OK, "ScriptXtoCP should return S_OK not %d\n", (unsigned int) hr);
|
||||
ok(piCP == 4, "iX=%d should return piCP=4 not %d\n", iX, piCP);
|
||||
|
||||
iCP=5;
|
||||
fTrailing = FALSE;
|
||||
cChars = 10;
|
||||
cGlyphs = 10;
|
||||
hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piX);
|
||||
ok(hr == S_OK, "ScriptCPtoX should return S_OK not %d\n", (unsigned int) hr);
|
||||
ok(piX == 976, "iCP=%d should return piX=976 not %d\n", iCP, piX);
|
||||
iCP=5;
|
||||
fTrailing = TRUE;
|
||||
cChars = 10;
|
||||
cGlyphs = 10;
|
||||
hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piX);
|
||||
ok(hr == S_OK, "ScriptCPtoX should return S_OK not %d\n", (unsigned int) hr);
|
||||
ok(piX == 1171, "iCP=%d should return piX=1171 not %d\n", iCP, piX);
|
||||
iCP=6;
|
||||
fTrailing = FALSE;
|
||||
cChars = 10;
|
||||
cGlyphs = 10;
|
||||
hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piX);
|
||||
ok(hr == S_OK, "ScriptCPtoX should return S_OK not %d\n", (unsigned int) hr);
|
||||
ok(piX == 1171, "iCP=%d should return piX=1171 not %d\n", iCP, piX);
|
||||
iCP=11;
|
||||
fTrailing = FALSE;
|
||||
cChars = 10;
|
||||
cGlyphs = 10;
|
||||
hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piX);
|
||||
ok(hr == S_OK, "ScriptCPtoX should return S_OK not %d\n", (unsigned int) hr);
|
||||
ok(piX == 1953, "iCP=%d should return piX=1953 not %d\n", iCP, piX);
|
||||
iCP=11;
|
||||
fTrailing = TRUE;
|
||||
cChars = 10;
|
||||
cGlyphs = 10;
|
||||
hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &psa, &piX);
|
||||
ok(hr == S_OK, "ScriptCPtoX should return S_OK not %d\n", (unsigned int) hr);
|
||||
ok(piX == 1953, "iCP=%d should return piX=1953 not %d\n", iCP, piX);
|
||||
|
||||
}
|
||||
|
||||
static void test_ScriptString(void)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
@ -569,5 +659,6 @@ START_TEST(usp10)
|
|||
test_ScriptGetCMap(pwOutGlyphs);
|
||||
test_ScriptGetFontProperties();
|
||||
test_ScriptTextOut();
|
||||
test_ScriptXtoX();
|
||||
test_ScriptString();
|
||||
}
|
||||
|
|
|
@ -362,11 +362,20 @@ HRESULT WINAPI ScriptCPtoX(int iCP,
|
|||
const SCRIPT_ANALYSIS *psa,
|
||||
int *piX)
|
||||
{
|
||||
FIXME("(%d,%d,%d,%d,%p,%p,%p,%p,%p): stub\n",
|
||||
int item;
|
||||
int iPosX;
|
||||
float fMaxPosX = 0;
|
||||
TRACE("(%d,%d,%d,%d,%p,%p,%p,%p,%p)\n",
|
||||
iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance,
|
||||
psa, piX);
|
||||
for (item=0; item < cGlyphs; item++) /* total piAdvance */
|
||||
fMaxPosX += piAdvance[item];
|
||||
iPosX = (fMaxPosX/cGlyphs)*(iCP+fTrailing);
|
||||
if (iPosX > fMaxPosX)
|
||||
iPosX = fMaxPosX;
|
||||
*piX = iPosX; /* Return something in range */
|
||||
|
||||
*piX = 1; /* Return something in range */
|
||||
TRACE("*piX=%d\n", *piX);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -384,12 +393,40 @@ HRESULT WINAPI ScriptXtoCP(int iX,
|
|||
int *piCP,
|
||||
int *piTrailing)
|
||||
{
|
||||
FIXME("(%d,%d,%d,%p,%p,%p,%p,%p,%p): stub\n",
|
||||
int item;
|
||||
int iPosX = 1;
|
||||
float fMaxPosX = 1;
|
||||
float fAvePosX;
|
||||
TRACE("(%d,%d,%d,%p,%p,%p,%p,%p,%p)\n",
|
||||
iX, cChars, cGlyphs, pwLogClust, psva, piAdvance,
|
||||
psa, piCP, piTrailing);
|
||||
if (iX < 0) /* iX is before start of run */
|
||||
{
|
||||
*piCP = -1;
|
||||
*piTrailing = TRUE;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
*piCP = 1; /* Return something in range */
|
||||
*piTrailing = 0;
|
||||
for (item=0; item < cGlyphs; item++) /* total piAdvance */
|
||||
fMaxPosX += piAdvance[item];
|
||||
|
||||
if (iX >= fMaxPosX) /* iX too large */
|
||||
{
|
||||
*piCP = cChars;
|
||||
*piTrailing = FALSE;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
fAvePosX = fMaxPosX / cGlyphs;
|
||||
for (item = 0; item < cGlyphs && iPosX < iX; item++)
|
||||
iPosX = fAvePosX * (item +1);
|
||||
if (iPosX - iX > fAvePosX/2)
|
||||
*piTrailing = 0;
|
||||
else
|
||||
*piTrailing = 1; /* yep we are over half way */
|
||||
|
||||
*piCP = item -1; /* Return character position */
|
||||
TRACE("*piCP=%d iPposX=%d\n", *piCP, iPosX);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue