Aric Stewart : usp10: Implementation of ScriptShapeOpenType.
Alexandre Julliard
julliard at winehq.org
Fri May 13 11:17:49 CDT 2011
Module: wine
Branch: master
Commit: 3ad7822d8560a39e024646b20f176f798652d118
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3ad7822d8560a39e024646b20f176f798652d118
Author: Aric Stewart <aric at codeweavers.com>
Date: Thu May 12 13:57:26 2011 -0500
usp10: Implementation of ScriptShapeOpenType.
---
dlls/usp10/shape.c | 12 ++++-
dlls/usp10/usp10.c | 111 ++++++++++++++++++++++++++++++++++++-------
dlls/usp10/usp10.spec | 2 +-
dlls/usp10/usp10_internal.h | 3 +
include/usp10.h | 12 +++++
5 files changed, 119 insertions(+), 21 deletions(-)
diff --git a/dlls/usp10/shape.c b/dlls/usp10/shape.c
index dff1f4f..b718190 100644
--- a/dlls/usp10/shape.c
+++ b/dlls/usp10/shape.c
@@ -762,10 +762,13 @@ static INT GSUB_apply_feature(const GSUB_Header * header, const GSUB_Feature* fe
return out_index;
}
-static const char* get_opentype_script(HDC hdc, SCRIPT_ANALYSIS *psa)
+static const char* get_opentype_script(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache *psc)
{
UINT charset;
+ if (psc->userScript != 0)
+ return (char*)&psc->userScript;
+
if (ShapingData[psa->eScript].otTag[0] != 0)
return ShapingData[psa->eScript].otTag;
@@ -810,10 +813,13 @@ static LPCVOID load_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache *psc
const GSUB_Script *script;
const GSUB_LangSys *language;
- script = GSUB_get_script_table(psc->GSUB_Table, get_opentype_script(hdc,psa));
+ script = GSUB_get_script_table(psc->GSUB_Table, get_opentype_script(hdc,psa,psc));
if (script)
{
- language = GSUB_get_lang_table(script, "xxxx"); /* Need to get Lang tag */
+ if (psc->userLang != 0)
+ language = GSUB_get_lang_table(script,(char*)&psc->userLang);
+ else
+ language = GSUB_get_lang_table(script, "xxxx"); /* Need to get Lang tag */
if (language)
feature = GSUB_get_feature(psc->GSUB_Table, language, feat);
}
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index d818015..e7bda77 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -1477,61 +1477,84 @@ HRESULT WINAPI ScriptIsComplex(const WCHAR *chars, int len, DWORD flag)
}
/***********************************************************************
- * ScriptShape (USP10.@)
+ * ScriptShapeOpenType (USP10.@)
*
* Produce glyphs and visual attributes for a run.
*
* PARAMS
* hdc [I] Device context.
* psc [I/O] Opaque pointer to a script cache.
+ * psa [I/O] Script analysis.
+ * tagScript [I] The OpenType tag for the Script
+ * tagLangSys [I] The OpenType tag for the Language
+ * rcRangeChars[I] Array of Character counts in each range
+ * rpRangeProperties [I] Array of TEXTRANGE_PROPERTIES structures
+ * cRanges [I] Count of ranges
* pwcChars [I] Array of characters specifying the run.
* cChars [I] Number of characters in pwcChars.
* cMaxGlyphs [I] Length of pwOutGlyphs.
- * psa [I/O] Script analysis.
- * pwOutGlyphs [O] Array of glyphs.
* pwLogClust [O] Array of logical cluster info.
- * psva [O] Array of visual attributes.
+ * pCharProps [O] Array of character property values
+ * pwOutGlyphs [O] Array of glyphs.
+ * pOutGlyphProps [O] Array of attributes for the retrieved glyphs
* pcGlyphs [O] Number of glyphs returned.
*
* RETURNS
* Success: S_OK
* Failure: Non-zero HRESULT value.
*/
-HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars,
- int cChars, int cMaxGlyphs,
- SCRIPT_ANALYSIS *psa, WORD *pwOutGlyphs, WORD *pwLogClust,
- SCRIPT_VISATTR *psva, int *pcGlyphs)
+HRESULT WINAPI ScriptShapeOpenType( HDC hdc, SCRIPT_CACHE *psc,
+ SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript,
+ OPENTYPE_TAG tagLangSys, int *rcRangeChars,
+ TEXTRANGE_PROPERTIES **rpRangeProperties,
+ int cRanges, const WCHAR *pwcChars, int cChars,
+ int cMaxGlyphs, WORD *pwLogClust,
+ SCRIPT_CHARPROP *pCharProps, WORD *pwOutGlyphs,
+ SCRIPT_GLYPHPROP *pOutGlyphProps, int *pcGlyphs)
{
HRESULT hr;
unsigned int i;
BOOL rtl;
- TRACE("(%p, %p, %s, %d, %d, %p, %p, %p, %p, %p)\n", hdc, psc, debugstr_wn(pwcChars, cChars),
- cChars, cMaxGlyphs, psa, pwOutGlyphs, pwLogClust, psva, pcGlyphs);
+ TRACE("(%p, %p, %p, %s, %s, %p, %p, %d, %s, %d, %d, %p, %p, %p, %p, %p )\n",
+ hdc, psc, psa,
+ debugstr_an((char*)&tagScript,4), debugstr_an((char*)&tagLangSys,4),
+ rcRangeChars, rpRangeProperties, cRanges, debugstr_wn(pwcChars, cChars),
+ cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs);
if (psa) TRACE("psa values: %d, %d, %d, %d, %d, %d, %d\n", psa->eScript, psa->fRTL, psa->fLayoutRTL,
psa->fLinkBefore, psa->fLinkAfter, psa->fLogicalOrder, psa->fNoGlyphIndex);
- if (!psva || !pcGlyphs) return E_INVALIDARG;
+ if (!pOutGlyphProps || !pcGlyphs || !pCharProps) return E_INVALIDARG;
if (cChars > cMaxGlyphs) return E_OUTOFMEMORY;
+
+ if (cRanges)
+ FIXME("Ranges not supported yet\n");
+
rtl = (!psa->fLogicalOrder && psa->fRTL);
*pcGlyphs = cChars;
if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr;
if (!pwLogClust) return E_FAIL;
+ ((ScriptCache *)*psc)->userScript = tagScript;
+ ((ScriptCache *)*psc)->userLang = tagLangSys;
+
/* Initialize a SCRIPT_VISATTR and LogClust for each char in this run */
for (i = 0; i < cChars; i++)
{
int idx = i;
if (rtl) idx = cChars - 1 - i;
/* FIXME: set to better values */
- psva[i].uJustification = (pwcChars[idx] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER;
- psva[i].fClusterStart = 1;
- psva[i].fDiacritic = 0;
- psva[i].fZeroWidth = 0;
- psva[i].fReserved = 0;
- psva[i].fShapeReserved = 0;
+ pOutGlyphProps[i].sva.uJustification = (pwcChars[idx] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER;
+ pOutGlyphProps[i].sva.fClusterStart = 1;
+ pOutGlyphProps[i].sva.fDiacritic = 0;
+ pOutGlyphProps[i].sva.fZeroWidth = 0;
+ pOutGlyphProps[i].sva.fReserved = 0;
+ pOutGlyphProps[i].sva.fShapeReserved = 0;
+
+ /* FIXME: have the shaping engine set this */
+ pCharProps[i].fCanGlyphAlone = 1;
pwLogClust[i] = idx;
}
@@ -1584,6 +1607,60 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars,
return S_OK;
}
+
+/***********************************************************************
+ * ScriptShape (USP10.@)
+ *
+ * Produce glyphs and visual attributes for a run.
+ *
+ * PARAMS
+ * hdc [I] Device context.
+ * psc [I/O] Opaque pointer to a script cache.
+ * pwcChars [I] Array of characters specifying the run.
+ * cChars [I] Number of characters in pwcChars.
+ * cMaxGlyphs [I] Length of pwOutGlyphs.
+ * psa [I/O] Script analysis.
+ * pwOutGlyphs [O] Array of glyphs.
+ * pwLogClust [O] Array of logical cluster info.
+ * psva [O] Array of visual attributes.
+ * pcGlyphs [O] Number of glyphs returned.
+ *
+ * RETURNS
+ * Success: S_OK
+ * Failure: Non-zero HRESULT value.
+ */
+HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars,
+ int cChars, int cMaxGlyphs,
+ SCRIPT_ANALYSIS *psa, WORD *pwOutGlyphs, WORD *pwLogClust,
+ SCRIPT_VISATTR *psva, int *pcGlyphs)
+{
+ HRESULT hr;
+ int i;
+ SCRIPT_CHARPROP *charProps;
+ SCRIPT_GLYPHPROP *glyphProps;
+
+ if (!psva || !pcGlyphs) return E_INVALIDARG;
+ if (cChars > cMaxGlyphs) return E_OUTOFMEMORY;
+
+ charProps = heap_alloc_zero(sizeof(SCRIPT_CHARPROP)*cChars);
+ if (!charProps) return E_OUTOFMEMORY;
+ glyphProps = heap_alloc_zero(sizeof(SCRIPT_GLYPHPROP)*cMaxGlyphs);
+ if (!glyphProps) return E_OUTOFMEMORY;
+
+ hr = ScriptShapeOpenType(hdc, psc, psa, scriptInformation[psa->eScript].scriptTag, 0, NULL, NULL, 0, pwcChars, cChars, cMaxGlyphs, pwLogClust, charProps, pwOutGlyphs, glyphProps, pcGlyphs);
+
+ if (SUCCEEDED(hr))
+ {
+ for (i = 0; i < *pcGlyphs; i++)
+ psva[i] = glyphProps[i].sva;
+ }
+
+ heap_free(charProps);
+ heap_free(glyphProps);
+
+ return hr;
+}
+
/***********************************************************************
* ScriptPlace (USP10.@)
*
diff --git a/dlls/usp10/usp10.spec b/dlls/usp10/usp10.spec
index 21e7c31..bc2eb73 100644
--- a/dlls/usp10/usp10.spec
+++ b/dlls/usp10/usp10.spec
@@ -24,7 +24,7 @@
@ stub ScriptPositionSingleGlyph
@ stdcall ScriptRecordDigitSubstitution(ptr ptr)
@ stdcall ScriptShape(ptr ptr ptr long long ptr ptr ptr ptr ptr)
-@ stub ScriptShapeOpenType
+@ stdcall ScriptShapeOpenType(ptr ptr ptr long long ptr ptr long wstr long long ptr ptr ptr ptr ptr)
@ stdcall ScriptStringAnalyse(ptr ptr long long long long long ptr ptr ptr ptr ptr ptr)
@ stdcall ScriptStringCPtoX(ptr long long ptr)
@ stdcall ScriptStringFree(ptr)
diff --git a/dlls/usp10/usp10_internal.h b/dlls/usp10/usp10_internal.h
index fae1066..a61e56e 100644
--- a/dlls/usp10/usp10_internal.h
+++ b/dlls/usp10/usp10_internal.h
@@ -69,6 +69,9 @@ typedef struct {
LPVOID GSUB_Table;
INT feature_count;
LoadedFeature *features;
+
+ OPENTYPE_TAG userScript;
+ OPENTYPE_TAG userLang;
} ScriptCache;
#define odd(x) ((x) & 1)
diff --git a/include/usp10.h b/include/usp10.h
index d947e6e..1940176 100644
--- a/include/usp10.h
+++ b/include/usp10.h
@@ -210,6 +210,18 @@ typedef struct tagOPENTYPE_FEATURE_RECORD
LONG lParameter;
} OPENTYPE_FEATURE_RECORD;
+typedef struct tagSCRIPT_GLYPHPROP
+{
+ SCRIPT_VISATTR sva;
+ WORD reserved;
+} SCRIPT_GLYPHPROP;
+
+typedef struct tagSCRIPT_CHARPROP
+{
+ WORD fCanGlyphAlone :1;
+ WORD reserved :15;
+} SCRIPT_CHARPROP;
+
typedef struct tagTEXTRANGE_PROPERTIES
{
OPENTYPE_FEATURE_RECORD *potfRecords;
More information about the wine-cvs
mailing list