mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[USP10] Sync with Wine 3.0. CORE-14225
This commit is contained in:
parent
095a4d1d23
commit
cea8085626
3 changed files with 37 additions and 42 deletions
|
@ -2041,7 +2041,7 @@ static void GPOS_apply_MarkToLigature(const OT_LookupTable *look, const SCRIPT_A
|
|||
}
|
||||
if (!offset)
|
||||
{
|
||||
ERR("Failed to find avalible ligature connection point\n");
|
||||
ERR("Failed to find available ligature connection point\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -672,15 +672,21 @@ typedef struct {
|
|||
int* piAdvance;
|
||||
SCRIPT_VISATTR* psva;
|
||||
GOFFSET* pGoffset;
|
||||
ABC* abc;
|
||||
ABC abc;
|
||||
int iMaxPosX;
|
||||
HFONT fallbackFont;
|
||||
} StringGlyphs;
|
||||
|
||||
enum stringanalysis_flags
|
||||
{
|
||||
SCRIPT_STRING_ANALYSIS_FLAGS_SIZE = 0x1,
|
||||
SCRIPT_STRING_ANALYSIS_FLAGS_INVALID = 0x2,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
HDC hdc;
|
||||
DWORD dwFlags;
|
||||
BOOL invalid;
|
||||
DWORD ssa_flags;
|
||||
DWORD flags;
|
||||
int clip_len;
|
||||
int cItems;
|
||||
int cMaxGlyphs;
|
||||
|
@ -688,7 +694,7 @@ typedef struct {
|
|||
int numItems;
|
||||
StringGlyphs* glyphs;
|
||||
SCRIPT_LOGATTR* logattrs;
|
||||
SIZE* sz;
|
||||
SIZE sz;
|
||||
int* logical2visual;
|
||||
} StringAnalysis;
|
||||
|
||||
|
@ -730,6 +736,8 @@ BOOL usp10_array_reserve(void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T
|
|||
/* TODO Fix font properties on Arabic locale */
|
||||
static inline BOOL set_cache_font_properties(const HDC hdc, ScriptCache *sc)
|
||||
{
|
||||
sc->sfp.cBytes = sizeof(sc->sfp);
|
||||
|
||||
if (!sc->sfnt)
|
||||
{
|
||||
sc->sfp.wgBlank = sc->tm.tmBreakChar;
|
||||
|
@ -777,11 +785,7 @@ static inline BOOL set_cache_font_properties(const HDC hdc, ScriptCache *sc)
|
|||
|
||||
static inline void get_cache_font_properties(SCRIPT_FONTPROPERTIES *sfp, ScriptCache *sc)
|
||||
{
|
||||
sfp->wgBlank = sc->sfp.wgBlank;
|
||||
sfp->wgDefault = sc->sfp.wgDefault;
|
||||
sfp->wgInvalid = sc->sfp.wgInvalid;
|
||||
sfp->wgKashida = sc->sfp.wgKashida;
|
||||
sfp->iKashidaWidth = sc->sfp.iKashidaWidth;
|
||||
*sfp = sc->sfp;
|
||||
}
|
||||
|
||||
static inline LONG get_cache_height(SCRIPT_CACHE *psc)
|
||||
|
@ -1945,7 +1949,7 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
|
|||
/* FIXME: handle clipping */
|
||||
analysis->clip_len = cString;
|
||||
analysis->hdc = hdc;
|
||||
analysis->dwFlags = dwFlags;
|
||||
analysis->ssa_flags = dwFlags;
|
||||
|
||||
if (psState)
|
||||
sState = *psState;
|
||||
|
@ -2020,7 +2024,6 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
|
|||
int *piAdvance = heap_alloc_zero(sizeof(int) * numGlyphs);
|
||||
SCRIPT_VISATTR *psva = heap_alloc_zero(sizeof(SCRIPT_VISATTR) * numGlyphs);
|
||||
GOFFSET *pGoffset = heap_alloc_zero(sizeof(GOFFSET) * numGlyphs);
|
||||
ABC *abc = heap_alloc_zero(sizeof(ABC));
|
||||
int numGlyphsReturned;
|
||||
HFONT originalFont = 0x0;
|
||||
|
||||
|
@ -2028,7 +2031,7 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
|
|||
const WCHAR* pStr = (const WCHAR*)pString;
|
||||
analysis->glyphs[i].fallbackFont = NULL;
|
||||
|
||||
if (!glyphs || !pwLogClust || !piAdvance || !psva || !pGoffset || !abc)
|
||||
if (!glyphs || !pwLogClust || !piAdvance || !psva || !pGoffset)
|
||||
{
|
||||
heap_free (BidiLevel);
|
||||
heap_free (glyphs);
|
||||
|
@ -2036,7 +2039,6 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
|
|||
heap_free (piAdvance);
|
||||
heap_free (psva);
|
||||
heap_free (pGoffset);
|
||||
heap_free (abc);
|
||||
hr = E_OUTOFMEMORY;
|
||||
goto error;
|
||||
}
|
||||
|
@ -2069,7 +2071,7 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
|
|||
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);
|
||||
piAdvance, pGoffset, &analysis->glyphs[i].abc);
|
||||
if (originalFont)
|
||||
SelectObject(hdc,originalFont);
|
||||
|
||||
|
@ -2090,7 +2092,6 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString,
|
|||
analysis->glyphs[i].piAdvance = piAdvance;
|
||||
analysis->glyphs[i].psva = psva;
|
||||
analysis->glyphs[i].pGoffset = pGoffset;
|
||||
analysis->glyphs[i].abc = abc;
|
||||
analysis->glyphs[i].iMaxPosX= -1;
|
||||
|
||||
BidiLevel[i] = analysis->pItem[i].a.s.uBidiLevel;
|
||||
|
@ -2313,7 +2314,7 @@ HRESULT WINAPI ScriptStringOut(SCRIPT_STRING_ANALYSIS ssa,
|
|||
ssa, iX, iY, uOptions, wine_dbgstr_rect(prc), iMinSel, iMaxSel, fDisabled);
|
||||
|
||||
if (!(analysis = ssa)) return E_INVALIDARG;
|
||||
if (!(analysis->dwFlags & SSA_GLYPHS)) return E_INVALIDARG;
|
||||
if (!(analysis->ssa_flags & SSA_GLYPHS)) return E_INVALIDARG;
|
||||
|
||||
for (item = 0; item < analysis->numItems; item++)
|
||||
{
|
||||
|
@ -2350,12 +2351,12 @@ HRESULT WINAPI ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrai
|
|||
TRACE("(%p), %d, %d, (%p)\n", ssa, icp, fTrailing, pX);
|
||||
|
||||
if (!ssa || !pX) return S_FALSE;
|
||||
if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
|
||||
if (!(analysis->ssa_flags & SSA_GLYPHS)) return S_FALSE;
|
||||
|
||||
/* icp out of range */
|
||||
if(icp < 0)
|
||||
{
|
||||
analysis->invalid = TRUE;
|
||||
analysis->flags |= SCRIPT_STRING_ANALYSIS_FLAGS_INVALID;
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
|
@ -2396,7 +2397,7 @@ HRESULT WINAPI ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrai
|
|||
}
|
||||
|
||||
/* icp out of range */
|
||||
analysis->invalid = TRUE;
|
||||
analysis->flags |= SCRIPT_STRING_ANALYSIS_FLAGS_INVALID;
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
|
@ -2412,7 +2413,7 @@ HRESULT WINAPI ScriptStringXtoCP(SCRIPT_STRING_ANALYSIS ssa, int iX, int* piCh,
|
|||
TRACE("(%p), %d, (%p), (%p)\n", ssa, iX, piCh, piTrailing);
|
||||
|
||||
if (!ssa || !piCh || !piTrailing) return S_FALSE;
|
||||
if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
|
||||
if (!(analysis->ssa_flags & SSA_GLYPHS)) return S_FALSE;
|
||||
|
||||
/* out of range */
|
||||
if(iX < 0)
|
||||
|
@ -2496,7 +2497,7 @@ HRESULT WINAPI ScriptStringFree(SCRIPT_STRING_ANALYSIS *pssa)
|
|||
|
||||
if (!pssa || !(analysis = *pssa)) return E_INVALIDARG;
|
||||
|
||||
invalid = analysis->invalid;
|
||||
invalid = analysis->flags & SCRIPT_STRING_ANALYSIS_FLAGS_INVALID;
|
||||
|
||||
if (analysis->glyphs)
|
||||
{
|
||||
|
@ -2507,7 +2508,6 @@ HRESULT WINAPI ScriptStringFree(SCRIPT_STRING_ANALYSIS *pssa)
|
|||
heap_free(analysis->glyphs[i].piAdvance);
|
||||
heap_free(analysis->glyphs[i].psva);
|
||||
heap_free(analysis->glyphs[i].pGoffset);
|
||||
heap_free(analysis->glyphs[i].abc);
|
||||
if (analysis->glyphs[i].fallbackFont)
|
||||
DeleteObject(analysis->glyphs[i].fallbackFont);
|
||||
ScriptFreeCache((SCRIPT_CACHE *)&analysis->glyphs[i].sc);
|
||||
|
@ -2518,7 +2518,6 @@ HRESULT WINAPI ScriptStringFree(SCRIPT_STRING_ANALYSIS *pssa)
|
|||
|
||||
heap_free(analysis->pItem);
|
||||
heap_free(analysis->logattrs);
|
||||
heap_free(analysis->sz);
|
||||
heap_free(analysis->logical2visual);
|
||||
heap_free(analysis);
|
||||
|
||||
|
@ -2631,7 +2630,7 @@ HRESULT WINAPI ScriptCPtoX(int iCP,
|
|||
iPosX = 0.0;
|
||||
for (item=0; item < iCP && item < cChars; item++)
|
||||
{
|
||||
if (iSpecial == -1 && (iCluster == -1 || (iCluster != -1 && iCluster+clust_size <= item)))
|
||||
if (iSpecial == -1 && (iCluster == -1 || iCluster+clust_size <= item))
|
||||
{
|
||||
int check;
|
||||
int clust = pwLogClust[item];
|
||||
|
@ -3018,9 +3017,6 @@ HRESULT WINAPI ScriptIsComplex(const WCHAR *chars, int len, DWORD flag)
|
|||
|
||||
for (i = 0; i < len; i+=consumed)
|
||||
{
|
||||
if (i >= len)
|
||||
break;
|
||||
|
||||
if ((flag & SIC_ASCIIDIGIT) && chars[i] >= 0x30 && chars[i] <= 0x39)
|
||||
return S_OK;
|
||||
|
||||
|
@ -3741,7 +3737,7 @@ HRESULT WINAPI ScriptStringGetLogicalWidths(SCRIPT_STRING_ANALYSIS ssa, int *piD
|
|||
TRACE("%p, %p\n", ssa, piDx);
|
||||
|
||||
if (!analysis) return S_FALSE;
|
||||
if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
|
||||
if (!(analysis->ssa_flags & SSA_GLYPHS)) return S_FALSE;
|
||||
|
||||
for (i = 0; i < analysis->numItems; i++)
|
||||
{
|
||||
|
@ -3790,7 +3786,7 @@ HRESULT WINAPI ScriptStringValidate(SCRIPT_STRING_ANALYSIS ssa)
|
|||
TRACE("(%p)\n", ssa);
|
||||
|
||||
if (!analysis) return E_INVALIDARG;
|
||||
return (analysis->invalid) ? S_FALSE : S_OK;
|
||||
return analysis->flags & SCRIPT_STRING_ANALYSIS_FLAGS_INVALID ? S_FALSE : S_OK;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -3813,23 +3809,22 @@ const SIZE * WINAPI ScriptString_pSize(SCRIPT_STRING_ANALYSIS ssa)
|
|||
TRACE("(%p)\n", ssa);
|
||||
|
||||
if (!analysis) return NULL;
|
||||
if (!(analysis->dwFlags & SSA_GLYPHS)) return NULL;
|
||||
if (!(analysis->ssa_flags & SSA_GLYPHS)) return NULL;
|
||||
|
||||
if (!analysis->sz)
|
||||
if (!(analysis->flags & SCRIPT_STRING_ANALYSIS_FLAGS_SIZE))
|
||||
{
|
||||
if (!(analysis->sz = heap_alloc(sizeof(SIZE)))) return NULL;
|
||||
analysis->sz->cy = analysis->glyphs[0].sc->tm.tmHeight;
|
||||
analysis->sz.cy = analysis->glyphs[0].sc->tm.tmHeight;
|
||||
|
||||
analysis->sz->cx = 0;
|
||||
analysis->sz.cx = 0;
|
||||
for (i = 0; i < analysis->numItems; i++)
|
||||
{
|
||||
if (analysis->glyphs[i].sc->tm.tmHeight > analysis->sz->cy)
|
||||
analysis->sz->cy = analysis->glyphs[i].sc->tm.tmHeight;
|
||||
if (analysis->glyphs[i].sc->tm.tmHeight > analysis->sz.cy)
|
||||
analysis->sz.cy = analysis->glyphs[i].sc->tm.tmHeight;
|
||||
for (j = 0; j < analysis->glyphs[i].numGlyphs; j++)
|
||||
analysis->sz->cx += analysis->glyphs[i].piAdvance[j];
|
||||
analysis->sz.cx += analysis->glyphs[i].piAdvance[j];
|
||||
}
|
||||
}
|
||||
return analysis->sz;
|
||||
return &analysis->sz;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -3851,7 +3846,7 @@ const SCRIPT_LOGATTR * WINAPI ScriptString_pLogAttr(SCRIPT_STRING_ANALYSIS ssa)
|
|||
TRACE("(%p)\n", ssa);
|
||||
|
||||
if (!analysis) return NULL;
|
||||
if (!(analysis->dwFlags & SSA_BREAK)) return NULL;
|
||||
if (!(analysis->ssa_flags & SSA_BREAK)) return NULL;
|
||||
return analysis->logattrs;
|
||||
}
|
||||
|
||||
|
@ -3899,7 +3894,7 @@ HRESULT WINAPI ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS ssa, UINT *order)
|
|||
TRACE("(%p)\n", ssa);
|
||||
|
||||
if (!analysis) return S_FALSE;
|
||||
if (!(analysis->dwFlags & SSA_GLYPHS)) return S_FALSE;
|
||||
if (!(analysis->ssa_flags & SSA_GLYPHS)) return S_FALSE;
|
||||
|
||||
/* FIXME: handle RTL scripts */
|
||||
for (i = 0, k = 0; i < analysis->numItems; i++)
|
||||
|
|
|
@ -189,7 +189,7 @@ reactos/dll/win32/twain_32 # Synced to WineStaging-2.9
|
|||
reactos/dll/win32/updspapi # Synced to WineStaging-2.9
|
||||
reactos/dll/win32/url # Synced to WineStaging-2.9
|
||||
reactos/dll/win32/urlmon # Synced to WineStaging-2.16
|
||||
reactos/dll/win32/usp10 # Synced to WineStaging-2.16
|
||||
reactos/dll/win32/usp10 # Synced to Wine-3.0
|
||||
reactos/dll/win32/uxtheme # Forked
|
||||
reactos/dll/win32/vbscript # Synced to WineStaging-2.9
|
||||
reactos/dll/win32/version # Synced to WineStaging-2.9
|
||||
|
|
Loading…
Reference in a new issue