4 * Copyright 1993 Alexandre Julliard
10 #include "wine/winestring.h"
15 #include "debugtools.h"
19 DECLARE_DEBUG_CHANNEL(font
)
20 DECLARE_DEBUG_CHANNEL(gdi
)
22 #define ENUM_UNICODE 0x00000001
26 LPLOGFONT16 lpLogFontParam
;
27 FONTENUMPROCEX16 lpEnumFunc
;
30 LPNEWTEXTMETRICEX16 lpTextMetric
;
31 LPENUMLOGFONTEX16 lpLogFont
;
38 LPLOGFONTW lpLogFontParam
;
39 FONTENUMPROCW lpEnumFunc
;
42 LPNEWTEXTMETRICEXW lpTextMetric
;
43 LPENUMLOGFONTEXW lpLogFont
;
48 * For TranslateCharsetInfo
50 #define FS(x) {{0,0,0,0},{0x1<<(x),0}}
51 #define MAXTCIINDEX 32
52 static CHARSETINFO FONT_tci
[MAXTCIINDEX
] = {
54 { ANSI_CHARSET
, 1252, FS(0)},
55 { EASTEUROPE_CHARSET
, 1250, FS(1)},
56 { RUSSIAN_CHARSET
, 1251, FS(2)},
57 { GREEK_CHARSET
, 1253, FS(3)},
58 { TURKISH_CHARSET
, 1254, FS(4)},
59 { HEBREW_CHARSET
, 1255, FS(5)},
60 { ARABIC_CHARSET
, 1256, FS(6)},
61 { BALTIC_CHARSET
, 1257, FS(7)},
62 /* reserved by ANSI */
63 { DEFAULT_CHARSET
, 0, FS(0)},
64 { DEFAULT_CHARSET
, 0, FS(0)},
65 { DEFAULT_CHARSET
, 0, FS(0)},
66 { DEFAULT_CHARSET
, 0, FS(0)},
67 { DEFAULT_CHARSET
, 0, FS(0)},
68 { DEFAULT_CHARSET
, 0, FS(0)},
69 { DEFAULT_CHARSET
, 0, FS(0)},
70 { DEFAULT_CHARSET
, 0, FS(0)},
72 { THAI_CHARSET
, 874, FS(16)},
73 { SHIFTJIS_CHARSET
, 932, FS(17)},
74 { GB2312_CHARSET
, 936, FS(18)},
75 { HANGEUL_CHARSET
, 949, FS(19)},
76 { CHINESEBIG5_CHARSET
, 950, FS(20)},
77 { JOHAB_CHARSET
, 1361, FS(21)},
78 /* reserved for alternate ANSI and OEM */
79 { DEFAULT_CHARSET
, 0, FS(0)},
80 { DEFAULT_CHARSET
, 0, FS(0)},
81 { DEFAULT_CHARSET
, 0, FS(0)},
82 { DEFAULT_CHARSET
, 0, FS(0)},
83 { DEFAULT_CHARSET
, 0, FS(0)},
84 { DEFAULT_CHARSET
, 0, FS(0)},
85 { DEFAULT_CHARSET
, 0, FS(0)},
86 { DEFAULT_CHARSET
, 0, FS(0)},
87 /* reserved for system */
88 { DEFAULT_CHARSET
, 0, FS(0)},
89 { DEFAULT_CHARSET
, 0, FS(0)},
92 /***********************************************************************
93 * LOGFONT conversion functions.
95 static void __logfont32to16( INT16
* plf16
, const INT
* plf32
)
98 for( i
= 0; i
< 5; i
++ ) *plf16
++ = *plf32
++;
99 *((INT
*)plf16
)++ = *plf32
++;
100 *((INT
*)plf16
) = *plf32
;
103 static void __logfont16to32( INT
* plf32
, const INT16
* plf16
)
106 for( i
= 0; i
< 5; i
++ ) *plf32
++ = *plf16
++;
107 *plf32
++ = *((INT
*)plf16
)++;
108 *plf32
= *((INT
*)plf16
);
111 void FONT_LogFont32ATo16( const LOGFONTA
* font32
, LPLOGFONT16 font16
)
113 __logfont32to16( (INT16
*)font16
, (const INT
*)font32
);
114 lstrcpynA( font16
->lfFaceName
, font32
->lfFaceName
, LF_FACESIZE
);
117 void FONT_LogFont32WTo16( const LOGFONTW
* font32
, LPLOGFONT16 font16
)
119 __logfont32to16( (INT16
*)font16
, (const INT
*)font32
);
120 lstrcpynWtoA( font16
->lfFaceName
, font32
->lfFaceName
, LF_FACESIZE
);
123 void FONT_LogFont16To32A( const LPLOGFONT16 font16
, LPLOGFONTA font32
)
125 __logfont16to32( (INT
*)font32
, (const INT16
*)font16
);
126 lstrcpynA( font32
->lfFaceName
, font16
->lfFaceName
, LF_FACESIZE
);
129 void FONT_LogFont16To32W( const LPLOGFONT16 font16
, LPLOGFONTW font32
)
131 __logfont16to32( (INT
*)font32
, (const INT16
*)font16
);
132 lstrcpynAtoW( font32
->lfFaceName
, font16
->lfFaceName
, LF_FACESIZE
);
135 /***********************************************************************
136 * TEXTMETRIC conversion functions.
138 void FONT_TextMetric32Ato16(const LPTEXTMETRICA ptm32
, LPTEXTMETRIC16 ptm16
)
140 ptm16
->tmHeight
= ptm32
->tmHeight
;
141 ptm16
->tmAscent
= ptm32
->tmAscent
;
142 ptm16
->tmDescent
= ptm32
->tmDescent
;
143 ptm16
->tmInternalLeading
= ptm32
->tmInternalLeading
;
144 ptm16
->tmExternalLeading
= ptm32
->tmExternalLeading
;
145 ptm16
->tmAveCharWidth
= ptm32
->tmAveCharWidth
;
146 ptm16
->tmMaxCharWidth
= ptm32
->tmMaxCharWidth
;
147 ptm16
->tmWeight
= ptm32
->tmWeight
;
148 ptm16
->tmOverhang
= ptm32
->tmOverhang
;
149 ptm16
->tmDigitizedAspectX
= ptm32
->tmDigitizedAspectX
;
150 ptm16
->tmDigitizedAspectY
= ptm32
->tmDigitizedAspectY
;
151 ptm16
->tmFirstChar
= ptm32
->tmFirstChar
;
152 ptm16
->tmLastChar
= ptm32
->tmLastChar
;
153 ptm16
->tmDefaultChar
= ptm32
->tmDefaultChar
;
154 ptm16
->tmBreakChar
= ptm32
->tmBreakChar
;
155 ptm16
->tmItalic
= ptm32
->tmItalic
;
156 ptm16
->tmUnderlined
= ptm32
->tmUnderlined
;
157 ptm16
->tmStruckOut
= ptm32
->tmStruckOut
;
158 ptm16
->tmPitchAndFamily
= ptm32
->tmPitchAndFamily
;
159 ptm16
->tmCharSet
= ptm32
->tmCharSet
;
162 void FONT_TextMetric32Wto16(const LPTEXTMETRICW ptm32
, LPTEXTMETRIC16 ptm16
)
164 ptm16
->tmHeight
= ptm32
->tmHeight
;
165 ptm16
->tmAscent
= ptm32
->tmAscent
;
166 ptm16
->tmDescent
= ptm32
->tmDescent
;
167 ptm16
->tmInternalLeading
= ptm32
->tmInternalLeading
;
168 ptm16
->tmExternalLeading
= ptm32
->tmExternalLeading
;
169 ptm16
->tmAveCharWidth
= ptm32
->tmAveCharWidth
;
170 ptm16
->tmMaxCharWidth
= ptm32
->tmMaxCharWidth
;
171 ptm16
->tmWeight
= ptm32
->tmWeight
;
172 ptm16
->tmOverhang
= ptm32
->tmOverhang
;
173 ptm16
->tmDigitizedAspectX
= ptm32
->tmDigitizedAspectX
;
174 ptm16
->tmDigitizedAspectY
= ptm32
->tmDigitizedAspectY
;
175 ptm16
->tmFirstChar
= ptm32
->tmFirstChar
;
176 ptm16
->tmLastChar
= ptm32
->tmLastChar
;
177 ptm16
->tmDefaultChar
= ptm32
->tmDefaultChar
;
178 ptm16
->tmBreakChar
= ptm32
->tmBreakChar
;
179 ptm16
->tmItalic
= ptm32
->tmItalic
;
180 ptm16
->tmUnderlined
= ptm32
->tmUnderlined
;
181 ptm16
->tmStruckOut
= ptm32
->tmStruckOut
;
182 ptm16
->tmPitchAndFamily
= ptm32
->tmPitchAndFamily
;
183 ptm16
->tmCharSet
= ptm32
->tmCharSet
;
186 void FONT_TextMetric16to32A(const LPTEXTMETRIC16 ptm16
, LPTEXTMETRICA ptm32
)
188 ptm32
->tmHeight
= ptm16
->tmHeight
;
189 ptm32
->tmAscent
= ptm16
->tmAscent
;
190 ptm32
->tmDescent
= ptm16
->tmDescent
;
191 ptm32
->tmInternalLeading
= ptm16
->tmInternalLeading
;
192 ptm32
->tmExternalLeading
= ptm16
->tmExternalLeading
;
193 ptm32
->tmAveCharWidth
= ptm16
->tmAveCharWidth
;
194 ptm32
->tmMaxCharWidth
= ptm16
->tmMaxCharWidth
;
195 ptm32
->tmWeight
= ptm16
->tmWeight
;
196 ptm32
->tmOverhang
= ptm16
->tmOverhang
;
197 ptm32
->tmDigitizedAspectX
= ptm16
->tmDigitizedAspectX
;
198 ptm32
->tmDigitizedAspectY
= ptm16
->tmDigitizedAspectY
;
199 ptm32
->tmFirstChar
= ptm16
->tmFirstChar
;
200 ptm32
->tmLastChar
= ptm16
->tmLastChar
;
201 ptm32
->tmDefaultChar
= ptm16
->tmDefaultChar
;
202 ptm32
->tmBreakChar
= ptm16
->tmBreakChar
;
203 ptm32
->tmItalic
= ptm16
->tmItalic
;
204 ptm32
->tmUnderlined
= ptm16
->tmUnderlined
;
205 ptm32
->tmStruckOut
= ptm16
->tmStruckOut
;
206 ptm32
->tmPitchAndFamily
= ptm16
->tmPitchAndFamily
;
207 ptm32
->tmCharSet
= ptm16
->tmCharSet
;
210 void FONT_TextMetric16to32W(const LPTEXTMETRIC16 ptm16
, LPTEXTMETRICW ptm32
)
212 ptm32
->tmHeight
= ptm16
->tmHeight
;
213 ptm32
->tmAscent
= ptm16
->tmAscent
;
214 ptm32
->tmDescent
= ptm16
->tmDescent
;
215 ptm32
->tmInternalLeading
= ptm16
->tmInternalLeading
;
216 ptm32
->tmExternalLeading
= ptm16
->tmExternalLeading
;
217 ptm32
->tmAveCharWidth
= ptm16
->tmAveCharWidth
;
218 ptm32
->tmMaxCharWidth
= ptm16
->tmMaxCharWidth
;
219 ptm32
->tmWeight
= ptm16
->tmWeight
;
220 ptm32
->tmOverhang
= ptm16
->tmOverhang
;
221 ptm32
->tmDigitizedAspectX
= ptm16
->tmDigitizedAspectX
;
222 ptm32
->tmDigitizedAspectY
= ptm16
->tmDigitizedAspectY
;
223 ptm32
->tmFirstChar
= ptm16
->tmFirstChar
;
224 ptm32
->tmLastChar
= ptm16
->tmLastChar
;
225 ptm32
->tmDefaultChar
= ptm16
->tmDefaultChar
;
226 ptm32
->tmBreakChar
= ptm16
->tmBreakChar
;
227 ptm32
->tmItalic
= ptm16
->tmItalic
;
228 ptm32
->tmUnderlined
= ptm16
->tmUnderlined
;
229 ptm32
->tmStruckOut
= ptm16
->tmStruckOut
;
230 ptm32
->tmPitchAndFamily
= ptm16
->tmPitchAndFamily
;
231 ptm32
->tmCharSet
= ptm16
->tmCharSet
;
234 void FONT_TextMetric32Ato32W(const LPTEXTMETRICA ptm32A
, LPTEXTMETRICW ptm32W
)
236 ptm32W
->tmHeight
= ptm32A
->tmHeight
;
237 ptm32W
->tmAscent
= ptm32A
->tmAscent
;
238 ptm32W
->tmDescent
= ptm32A
->tmDescent
;
239 ptm32W
->tmInternalLeading
= ptm32A
->tmInternalLeading
;
240 ptm32W
->tmExternalLeading
= ptm32A
->tmExternalLeading
;
241 ptm32W
->tmAveCharWidth
= ptm32A
->tmAveCharWidth
;
242 ptm32W
->tmMaxCharWidth
= ptm32A
->tmMaxCharWidth
;
243 ptm32W
->tmWeight
= ptm32A
->tmWeight
;
244 ptm32W
->tmOverhang
= ptm32A
->tmOverhang
;
245 ptm32W
->tmDigitizedAspectX
= ptm32A
->tmDigitizedAspectX
;
246 ptm32W
->tmDigitizedAspectY
= ptm32A
->tmDigitizedAspectY
;
247 ptm32W
->tmFirstChar
= ptm32A
->tmFirstChar
;
248 ptm32W
->tmLastChar
= ptm32A
->tmLastChar
;
249 ptm32W
->tmDefaultChar
= ptm32A
->tmDefaultChar
;
250 ptm32W
->tmBreakChar
= ptm32A
->tmBreakChar
;
251 ptm32W
->tmItalic
= ptm32A
->tmItalic
;
252 ptm32W
->tmUnderlined
= ptm32A
->tmUnderlined
;
253 ptm32W
->tmStruckOut
= ptm32A
->tmStruckOut
;
254 ptm32W
->tmPitchAndFamily
= ptm32A
->tmPitchAndFamily
;
255 ptm32W
->tmCharSet
= ptm32A
->tmCharSet
;
258 /***********************************************************************
259 * CreateFontIndirect16 (GDI.57)
261 HFONT16 WINAPI
CreateFontIndirect16( const LOGFONT16
*font
)
267 hFont
= GDI_AllocObject( sizeof(FONTOBJ
), FONT_MAGIC
);
271 fontPtr
= (FONTOBJ
*) GDI_HEAP_LOCK( hFont
);
272 memcpy( &fontPtr
->logfont
, font
, sizeof(LOGFONT16
) );
274 TRACE_(font
)("(%i %i %i %i) '%s' %s %s => %04x\n",
275 font
->lfHeight
, font
->lfWidth
,
276 font
->lfEscapement
, font
->lfOrientation
,
277 font
->lfFaceName
? font
->lfFaceName
: "NULL",
278 font
->lfWeight
> 400 ? "Bold" : "",
279 font
->lfItalic
? "Italic" : "",
282 if (font
->lfEscapement
!= font
->lfOrientation
) {
283 /* this should really depend on whether GM_ADVANCED is set */
284 fontPtr
->logfont
.lfOrientation
= fontPtr
->logfont
.lfEscapement
;
286 "orientation angle %f set to escapement angle %f for new font %04x\n",
287 font
->lfOrientation
/10., font
->lfEscapement
/10., hFont
);
289 GDI_HEAP_UNLOCK( hFont
);
292 else WARN_(font
)("(NULL) => NULL\n");
297 /***********************************************************************
298 * CreateFontIndirectA (GDI32.44)
300 HFONT WINAPI
CreateFontIndirectA( const LOGFONTA
*font
)
304 FONT_LogFont32ATo16( font
, &font16
);
305 return CreateFontIndirect16( &font16
);
308 /***********************************************************************
309 * CreateFontIndirectW (GDI32.45)
311 HFONT WINAPI
CreateFontIndirectW( const LOGFONTW
*font
)
315 FONT_LogFont32WTo16( font
, &font16
);
316 return CreateFontIndirect16( &font16
);
319 /***********************************************************************
320 * CreateFont16 (GDI.56)
322 HFONT16 WINAPI
CreateFont16(INT16 height
, INT16 width
, INT16 esc
, INT16 orient
,
323 INT16 weight
, BYTE italic
, BYTE underline
,
324 BYTE strikeout
, BYTE charset
, BYTE outpres
,
325 BYTE clippres
, BYTE quality
, BYTE pitch
,
330 TRACE_(font
)("('%s',%d,%d)\n",
331 (name
? name
: "(null)") , height
, width
);
333 logfont
.lfHeight
= height
;
334 logfont
.lfWidth
= width
;
335 logfont
.lfEscapement
= esc
;
336 logfont
.lfOrientation
= orient
;
337 logfont
.lfWeight
= weight
;
338 logfont
.lfItalic
= italic
;
339 logfont
.lfUnderline
= underline
;
340 logfont
.lfStrikeOut
= strikeout
;
341 logfont
.lfCharSet
= charset
;
342 logfont
.lfOutPrecision
= outpres
;
343 logfont
.lfClipPrecision
= clippres
;
344 logfont
.lfQuality
= quality
;
345 logfont
.lfPitchAndFamily
= pitch
;
348 lstrcpynA(logfont
.lfFaceName
,name
,sizeof(logfont
.lfFaceName
));
350 logfont
.lfFaceName
[0] = '\0';
352 return CreateFontIndirect16( &logfont
);
355 /*************************************************************************
356 * CreateFontA (GDI32.43)
358 HFONT WINAPI
CreateFontA( INT height
, INT width
, INT esc
,
359 INT orient
, INT weight
, DWORD italic
,
360 DWORD underline
, DWORD strikeout
, DWORD charset
,
361 DWORD outpres
, DWORD clippres
, DWORD quality
,
362 DWORD pitch
, LPCSTR name
)
364 return (HFONT
)CreateFont16( height
, width
, esc
, orient
, weight
, italic
,
365 underline
, strikeout
, charset
, outpres
,
366 clippres
, quality
, pitch
, name
);
369 /*************************************************************************
370 * CreateFontW (GDI32.46)
372 HFONT WINAPI
CreateFontW( INT height
, INT width
, INT esc
,
373 INT orient
, INT weight
, DWORD italic
,
374 DWORD underline
, DWORD strikeout
, DWORD charset
,
375 DWORD outpres
, DWORD clippres
, DWORD quality
,
376 DWORD pitch
, LPCWSTR name
)
378 LPSTR namea
= HEAP_strdupWtoA( GetProcessHeap(), 0, name
);
379 HFONT ret
= (HFONT
)CreateFont16( height
, width
, esc
, orient
, weight
,
380 italic
, underline
, strikeout
, charset
,
381 outpres
, clippres
, quality
, pitch
,
383 if (namea
) HeapFree( GetProcessHeap(), 0, namea
);
388 /***********************************************************************
391 INT16
FONT_GetObject16( FONTOBJ
* font
, INT16 count
, LPSTR buffer
)
393 if (count
> sizeof(LOGFONT16
)) count
= sizeof(LOGFONT16
);
394 memcpy( buffer
, &font
->logfont
, count
);
398 /***********************************************************************
401 INT
FONT_GetObjectA( FONTOBJ
*font
, INT count
, LPSTR buffer
)
405 FONT_LogFont16To32A( &font
->logfont
, &fnt32
);
407 if (count
> sizeof(fnt32
)) count
= sizeof(fnt32
);
408 memcpy( buffer
, &fnt32
, count
);
411 /***********************************************************************
414 INT
FONT_GetObjectW( FONTOBJ
*font
, INT count
, LPSTR buffer
)
418 FONT_LogFont16To32W( &font
->logfont
, &fnt32
);
420 if (count
> sizeof(fnt32
)) count
= sizeof(fnt32
);
421 memcpy( buffer
, &fnt32
, count
);
426 /***********************************************************************
427 * FONT_EnumInstance16
429 * Called by the device driver layer to pass font info
430 * down to the application.
432 static INT
FONT_EnumInstance16( LPENUMLOGFONT16 plf
,
433 LPNEWTEXTMETRIC16 ptm
, UINT16 fType
, LPARAM lp
)
435 #define pfe ((fontEnum16*)lp)
436 if( pfe
->lpLogFontParam
->lfCharSet
== DEFAULT_CHARSET
||
437 pfe
->lpLogFontParam
->lfCharSet
== plf
->elfLogFont
.lfCharSet
)
439 memcpy( pfe
->lpLogFont
, plf
, sizeof(ENUMLOGFONT16
) );
440 memcpy( pfe
->lpTextMetric
, ptm
, sizeof(NEWTEXTMETRIC16
) );
442 return pfe
->lpEnumFunc( pfe
->segLogFont
, pfe
->segTextMetric
, fType
, (LPARAM
)(pfe
->lpData
) );
448 /***********************************************************************
451 static INT
FONT_EnumInstance( LPENUMLOGFONT16 plf
,
452 LPNEWTEXTMETRIC16 ptm
, UINT16 fType
, LPARAM lp
)
454 /* lfCharSet is at the same offset in both LOGFONT32A and LOGFONT32W */
456 #define pfe ((fontEnum32*)lp)
457 if( pfe
->lpLogFontParam
->lfCharSet
== DEFAULT_CHARSET
||
458 pfe
->lpLogFontParam
->lfCharSet
== plf
->elfLogFont
.lfCharSet
)
460 /* convert font metrics */
462 if( pfe
->dwFlags
& ENUM_UNICODE
)
464 FONT_LogFont16To32W( &plf
->elfLogFont
, (LPLOGFONTW
)(pfe
->lpLogFont
) );
465 FONT_TextMetric16to32W( (LPTEXTMETRIC16
)ptm
, (LPTEXTMETRICW
)(pfe
->lpTextMetric
) );
469 FONT_LogFont16To32A( &plf
->elfLogFont
, (LPLOGFONTA
)pfe
->lpLogFont
);
470 FONT_TextMetric16to32A( (LPTEXTMETRIC16
)ptm
, (LPTEXTMETRICA
)pfe
->lpTextMetric
);
473 return pfe
->lpEnumFunc( (LPENUMLOGFONTW
)pfe
->lpLogFont
,
474 (LPNEWTEXTMETRICW
)pfe
->lpTextMetric
, fType
, pfe
->lpData
);
480 /***********************************************************************
481 * EnumFontFamiliesEx16 (GDI.613)
483 INT16 WINAPI
EnumFontFamiliesEx16( HDC16 hDC
, LPLOGFONT16 plf
,
484 FONTENUMPROCEX16 efproc
, LPARAM lParam
,
488 DC
* dc
= (DC
*) GDI_GetObjPtr( hDC
, DC_MAGIC
);
490 if( dc
&& dc
->funcs
->pEnumDeviceFonts
)
492 LPNEWTEXTMETRICEX16 lptm16
= SEGPTR_ALLOC( sizeof(NEWTEXTMETRICEX16
) );
495 LPENUMLOGFONTEX16 lplf16
= SEGPTR_ALLOC( sizeof(ENUMLOGFONTEX16
) );
500 fe16
.lpLogFontParam
= plf
;
501 fe16
.lpEnumFunc
= efproc
;
502 fe16
.lpData
= lParam
;
504 fe16
.lpTextMetric
= lptm16
;
505 fe16
.lpLogFont
= lplf16
;
506 fe16
.segTextMetric
= SEGPTR_GET(lptm16
);
507 fe16
.segLogFont
= SEGPTR_GET(lplf16
);
509 retVal
= dc
->funcs
->pEnumDeviceFonts( dc
, plf
, FONT_EnumInstance16
, (LPARAM
)&fe16
);
519 /***********************************************************************
520 * FONT_EnumFontFamiliesEx
522 static INT
FONT_EnumFontFamiliesEx( HDC hDC
, LPLOGFONTW plf
, FONTENUMPROCW efproc
,
523 LPARAM lParam
, DWORD dwUnicode
)
525 DC
* dc
= (DC
*) GDI_GetObjPtr( hDC
, DC_MAGIC
);
527 if( dc
&& dc
->funcs
->pEnumDeviceFonts
)
530 NEWTEXTMETRICEXW tm32w
;
531 ENUMLOGFONTEXW lf32w
;
534 fe32
.lpLogFontParam
= plf
;
535 fe32
.lpEnumFunc
= efproc
;
536 fe32
.lpData
= lParam
;
538 fe32
.lpTextMetric
= &tm32w
;
539 fe32
.lpLogFont
= &lf32w
;
540 fe32
.dwFlags
= dwUnicode
;
542 /* the only difference between LOGFONT32A and LOGFONT32W is in the lfFaceName */
544 if( plf
->lfFaceName
[0] )
547 lstrcpynWtoA( lf16
.lfFaceName
, plf
->lfFaceName
, LF_FACESIZE
);
549 lstrcpynA( lf16
.lfFaceName
, (LPCSTR
)plf
->lfFaceName
, LF_FACESIZE
);
551 else lf16
.lfFaceName
[0] = '\0';
552 lf16
.lfCharSet
= plf
->lfCharSet
;
554 return dc
->funcs
->pEnumDeviceFonts( dc
, &lf16
, FONT_EnumInstance
, (LPARAM
)&fe32
);
559 /***********************************************************************
560 * EnumFontFamiliesExW (GDI32.82)
562 INT WINAPI
EnumFontFamiliesExW( HDC hDC
, LPLOGFONTW plf
,
563 FONTENUMPROCEXW efproc
,
564 LPARAM lParam
, DWORD dwFlags
)
566 return FONT_EnumFontFamiliesEx( hDC
, plf
, (FONTENUMPROCW
)efproc
,
567 lParam
, ENUM_UNICODE
);
570 /***********************************************************************
571 * EnumFontFamiliesExA (GDI32.81)
573 INT WINAPI
EnumFontFamiliesExA( HDC hDC
, LPLOGFONTA plf
,
574 FONTENUMPROCEXA efproc
,
575 LPARAM lParam
, DWORD dwFlags
)
577 return FONT_EnumFontFamiliesEx( hDC
, (LPLOGFONTW
)plf
,
578 (FONTENUMPROCW
)efproc
, lParam
, 0);
581 /***********************************************************************
582 * EnumFontFamilies16 (GDI.330)
584 INT16 WINAPI
EnumFontFamilies16( HDC16 hDC
, LPCSTR lpFamily
,
585 FONTENUMPROC16 efproc
, LPARAM lpData
)
589 lf
.lfCharSet
= DEFAULT_CHARSET
;
590 if( lpFamily
) lstrcpynA( lf
.lfFaceName
, lpFamily
, LF_FACESIZE
);
591 else lf
.lfFaceName
[0] = '\0';
593 return EnumFontFamiliesEx16( hDC
, &lf
, (FONTENUMPROCEX16
)efproc
, lpData
, 0 );
596 /***********************************************************************
597 * EnumFontFamiliesA (GDI32.80)
599 INT WINAPI
EnumFontFamiliesA( HDC hDC
, LPCSTR lpFamily
,
600 FONTENUMPROCA efproc
, LPARAM lpData
)
604 lf
.lfCharSet
= DEFAULT_CHARSET
;
605 if( lpFamily
) lstrcpynA( lf
.lfFaceName
, lpFamily
, LF_FACESIZE
);
606 else lf
.lfFaceName
[0] = lf
.lfFaceName
[1] = '\0';
608 return FONT_EnumFontFamiliesEx( hDC
, (LPLOGFONTW
)&lf
,
609 (FONTENUMPROCW
)efproc
, lpData
, 0 );
612 /***********************************************************************
613 * EnumFontFamiliesW (GDI32.83)
615 INT WINAPI
EnumFontFamiliesW( HDC hDC
, LPCWSTR lpFamily
,
616 FONTENUMPROCW efproc
, LPARAM lpData
)
620 lf
.lfCharSet
= DEFAULT_CHARSET
;
621 if( lpFamily
) lstrcpynW( lf
.lfFaceName
, lpFamily
, LF_FACESIZE
);
622 else lf
.lfFaceName
[0] = 0;
624 return FONT_EnumFontFamiliesEx( hDC
, &lf
, efproc
, lpData
, ENUM_UNICODE
);
627 /***********************************************************************
628 * EnumFonts16 (GDI.70)
630 INT16 WINAPI
EnumFonts16( HDC16 hDC
, LPCSTR lpName
, FONTENUMPROC16 efproc
,
633 return EnumFontFamilies16( hDC
, lpName
, (FONTENUMPROCEX16
)efproc
, lpData
);
636 /***********************************************************************
637 * EnumFontsA (GDI32.84)
639 INT WINAPI
EnumFontsA( HDC hDC
, LPCSTR lpName
, FONTENUMPROCA efproc
,
642 return EnumFontFamiliesA( hDC
, lpName
, efproc
, lpData
);
645 /***********************************************************************
646 * EnumFontsW (GDI32.85)
648 INT WINAPI
EnumFontsW( HDC hDC
, LPCWSTR lpName
, FONTENUMPROCW efproc
,
651 return EnumFontFamiliesW( hDC
, lpName
, efproc
, lpData
);
655 /***********************************************************************
656 * GetTextCharacterExtra16 (GDI.89)
658 INT16 WINAPI
GetTextCharacterExtra16( HDC16 hdc
)
660 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
662 return abs( (dc
->w
.charExtra
* dc
->wndExtX
+ dc
->vportExtX
/ 2)
667 /***********************************************************************
668 * GetTextCharacterExtra (GDI32.225)
670 INT WINAPI
GetTextCharacterExtra( HDC hdc
)
672 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
674 return abs( (dc
->w
.charExtra
* dc
->wndExtX
+ dc
->vportExtX
/ 2)
679 /***********************************************************************
680 * SetTextCharacterExtra16 (GDI.8)
682 INT16 WINAPI
SetTextCharacterExtra16( HDC16 hdc
, INT16 extra
)
684 return (INT16
)SetTextCharacterExtra( hdc
, extra
);
688 /***********************************************************************
689 * SetTextCharacterExtra (GDI32.337)
691 INT WINAPI
SetTextCharacterExtra( HDC hdc
, INT extra
)
694 DC
* dc
= DC_GetDCPtr( hdc
);
696 if (dc
->funcs
->pSetTextCharacterExtra
)
697 return dc
->funcs
->pSetTextCharacterExtra( dc
, extra
);
698 extra
= (extra
* dc
->vportExtX
+ dc
->wndExtX
/ 2) / dc
->wndExtX
;
699 prev
= dc
->w
.charExtra
;
700 dc
->w
.charExtra
= abs(extra
);
701 return (prev
* dc
->wndExtX
+ dc
->vportExtX
/ 2) / dc
->vportExtX
;
705 /***********************************************************************
706 * SetTextJustification16 (GDI.10)
708 INT16 WINAPI
SetTextJustification16( HDC16 hdc
, INT16 extra
, INT16 breaks
)
710 return SetTextJustification( hdc
, extra
, breaks
);
714 /***********************************************************************
715 * SetTextJustification (GDI32.339)
717 BOOL WINAPI
SetTextJustification( HDC hdc
, INT extra
, INT breaks
)
719 DC
* dc
= DC_GetDCPtr( hdc
);
721 if (dc
->funcs
->pSetTextJustification
)
722 return dc
->funcs
->pSetTextJustification( dc
, extra
, breaks
);
724 extra
= abs((extra
* dc
->vportExtX
+ dc
->wndExtX
/ 2) / dc
->wndExtX
);
725 if (!extra
) breaks
= 0;
726 dc
->w
.breakTotalExtra
= extra
;
727 dc
->w
.breakCount
= breaks
;
730 dc
->w
.breakExtra
= extra
/ breaks
;
731 dc
->w
.breakRem
= extra
- (dc
->w
.breakCount
* dc
->w
.breakExtra
);
735 dc
->w
.breakExtra
= 0;
742 /***********************************************************************
743 * GetTextFace16 (GDI.92)
745 INT16 WINAPI
GetTextFace16( HDC16 hdc
, INT16 count
, LPSTR name
)
747 return GetTextFaceA(hdc
,count
,name
);
750 /***********************************************************************
751 * GetTextFaceA (GDI32.234)
753 INT WINAPI
GetTextFaceA( HDC hdc
, INT count
, LPSTR name
)
757 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
759 if (!(font
= (FONTOBJ
*) GDI_GetObjPtr( dc
->w
.hFont
, FONT_MAGIC
)))
762 lstrcpynA( name
, font
->logfont
.lfFaceName
, count
);
763 GDI_HEAP_UNLOCK( dc
->w
.hFont
);
767 return strlen(font
->logfont
.lfFaceName
) + 1;
770 /***********************************************************************
771 * GetTextFaceW (GDI32.235)
773 INT WINAPI
GetTextFaceW( HDC hdc
, INT count
, LPWSTR name
)
775 LPSTR nameA
= HeapAlloc( GetProcessHeap(), 0, count
);
776 INT res
= GetTextFaceA(hdc
,count
,nameA
);
777 lstrcpyAtoW( name
, nameA
);
778 HeapFree( GetProcessHeap(), 0, nameA
);
783 /***********************************************************************
784 * GetTextExtent16 (GDI.91)
786 DWORD WINAPI
GetTextExtent16( HDC16 hdc
, LPCSTR str
, INT16 count
)
789 if (!GetTextExtentPoint16( hdc
, str
, count
, &size
)) return 0;
790 return MAKELONG( size
.cx
, size
.cy
);
794 /***********************************************************************
795 * GetTextExtentPoint16 (GDI.471)
797 * FIXME: Should this have a bug for compatibility?
798 * Original Windows versions of GetTextExtentPoint{A,W} have documented
799 * bugs (-> MSDN KB q147647.txt).
801 BOOL16 WINAPI
GetTextExtentPoint16( HDC16 hdc
, LPCSTR str
, INT16 count
,
805 BOOL ret
= GetTextExtentPoint32A( hdc
, str
, count
, &size32
);
806 CONV_SIZE32TO16( &size32
, size
);
811 /***********************************************************************
812 * GetTextExtentPoint32A (GDI32.230)
814 BOOL WINAPI
GetTextExtentPoint32A( HDC hdc
, LPCSTR str
, INT count
,
817 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
820 if (!(dc
= (DC
*)GDI_GetObjPtr( hdc
, METAFILE_DC_MAGIC
)))
824 if (!dc
->funcs
->pGetTextExtentPoint
||
825 !dc
->funcs
->pGetTextExtentPoint( dc
, str
, count
, size
))
828 TRACE_(font
)("(%08x %s %d %p): returning %d,%d\n",
829 hdc
, debugstr_an (str
, count
), count
,
830 size
, size
->cx
, size
->cy
);
835 /***********************************************************************
836 * GetTextExtentPoint32W [GDI32.231] Computes width/height for a string
838 * Computes width and height of the specified string.
844 BOOL WINAPI
GetTextExtentPoint32W(
845 HDC hdc
, /* [in] Handle of device context */
846 LPCWSTR str
, /* [in] Address of text string */
847 INT count
, /* [in] Number of characters in string */
848 LPSIZE size
) /* [out] Address of structure for string size */
853 /* str may not be 0 terminated so we can't use HEAP_strdupWtoA.
854 * We allocate one more than we need so that lstrcpynWtoA can write a
855 * trailing 0 if it wants.
858 if(!count
) count
= lstrlenW(str
);
859 p
= HeapAlloc( GetProcessHeap(), 0, count
+1 );
860 lstrcpynWtoA(p
, str
, count
+1);
861 ret
= GetTextExtentPoint32A( hdc
, p
, count
, size
);
862 HeapFree( GetProcessHeap(), 0, p
);
867 /***********************************************************************
868 * GetTextExtentPointA (GDI32.232)
870 BOOL WINAPI
GetTextExtentPointA( HDC hdc
, LPCSTR str
, INT count
,
873 TRACE_(font
)("not bug compatible.\n");
874 return GetTextExtentPoint32A( hdc
, str
, count
, size
);
877 /***********************************************************************
878 * GetTextExtentPointW (GDI32.233)
880 BOOL WINAPI
GetTextExtentPointW( HDC hdc
, LPCWSTR str
, INT count
,
883 TRACE_(font
)("not bug compatible.\n");
884 return GetTextExtentPoint32W( hdc
, str
, count
, size
);
888 /***********************************************************************
889 * GetTextExtentExPointA (GDI32.228)
891 BOOL WINAPI
GetTextExtentExPointA( HDC hdc
, LPCSTR str
, INT count
,
892 INT maxExt
, LPINT lpnFit
,
893 LPINT alpDx
, LPSIZE size
)
895 int index
, nFit
, extent
;
897 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
901 if (!(dc
= (DC
*)GDI_GetObjPtr( hdc
, METAFILE_DC_MAGIC
)))
904 if (!dc
->funcs
->pGetTextExtentPoint
) return FALSE
;
906 size
->cx
= size
->cy
= nFit
= extent
= 0;
907 for(index
= 0; index
< count
; index
++)
909 if(!dc
->funcs
->pGetTextExtentPoint( dc
, str
, 1, &tSize
)) return FALSE
;
910 if( extent
+tSize
.cx
< maxExt
)
915 if( alpDx
) alpDx
[index
] = extent
;
916 if( tSize
.cy
> size
->cy
) size
->cy
= tSize
.cy
;
923 TRACE_(font
)("(%08x '%.*s' %d) returning %d %d %d\n",
924 hdc
,count
,str
,maxExt
,nFit
, size
->cx
,size
->cy
);
929 /***********************************************************************
930 * GetTextExtentExPointW (GDI32.229)
933 BOOL WINAPI
GetTextExtentExPointW( HDC hdc
, LPCWSTR str
, INT count
,
934 INT maxExt
, LPINT lpnFit
,
935 LPINT alpDx
, LPSIZE size
)
940 /* Docs say str should be 0 terminated here, but we'll use count just in case
943 if(!count
) count
= lstrlenW(str
);
944 p
= HeapAlloc( GetProcessHeap(), 0, count
+1 );
945 lstrcpynWtoA(p
, str
, count
+1);
946 ret
= GetTextExtentExPointA( hdc
, p
, count
, maxExt
,
947 lpnFit
, alpDx
, size
);
948 HeapFree( GetProcessHeap(), 0, p
);
952 /***********************************************************************
953 * GetTextMetrics16 (GDI.93)
955 BOOL16 WINAPI
GetTextMetrics16( HDC16 hdc
, TEXTMETRIC16
*metrics
)
959 if (!GetTextMetricsA( (HDC
)hdc
, &tm32
)) return FALSE
;
960 FONT_TextMetric32Ato16( &tm32
, metrics
);
965 /***********************************************************************
966 * GetTextMetricsA (GDI32.236)
968 BOOL WINAPI
GetTextMetricsA( HDC hdc
, TEXTMETRICA
*metrics
)
970 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
973 if (!(dc
= (DC
*)GDI_GetObjPtr( hdc
, METAFILE_DC_MAGIC
)))
977 if (!dc
->funcs
->pGetTextMetrics
||
978 !dc
->funcs
->pGetTextMetrics( dc
, metrics
))
981 /* device layer returns values in device units
982 * therefore we have to convert them to logical */
984 #define WDPTOLP(x) ((x<0)? \
985 (-abs((x)*dc->wndExtX/dc->vportExtX)): \
986 (abs((x)*dc->wndExtX/dc->vportExtX)))
987 #define HDPTOLP(y) ((y<0)? \
988 (-abs((y)*dc->wndExtY/dc->vportExtY)): \
989 (abs((y)*dc->wndExtY/dc->vportExtY)))
991 metrics
->tmHeight
= HDPTOLP(metrics
->tmHeight
);
992 metrics
->tmAscent
= HDPTOLP(metrics
->tmAscent
);
993 metrics
->tmDescent
= HDPTOLP(metrics
->tmDescent
);
994 metrics
->tmInternalLeading
= HDPTOLP(metrics
->tmInternalLeading
);
995 metrics
->tmExternalLeading
= HDPTOLP(metrics
->tmExternalLeading
);
996 metrics
->tmAveCharWidth
= WDPTOLP(metrics
->tmAveCharWidth
);
997 metrics
->tmMaxCharWidth
= WDPTOLP(metrics
->tmMaxCharWidth
);
998 metrics
->tmOverhang
= WDPTOLP(metrics
->tmOverhang
);
1000 TRACE_(font
)("text metrics:\n"
1001 " Weight = %03li\t FirstChar = %03i\t AveCharWidth = %li\n"
1002 " Italic = % 3i\t LastChar = %03i\t\t MaxCharWidth = %li\n"
1003 " UnderLined = %01i\t DefaultChar = %03i\t Overhang = %li\n"
1004 " StruckOut = %01i\t BreakChar = %03i\t CharSet = %i\n"
1005 " PitchAndFamily = %02x\n"
1006 " --------------------\n"
1007 " InternalLeading = %li\n"
1011 metrics
->tmWeight
, metrics
->tmFirstChar
, metrics
->tmAveCharWidth
,
1012 metrics
->tmItalic
, metrics
->tmLastChar
, metrics
->tmMaxCharWidth
,
1013 metrics
->tmUnderlined
, metrics
->tmDefaultChar
, metrics
->tmOverhang
,
1014 metrics
->tmStruckOut
, metrics
->tmBreakChar
, metrics
->tmCharSet
,
1015 metrics
->tmPitchAndFamily
,
1016 metrics
->tmInternalLeading
,
1019 metrics
->tmHeight
);
1024 /***********************************************************************
1025 * GetTextMetricsW (GDI32.237)
1027 BOOL WINAPI
GetTextMetricsW( HDC hdc
, TEXTMETRICW
*metrics
)
1030 if (!GetTextMetricsA( (HDC16
)hdc
, &tm
)) return FALSE
;
1031 FONT_TextMetric32Ato32W( &tm
, metrics
);
1036 /***********************************************************************
1037 * GetOutlineTextMetrics16 [GDI.308] Gets metrics for TrueType fonts.
1040 * lpOTM should be LPOUTLINETEXTMETRIC
1043 * Success: Non-zero or size of required buffer
1046 UINT16 WINAPI
GetOutlineTextMetrics16(
1047 HDC16 hdc
, /* [in] Handle of device context */
1048 UINT16 cbData
, /* [in] Size of metric data array */
1049 LPOUTLINETEXTMETRIC16 lpOTM
) /* [out] Address of metric data array */
1051 FIXME_(font
)("(%04x,%04x,%p): stub\n", hdc
,cbData
,lpOTM
);
1056 /***********************************************************************
1057 * GetOutlineTextMetricsA [GDI.207] Gets metrics for TrueType fonts.
1061 * Success: Non-zero or size of required buffer
1064 UINT WINAPI
GetOutlineTextMetricsA(
1065 HDC hdc
, /* [in] Handle of device context */
1066 UINT cbData
, /* [in] Size of metric data array */
1067 LPOUTLINETEXTMETRICA lpOTM
) /* [out] Address of metric data array */
1072 LPTEXTMETRICA lptxtMetr
;
1079 lpOTM
= (LPOUTLINETEXTMETRICA
)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(OUTLINETEXTMETRICA
));
1080 rtn
= sizeof(OUTLINETEXTMETRICA
);
1084 cbData
= sizeof(*lpOTM
);
1088 lpOTM
->otmSize
= cbData
;
1090 lptxtMetr
=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(TEXTMETRICA
));
1092 if (!GetTextMetricsA(hdc
,lptxtMetr
))
1097 memcpy(&(lpOTM
->otmTextMetrics
),lptxtMetr
,sizeof(TEXTMETRICA
));
1100 HeapFree(GetProcessHeap(),HEAP_ZERO_MEMORY
,lptxtMetr
);
1102 lpOTM
->otmFilter
= 0;
1104 lpOTM
->otmPanoseNumber
.bFamilyType
= 0;
1105 lpOTM
->otmPanoseNumber
.bSerifStyle
= 0;
1106 lpOTM
->otmPanoseNumber
.bWeight
= 0;
1107 lpOTM
->otmPanoseNumber
.bProportion
= 0;
1108 lpOTM
->otmPanoseNumber
.bContrast
= 0;
1109 lpOTM
->otmPanoseNumber
.bStrokeVariation
= 0;
1110 lpOTM
->otmPanoseNumber
.bArmStyle
= 0;
1111 lpOTM
->otmPanoseNumber
.bLetterform
= 0;
1112 lpOTM
->otmPanoseNumber
.bMidline
= 0;
1113 lpOTM
->otmPanoseNumber
.bXHeight
= 0;
1115 lpOTM
->otmfsSelection
= 0;
1116 lpOTM
->otmfsType
= 0;
1119 Further fill of the structure not implemented,
1120 Needs real values for the structure members
1126 /***********************************************************************
1127 * GetOutlineTextMetricsW [GDI32.208]
1129 UINT WINAPI
GetOutlineTextMetricsW(
1130 HDC hdc
, /* [in] Handle of device context */
1131 UINT cbData
, /* [in] Size of metric data array */
1132 LPOUTLINETEXTMETRICW lpOTM
) /* [out] Address of metric data array */
1134 FIXME_(font
)("(%d,%d,%p): stub\n", hdc
, cbData
, lpOTM
);
1138 /***********************************************************************
1139 * GetCharWidth16 (GDI.350)
1141 BOOL16 WINAPI
GetCharWidth16( HDC16 hdc
, UINT16 firstChar
, UINT16 lastChar
,
1144 BOOL retVal
= FALSE
;
1146 if( firstChar
!= lastChar
)
1148 LPINT buf32
= (LPINT
)HeapAlloc(GetProcessHeap(), 0,
1149 sizeof(INT
)*(1 + (lastChar
- firstChar
)));
1152 LPINT obuf32
= buf32
;
1155 retVal
= GetCharWidth32A(hdc
, firstChar
, lastChar
, buf32
);
1158 for (i
= firstChar
; i
<= lastChar
; i
++)
1159 *buffer
++ = *buf32
++;
1161 HeapFree(GetProcessHeap(), 0, obuf32
);
1164 else /* happens quite often to warrant a special treatment */
1167 retVal
= GetCharWidth32A(hdc
, firstChar
, lastChar
, &chWidth
);
1174 /***********************************************************************
1175 * GetCharWidth32A (GDI32.155)
1177 BOOL WINAPI
GetCharWidth32A( HDC hdc
, UINT firstChar
, UINT lastChar
,
1181 DC
* dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
);
1184 if (!(dc
= (DC
*)GDI_GetObjPtr( hdc
, METAFILE_DC_MAGIC
)))
1188 if (!dc
->funcs
->pGetCharWidth
||
1189 !dc
->funcs
->pGetCharWidth( dc
, firstChar
, lastChar
, buffer
))
1192 /* convert device units to logical */
1194 extra
= dc
->vportExtX
>> 1;
1195 for( i
= firstChar
; i
<= lastChar
; i
++, buffer
++ )
1196 *buffer
= (*buffer
* dc
->wndExtX
+ extra
) / dc
->vportExtX
;
1202 /***********************************************************************
1203 * GetCharWidth32W (GDI32.158)
1205 BOOL WINAPI
GetCharWidth32W( HDC hdc
, UINT firstChar
, UINT lastChar
,
1208 return GetCharWidth32A( hdc
, firstChar
, lastChar
, buffer
);
1213 /* FIXME: all following APIs *******************************************
1216 * SetMapperFlags16 (GDI.349)
1218 DWORD WINAPI
SetMapperFlags16( HDC16 hDC
, DWORD dwFlag
)
1220 return SetMapperFlags( hDC
, dwFlag
);
1224 /***********************************************************************
1225 * SetMapperFlags (GDI32.322)
1227 DWORD WINAPI
SetMapperFlags( HDC hDC
, DWORD dwFlag
)
1229 DC
*dc
= DC_GetDCPtr( hDC
);
1232 if(dc
->funcs
->pSetMapperFlags
)
1233 ret
= dc
->funcs
->pSetMapperFlags( dc
, dwFlag
);
1235 FIXME_(font
)("(0x%04x, 0x%08lx): stub - harmless\n", hDC
, dwFlag
);
1236 GDI_HEAP_UNLOCK( hDC
);
1240 /***********************************************************************
1241 * GetAspectRatioFilterEx16 (GDI.486)
1243 BOOL16 WINAPI
GetAspectRatioFilterEx16( HDC16 hdc
, LPSIZE16 pAspectRatio
)
1245 FIXME_(font
)("(%04x, %p): -- Empty Stub !\n",
1250 /***********************************************************************
1251 * GetAspectRatioFilterEx (GDI32.142)
1253 BOOL WINAPI
GetAspectRatioFilterEx( HDC hdc
, LPSIZE pAspectRatio
)
1255 FIXME_(font
)("(%04x, %p): -- Empty Stub !\n",
1260 /***********************************************************************
1261 * GetCharABCWidths16 (GDI.307)
1263 BOOL16 WINAPI
GetCharABCWidths16( HDC16 hdc
, UINT16 firstChar
, UINT16 lastChar
,
1267 if (!GetCharABCWidthsA( hdc
, firstChar
, lastChar
, &abc32
)) return FALSE
;
1268 abc
->abcA
= abc32
.abcA
;
1269 abc
->abcB
= abc32
.abcB
;
1270 abc
->abcC
= abc32
.abcC
;
1275 /***********************************************************************
1276 * GetCharABCWidthsA (GDI32.149)
1278 BOOL WINAPI
GetCharABCWidthsA(HDC hdc
, UINT firstChar
, UINT lastChar
,
1281 return GetCharABCWidthsW( hdc
, firstChar
, lastChar
, abc
);
1285 /******************************************************************************
1286 * GetCharABCWidthsW [GDI32.152] Retrieves widths of characters in range
1289 * hdc [I] Handle of device context
1290 * firstChar [I] First character in range to query
1291 * lastChar [I] Last character in range to query
1292 * abc [O] Address of character-width structure
1295 * Only works with TrueType fonts
1301 BOOL WINAPI
GetCharABCWidthsW( HDC hdc
, UINT firstChar
, UINT lastChar
,
1304 /* No TrueType fonts in Wine so far */
1305 FIXME_(font
)("(%04x,%04x,%04x,%p): stub\n", hdc
, firstChar
, lastChar
, abc
);
1310 /***********************************************************************
1311 * GetGlyphOutline16 (GDI.309)
1313 DWORD WINAPI
GetGlyphOutline16( HDC16 hdc
, UINT16 uChar
, UINT16 fuFormat
,
1314 LPGLYPHMETRICS16 lpgm
, DWORD cbBuffer
,
1315 LPVOID lpBuffer
, const MAT2
*lpmat2
)
1317 FIXME_(font
)("(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
1318 hdc
, uChar
, fuFormat
, lpgm
, cbBuffer
, lpBuffer
, lpmat2
);
1319 return (DWORD
)-1; /* failure */
1323 /***********************************************************************
1324 * GetGlyphOutlineA (GDI32.186)
1326 DWORD WINAPI
GetGlyphOutlineA( HDC hdc
, UINT uChar
, UINT fuFormat
,
1327 LPGLYPHMETRICS lpgm
, DWORD cbBuffer
,
1328 LPVOID lpBuffer
, const MAT2
*lpmat2
)
1330 FIXME_(font
)("(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
1331 hdc
, uChar
, fuFormat
, lpgm
, cbBuffer
, lpBuffer
, lpmat2
);
1332 return (DWORD
)-1; /* failure */
1335 /***********************************************************************
1336 * GetGlyphOutlineW (GDI32.187)
1338 DWORD WINAPI
GetGlyphOutlineW( HDC hdc
, UINT uChar
, UINT fuFormat
,
1339 LPGLYPHMETRICS lpgm
, DWORD cbBuffer
,
1340 LPVOID lpBuffer
, const MAT2
*lpmat2
)
1342 FIXME_(font
)("(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
1343 hdc
, uChar
, fuFormat
, lpgm
, cbBuffer
, lpBuffer
, lpmat2
);
1344 return (DWORD
)-1; /* failure */
1347 /***********************************************************************
1348 * CreateScalableFontResource16 (GDI.310)
1350 BOOL16 WINAPI
CreateScalableFontResource16( UINT16 fHidden
,
1351 LPCSTR lpszResourceFile
,
1352 LPCSTR fontFile
, LPCSTR path
)
1354 return CreateScalableFontResourceA( fHidden
, lpszResourceFile
,
1358 /***********************************************************************
1359 * CreateScalableFontResourceA (GDI32.62)
1361 BOOL WINAPI
CreateScalableFontResourceA( DWORD fHidden
,
1362 LPCSTR lpszResourceFile
,
1363 LPCSTR lpszFontFile
,
1364 LPCSTR lpszCurrentPath
)
1366 /* fHidden=1 - only visible for the calling app, read-only, not
1367 * enumbered with EnumFonts/EnumFontFamilies
1368 * lpszCurrentPath can be NULL
1370 FIXME_(font
)("(%ld,%s,%s,%s): stub\n",
1371 fHidden
, lpszResourceFile
, lpszFontFile
, lpszCurrentPath
);
1372 return FALSE
; /* create failed */
1375 /***********************************************************************
1376 * CreateScalableFontResourceW (GDI32.63)
1378 BOOL WINAPI
CreateScalableFontResourceW( DWORD fHidden
,
1379 LPCWSTR lpszResourceFile
,
1380 LPCWSTR lpszFontFile
,
1381 LPCWSTR lpszCurrentPath
)
1383 FIXME_(font
)("(%ld,%p,%p,%p): stub\n",
1384 fHidden
, lpszResourceFile
, lpszFontFile
, lpszCurrentPath
);
1385 return FALSE
; /* create failed */
1389 /*************************************************************************
1390 * GetRasterizerCaps16 (GDI.313)
1392 BOOL16 WINAPI
GetRasterizerCaps16( LPRASTERIZER_STATUS lprs
, UINT16 cbNumBytes
)
1394 return GetRasterizerCaps( lprs
, cbNumBytes
);
1398 /*************************************************************************
1399 * GetRasterizerCaps (GDI32.216)
1401 BOOL WINAPI
GetRasterizerCaps( LPRASTERIZER_STATUS lprs
, UINT cbNumBytes
)
1403 lprs
->nSize
= sizeof(RASTERIZER_STATUS
);
1404 lprs
->wFlags
= TT_AVAILABLE
|TT_ENABLED
;
1405 lprs
->nLanguageID
= 0;
1410 /*************************************************************************
1411 * GetKerningPairs16 (GDI.332)
1413 INT16 WINAPI
GetKerningPairs16( HDC16 hDC
, INT16 cPairs
,
1414 LPKERNINGPAIR16 lpKerningPairs
)
1416 /* At this time kerning is ignored (set to 0) */
1418 FIXME_(font
)("(%x,%d,%p): almost empty stub!\n",
1419 hDC
, cPairs
, lpKerningPairs
);
1420 for (i
= 0; i
< cPairs
; i
++)
1421 lpKerningPairs
[i
].iKernAmount
= 0;
1427 /*************************************************************************
1428 * GetKerningPairsA (GDI32.192)
1430 DWORD WINAPI
GetKerningPairsA( HDC hDC
, DWORD cPairs
,
1431 LPKERNINGPAIR lpKerningPairs
)
1434 FIXME_(font
)("(%x,%ld,%p): almost empty stub!\n",
1435 hDC
, cPairs
, lpKerningPairs
);
1436 for (i
= 0; i
< cPairs
; i
++)
1437 lpKerningPairs
[i
].iKernAmount
= 0;
1442 /*************************************************************************
1443 * GetKerningPairsW (GDI32.193)
1445 DWORD WINAPI
GetKerningPairsW( HDC hDC
, DWORD cPairs
,
1446 LPKERNINGPAIR lpKerningPairs
)
1448 return GetKerningPairsA( hDC
, cPairs
, lpKerningPairs
);
1451 /*************************************************************************
1452 * TranslateCharsetInfo [GDI32.382]
1454 * Fills a CHARSETINFO structure for a character set, code page, or
1455 * font. This allows making the correspondance between different labelings
1456 * (character set, Windows, ANSI, and OEM codepages, and Unicode ranges)
1457 * of the same encoding.
1459 * Only one codepage will be set in lpCs->fs. If TCI_SRCFONTSIG is used,
1460 * only one codepage should be set in *lpSrc.
1463 * TRUE on success, FALSE on failure.
1466 BOOL WINAPI
TranslateCharsetInfo(
1468 if flags == TCI_SRCFONTSIG: pointer to fsCsb of a FONTSIGNATURE
1469 if flags == TCI_SRCCHARSET: a character set value
1470 if flags == TCI_SRCCODEPAGE: a code page value
1472 LPCHARSETINFO lpCs
, /* structure to receive charset information */
1473 DWORD flags
/* determines interpretation of lpSrc */
1477 case TCI_SRCFONTSIG
:
1478 while (!(*lpSrc
>>index
& 0x0001) && index
<MAXTCIINDEX
) index
++;
1480 case TCI_SRCCODEPAGE
:
1481 while ((UINT
) (lpSrc
) != FONT_tci
[index
].ciACP
&& index
< MAXTCIINDEX
) index
++;
1483 case TCI_SRCCHARSET
:
1484 while ((UINT
) (lpSrc
) != FONT_tci
[index
].ciCharset
&& index
< MAXTCIINDEX
) index
++;
1489 if (index
>= MAXTCIINDEX
|| FONT_tci
[index
].ciCharset
== DEFAULT_CHARSET
) return FALSE
;
1490 memcpy(lpCs
, &FONT_tci
[index
], sizeof(CHARSETINFO
));
1494 /*************************************************************************
1495 * GetFontLanguageInfo (GDI32.182)
1497 DWORD WINAPI
GetFontLanguageInfo(HDC hdc
) {
1498 /* return value 0 is correct for most cases anyway */
1499 FIXME_(font
)("(%x):stub!\n", hdc
);
1503 /*************************************************************************
1504 * GetFontLanguageInfo (GDI.616)
1506 DWORD WINAPI
GetFontLanguageInfo16(HDC16 hdc
) {
1507 /* return value 0 is correct for most cases anyway */
1508 FIXME_(font
)("(%x):stub!\n",hdc
);
1512 /*************************************************************************
1513 * GetFontData [GDI32.181] Retrieve data for TrueType font
1517 * success: Number of bytes returned
1518 * failure: GDI_ERROR
1522 * Calls SetLastError()
1528 DWORD WINAPI
GetFontData(HDC hdc
, DWORD table
, DWORD offset
,
1529 LPVOID buffer
, DWORD length
)
1531 FIXME_(font
)("(%x,%ld,%ld,%p,%ld): stub\n",
1532 hdc
, table
, offset
, buffer
, length
);
1533 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1537 /*************************************************************************
1538 * GetCharacterPlacementA [GDI32.160]
1541 * the web browser control of ie4 calls this with dwFlags=0
1544 GetCharacterPlacementA(HDC hdc
, LPCSTR lpString
, INT uCount
,
1545 INT nMaxExtent
, GCP_RESULTSA
*lpResults
,
1551 TRACE_(font
)("%s 0x%08x 0x%08x 0x%08lx:stub!\n",
1552 debugstr_a(lpString
), uCount
, nMaxExtent
, dwFlags
);
1554 TRACE_(font
)("lpOrder=%p lpDx=%p lpCaretPos=%p lpClass=%p lpOutString=%p lpGlyphs=%p\n",
1555 lpResults
->lpOrder
, lpResults
->lpDx
, lpResults
->lpCaretPos
, lpResults
->lpClass
,
1556 lpResults
->lpOutString
, lpResults
->lpGlyphs
);
1558 if(dwFlags
) FIXME_(font
)("flags 0x%08lx ignored\n", dwFlags
);
1559 if(lpResults
->lpOrder
) FIXME_(font
)("reordering not implemented\n");
1560 if(lpResults
->lpCaretPos
) FIXME_(font
)("caret positions not implemented\n");
1561 if(lpResults
->lpClass
) FIXME_(font
)("classes not implemented\n");
1562 if(lpResults
->lpGlyphs
) FIXME_(font
)("glyphs not implemented\n");
1564 /* copy will do if the GCP_REORDER flag is not set */
1565 if(lpResults
->lpOutString
)
1567 lstrcpynA(lpResults
->lpOutString
, lpString
, uCount
);
1570 if (lpResults
->lpDx
)
1573 for (i
=0; i
<uCount
;i
++)
1575 if (GetCharWidth32A(hdc
, lpString
[i
], lpString
[i
], &c
))
1576 lpResults
->lpDx
[i
]= c
;
1580 if (GetTextExtentPoint32A(hdc
, lpString
, uCount
, &size
))
1581 ret
= MAKELONG(size
.cx
, size
.cy
);
1586 /*************************************************************************
1587 * GetCharacterPlacementW [GDI32.161]
1590 GetCharacterPlacementW(HDC hdc
, LPCWSTR lpString
, INT uCount
,
1591 INT nMaxExtent
, GCP_RESULTSW
*lpResults
,
1594 /* return value 0 is correct for most cases anyway */
1595 FIXME_(font
)(":stub!\n");
1599 /*************************************************************************
1600 * GetCharABCWidthsFloatA [GDI32.150]
1602 BOOL WINAPI
GetCharABCWidthsFloatA(HDC hdc
, UINT iFirstChar
, UINT iLastChar
,
1605 FIXME_(gdi
)("GetCharABCWidthsFloatA, stub\n");
1609 /*************************************************************************
1610 * GetCharABCWidthsFloatW [GDI32.151]
1612 BOOL WINAPI
GetCharABCWidthsFloatW(HDC hdc
, UINT iFirstChar
,
1613 UINT iLastChar
, LPABCFLOAT lpABCF
)
1615 FIXME_(gdi
)("GetCharABCWidthsFloatW, stub\n");
1619 /*************************************************************************
1620 * GetCharWidthFloatA [GDI32.156]
1622 BOOL WINAPI
GetCharWidthFloatA(HDC hdc
, UINT iFirstChar
,
1623 UINT iLastChar
, PFLOAT pxBuffer
)
1625 FIXME_(gdi
)("GetCharWidthFloatA, stub\n");
1629 /*************************************************************************
1630 * GetCharWidthFloatW [GDI32.157]
1632 BOOL WINAPI
GetCharWidthFloatW(HDC hdc
, UINT iFirstChar
,
1633 UINT iLastChar
, PFLOAT pxBuffer
)
1635 FIXME_(gdi
)("GetCharWidthFloatW, stub\n");