usp10: Implement ScriptStringCPtoX.
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c
index 14f6fe9..448153f 100644
--- a/dlls/usp10/usp10.c
+++ b/dlls/usp10/usp10.c
@@ -574,9 +574,46 @@
  */
 HRESULT WINAPI ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrailing, int* pX)
 {
-    FIXME("(%p), %d, %d, (%p): stub\n", ssa, icp, fTrailing, pX);
-    *pX = 0;                             /* Set a reasonable value */
-    return S_OK;
+    int i, j;
+    int runningX = 0;
+    int runningCp = 0;
+    StringAnalysis* analysis = ssa;
+    TRACE("(%p), %d, %d, (%p)\n", ssa, icp, fTrailing, pX);
+
+    if(!ssa || !pX)
+    {
+        return 1;
+    }
+
+    /* icp out of range */
+    if(icp < 0)
+    {
+        analysis->invalid = TRUE;
+        return E_INVALIDARG;
+    }
+
+    for(i=0; i<analysis->numItems; i++)
+    {
+        for(j=0; j<analysis->glyphs[i].numGlyphs; j++)
+        {
+            if(runningCp == icp && fTrailing == FALSE)
+            {
+                *pX = runningX;
+                return S_OK;
+            }
+            runningX += analysis->glyphs[i].piAdvance[j];
+            if(runningCp == icp && fTrailing == TRUE)
+            {
+                *pX = runningX;
+                return S_OK;
+            }
+            runningCp++;
+        }
+    }
+
+    /* icp out of range */
+    analysis->invalid = TRUE;
+    return E_INVALIDARG;
 }
 
 /***********************************************************************