diff --git a/objects/font.c b/objects/font.c index 1a98d9e0f2f79ee897cbb0f3fcfe396e00e19a90..7f6035bf620783a3019693786476586549001569 100644 --- a/objects/font.c +++ b/objects/font.c @@ -1536,15 +1536,51 @@ DWORD WINAPI GetFontData(HDC hdc, DWORD table, DWORD offset, /************************************************************************* * GetCharacterPlacementA [GDI32.160] + * + * NOTES: + * the web browser control of ie4 calls this with dwFlags=0 */ DWORD WINAPI GetCharacterPlacementA(HDC hdc, LPCSTR lpString, INT uCount, INT nMaxExtent, GCP_RESULTSA *lpResults, DWORD dwFlags) { - /* return value 0 is correct for most cases anyway */ - FIXME_(font)(":stub!\n"); - return 0; + DWORD ret=0; + SIZE size; + + TRACE_(font)("%s 0x%08x 0x%08x 0x%08lx:stub!\n", + debugstr_a(lpString), uCount, nMaxExtent, dwFlags); + + TRACE_(font)("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_(font)("flags 0x%08lx ignored\n", dwFlags); + if(lpResults->lpOrder) FIXME_(font)("reordering not implemented\n"); + if(lpResults->lpCaretPos) FIXME_(font)("caret positions not implemented\n"); + if(lpResults->lpClass) FIXME_(font)("classes not implemented\n"); + if(lpResults->lpGlyphs) FIXME_(font)("glyphs not implemented\n"); + + /* copy will do if the GCP_REORDER flag is not set */ + if(lpResults->lpOutString) + { + lstrcpynA(lpResults->lpOutString, lpString, uCount); + } + + if (lpResults->lpDx) + { + int i, c; + for (i=0; i<uCount;i++) + { + if (GetCharWidth32A(hdc, lpString[i], lpString[i], &c)) + lpResults->lpDx[i]= c; + } + } + + if (GetTextExtentPoint32A(hdc, lpString, uCount, &size)) + ret = MAKELONG(size.cx, size.cy); + + return ret; } /*************************************************************************