--- usp10.c	2005-08-11 09:38:40.000000000 +1000
+++ usp10new.c	2005-09-27 12:05:28.000000000 +1000
@@ -33,6 +33,11 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(uniscribe);
 
+typedef struct
+{
+	TEXTMETRICW tm;
+} WINE_SCRIPT_CACHE;
+
 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
 {
     switch(fdwReason) {
@@ -45,6 +50,27 @@
     return TRUE;
 }
 
+static SCRIPT_CACHE USP_GetScriptCache(HDC hdc)
+{
+	WINE_SCRIPT_CACHE *p;
+
+	if (!hdc)
+		return NULL;
+
+	p = HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_SCRIPT_CACHE));
+
+	if (GetTextMetricW(hdc, &p->tm))
+		return (SCRIPT_CACHE) p;
+	HeapFree(GetProcessHeap(), 0, p);
+	return NULL;
+}
+
+HRESULT WINAPI ScriptFreeCache(SCRIPT_CACHE *psc)
+{
+	HeapFree(GetProcessHeap(), 0, *psc);
+	*psc = 0;
+}
+
 HRESULT WINAPI ScriptGetProperties(const SCRIPT_PROPERTIES ***ppSp, int *piNumScripts)
 {
     FIXME("%p,%p\n",ppSp,piNumScripts);
@@ -54,6 +80,21 @@
 HRESULT WINAPI ScriptGetFontProperties(HDC hdc, SCRIPT_CACHE *psc, SCRIPT_FONTPROPERTIES *sfp)
 {
     FIXME("%p,%p,%p\n", hdc, psc, sfp);
+    WINE_SCRIPT_CACHE *p;
+
+    if (!hdc)
+    {
+	if (!psc || !*psc)
+	    return E_PENDING;
+    }
+    else if (!psc || !*psc)
+    {
+	p = USP_GetScriptCache(hdc);
+	if (!p)
+	    return E_FAIL;
+	if (psc)
+	    *psc = p;
+    }
     /* return something sensible? */
     if (NULL != sfp) {
         sfp->cBytes        = sizeof(SCRIPT_FONTPROPERTIES);
@@ -63,6 +104,9 @@
         sfp->wgKashida     = 1;
         sfp->iKashidaWidth = 0;
     }
+
+    if (!psc)
+	HeapFree(GetProcessHeap(), 0, p);
     return 0;
 }
 
@@ -87,3 +131,14 @@
           psControl, psState, pItems, pcItems);
     return E_INVALIDARG;
 }
+
+HRESULT WINAPI ScriptCacheGetHeight(HDC hdc, SCRIPT_CACHE *psc, long *tmHeight )
+{
+	WINE_SCRIPT_CACHE *p;
+
+	if (!*psc)
+		return E_FAIL;
+	p = *psc;
+	*tmHeight = p->tm.tmHeight;
+	return S_OK;
+}
