Implemented GetCharacterPlacementW.

diff --git a/objects/font.c b/objects/font.c
index 01ce73d..efba0d2 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -1975,9 +1975,43 @@
 			 INT nMaxExtent, GCP_RESULTSW *lpResults,
 			 DWORD dwFlags)
 {
-    /* return value 0 is correct for most cases anyway */
-    FIXME(":stub!\n");
-    return 0;
+    DWORD ret=0;
+    SIZE size;
+
+    TRACE("%s 0x%08x 0x%08x 0x%08lx:partial stub!\n",
+          debugstr_w(lpString), uCount, nMaxExtent, dwFlags);
+
+    TRACE("lpOrder=%p lpDx=%p lpCaretPos=%p lpClass=%p "
+          "lpOutString=%p lpGlyphs=%p\n",
+          lpResults->lpOrder, lpResults->lpDx, lpResults->lpCaretPos,
+          lpResults->lpClass, lpResults->lpOutString, lpResults->lpGlyphs);
+
+    if(dwFlags)			FIXME("flags 0x%08lx ignored\n", dwFlags);
+    if(lpResults->lpOrder)	FIXME("reordering not implemented\n");
+    if(lpResults->lpCaretPos)	FIXME("caret positions not implemented\n");
+    if(lpResults->lpClass)	FIXME("classes not implemented\n");
+    if(lpResults->lpGlyphs)	FIXME("glyphs not implemented\n");
+
+    /* copy will do if the GCP_REORDER flag is not set */
+    if(lpResults->lpOutString)
+    {
+      lstrcpynW(lpResults->lpOutString, lpString, uCount);
+    }
+
+    if (lpResults->lpDx)
+    {
+      int i, c;
+      for (i=0; i<uCount;i++)
+      { 
+        if (GetCharWidth32W(hdc, lpString[i], lpString[i], &c))
+          lpResults->lpDx[i]= c;
+      }
+    }
+
+    if (GetTextExtentPoint32W(hdc, lpString, uCount, &size))
+      ret = MAKELONG(size.cx, size.cy);
+
+    return ret;
 }
 
 /*************************************************************************