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 );
348 /***********************************************************************
349 * FONT_EnumInstance16
351 * Called by the device driver layer to pass font info
352 * down to the application.
354 static INT32 FONT_EnumInstance16( LPENUMLOGFONT16 plf,
355 LPNEWTEXTMETRIC16 ptm, UINT16 fType, LPARAM lp )
357 #define pfe ((fontEnum16*)lp)
358 if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
359 pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
361 memcpy( pfe->lpLogFont, plf, sizeof(ENUMLOGFONT16) );
362 memcpy( pfe->lpTextMetric, ptm, sizeof(NEWTEXTMETRIC16) );
364 return pfe->lpEnumFunc( pfe->segLogFont, pfe->segTextMetric, fType, (LPARAM)(pfe->lpData) );
370 /***********************************************************************
371 * FONT_EnumInstance32
373 static INT32 FONT_EnumInstance32( LPENUMLOGFONT16 plf,
374 LPNEWTEXTMETRIC16 ptm, UINT16 fType, LPARAM lp )
376 /* lfCharSet is at the same offset in both LOGFONT32A and LOGFONT32W */
378 #define pfe ((fontEnum32*)lp)
379 if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
380 pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
382 /* convert font metrics */
384 if( pfe->dwFlags & ENUM_UNICODE )
386 FONT_LogFont16To32W( &plf->elfLogFont, (LPLOGFONT32W)(pfe->lpLogFont) );
387 FONT_TextMetric16to32W( (LPTEXTMETRIC16)ptm, (LPTEXTMETRIC32W)(pfe->lpTextMetric) );
391 FONT_LogFont16To32A( &plf->elfLogFont, (LPLOGFONT32A)pfe->lpLogFont );
392 FONT_TextMetric16to32A( (LPTEXTMETRIC16)ptm, (LPTEXTMETRIC32A)pfe->lpTextMetric );
395 return pfe->lpEnumFunc( (LPENUMLOGFONT32W)pfe->lpLogFont,
396 (LPNEWTEXTMETRIC32W)pfe->lpTextMetric, fType, pfe->lpData );
402 /***********************************************************************
403 * EnumFontFamiliesEx16 (GDI.613)
405 INT16 WINAPI EnumFontFamiliesEx16( HDC16 hDC, LPLOGFONT16 plf,
406 FONTENUMPROCEX16 efproc, LPARAM lParam,
410 DC* dc = (DC*) GDI_GetObjPtr( hDC, DC_MAGIC );
412 if( dc && dc->funcs->pEnumDeviceFonts )
414 LPNEWTEXTMETRICEX16 lptm16 = SEGPTR_ALLOC( sizeof(NEWTEXTMETRICEX16) );
417 LPENUMLOGFONTEX16 lplf16 = SEGPTR_ALLOC( sizeof(ENUMLOGFONTEX16) );
420 fontEnum16 fe16 = { plf, efproc, lParam, lptm16, lplf16,
421 SEGPTR_GET(lptm16), SEGPTR_GET(lplf16) };
423 retVal = dc->funcs->pEnumDeviceFonts( dc, plf, FONT_EnumInstance16, (LPARAM)&fe16 );
433 /***********************************************************************
434 * FONT_EnumFontFamiliesEx32
436 static INT32 FONT_EnumFontFamiliesEx32( HDC32 hDC, LPLOGFONT32W plf, FONTENUMPROC32W efproc,
437 LPARAM lParam, DWORD dwUnicode)
439 DC* dc = (DC*) GDI_GetObjPtr( hDC, DC_MAGIC );
441 if( dc && dc->funcs->pEnumDeviceFonts )
444 NEWTEXTMETRICEX32W tm32w;
445 ENUMLOGFONTEX32W lf32w;
446 fontEnum32 fe32 = { plf, efproc, lParam, &tm32w, &lf32w, dwUnicode };
448 /* the only difference between LOGFONT32A and LOGFONT32W is in the lfFaceName */
450 if( plf->lfFaceName[0] )
453 lstrcpynWtoA( lf16.lfFaceName, plf->lfFaceName, LF_FACESIZE );
455 lstrcpyn32A( lf16.lfFaceName, (LPCSTR)plf->lfFaceName, LF_FACESIZE );
457 else lf16.lfFaceName[0] = '\0';
458 lf16.lfCharSet = plf->lfCharSet;
460 return dc->funcs->pEnumDeviceFonts( dc, &lf16, FONT_EnumInstance32, (LPARAM)&fe32 );
465 /***********************************************************************
466 * EnumFontFamiliesEx32W (GDI32.82)
468 INT32 WINAPI EnumFontFamiliesEx32W( HDC32 hDC, LPLOGFONT32W plf,
469 FONTENUMPROCEX32W efproc,
470 LPARAM lParam, DWORD dwFlags )
472 return FONT_EnumFontFamiliesEx32( hDC, plf, (FONTENUMPROC32W)efproc,
473 lParam, ENUM_UNICODE );
476 /***********************************************************************
477 * EnumFontFamiliesEx32A (GDI32.81)
479 INT32 WINAPI EnumFontFamiliesEx32A( HDC32 hDC, LPLOGFONT32A plf,
480 FONTENUMPROCEX32A efproc,
481 LPARAM lParam, DWORD dwFlags)
483 return FONT_EnumFontFamiliesEx32( hDC, (LPLOGFONT32W)plf,
484 (FONTENUMPROC32W)efproc, lParam, 0);
487 /***********************************************************************
488 * EnumFontFamilies16 (GDI.330)
490 INT16 WINAPI EnumFontFamilies16( HDC16 hDC, LPCSTR lpFamily,
491 FONTENUMPROC16 efproc, LPARAM lpData )
495 lf.lfCharSet = DEFAULT_CHARSET;
496 if( lpFamily ) lstrcpyn32A( lf.lfFaceName, lpFamily, LF_FACESIZE );
497 else lf.lfFaceName[0] = '\0';
499 return EnumFontFamiliesEx16( hDC, &lf, (FONTENUMPROCEX16)efproc, lpData, 0 );
502 /***********************************************************************
503 * EnumFontFamilies32A (GDI32.80)
505 INT32 WINAPI EnumFontFamilies32A( HDC32 hDC, LPCSTR lpFamily,
506 FONTENUMPROC32A efproc, LPARAM lpData )
510 lf.lfCharSet = DEFAULT_CHARSET;
511 if( lpFamily ) lstrcpyn32A( lf.lfFaceName, lpFamily, LF_FACESIZE );
512 else lf.lfFaceName[0] = lf.lfFaceName[1] = '\0';
514 return FONT_EnumFontFamiliesEx32( hDC, (LPLOGFONT32W)&lf,
515 (FONTENUMPROC32W)efproc, lpData, 0 );
518 /***********************************************************************
519 * EnumFontFamilies32W (GDI32.83)
521 INT32 WINAPI EnumFontFamilies32W( HDC32 hDC, LPCWSTR lpFamily,
522 FONTENUMPROC32W efproc, LPARAM lpData )
526 lf.lfCharSet = DEFAULT_CHARSET;
527 if( lpFamily ) lstrcpyn32W( lf.lfFaceName, lpFamily, LF_FACESIZE );
528 else lf.lfFaceName[0] = 0;
530 return FONT_EnumFontFamiliesEx32( hDC, &lf, efproc, lpData, ENUM_UNICODE );
533 /***********************************************************************
534 * EnumFonts16 (GDI.70)
536 INT16 WINAPI EnumFonts16( HDC16 hDC, LPCSTR lpName, FONTENUMPROC16 efproc,
539 return EnumFontFamilies16( hDC, lpName, (FONTENUMPROCEX16)efproc, lpData );
542 /***********************************************************************
543 * EnumFonts32A (GDI32.84)
545 INT32 WINAPI EnumFonts32A( HDC32 hDC, LPCSTR lpName, FONTENUMPROC32A efproc,
548 return EnumFontFamilies32A( hDC, lpName, efproc, lpData );
551 /***********************************************************************
552 * EnumFonts32W (GDI32.85)
554 INT32 WINAPI EnumFonts32W( HDC32 hDC, LPCWSTR lpName, FONTENUMPROC32W efproc,
557 return EnumFontFamilies32W( hDC, lpName, efproc, lpData );
561 /***********************************************************************
562 * GetTextCharacterExtra16 (GDI.89)
564 INT16 WINAPI GetTextCharacterExtra16( HDC16 hdc )
566 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
568 return abs( (dc->w.charExtra * dc->wndExtX + dc->vportExtX / 2)
573 /***********************************************************************
574 * GetTextCharacterExtra32 (GDI32.225)
576 INT32 WINAPI GetTextCharacterExtra32( HDC32 hdc )
578 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
580 return abs( (dc->w.charExtra * dc->wndExtX + dc->vportExtX / 2)
585 /***********************************************************************
586 * SetTextCharacterExtra16 (GDI.8)
588 INT16 WINAPI SetTextCharacterExtra16( HDC16 hdc, INT16 extra )
590 return (INT16)SetTextCharacterExtra32( hdc, extra );
594 /***********************************************************************
595 * SetTextCharacterExtra32 (GDI32.337)
597 INT32 WINAPI SetTextCharacterExtra32( HDC32 hdc, INT32 extra )
600 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
602 extra = (extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX;
603 prev = dc->w.charExtra;
604 dc->w.charExtra = abs(extra);
605 return (prev * dc->wndExtX + dc->vportExtX / 2) / dc->vportExtX;
609 /***********************************************************************
610 * SetTextJustification16 (GDI.10)
612 INT16 WINAPI SetTextJustification16( HDC16 hdc, INT16 extra, INT16 breaks )
614 return SetTextJustification32( hdc, extra, breaks );
618 /***********************************************************************
619 * SetTextJustification32 (GDI32.339)
621 BOOL32 WINAPI SetTextJustification32( HDC32 hdc, INT32 extra, INT32 breaks )
623 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
626 extra = abs((extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX);
627 if (!extra) breaks = 0;
628 dc->w.breakTotalExtra = extra;
629 dc->w.breakCount = breaks;
632 dc->w.breakExtra = extra / breaks;
633 dc->w.breakRem = extra - (dc->w.breakCount * dc->w.breakExtra);
637 dc->w.breakExtra = 0;
644 /***********************************************************************
645 * GetTextFace16 (GDI.92)
647 INT16 WINAPI GetTextFace16( HDC16 hdc, INT16 count, LPSTR name )
649 return GetTextFace32A(hdc,count,name);
652 /***********************************************************************
653 * GetTextFace32A (GDI32.234)
655 INT32 WINAPI GetTextFace32A( HDC32 hdc, INT32 count, LPSTR name )
659 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
661 if (!(font = (FONTOBJ *) GDI_GetObjPtr( dc->w.hFont, FONT_MAGIC )))
664 lstrcpyn32A( name, font->logfont.lfFaceName, count );
665 GDI_HEAP_UNLOCK( dc->w.hFont );
669 return strlen(font->logfont.lfFaceName) + 1;
672 /***********************************************************************
673 * GetTextFace32W (GDI32.235)
675 INT32 WINAPI GetTextFace32W( HDC32 hdc, INT32 count, LPWSTR name )
677 LPSTR nameA = HeapAlloc( GetProcessHeap(), 0, count );
678 INT32 res = GetTextFace32A(hdc,count,nameA);
679 lstrcpyAtoW( name, nameA );
680 HeapFree( GetProcessHeap(), 0, nameA );
685 /***********************************************************************
686 * GetTextExtent (GDI.91)
688 DWORD WINAPI GetTextExtent( HDC16 hdc, LPCSTR str, INT16 count )
691 if (!GetTextExtentPoint16( hdc, str, count, &size )) return 0;
692 return MAKELONG( size.cx, size.cy );
696 /***********************************************************************
697 * GetTextExtentPoint16 (GDI.471)
699 * FIXME: Should this have a bug for compatibility?
700 * Original Windows versions of GetTextExtentPoint{A,W} have documented
703 BOOL16 WINAPI GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count,
707 BOOL32 ret = GetTextExtentPoint32A( hdc, str, count, &size32 );
708 CONV_SIZE32TO16( &size32, size );
713 /***********************************************************************
714 * GetTextExtentPoint32A (GDI32.230)
716 BOOL32 WINAPI GetTextExtentPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
719 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
722 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
726 if (!dc->funcs->pGetTextExtentPoint ||
727 !dc->funcs->pGetTextExtentPoint( dc, str, count, size ))
730 TRACE(font,"(%08x %s %d %p): returning %d,%d\n",
731 hdc, debugstr_an (str, count), count,
732 size, size->cx, size->cy );
737 /***********************************************************************
738 * GetTextExtentPoint32W [GDI32.231] Computes width/height for a string
740 * Computes width and height of the specified string.
746 BOOL32 WINAPI GetTextExtentPoint32W(
747 HDC32 hdc, /* [in] Handle of device context */
748 LPCWSTR str, /* [in] Address of text string */
749 INT32 count, /* [in] Number of characters in string */
750 LPSIZE32 size) /* [out] Address of structure for string size */
752 LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
753 BOOL32 ret = GetTextExtentPoint32A( hdc, p, count, size );
754 HeapFree( GetProcessHeap(), 0, p );
759 /***********************************************************************
760 * GetTextExtentPoint32ABuggy (GDI32.232)
762 BOOL32 WINAPI GetTextExtentPoint32ABuggy( HDC32 hdc, LPCSTR str, INT32 count,
765 TRACE(font, "not bug compatible.\n");
766 return GetTextExtentPoint32A( hdc, str, count, size );
769 /***********************************************************************
770 * GetTextExtentPoint32WBuggy (GDI32.233)
772 BOOL32 WINAPI GetTextExtentPoint32WBuggy( HDC32 hdc, LPCWSTR str, INT32 count,
775 TRACE(font, "not bug compatible.\n");
776 return GetTextExtentPoint32W( hdc, str, count, size );
780 /***********************************************************************
781 * GetTextExtentExPoint32A (GDI32.228)
783 BOOL32 WINAPI GetTextExtentExPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
784 INT32 maxExt, LPINT32 lpnFit,
785 LPINT32 alpDx, LPSIZE32 size )
787 int index, nFit, extent;
789 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
793 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
796 if (!dc->funcs->pGetTextExtentPoint) return FALSE;
798 size->cx = size->cy = nFit = extent = 0;
799 for(index = 0; index < count; index++)
801 if(!dc->funcs->pGetTextExtentPoint( dc, str, 1, &tSize )) return FALSE;
802 if( extent+tSize.cx < maxExt )
807 if( alpDx ) alpDx[index] = extent;
808 if( tSize.cy > size->cy ) size->cy = tSize.cy;
815 TRACE(font,"(%08x '%.*s' %d) returning %d %d %d\n",
816 hdc,count,str,maxExt,nFit, size->cx,size->cy);
821 /***********************************************************************
822 * GetTextExtentExPoint32W (GDI32.229)
825 BOOL32 WINAPI GetTextExtentExPoint32W( HDC32 hdc, LPCWSTR str, INT32 count,
826 INT32 maxExt, LPINT32 lpnFit,
827 LPINT32 alpDx, LPSIZE32 size )
829 LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
830 BOOL32 ret = GetTextExtentExPoint32A( hdc, p, count, maxExt,
831 lpnFit, alpDx, size);
832 HeapFree( GetProcessHeap(), 0, p );
836 /***********************************************************************
837 * GetTextMetrics16 (GDI.93)
839 BOOL16 WINAPI GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *metrics )
843 if (!GetTextMetrics32A( (HDC32)hdc, &tm32 )) return FALSE;
844 FONT_TextMetric32Ato16( &tm32, metrics );
849 /***********************************************************************
850 * GetTextMetrics32A (GDI32.236)
852 BOOL32 WINAPI GetTextMetrics32A( HDC32 hdc, TEXTMETRIC32A *metrics )
854 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
857 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
861 if (!dc->funcs->pGetTextMetrics ||
862 !dc->funcs->pGetTextMetrics( dc, metrics ))
865 /* device layer returns values in device units
866 * therefore we have to convert them to logical */
868 #define WDPTOLP(x) ((x<0)? \
869 (-abs((x)*dc->wndExtX/dc->vportExtX)): \
870 (abs((x)*dc->wndExtX/dc->vportExtX)))
871 #define HDPTOLP(y) ((y<0)? \
872 (-abs((y)*dc->wndExtY/dc->vportExtY)): \
873 (abs((y)*dc->wndExtY/dc->vportExtY)))
875 metrics->tmHeight = HDPTOLP(metrics->tmHeight);
876 metrics->tmAscent = HDPTOLP(metrics->tmAscent);
877 metrics->tmDescent = HDPTOLP(metrics->tmDescent);
878 metrics->tmInternalLeading = HDPTOLP(metrics->tmInternalLeading);
879 metrics->tmExternalLeading = HDPTOLP(metrics->tmExternalLeading);
880 metrics->tmAveCharWidth = WDPTOLP(metrics->tmAveCharWidth);
881 metrics->tmMaxCharWidth = WDPTOLP(metrics->tmMaxCharWidth);
882 metrics->tmOverhang = WDPTOLP(metrics->tmOverhang);
884 TRACE(font,"text metrics:
885 Weight = %03i\t FirstChar = %03i\t AveCharWidth = %i
886 Italic = % 3i\t LastChar = %03i\t\t MaxCharWidth = %i
887 UnderLined = %01i\t DefaultChar = %03i\t Overhang = %i
888 StruckOut = %01i\t BreakChar = %03i\t CharSet = %i
889 PitchAndFamily = %02x
895 metrics->tmWeight, metrics->tmFirstChar, metrics->tmAveCharWidth,
896 metrics->tmItalic, metrics->tmLastChar, metrics->tmMaxCharWidth,
897 metrics->tmUnderlined, metrics->tmDefaultChar, metrics->tmOverhang,
898 metrics->tmStruckOut, metrics->tmBreakChar, metrics->tmCharSet,
899 metrics->tmPitchAndFamily,
900 metrics->tmInternalLeading,
908 /***********************************************************************
909 * GetTextMetrics32W (GDI32.237)
911 BOOL32 WINAPI GetTextMetrics32W( HDC32 hdc, TEXTMETRIC32W *metrics )
914 if (!GetTextMetrics32A( (HDC16)hdc, &tm )) return FALSE;
915 FONT_TextMetric32Ato32W( &tm, metrics );
920 /***********************************************************************
921 * GetOutlineTextMetrics [GDI.308] Gets metrics for TrueType fonts.
924 * lpOTM should be LPOUTLINETEXTMETRIC
927 * Success: Non-zero or size of required buffer
930 UINT16 WINAPI GetOutlineTextMetrics16(
931 HDC16 hdc, /* [in] Handle of device context */
932 UINT16 cbData, /* [in] Size of metric data array */
933 LPOUTLINETEXTMETRIC16 lpOTM) /* [out] Address of metric data array */
935 FIXME(font, "(%04x,%04x,%p): stub\n", hdc,cbData,lpOTM);
940 /***********************************************************************
941 * GetOutlineTextMetrics [GDI.207] Gets metrics for TrueType fonts.
945 * Success: Non-zero or size of required buffer
948 UINT32 WINAPI GetOutlineTextMetrics32A(
949 HDC32 hdc, /* [in] Handle of device context */
950 UINT32 cbData, /* [in] Size of metric data array */
951 LPOUTLINETEXTMETRIC32A lpOTM) /* [out] Address of metric data array */
956 LPTEXTMETRIC32A lptxtMetr;
963 lpOTM = (LPOUTLINETEXTMETRIC32A)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(OUTLINETEXTMETRIC32A));
964 rtn = sizeof(OUTLINETEXTMETRIC32A);
968 cbData = sizeof(*lpOTM);
972 lpOTM->otmSize = cbData;
974 lptxtMetr =HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(TEXTMETRIC32A));
976 if (!GetTextMetrics32A(hdc,lptxtMetr))
981 memcpy(&(lpOTM->otmTextMetrics),lptxtMetr,sizeof(TEXTMETRIC32A));
984 HeapFree(GetProcessHeap(),HEAP_ZERO_MEMORY,lptxtMetr);
986 lpOTM->otmFilter = 0;
988 lpOTM->otmPanoseNumber.bFamilyType = 0;
989 lpOTM->otmPanoseNumber.bSerifStyle = 0;
990 lpOTM->otmPanoseNumber.bWeight = 0;
991 lpOTM->otmPanoseNumber.bProportion = 0;
992 lpOTM->otmPanoseNumber.bContrast = 0;
993 lpOTM->otmPanoseNumber.bStrokeVariation = 0;
994 lpOTM->otmPanoseNumber.bArmStyle = 0;
995 lpOTM->otmPanoseNumber.bLetterform = 0;
996 lpOTM->otmPanoseNumber.bMidline = 0;
997 lpOTM->otmPanoseNumber.bXHeight = 0;
999 lpOTM->otmfsSelection = 0;
1000 lpOTM->otmfsType = 0;
1003 Further fill of the structure not implemented,
1004 Needs real values for the structure members
1012 /***********************************************************************
1013 * GetCharWidth16 (GDI.350)
1015 BOOL16 WINAPI GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
1018 BOOL32 retVal = FALSE;
1020 if( firstChar != lastChar )
1022 LPINT32 buf32 = (LPINT32)HeapAlloc(GetProcessHeap(), 0,
1023 sizeof(INT32)*(1 + (lastChar - firstChar)));
1026 LPINT32 obuf32 = buf32;
1029 retVal = GetCharWidth32A(hdc, firstChar, lastChar, buf32);
1032 for (i = firstChar; i <= lastChar; i++)
1033 *buffer++ = *buf32++;
1035 HeapFree(GetProcessHeap(), 0, obuf32);
1038 else /* happens quite often to warrant a special treatment */
1041 retVal = GetCharWidth32A(hdc, firstChar, lastChar, &chWidth );
1048 /***********************************************************************
1049 * GetCharWidth32A (GDI32.155)
1051 BOOL32 WINAPI GetCharWidth32A( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
1055 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
1058 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
1062 if (!dc->funcs->pGetCharWidth ||
1063 !dc->funcs->pGetCharWidth( dc, firstChar, lastChar, buffer))
1066 /* convert device units to logical */
1068 extra = dc->vportExtX >> 1;
1069 for( i = firstChar; i <= lastChar; i++, buffer++ )
1070 *buffer = (*buffer * dc->wndExtX + extra) / dc->vportExtX;
1076 /***********************************************************************
1077 * GetCharWidth32W (GDI32.158)
1079 BOOL32 WINAPI GetCharWidth32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
1082 return GetCharWidth32A( hdc, firstChar, lastChar, buffer );
1087 /* FIXME: all following APIs *******************************************
1090 * SetMapperFlags16 (GDI.349)
1092 DWORD WINAPI SetMapperFlags16( HDC16 hDC, DWORD dwFlag )
1094 return SetMapperFlags32( hDC, dwFlag );
1098 /***********************************************************************
1099 * SetMapperFlags32 (GDI32.322)
1101 DWORD WINAPI SetMapperFlags32( HDC32 hDC, DWORD dwFlag )
1103 FIXME(font, "(0x%04x, 0x%08lx): stub - harmless\n", hDC, dwFlag);
1107 /***********************************************************************
1108 * GetAspectRatioFilterEx16 (GDI.486)
1110 BOOL16 WINAPI GetAspectRatioFilterEx16( HDC16 hdc, LPSIZE16 pAspectRatio )
1112 FIXME(font, "(%04x, %p): -- Empty Stub !\n",
1118 /***********************************************************************
1119 * GetCharABCWidths16 (GDI.307)
1121 BOOL16 WINAPI GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
1125 if (!GetCharABCWidths32A( hdc, firstChar, lastChar, &abc32 )) return FALSE;
1126 abc->abcA = abc32.abcA;
1127 abc->abcB = abc32.abcB;
1128 abc->abcC = abc32.abcC;
1133 /***********************************************************************
1134 * GetCharABCWidths32A (GDI32.149)
1136 BOOL32 WINAPI GetCharABCWidths32A(HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
1139 return GetCharABCWidths32W( hdc, firstChar, lastChar, abc );
1143 /******************************************************************************
1144 * GetCharABCWidths32W [GDI32.152] Retrieves widths of characters in range
1147 * hdc [I] Handle of device context
1148 * firstChar [I] First character in range to query
1149 * lastChar [I] Last character in range to query
1150 * abc [O] Address of character-width structure
1153 * Only works with TrueType fonts
1159 BOOL32 WINAPI GetCharABCWidths32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
1162 /* No TrueType fonts in Wine so far */
1163 FIXME(font, "(%04x,%04x,%04x,%p): stub\n", hdc, firstChar, lastChar, abc);
1168 /***********************************************************************
1169 * GetGlyphOutline16 (GDI.309)
1171 DWORD WINAPI GetGlyphOutline16( HDC16 hdc, UINT16 uChar, UINT16 fuFormat,
1172 LPGLYPHMETRICS16 lpgm, DWORD cbBuffer,
1173 LPVOID lpBuffer, const MAT2 *lpmat2 )
1175 FIXME(font,"(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
1176 hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
1177 return (DWORD)-1; /* failure */
1181 /***********************************************************************
1182 * GetGlyphOutline32A (GDI32.186)
1184 DWORD WINAPI GetGlyphOutline32A( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
1185 LPGLYPHMETRICS32 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 */
1193 /***********************************************************************
1194 * GetGlyphOutline32W (GDI32.187)
1196 DWORD WINAPI GetGlyphOutline32W( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
1197 LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
1198 LPVOID lpBuffer, const MAT2 *lpmat2 )
1200 FIXME(font,"(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
1201 hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
1202 return (DWORD)-1; /* failure */
1205 /***********************************************************************
1206 * CreateScalableFontResource16 (GDI.310)
1208 BOOL16 WINAPI CreateScalableFontResource16( UINT16 fHidden,
1209 LPCSTR lpszResourceFile,
1210 LPCSTR fontFile, LPCSTR path )
1212 return CreateScalableFontResource32A( fHidden, lpszResourceFile,
1216 /***********************************************************************
1217 * CreateScalableFontResource32A (GDI32.62)
1219 BOOL32 WINAPI CreateScalableFontResource32A( DWORD fHidden,
1220 LPCSTR lpszResourceFile,
1221 LPCSTR lpszFontFile,
1222 LPCSTR lpszCurrentPath )
1224 /* fHidden=1 - only visible for the calling app, read-only, not
1225 * enumbered with EnumFonts/EnumFontFamilies
1226 * lpszCurrentPath can be NULL
1228 FIXME(font,"(%ld,%s,%s,%s): stub\n",
1229 fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
1230 return FALSE; /* create failed */
1233 /***********************************************************************
1234 * CreateScalableFontResource32W (GDI32.63)
1236 BOOL32 WINAPI CreateScalableFontResource32W( DWORD fHidden,
1237 LPCWSTR lpszResourceFile,
1238 LPCWSTR lpszFontFile,
1239 LPCWSTR lpszCurrentPath )
1241 FIXME(font,"(%ld,%p,%p,%p): stub\n",
1242 fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
1243 return FALSE; /* create failed */
1247 /*************************************************************************
1248 * GetRasterizerCaps16 (GDI.313)
1250 BOOL16 WINAPI GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes)
1252 return GetRasterizerCaps32( lprs, cbNumBytes );
1256 /*************************************************************************
1257 * GetRasterizerCaps32 (GDI32.216)
1259 BOOL32 WINAPI GetRasterizerCaps32( LPRASTERIZER_STATUS lprs, UINT32 cbNumBytes)
1261 lprs->nSize = sizeof(RASTERIZER_STATUS);
1262 lprs->wFlags = TT_AVAILABLE|TT_ENABLED;
1263 lprs->nLanguageID = 0;
1268 /*************************************************************************
1269 * GetKerningPairs16 (GDI.332)
1271 INT16 WINAPI GetKerningPairs16( HDC16 hDC, INT16 cPairs,
1272 LPKERNINGPAIR16 lpKerningPairs )
1274 /* At this time kerning is ignored (set to 0) */
1276 FIXME(font,"(%x,%d,%p): almost empty stub!\n",
1277 hDC, cPairs, lpKerningPairs);
1278 for (i = 0; i < cPairs; i++)
1279 lpKerningPairs[i].iKernAmount = 0;
1285 /*************************************************************************
1286 * GetKerningPairs32A (GDI32.192)
1288 DWORD WINAPI GetKerningPairs32A( HDC32 hDC, DWORD cPairs,
1289 LPKERNINGPAIR32 lpKerningPairs )
1292 FIXME(font,"(%x,%ld,%p): almost empty stub!\n",
1293 hDC, cPairs, lpKerningPairs);
1294 for (i = 0; i < cPairs; i++)
1295 lpKerningPairs[i].iKernAmount = 0;
1300 /*************************************************************************
1301 * GetKerningPairs32W (GDI32.193)
1303 DWORD WINAPI GetKerningPairs32W( HDC32 hDC, DWORD cPairs,
1304 LPKERNINGPAIR32 lpKerningPairs )
1306 return GetKerningPairs32A( hDC, cPairs, lpKerningPairs );
1309 /*************************************************************************
1310 * TranslateCharSetInfo [GDI32.382]
1312 BOOL32 WINAPI TranslateCharSetInfo(LPDWORD lpSrc,LPCHARSETINFO lpCs,DWORD dwFlags) {
1313 FIXME(font,"(%p,%p,0x%08lx), stub.\n",lpSrc,lpCs,dwFlags);
1317 /*************************************************************************
1318 * GetFontLanguageInfo (GDI32.182)
1320 DWORD WINAPI GetFontLanguageInfo32(HDC32 hdc) {
1321 /* return value 0 is correct for most cases anyway */
1322 FIXME(font,"(%x):stub!\n", hdc);
1326 /*************************************************************************
1327 * GetFontLanguageInfo (GDI.616)
1329 DWORD WINAPI GetFontLanguageInfo16(HDC16 hdc) {
1330 /* return value 0 is correct for most cases anyway */
1331 FIXME(font,"(%x):stub!\n",hdc);
1335 /*************************************************************************
1336 * GetFontData32 [GDI32.181] Retrieve data for TrueType font
1340 * success: Number of bytes returned
1341 * failure: GDI_ERROR
1345 * Calls SetLastError()
1351 DWORD WINAPI GetFontData32(HDC32 hdc, DWORD table, DWORD offset,
1352 LPVOID buffer, DWORD length)
1354 FIXME(font, "(%x,%ld,%ld,%p,%ld): stub\n",
1355 hdc, table, offset, buffer, length);
1356 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1360 /*************************************************************************
1361 * GetCharacterPlacement32A [GDI32.160]
1364 GetCharacterPlacement32A(HDC32 hdc, LPCSTR lpString, INT32 uCount,
1365 INT32 nMaxExtent, GCP_RESULTS32A *lpResults,
1368 /* return value 0 is correct for most cases anyway */
1369 FIXME(font,":stub!\n");
1373 /*************************************************************************
1374 * GetCharacterPlacement32W [GDI32.161]
1377 GetCharacterPlacement32W(HDC32 hdc, LPCWSTR lpString, INT32 uCount,
1378 INT32 nMaxExtent, GCP_RESULTS32W *lpResults,
1381 /* return value 0 is correct for most cases anyway */
1382 FIXME(font,":stub!\n");