4 * Copyright 1993 Alexandre Julliard
17 #define ENUM_UNICODE 0x00000001
21 LPLOGFONT16 lpLogFontParam;
22 FONTENUMPROCEX16 lpEnumFunc;
25 LPNEWTEXTMETRICEX16 lpTextMetric;
26 LPENUMLOGFONTEX16 lpLogFont;
33 LPLOGFONT32W lpLogFontParam;
34 FONTENUMPROC32W lpEnumFunc;
37 LPNEWTEXTMETRICEX32W lpTextMetric;
38 LPENUMLOGFONTEX32W lpLogFont;
42 /***********************************************************************
43 * LOGFONT conversion functions.
45 static void __logfont32to16( INT16* plf16, const INT32* plf32 )
48 for( i = 0; i < 5; i++ ) *plf16++ = *plf32++;
49 *((INT32*)plf16)++ = *plf32++;
50 *((INT32*)plf16) = *plf32;
53 static void __logfont16to32( INT32* plf32, const INT16* plf16 )
56 for( i = 0; i < 5; i++ ) *plf32++ = *plf16++;
57 *plf32++ = *((INT32*)plf16)++;
58 *plf32 = *((INT32*)plf16);
61 void FONT_LogFont32ATo16( const LOGFONT32A* font32, LPLOGFONT16 font16 )
63 __logfont32to16( (INT16*)font16, (const INT32*)font32 );
64 lstrcpyn32A( font16->lfFaceName, font32->lfFaceName, LF_FACESIZE );
67 void FONT_LogFont32WTo16( const LOGFONT32W* font32, LPLOGFONT16 font16 )
69 __logfont32to16( (INT16*)font16, (const INT32*)font32 );
70 lstrcpynWtoA( font16->lfFaceName, font32->lfFaceName, LF_FACESIZE );
73 void FONT_LogFont16To32A( const LPLOGFONT16 font16, LPLOGFONT32A font32 )
75 __logfont16to32( (INT32*)font32, (const INT16*)font16 );
76 lstrcpyn32A( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
79 void FONT_LogFont16To32W( const LPLOGFONT16 font16, LPLOGFONT32W font32 )
81 __logfont16to32( (INT32*)font32, (const INT16*)font16 );
82 lstrcpynAtoW( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
85 /***********************************************************************
86 * TEXTMETRIC conversion functions.
88 void FONT_TextMetric32Ato16(const LPTEXTMETRIC32A ptm32, LPTEXTMETRIC16 ptm16 )
90 ptm16->tmHeight = ptm32->tmHeight;
91 ptm16->tmAscent = ptm32->tmAscent;
92 ptm16->tmDescent = ptm32->tmDescent;
93 ptm16->tmInternalLeading = ptm32->tmInternalLeading;
94 ptm16->tmExternalLeading = ptm32->tmExternalLeading;
95 ptm16->tmAveCharWidth = ptm32->tmAveCharWidth;
96 ptm16->tmMaxCharWidth = ptm32->tmMaxCharWidth;
97 ptm16->tmWeight = ptm32->tmWeight;
98 ptm16->tmOverhang = ptm32->tmOverhang;
99 ptm16->tmDigitizedAspectX = ptm32->tmDigitizedAspectX;
100 ptm16->tmDigitizedAspectY = ptm32->tmDigitizedAspectY;
101 ptm16->tmFirstChar = ptm32->tmFirstChar;
102 ptm16->tmLastChar = ptm32->tmLastChar;
103 ptm16->tmDefaultChar = ptm32->tmDefaultChar;
104 ptm16->tmBreakChar = ptm32->tmBreakChar;
105 ptm16->tmItalic = ptm32->tmItalic;
106 ptm16->tmUnderlined = ptm32->tmUnderlined;
107 ptm16->tmStruckOut = ptm32->tmStruckOut;
108 ptm16->tmPitchAndFamily = ptm32->tmPitchAndFamily;
109 ptm16->tmCharSet = ptm32->tmCharSet;
112 void FONT_TextMetric32Wto16(const LPTEXTMETRIC32W ptm32, LPTEXTMETRIC16 ptm16 )
114 ptm16->tmHeight = ptm32->tmHeight;
115 ptm16->tmAscent = ptm32->tmAscent;
116 ptm16->tmDescent = ptm32->tmDescent;
117 ptm16->tmInternalLeading = ptm32->tmInternalLeading;
118 ptm16->tmExternalLeading = ptm32->tmExternalLeading;
119 ptm16->tmAveCharWidth = ptm32->tmAveCharWidth;
120 ptm16->tmMaxCharWidth = ptm32->tmMaxCharWidth;
121 ptm16->tmWeight = ptm32->tmWeight;
122 ptm16->tmOverhang = ptm32->tmOverhang;
123 ptm16->tmDigitizedAspectX = ptm32->tmDigitizedAspectX;
124 ptm16->tmDigitizedAspectY = ptm32->tmDigitizedAspectY;
125 ptm16->tmFirstChar = ptm32->tmFirstChar;
126 ptm16->tmLastChar = ptm32->tmLastChar;
127 ptm16->tmDefaultChar = ptm32->tmDefaultChar;
128 ptm16->tmBreakChar = ptm32->tmBreakChar;
129 ptm16->tmItalic = ptm32->tmItalic;
130 ptm16->tmUnderlined = ptm32->tmUnderlined;
131 ptm16->tmStruckOut = ptm32->tmStruckOut;
132 ptm16->tmPitchAndFamily = ptm32->tmPitchAndFamily;
133 ptm16->tmCharSet = ptm32->tmCharSet;
136 void FONT_TextMetric16to32A(const LPTEXTMETRIC16 ptm16, LPTEXTMETRIC32A ptm32 )
138 ptm32->tmHeight = ptm16->tmHeight;
139 ptm32->tmAscent = ptm16->tmAscent;
140 ptm32->tmDescent = ptm16->tmDescent;
141 ptm32->tmInternalLeading = ptm16->tmInternalLeading;
142 ptm32->tmExternalLeading = ptm16->tmExternalLeading;
143 ptm32->tmAveCharWidth = ptm16->tmAveCharWidth;
144 ptm32->tmMaxCharWidth = ptm16->tmMaxCharWidth;
145 ptm32->tmWeight = ptm16->tmWeight;
146 ptm32->tmOverhang = ptm16->tmOverhang;
147 ptm32->tmDigitizedAspectX = ptm16->tmDigitizedAspectX;
148 ptm32->tmDigitizedAspectY = ptm16->tmDigitizedAspectY;
149 ptm32->tmFirstChar = ptm16->tmFirstChar;
150 ptm32->tmLastChar = ptm16->tmLastChar;
151 ptm32->tmDefaultChar = ptm16->tmDefaultChar;
152 ptm32->tmBreakChar = ptm16->tmBreakChar;
153 ptm32->tmItalic = ptm16->tmItalic;
154 ptm32->tmUnderlined = ptm16->tmUnderlined;
155 ptm32->tmStruckOut = ptm16->tmStruckOut;
156 ptm32->tmPitchAndFamily = ptm16->tmPitchAndFamily;
157 ptm32->tmCharSet = ptm16->tmCharSet;
160 void FONT_TextMetric16to32W(const LPTEXTMETRIC16 ptm16, LPTEXTMETRIC32W ptm32 )
162 ptm32->tmHeight = ptm16->tmHeight;
163 ptm32->tmAscent = ptm16->tmAscent;
164 ptm32->tmDescent = ptm16->tmDescent;
165 ptm32->tmInternalLeading = ptm16->tmInternalLeading;
166 ptm32->tmExternalLeading = ptm16->tmExternalLeading;
167 ptm32->tmAveCharWidth = ptm16->tmAveCharWidth;
168 ptm32->tmMaxCharWidth = ptm16->tmMaxCharWidth;
169 ptm32->tmWeight = ptm16->tmWeight;
170 ptm32->tmOverhang = ptm16->tmOverhang;
171 ptm32->tmDigitizedAspectX = ptm16->tmDigitizedAspectX;
172 ptm32->tmDigitizedAspectY = ptm16->tmDigitizedAspectY;
173 ptm32->tmFirstChar = ptm16->tmFirstChar;
174 ptm32->tmLastChar = ptm16->tmLastChar;
175 ptm32->tmDefaultChar = ptm16->tmDefaultChar;
176 ptm32->tmBreakChar = ptm16->tmBreakChar;
177 ptm32->tmItalic = ptm16->tmItalic;
178 ptm32->tmUnderlined = ptm16->tmUnderlined;
179 ptm32->tmStruckOut = ptm16->tmStruckOut;
180 ptm32->tmPitchAndFamily = ptm16->tmPitchAndFamily;
181 ptm32->tmCharSet = ptm16->tmCharSet;
184 void FONT_TextMetric32Ato32W(const LPTEXTMETRIC32A ptm32A, LPTEXTMETRIC32W ptm32W )
186 ptm32W->tmHeight = ptm32A->tmHeight;
187 ptm32W->tmAscent = ptm32A->tmAscent;
188 ptm32W->tmDescent = ptm32A->tmDescent;
189 ptm32W->tmInternalLeading = ptm32A->tmInternalLeading;
190 ptm32W->tmExternalLeading = ptm32A->tmExternalLeading;
191 ptm32W->tmAveCharWidth = ptm32A->tmAveCharWidth;
192 ptm32W->tmMaxCharWidth = ptm32A->tmMaxCharWidth;
193 ptm32W->tmWeight = ptm32A->tmWeight;
194 ptm32W->tmOverhang = ptm32A->tmOverhang;
195 ptm32W->tmDigitizedAspectX = ptm32A->tmDigitizedAspectX;
196 ptm32W->tmDigitizedAspectY = ptm32A->tmDigitizedAspectY;
197 ptm32W->tmFirstChar = ptm32A->tmFirstChar;
198 ptm32W->tmLastChar = ptm32A->tmLastChar;
199 ptm32W->tmDefaultChar = ptm32A->tmDefaultChar;
200 ptm32W->tmBreakChar = ptm32A->tmBreakChar;
201 ptm32W->tmItalic = ptm32A->tmItalic;
202 ptm32W->tmUnderlined = ptm32A->tmUnderlined;
203 ptm32W->tmStruckOut = ptm32A->tmStruckOut;
204 ptm32W->tmPitchAndFamily = ptm32A->tmPitchAndFamily;
205 ptm32W->tmCharSet = ptm32A->tmCharSet;
208 /***********************************************************************
209 * CreateFontIndirect16 (GDI.57)
211 HFONT16 WINAPI CreateFontIndirect16( const LOGFONT16 *font )
217 hFont = GDI_AllocObject( sizeof(FONTOBJ), FONT_MAGIC );
221 fontPtr = (FONTOBJ *) GDI_HEAP_LOCK( hFont );
222 memcpy( &fontPtr->logfont, font, sizeof(LOGFONT16) );
224 TRACE(font,"(%i %i %i %i) '%s' %s %s => %04x\n",
225 font->lfHeight, font->lfWidth,
226 font->lfEscapement, font->lfOrientation,
227 font->lfFaceName ? font->lfFaceName : "NULL",
228 font->lfWeight > 400 ? "Bold" : "",
229 font->lfItalic ? "Italic" : "",
232 if (font->lfEscapement != font->lfOrientation) {
233 /* this should really depend on whether GM_ADVANCED is set */
234 fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement;
236 "orientation angle %f set to escapement angle %f for new font %04x\n",
237 font->lfOrientation/10., font->lfEscapement/10., hFont);
239 GDI_HEAP_UNLOCK( hFont );
242 else WARN(font,"(NULL) => NULL\n");
247 /***********************************************************************
248 * CreateFontIndirect32A (GDI32.44)
250 HFONT32 WINAPI CreateFontIndirect32A( const LOGFONT32A *font )
254 FONT_LogFont32ATo16( font, &font16 );
255 return CreateFontIndirect16( &font16 );
258 /***********************************************************************
259 * CreateFontIndirect32W (GDI32.45)
261 HFONT32 WINAPI CreateFontIndirect32W( const LOGFONT32W *font )
265 FONT_LogFont32WTo16( font, &font16 );
266 return CreateFontIndirect16( &font16 );
269 /***********************************************************************
270 * CreateFont16 (GDI.56)
272 HFONT16 WINAPI CreateFont16(INT16 height, INT16 width, INT16 esc, INT16 orient,
273 INT16 weight, BYTE italic, BYTE underline,
274 BYTE strikeout, BYTE charset, BYTE outpres,
275 BYTE clippres, BYTE quality, BYTE pitch,
278 LOGFONT16 logfont = { height, width, esc, orient, weight, italic, underline,
279 strikeout, charset, outpres, clippres, quality, pitch, };
281 TRACE(font,"('%s',%d,%d)\n",
282 (name ? name : "(null)") , height, width);
284 lstrcpyn32A(logfont.lfFaceName,name,sizeof(logfont.lfFaceName));
286 logfont.lfFaceName[0] = '\0';
287 return CreateFontIndirect16( &logfont );
290 /*************************************************************************
291 * CreateFont32A (GDI32.43)
293 HFONT32 WINAPI CreateFont32A( INT32 height, INT32 width, INT32 esc,
294 INT32 orient, INT32 weight, DWORD italic,
295 DWORD underline, DWORD strikeout, DWORD charset,
296 DWORD outpres, DWORD clippres, DWORD quality,
297 DWORD pitch, LPCSTR name )
299 return (HFONT32)CreateFont16( height, width, esc, orient, weight, italic,
300 underline, strikeout, charset, outpres,
301 clippres, quality, pitch, name );
304 /*************************************************************************
305 * CreateFont32W (GDI32.46)
307 HFONT32 WINAPI CreateFont32W( INT32 height, INT32 width, INT32 esc,
308 INT32 orient, INT32 weight, DWORD italic,
309 DWORD underline, DWORD strikeout, DWORD charset,
310 DWORD outpres, DWORD clippres, DWORD quality,
311 DWORD pitch, LPCWSTR name )
313 LPSTR namea = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
314 HFONT32 ret = (HFONT32)CreateFont16( height, width, esc, orient, weight,
315 italic, underline, strikeout, charset,
316 outpres, clippres, quality, pitch,
318 if (namea) HeapFree( GetProcessHeap(), 0, namea );
323 /***********************************************************************
326 INT16 FONT_GetObject16( FONTOBJ * font, INT16 count, LPSTR buffer )
328 if (count > sizeof(LOGFONT16)) count = sizeof(LOGFONT16);
329 memcpy( buffer, &font->logfont, count );
333 /***********************************************************************
336 INT32 FONT_GetObject32A( FONTOBJ *font, INT32 count, LPSTR buffer )
340 FONT_LogFont16To32A( &font->logfont, &fnt32 );
342 if (count > sizeof(fnt32)) count = sizeof(fnt32);
343 memcpy( buffer, &fnt32, count );
346 /***********************************************************************
349 INT32 FONT_GetObject32W( FONTOBJ *font, INT32 count, LPSTR buffer )
353 FONT_LogFont16To32W( &font->logfont, &fnt32 );
355 if (count > sizeof(fnt32)) count = sizeof(fnt32);
356 memcpy( buffer, &fnt32, count );
361 /***********************************************************************
362 * FONT_EnumInstance16
364 * Called by the device driver layer to pass font info
365 * down to the application.
367 static INT32 FONT_EnumInstance16( LPENUMLOGFONT16 plf,
368 LPNEWTEXTMETRIC16 ptm, UINT16 fType, LPARAM lp )
370 #define pfe ((fontEnum16*)lp)
371 if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
372 pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
374 memcpy( pfe->lpLogFont, plf, sizeof(ENUMLOGFONT16) );
375 memcpy( pfe->lpTextMetric, ptm, sizeof(NEWTEXTMETRIC16) );
377 return pfe->lpEnumFunc( pfe->segLogFont, pfe->segTextMetric, fType, (LPARAM)(pfe->lpData) );
383 /***********************************************************************
384 * FONT_EnumInstance32
386 static INT32 FONT_EnumInstance32( LPENUMLOGFONT16 plf,
387 LPNEWTEXTMETRIC16 ptm, UINT16 fType, LPARAM lp )
389 /* lfCharSet is at the same offset in both LOGFONT32A and LOGFONT32W */
391 #define pfe ((fontEnum32*)lp)
392 if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
393 pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
395 /* convert font metrics */
397 if( pfe->dwFlags & ENUM_UNICODE )
399 FONT_LogFont16To32W( &plf->elfLogFont, (LPLOGFONT32W)(pfe->lpLogFont) );
400 FONT_TextMetric16to32W( (LPTEXTMETRIC16)ptm, (LPTEXTMETRIC32W)(pfe->lpTextMetric) );
404 FONT_LogFont16To32A( &plf->elfLogFont, (LPLOGFONT32A)pfe->lpLogFont );
405 FONT_TextMetric16to32A( (LPTEXTMETRIC16)ptm, (LPTEXTMETRIC32A)pfe->lpTextMetric );
408 return pfe->lpEnumFunc( (LPENUMLOGFONT32W)pfe->lpLogFont,
409 (LPNEWTEXTMETRIC32W)pfe->lpTextMetric, fType, pfe->lpData );
415 /***********************************************************************
416 * EnumFontFamiliesEx16 (GDI.613)
418 INT16 WINAPI EnumFontFamiliesEx16( HDC16 hDC, LPLOGFONT16 plf,
419 FONTENUMPROCEX16 efproc, LPARAM lParam,
423 DC* dc = (DC*) GDI_GetObjPtr( hDC, DC_MAGIC );
425 if( dc && dc->funcs->pEnumDeviceFonts )
427 LPNEWTEXTMETRICEX16 lptm16 = SEGPTR_ALLOC( sizeof(NEWTEXTMETRICEX16) );
430 LPENUMLOGFONTEX16 lplf16 = SEGPTR_ALLOC( sizeof(ENUMLOGFONTEX16) );
433 fontEnum16 fe16 = { plf, efproc, lParam, lptm16, lplf16,
434 SEGPTR_GET(lptm16), SEGPTR_GET(lplf16) };
436 retVal = dc->funcs->pEnumDeviceFonts( dc, plf, FONT_EnumInstance16, (LPARAM)&fe16 );
446 /***********************************************************************
447 * FONT_EnumFontFamiliesEx32
449 static INT32 FONT_EnumFontFamiliesEx32( HDC32 hDC, LPLOGFONT32W plf, FONTENUMPROC32W efproc,
450 LPARAM lParam, DWORD dwUnicode)
452 DC* dc = (DC*) GDI_GetObjPtr( hDC, DC_MAGIC );
454 if( dc && dc->funcs->pEnumDeviceFonts )
457 NEWTEXTMETRICEX32W tm32w;
458 ENUMLOGFONTEX32W lf32w;
459 fontEnum32 fe32 = { plf, efproc, lParam, &tm32w, &lf32w, dwUnicode };
461 /* the only difference between LOGFONT32A and LOGFONT32W is in the lfFaceName */
463 if( plf->lfFaceName[0] )
466 lstrcpynWtoA( lf16.lfFaceName, plf->lfFaceName, LF_FACESIZE );
468 lstrcpyn32A( lf16.lfFaceName, (LPCSTR)plf->lfFaceName, LF_FACESIZE );
470 else lf16.lfFaceName[0] = '\0';
471 lf16.lfCharSet = plf->lfCharSet;
473 return dc->funcs->pEnumDeviceFonts( dc, &lf16, FONT_EnumInstance32, (LPARAM)&fe32 );
478 /***********************************************************************
479 * EnumFontFamiliesEx32W (GDI32.82)
481 INT32 WINAPI EnumFontFamiliesEx32W( HDC32 hDC, LPLOGFONT32W plf,
482 FONTENUMPROCEX32W efproc,
483 LPARAM lParam, DWORD dwFlags )
485 return FONT_EnumFontFamiliesEx32( hDC, plf, (FONTENUMPROC32W)efproc,
486 lParam, ENUM_UNICODE );
489 /***********************************************************************
490 * EnumFontFamiliesEx32A (GDI32.81)
492 INT32 WINAPI EnumFontFamiliesEx32A( HDC32 hDC, LPLOGFONT32A plf,
493 FONTENUMPROCEX32A efproc,
494 LPARAM lParam, DWORD dwFlags)
496 return FONT_EnumFontFamiliesEx32( hDC, (LPLOGFONT32W)plf,
497 (FONTENUMPROC32W)efproc, lParam, 0);
500 /***********************************************************************
501 * EnumFontFamilies16 (GDI.330)
503 INT16 WINAPI EnumFontFamilies16( HDC16 hDC, LPCSTR lpFamily,
504 FONTENUMPROC16 efproc, LPARAM lpData )
508 lf.lfCharSet = DEFAULT_CHARSET;
509 if( lpFamily ) lstrcpyn32A( lf.lfFaceName, lpFamily, LF_FACESIZE );
510 else lf.lfFaceName[0] = '\0';
512 return EnumFontFamiliesEx16( hDC, &lf, (FONTENUMPROCEX16)efproc, lpData, 0 );
515 /***********************************************************************
516 * EnumFontFamilies32A (GDI32.80)
518 INT32 WINAPI EnumFontFamilies32A( HDC32 hDC, LPCSTR lpFamily,
519 FONTENUMPROC32A efproc, LPARAM lpData )
523 lf.lfCharSet = DEFAULT_CHARSET;
524 if( lpFamily ) lstrcpyn32A( lf.lfFaceName, lpFamily, LF_FACESIZE );
525 else lf.lfFaceName[0] = lf.lfFaceName[1] = '\0';
527 return FONT_EnumFontFamiliesEx32( hDC, (LPLOGFONT32W)&lf,
528 (FONTENUMPROC32W)efproc, lpData, 0 );
531 /***********************************************************************
532 * EnumFontFamilies32W (GDI32.83)
534 INT32 WINAPI EnumFontFamilies32W( HDC32 hDC, LPCWSTR lpFamily,
535 FONTENUMPROC32W efproc, LPARAM lpData )
539 lf.lfCharSet = DEFAULT_CHARSET;
540 if( lpFamily ) lstrcpyn32W( lf.lfFaceName, lpFamily, LF_FACESIZE );
541 else lf.lfFaceName[0] = 0;
543 return FONT_EnumFontFamiliesEx32( hDC, &lf, efproc, lpData, ENUM_UNICODE );
546 /***********************************************************************
547 * EnumFonts16 (GDI.70)
549 INT16 WINAPI EnumFonts16( HDC16 hDC, LPCSTR lpName, FONTENUMPROC16 efproc,
552 return EnumFontFamilies16( hDC, lpName, (FONTENUMPROCEX16)efproc, lpData );
555 /***********************************************************************
556 * EnumFonts32A (GDI32.84)
558 INT32 WINAPI EnumFonts32A( HDC32 hDC, LPCSTR lpName, FONTENUMPROC32A efproc,
561 return EnumFontFamilies32A( hDC, lpName, efproc, lpData );
564 /***********************************************************************
565 * EnumFonts32W (GDI32.85)
567 INT32 WINAPI EnumFonts32W( HDC32 hDC, LPCWSTR lpName, FONTENUMPROC32W efproc,
570 return EnumFontFamilies32W( hDC, lpName, efproc, lpData );
574 /***********************************************************************
575 * GetTextCharacterExtra16 (GDI.89)
577 INT16 WINAPI GetTextCharacterExtra16( HDC16 hdc )
579 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
581 return abs( (dc->w.charExtra * dc->wndExtX + dc->vportExtX / 2)
586 /***********************************************************************
587 * GetTextCharacterExtra32 (GDI32.225)
589 INT32 WINAPI GetTextCharacterExtra32( HDC32 hdc )
591 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
593 return abs( (dc->w.charExtra * dc->wndExtX + dc->vportExtX / 2)
598 /***********************************************************************
599 * SetTextCharacterExtra16 (GDI.8)
601 INT16 WINAPI SetTextCharacterExtra16( HDC16 hdc, INT16 extra )
603 return (INT16)SetTextCharacterExtra32( hdc, extra );
607 /***********************************************************************
608 * SetTextCharacterExtra32 (GDI32.337)
610 INT32 WINAPI SetTextCharacterExtra32( HDC32 hdc, INT32 extra )
613 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
615 extra = (extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX;
616 prev = dc->w.charExtra;
617 dc->w.charExtra = abs(extra);
618 return (prev * dc->wndExtX + dc->vportExtX / 2) / dc->vportExtX;
622 /***********************************************************************
623 * SetTextJustification16 (GDI.10)
625 INT16 WINAPI SetTextJustification16( HDC16 hdc, INT16 extra, INT16 breaks )
627 return SetTextJustification32( hdc, extra, breaks );
631 /***********************************************************************
632 * SetTextJustification32 (GDI32.339)
634 BOOL32 WINAPI SetTextJustification32( HDC32 hdc, INT32 extra, INT32 breaks )
636 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
639 extra = abs((extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX);
640 if (!extra) breaks = 0;
641 dc->w.breakTotalExtra = extra;
642 dc->w.breakCount = breaks;
645 dc->w.breakExtra = extra / breaks;
646 dc->w.breakRem = extra - (dc->w.breakCount * dc->w.breakExtra);
650 dc->w.breakExtra = 0;
657 /***********************************************************************
658 * GetTextFace16 (GDI.92)
660 INT16 WINAPI GetTextFace16( HDC16 hdc, INT16 count, LPSTR name )
662 return GetTextFace32A(hdc,count,name);
665 /***********************************************************************
666 * GetTextFace32A (GDI32.234)
668 INT32 WINAPI GetTextFace32A( HDC32 hdc, INT32 count, LPSTR name )
672 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
674 if (!(font = (FONTOBJ *) GDI_GetObjPtr( dc->w.hFont, FONT_MAGIC )))
677 lstrcpyn32A( name, font->logfont.lfFaceName, count );
678 GDI_HEAP_UNLOCK( dc->w.hFont );
682 return strlen(font->logfont.lfFaceName) + 1;
685 /***********************************************************************
686 * GetTextFace32W (GDI32.235)
688 INT32 WINAPI GetTextFace32W( HDC32 hdc, INT32 count, LPWSTR name )
690 LPSTR nameA = HeapAlloc( GetProcessHeap(), 0, count );
691 INT32 res = GetTextFace32A(hdc,count,nameA);
692 lstrcpyAtoW( name, nameA );
693 HeapFree( GetProcessHeap(), 0, nameA );
698 /***********************************************************************
699 * GetTextExtent (GDI.91)
701 DWORD WINAPI GetTextExtent( HDC16 hdc, LPCSTR str, INT16 count )
704 if (!GetTextExtentPoint16( hdc, str, count, &size )) return 0;
705 return MAKELONG( size.cx, size.cy );
709 /***********************************************************************
710 * GetTextExtentPoint16 (GDI.471)
712 * FIXME: Should this have a bug for compatibility?
713 * Original Windows versions of GetTextExtentPoint{A,W} have documented
716 BOOL16 WINAPI GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count,
720 BOOL32 ret = GetTextExtentPoint32A( hdc, str, count, &size32 );
721 CONV_SIZE32TO16( &size32, size );
726 /***********************************************************************
727 * GetTextExtentPoint32A (GDI32.230)
729 BOOL32 WINAPI GetTextExtentPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
732 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
735 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
739 if (!dc->funcs->pGetTextExtentPoint ||
740 !dc->funcs->pGetTextExtentPoint( dc, str, count, size ))
743 TRACE(font,"(%08x %s %d %p): returning %d,%d\n",
744 hdc, debugstr_an (str, count), count,
745 size, size->cx, size->cy );
750 /***********************************************************************
751 * GetTextExtentPoint32W [GDI32.231] Computes width/height for a string
753 * Computes width and height of the specified string.
759 BOOL32 WINAPI GetTextExtentPoint32W(
760 HDC32 hdc, /* [in] Handle of device context */
761 LPCWSTR str, /* [in] Address of text string */
762 INT32 count, /* [in] Number of characters in string */
763 LPSIZE32 size) /* [out] Address of structure for string size */
765 LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
766 BOOL32 ret = GetTextExtentPoint32A( hdc, p, count, size );
767 HeapFree( GetProcessHeap(), 0, p );
772 /***********************************************************************
773 * GetTextExtentPoint32ABuggy (GDI32.232)
775 BOOL32 WINAPI GetTextExtentPoint32ABuggy( HDC32 hdc, LPCSTR str, INT32 count,
778 TRACE(font, "not bug compatible.\n");
779 return GetTextExtentPoint32A( hdc, str, count, size );
782 /***********************************************************************
783 * GetTextExtentPoint32WBuggy (GDI32.233)
785 BOOL32 WINAPI GetTextExtentPoint32WBuggy( HDC32 hdc, LPCWSTR str, INT32 count,
788 TRACE(font, "not bug compatible.\n");
789 return GetTextExtentPoint32W( hdc, str, count, size );
793 /***********************************************************************
794 * GetTextExtentExPoint32A (GDI32.228)
796 BOOL32 WINAPI GetTextExtentExPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
797 INT32 maxExt, LPINT32 lpnFit,
798 LPINT32 alpDx, LPSIZE32 size )
800 int index, nFit, extent;
802 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
806 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
809 if (!dc->funcs->pGetTextExtentPoint) return FALSE;
811 size->cx = size->cy = nFit = extent = 0;
812 for(index = 0; index < count; index++)
814 if(!dc->funcs->pGetTextExtentPoint( dc, str, 1, &tSize )) return FALSE;
815 if( extent+tSize.cx < maxExt )
820 if( alpDx ) alpDx[index] = extent;
821 if( tSize.cy > size->cy ) size->cy = tSize.cy;
828 TRACE(font,"(%08x '%.*s' %d) returning %d %d %d\n",
829 hdc,count,str,maxExt,nFit, size->cx,size->cy);
834 /***********************************************************************
835 * GetTextExtentExPoint32W (GDI32.229)
838 BOOL32 WINAPI GetTextExtentExPoint32W( HDC32 hdc, LPCWSTR str, INT32 count,
839 INT32 maxExt, LPINT32 lpnFit,
840 LPINT32 alpDx, LPSIZE32 size )
842 LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
843 BOOL32 ret = GetTextExtentExPoint32A( hdc, p, count, maxExt,
844 lpnFit, alpDx, size);
845 HeapFree( GetProcessHeap(), 0, p );
849 /***********************************************************************
850 * GetTextMetrics16 (GDI.93)
852 BOOL16 WINAPI GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *metrics )
856 if (!GetTextMetrics32A( (HDC32)hdc, &tm32 )) return FALSE;
857 FONT_TextMetric32Ato16( &tm32, metrics );
862 /***********************************************************************
863 * GetTextMetrics32A (GDI32.236)
865 BOOL32 WINAPI GetTextMetrics32A( HDC32 hdc, TEXTMETRIC32A *metrics )
867 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
870 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
874 if (!dc->funcs->pGetTextMetrics ||
875 !dc->funcs->pGetTextMetrics( dc, metrics ))
878 /* device layer returns values in device units
879 * therefore we have to convert them to logical */
881 #define WDPTOLP(x) ((x<0)? \
882 (-abs((x)*dc->wndExtX/dc->vportExtX)): \
883 (abs((x)*dc->wndExtX/dc->vportExtX)))
884 #define HDPTOLP(y) ((y<0)? \
885 (-abs((y)*dc->wndExtY/dc->vportExtY)): \
886 (abs((y)*dc->wndExtY/dc->vportExtY)))
888 metrics->tmHeight = HDPTOLP(metrics->tmHeight);
889 metrics->tmAscent = HDPTOLP(metrics->tmAscent);
890 metrics->tmDescent = HDPTOLP(metrics->tmDescent);
891 metrics->tmInternalLeading = HDPTOLP(metrics->tmInternalLeading);
892 metrics->tmExternalLeading = HDPTOLP(metrics->tmExternalLeading);
893 metrics->tmAveCharWidth = WDPTOLP(metrics->tmAveCharWidth);
894 metrics->tmMaxCharWidth = WDPTOLP(metrics->tmMaxCharWidth);
895 metrics->tmOverhang = WDPTOLP(metrics->tmOverhang);
897 TRACE(font,"text metrics:
898 Weight = %03i\t FirstChar = %03i\t AveCharWidth = %i
899 Italic = % 3i\t LastChar = %03i\t\t MaxCharWidth = %i
900 UnderLined = %01i\t DefaultChar = %03i\t Overhang = %i
901 StruckOut = %01i\t BreakChar = %03i\t CharSet = %i
902 PitchAndFamily = %02x
908 metrics->tmWeight, metrics->tmFirstChar, metrics->tmAveCharWidth,
909 metrics->tmItalic, metrics->tmLastChar, metrics->tmMaxCharWidth,
910 metrics->tmUnderlined, metrics->tmDefaultChar, metrics->tmOverhang,
911 metrics->tmStruckOut, metrics->tmBreakChar, metrics->tmCharSet,
912 metrics->tmPitchAndFamily,
913 metrics->tmInternalLeading,
921 /***********************************************************************
922 * GetTextMetrics32W (GDI32.237)
924 BOOL32 WINAPI GetTextMetrics32W( HDC32 hdc, TEXTMETRIC32W *metrics )
927 if (!GetTextMetrics32A( (HDC16)hdc, &tm )) return FALSE;
928 FONT_TextMetric32Ato32W( &tm, metrics );
933 /***********************************************************************
934 * GetOutlineTextMetrics [GDI.308] Gets metrics for TrueType fonts.
937 * lpOTM should be LPOUTLINETEXTMETRIC
940 * Success: Non-zero or size of required buffer
943 UINT16 WINAPI GetOutlineTextMetrics16(
944 HDC16 hdc, /* [in] Handle of device context */
945 UINT16 cbData, /* [in] Size of metric data array */
946 LPOUTLINETEXTMETRIC16 lpOTM) /* [out] Address of metric data array */
948 FIXME(font, "(%04x,%04x,%p): stub\n", hdc,cbData,lpOTM);
953 /***********************************************************************
954 * GetOutlineTextMetrics [GDI.207] Gets metrics for TrueType fonts.
958 * Success: Non-zero or size of required buffer
961 UINT32 WINAPI GetOutlineTextMetrics32A(
962 HDC32 hdc, /* [in] Handle of device context */
963 UINT32 cbData, /* [in] Size of metric data array */
964 LPOUTLINETEXTMETRIC32A lpOTM) /* [out] Address of metric data array */
969 LPTEXTMETRIC32A lptxtMetr;
976 lpOTM = (LPOUTLINETEXTMETRIC32A)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(OUTLINETEXTMETRIC32A));
977 rtn = sizeof(OUTLINETEXTMETRIC32A);
981 cbData = sizeof(*lpOTM);
985 lpOTM->otmSize = cbData;
987 lptxtMetr =HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(TEXTMETRIC32A));
989 if (!GetTextMetrics32A(hdc,lptxtMetr))
994 memcpy(&(lpOTM->otmTextMetrics),lptxtMetr,sizeof(TEXTMETRIC32A));
997 HeapFree(GetProcessHeap(),HEAP_ZERO_MEMORY,lptxtMetr);
999 lpOTM->otmFilter = 0;
1001 lpOTM->otmPanoseNumber.bFamilyType = 0;
1002 lpOTM->otmPanoseNumber.bSerifStyle = 0;
1003 lpOTM->otmPanoseNumber.bWeight = 0;
1004 lpOTM->otmPanoseNumber.bProportion = 0;
1005 lpOTM->otmPanoseNumber.bContrast = 0;
1006 lpOTM->otmPanoseNumber.bStrokeVariation = 0;
1007 lpOTM->otmPanoseNumber.bArmStyle = 0;
1008 lpOTM->otmPanoseNumber.bLetterform = 0;
1009 lpOTM->otmPanoseNumber.bMidline = 0;
1010 lpOTM->otmPanoseNumber.bXHeight = 0;
1012 lpOTM->otmfsSelection = 0;
1013 lpOTM->otmfsType = 0;
1016 Further fill of the structure not implemented,
1017 Needs real values for the structure members
1025 /***********************************************************************
1026 * GetCharWidth16 (GDI.350)
1028 BOOL16 WINAPI GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
1031 BOOL32 retVal = FALSE;
1033 if( firstChar != lastChar )
1035 LPINT32 buf32 = (LPINT32)HeapAlloc(GetProcessHeap(), 0,
1036 sizeof(INT32)*(1 + (lastChar - firstChar)));
1039 LPINT32 obuf32 = buf32;
1042 retVal = GetCharWidth32A(hdc, firstChar, lastChar, buf32);
1045 for (i = firstChar; i <= lastChar; i++)
1046 *buffer++ = *buf32++;
1048 HeapFree(GetProcessHeap(), 0, obuf32);
1051 else /* happens quite often to warrant a special treatment */
1054 retVal = GetCharWidth32A(hdc, firstChar, lastChar, &chWidth );
1061 /***********************************************************************
1062 * GetCharWidth32A (GDI32.155)
1064 BOOL32 WINAPI GetCharWidth32A( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
1068 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
1071 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
1075 if (!dc->funcs->pGetCharWidth ||
1076 !dc->funcs->pGetCharWidth( dc, firstChar, lastChar, buffer))
1079 /* convert device units to logical */
1081 extra = dc->vportExtX >> 1;
1082 for( i = firstChar; i <= lastChar; i++, buffer++ )
1083 *buffer = (*buffer * dc->wndExtX + extra) / dc->vportExtX;
1089 /***********************************************************************
1090 * GetCharWidth32W (GDI32.158)
1092 BOOL32 WINAPI GetCharWidth32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
1095 return GetCharWidth32A( hdc, firstChar, lastChar, buffer );
1100 /* FIXME: all following APIs *******************************************
1103 * SetMapperFlags16 (GDI.349)
1105 DWORD WINAPI SetMapperFlags16( HDC16 hDC, DWORD dwFlag )
1107 return SetMapperFlags32( hDC, dwFlag );
1111 /***********************************************************************
1112 * SetMapperFlags32 (GDI32.322)
1114 DWORD WINAPI SetMapperFlags32( HDC32 hDC, DWORD dwFlag )
1116 FIXME(font, "(0x%04x, 0x%08lx): stub - harmless\n", hDC, dwFlag);
1120 /***********************************************************************
1121 * GetAspectRatioFilterEx16 (GDI.486)
1123 BOOL16 WINAPI GetAspectRatioFilterEx16( HDC16 hdc, LPSIZE16 pAspectRatio )
1125 FIXME(font, "(%04x, %p): -- Empty Stub !\n",
1131 /***********************************************************************
1132 * GetCharABCWidths16 (GDI.307)
1134 BOOL16 WINAPI GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
1138 if (!GetCharABCWidths32A( hdc, firstChar, lastChar, &abc32 )) return FALSE;
1139 abc->abcA = abc32.abcA;
1140 abc->abcB = abc32.abcB;
1141 abc->abcC = abc32.abcC;
1146 /***********************************************************************
1147 * GetCharABCWidths32A (GDI32.149)
1149 BOOL32 WINAPI GetCharABCWidths32A(HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
1152 return GetCharABCWidths32W( hdc, firstChar, lastChar, abc );
1156 /******************************************************************************
1157 * GetCharABCWidths32W [GDI32.152] Retrieves widths of characters in range
1160 * hdc [I] Handle of device context
1161 * firstChar [I] First character in range to query
1162 * lastChar [I] Last character in range to query
1163 * abc [O] Address of character-width structure
1166 * Only works with TrueType fonts
1172 BOOL32 WINAPI GetCharABCWidths32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
1175 /* No TrueType fonts in Wine so far */
1176 FIXME(font, "(%04x,%04x,%04x,%p): stub\n", hdc, firstChar, lastChar, abc);
1181 /***********************************************************************
1182 * GetGlyphOutline16 (GDI.309)
1184 DWORD WINAPI GetGlyphOutline16( HDC16 hdc, UINT16 uChar, UINT16 fuFormat,
1185 LPGLYPHMETRICS16 lpgm, DWORD cbBuffer,
1186 LPVOID lpBuffer, const MAT2 *lpmat2 )
1188 FIXME(font,"(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
1189 hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
1190 return (DWORD)-1; /* failure */
1194 /***********************************************************************
1195 * GetGlyphOutline32A (GDI32.186)
1197 DWORD WINAPI GetGlyphOutline32A( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
1198 LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
1199 LPVOID lpBuffer, const MAT2 *lpmat2 )
1201 FIXME(font,"(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
1202 hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
1203 return (DWORD)-1; /* failure */
1206 /***********************************************************************
1207 * GetGlyphOutline32W (GDI32.187)
1209 DWORD WINAPI GetGlyphOutline32W( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
1210 LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
1211 LPVOID lpBuffer, const MAT2 *lpmat2 )
1213 FIXME(font,"(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
1214 hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
1215 return (DWORD)-1; /* failure */
1218 /***********************************************************************
1219 * CreateScalableFontResource16 (GDI.310)
1221 BOOL16 WINAPI CreateScalableFontResource16( UINT16 fHidden,
1222 LPCSTR lpszResourceFile,
1223 LPCSTR fontFile, LPCSTR path )
1225 return CreateScalableFontResource32A( fHidden, lpszResourceFile,
1229 /***********************************************************************
1230 * CreateScalableFontResource32A (GDI32.62)
1232 BOOL32 WINAPI CreateScalableFontResource32A( DWORD fHidden,
1233 LPCSTR lpszResourceFile,
1234 LPCSTR lpszFontFile,
1235 LPCSTR lpszCurrentPath )
1237 /* fHidden=1 - only visible for the calling app, read-only, not
1238 * enumbered with EnumFonts/EnumFontFamilies
1239 * lpszCurrentPath can be NULL
1241 FIXME(font,"(%ld,%s,%s,%s): stub\n",
1242 fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
1243 return FALSE; /* create failed */
1246 /***********************************************************************
1247 * CreateScalableFontResource32W (GDI32.63)
1249 BOOL32 WINAPI CreateScalableFontResource32W( DWORD fHidden,
1250 LPCWSTR lpszResourceFile,
1251 LPCWSTR lpszFontFile,
1252 LPCWSTR lpszCurrentPath )
1254 FIXME(font,"(%ld,%p,%p,%p): stub\n",
1255 fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
1256 return FALSE; /* create failed */
1260 /*************************************************************************
1261 * GetRasterizerCaps16 (GDI.313)
1263 BOOL16 WINAPI GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes)
1265 return GetRasterizerCaps32( lprs, cbNumBytes );
1269 /*************************************************************************
1270 * GetRasterizerCaps32 (GDI32.216)
1272 BOOL32 WINAPI GetRasterizerCaps32( LPRASTERIZER_STATUS lprs, UINT32 cbNumBytes)
1274 lprs->nSize = sizeof(RASTERIZER_STATUS);
1275 lprs->wFlags = TT_AVAILABLE|TT_ENABLED;
1276 lprs->nLanguageID = 0;
1281 /*************************************************************************
1282 * GetKerningPairs16 (GDI.332)
1284 INT16 WINAPI GetKerningPairs16( HDC16 hDC, INT16 cPairs,
1285 LPKERNINGPAIR16 lpKerningPairs )
1287 /* At this time kerning is ignored (set to 0) */
1289 FIXME(font,"(%x,%d,%p): almost empty stub!\n",
1290 hDC, cPairs, lpKerningPairs);
1291 for (i = 0; i < cPairs; i++)
1292 lpKerningPairs[i].iKernAmount = 0;
1298 /*************************************************************************
1299 * GetKerningPairs32A (GDI32.192)
1301 DWORD WINAPI GetKerningPairs32A( HDC32 hDC, DWORD cPairs,
1302 LPKERNINGPAIR32 lpKerningPairs )
1305 FIXME(font,"(%x,%ld,%p): almost empty stub!\n",
1306 hDC, cPairs, lpKerningPairs);
1307 for (i = 0; i < cPairs; i++)
1308 lpKerningPairs[i].iKernAmount = 0;
1313 /*************************************************************************
1314 * GetKerningPairs32W (GDI32.193)
1316 DWORD WINAPI GetKerningPairs32W( HDC32 hDC, DWORD cPairs,
1317 LPKERNINGPAIR32 lpKerningPairs )
1319 return GetKerningPairs32A( hDC, cPairs, lpKerningPairs );
1322 /*************************************************************************
1323 * TranslateCharSetInfo [GDI32.382]
1325 BOOL32 WINAPI TranslateCharSetInfo(LPDWORD lpSrc,LPCHARSETINFO lpCs,DWORD dwFlags) {
1326 FIXME(font,"(%p,%p,0x%08lx), stub.\n",lpSrc,lpCs,dwFlags);
1330 /*************************************************************************
1331 * GetFontLanguageInfo (GDI32.182)
1333 DWORD WINAPI GetFontLanguageInfo32(HDC32 hdc) {
1334 /* return value 0 is correct for most cases anyway */
1335 FIXME(font,"(%x):stub!\n", hdc);
1339 /*************************************************************************
1340 * GetFontLanguageInfo (GDI.616)
1342 DWORD WINAPI GetFontLanguageInfo16(HDC16 hdc) {
1343 /* return value 0 is correct for most cases anyway */
1344 FIXME(font,"(%x):stub!\n",hdc);
1348 /*************************************************************************
1349 * GetFontData32 [GDI32.181] Retrieve data for TrueType font
1353 * success: Number of bytes returned
1354 * failure: GDI_ERROR
1358 * Calls SetLastError()
1364 DWORD WINAPI GetFontData32(HDC32 hdc, DWORD table, DWORD offset,
1365 LPVOID buffer, DWORD length)
1367 FIXME(font, "(%x,%ld,%ld,%p,%ld): stub\n",
1368 hdc, table, offset, buffer, length);
1369 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1373 /*************************************************************************
1374 * GetCharacterPlacement32A [GDI32.160]
1377 GetCharacterPlacement32A(HDC32 hdc, LPCSTR lpString, INT32 uCount,
1378 INT32 nMaxExtent, GCP_RESULTS32A *lpResults,
1381 /* return value 0 is correct for most cases anyway */
1382 FIXME(font,":stub!\n");
1386 /*************************************************************************
1387 * GetCharacterPlacement32W [GDI32.161]
1390 GetCharacterPlacement32W(HDC32 hdc, LPCWSTR lpString, INT32 uCount,
1391 INT32 nMaxExtent, GCP_RESULTS32W *lpResults,
1394 /* return value 0 is correct for most cases anyway */
1395 FIXME(font,":stub!\n");