Release 971012
[wine/multimedia.git] / objects / font.c
blob5404d2a6efa6173d378797b23278a04d070c8f29
1 /*
2 * GDI font objects
4 * Copyright 1993 Alexandre Julliard
5 * 1997 Alex Korobka
6 */
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include "font.h"
12 #include "heap.h"
13 #include "metafile.h"
14 #include "options.h"
15 #include "stddebug.h"
16 #include "debug.h"
18 #define ENUM_UNICODE 0x00000001
20 typedef struct
22 LPLOGFONT16 lpLogFontParam;
23 FONTENUMPROCEX16 lpEnumFunc;
24 LPARAM lpData;
26 LPNEWTEXTMETRICEX16 lpTextMetric;
27 LPENUMLOGFONTEX16 lpLogFont;
28 SEGPTR segTextMetric;
29 SEGPTR segLogFont;
30 } fontEnum16;
32 typedef struct
34 LPLOGFONT32W lpLogFontParam;
35 FONTENUMPROC32W lpEnumFunc;
36 LPARAM lpData;
38 LPNEWTEXTMETRICEX32W lpTextMetric;
39 LPENUMLOGFONTEX32W lpLogFont;
40 DWORD dwFlags;
41 } fontEnum32;
43 /***********************************************************************
44 * LOGFONT conversion functions.
46 static void __logfont32to16( INT16* plf16, INT32* plf32 )
48 int i;
49 for( i = 0; i < 5; i++ ) *plf16++ = *plf32++;
50 *((INT32*)plf16)++ = *plf32++;
51 *((INT32*)plf16) = *plf32;
54 static void __logfont16to32( INT32* plf32, INT16* plf16 )
56 int i;
57 for( i = 0; i < 5; i++ ) *plf32++ = *plf16++;
58 *plf32++ = *((INT32*)plf16)++;
59 *plf32 = *((INT32*)plf16);
62 void FONT_LogFont32ATo16( const LOGFONT32A* font32, LPLOGFONT16 font16 )
64 __logfont32to16( (INT16*)font16, (INT32*)font32 );
65 lstrcpyn32A( font16->lfFaceName, font32->lfFaceName, LF_FACESIZE );
68 void FONT_LogFont32WTo16( const LOGFONT32W* font32, LPLOGFONT16 font16 )
70 __logfont32to16( (INT16*)font16, (INT32*)font32 );
71 lstrcpynWtoA( font16->lfFaceName, font32->lfFaceName, LF_FACESIZE );
74 void FONT_LogFont16To32A( LPLOGFONT16 font16, LPLOGFONT32A font32 )
76 __logfont16to32( (INT32*)font32, (INT16*)font16 );
77 lstrcpyn32A( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
80 void FONT_LogFont16To32W( LPLOGFONT16 font16, LPLOGFONT32W font32 )
82 __logfont16to32( (INT32*)font32, (INT16*)font16 );
83 lstrcpynAtoW( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
86 /***********************************************************************
87 * TEXTMETRIC conversion functions.
89 void FONT_TextMetric32Ato16( LPTEXTMETRIC32A ptm32, LPTEXTMETRIC16 ptm16 )
91 int i;
92 INT16* pi16 = (INT16*)ptm16;
94 *(INT32*)&ptm16->tmFirstChar = *(INT32*)&ptm32->tmFirstChar;
95 *(INT32*)&ptm16->tmItalic = *(INT32*)&ptm32->tmItalic;
96 *(INT16*)&ptm16->tmPitchAndFamily = *(INT16*)&ptm32->tmPitchAndFamily;
97 #define pi32 ((INT32*)ptm32)
98 for( i = 0; i < 8; i++ ) *pi16++ = *pi32++;
99 ptm16->tmOverhang = pi32[0];
100 ptm16->tmDigitizedAspectX = pi32[1];
101 ptm16->tmDigitizedAspectY = pi32[2];
102 #undef pi32
105 void FONT_TextMetric32Wto16( LPTEXTMETRIC32W ptm32, LPTEXTMETRIC16 ptm16 )
107 int i;
108 INT16* pi16 = (INT16*)ptm16;
110 ptm16->tmFirstChar = ptm32->tmFirstChar;
111 ptm16->tmLastChar = ptm32->tmLastChar;
112 ptm16->tmDefaultChar = ptm32->tmDefaultChar;
113 ptm16->tmBreakChar = ptm32->tmBreakChar;
114 *(INT32*)&ptm16->tmItalic = *(INT32*)&ptm32->tmItalic;
115 *(INT16*)&ptm16->tmPitchAndFamily = *(INT16*)&ptm32->tmPitchAndFamily;
116 #define pi32 ((INT32*)ptm32)
117 for( i = 0; i < 8; i++ ) *pi16++ = *pi32++;
118 ptm16->tmOverhang = pi32[0];
119 ptm16->tmDigitizedAspectX = pi32[1];
120 ptm16->tmDigitizedAspectY = pi32[2];
121 #undef pi32
124 void FONT_TextMetric16to32A( LPTEXTMETRIC16 ptm16, LPTEXTMETRIC32A ptm32 )
126 int i;
127 INT16* pi16 = (INT16*)ptm16;
129 *(INT32*)&ptm32->tmFirstChar = *(INT32*)&ptm16->tmFirstChar;
130 *(INT32*)&ptm32->tmItalic = *(INT32*)&ptm16->tmItalic;
131 *(INT16*)&ptm32->tmPitchAndFamily = *(INT16*)&ptm16->tmPitchAndFamily;
132 #define pi32 ((INT32*)ptm32)
133 for( i = 0; i < 8; i++ ) *pi32++ = *pi16++;
134 pi32[0] = ptm16->tmOverhang;
135 pi32[1] = ptm16->tmDigitizedAspectX;
136 pi32[2] = ptm16->tmDigitizedAspectY;
137 #undef pi32
140 void FONT_TextMetric16to32W( LPTEXTMETRIC16 ptm16, LPTEXTMETRIC32W ptm32 )
142 int i;
143 INT16* pi16 = (INT16*)ptm16;
145 ptm32->tmFirstChar = ptm16->tmFirstChar;
146 ptm32->tmLastChar = ptm16->tmLastChar;
147 ptm32->tmDefaultChar = ptm16->tmDefaultChar;
148 ptm32->tmBreakChar = ptm16->tmBreakChar;
149 *(INT32*)&ptm32->tmItalic = *(INT32*)&ptm16->tmItalic;
150 *(INT16*)&ptm32->tmPitchAndFamily = *(INT16*)&ptm16->tmPitchAndFamily;
151 #define pi32 ((INT32*)ptm32)
152 for( i = 0; i < 8; i++ ) *pi32++ = *pi16++;
153 pi32[0] = ptm16->tmOverhang;
154 pi32[1] = ptm16->tmDigitizedAspectX;
155 pi32[2] = ptm16->tmDigitizedAspectY;
156 #undef pi32
159 void FONT_TextMetric32Ato32W( LPTEXTMETRIC32A ptm32A, LPTEXTMETRIC32W ptm32W )
161 int i;
162 #define pi32A ((INT32*)ptm32A)
163 #define pi32W ((INT32*)ptm32W)
164 for( i = 0; i < 8; i++ ) *pi32W++ = *pi32A++;
165 #undef pi32W
166 #undef pi32A
167 #define pch32A ((BYTE*)ptm32A)
168 #define pch32W ((WCHAR*)ptm32W)
169 for( i = 0; i < 4; i++ ) *pch32W++ = *pch32A++;
170 #undef pch32W
171 #define pch32W ((BYTE*)ptm32W)
172 for( i = 0; i < 5; i++ ) *pch32W++ = *pch32A++;
173 #undef pch32W
174 #undef pch32A
177 /***********************************************************************
178 * CreateFontIndirect16 (GDI.57)
180 HFONT16 WINAPI CreateFontIndirect16( const LOGFONT16 *font )
182 HFONT16 hFont = 0;
184 if (font)
186 hFont = GDI_AllocObject( sizeof(FONTOBJ), FONT_MAGIC );
187 if( hFont )
189 FONTOBJ* fontPtr;
190 fontPtr = (FONTOBJ *) GDI_HEAP_LOCK( hFont );
191 memcpy( &fontPtr->logfont, font, sizeof(LOGFONT16) );
193 dprintf_font(stddeb,"CreateFontIndirect(%i %i) '%s' %s %s => %04x\n",
194 font->lfHeight, font->lfWidth,
195 font->lfFaceName ? font->lfFaceName : "NULL",
196 font->lfWeight > 400 ? "Bold" : "",
197 font->lfItalic ? "Italic" : "",
198 hFont);
199 GDI_HEAP_UNLOCK( hFont );
202 else fprintf(stderr,"CreateFontIndirect(NULL) => NULL\n");
204 return hFont;
207 /***********************************************************************
208 * CreateFontIndirect32A (GDI32.44)
210 HFONT32 WINAPI CreateFontIndirect32A( const LOGFONT32A *font )
212 LOGFONT16 font16;
214 FONT_LogFont32ATo16( font, &font16 );
215 return CreateFontIndirect16( &font16 );
218 /***********************************************************************
219 * CreateFontIndirect32W (GDI32.45)
221 HFONT32 WINAPI CreateFontIndirect32W( const LOGFONT32W *font )
223 LOGFONT16 font16;
225 FONT_LogFont32WTo16( font, &font16 );
226 return CreateFontIndirect16( &font16 );
229 /***********************************************************************
230 * CreateFont16 (GDI.56)
232 HFONT16 WINAPI CreateFont16(INT16 height, INT16 width, INT16 esc, INT16 orient,
233 INT16 weight, BYTE italic, BYTE underline,
234 BYTE strikeout, BYTE charset, BYTE outpres,
235 BYTE clippres, BYTE quality, BYTE pitch,
236 LPCSTR name )
238 LOGFONT16 logfont = { height, width, esc, orient, weight, italic, underline,
239 strikeout, charset, outpres, clippres, quality, pitch, };
241 dprintf_font(stddeb,"CreateFont16('%s',%d,%d)\n", name, height, width);
242 if (name)
243 lstrcpyn32A(logfont.lfFaceName,name,sizeof(logfont.lfFaceName));
244 else
245 logfont.lfFaceName[0] = '\0';
246 return CreateFontIndirect16( &logfont );
249 /*************************************************************************
250 * CreateFont32A (GDI32.43)
252 HFONT32 WINAPI CreateFont32A( INT32 height, INT32 width, INT32 esc,
253 INT32 orient, INT32 weight, DWORD italic,
254 DWORD underline, DWORD strikeout, DWORD charset,
255 DWORD outpres, DWORD clippres, DWORD quality,
256 DWORD pitch, LPCSTR name )
258 return (HFONT32)CreateFont16( height, width, esc, orient, weight, italic,
259 underline, strikeout, charset, outpres,
260 clippres, quality, pitch, name );
263 /*************************************************************************
264 * CreateFont32W (GDI32.46)
266 HFONT32 WINAPI CreateFont32W( INT32 height, INT32 width, INT32 esc,
267 INT32 orient, INT32 weight, DWORD italic,
268 DWORD underline, DWORD strikeout, DWORD charset,
269 DWORD outpres, DWORD clippres, DWORD quality,
270 DWORD pitch, LPCWSTR name )
272 LPSTR namea = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
273 HFONT32 ret = (HFONT32)CreateFont16( height, width, esc, orient, weight,
274 italic, underline, strikeout, charset,
275 outpres, clippres, quality, pitch,
276 namea );
277 HeapFree( GetProcessHeap(), 0, namea );
278 return ret;
282 /***********************************************************************
283 * FONT_GetObject16
285 INT16 FONT_GetObject16( FONTOBJ * font, INT16 count, LPSTR buffer )
287 if (count > sizeof(LOGFONT16)) count = sizeof(LOGFONT16);
288 memcpy( buffer, &font->logfont, count );
289 return count;
292 /***********************************************************************
293 * FONT_GetObject32A
295 INT32 FONT_GetObject32A( FONTOBJ *font, INT32 count, LPSTR buffer )
297 LOGFONT32A fnt32;
299 FONT_LogFont16To32A( &font->logfont, &fnt32 );
301 if (count > sizeof(fnt32)) count = sizeof(fnt32);
302 memcpy( buffer, &fnt32, count );
303 return count;
307 /***********************************************************************
308 * FONT_EnumInstance16
310 * Called by the device driver layer to pass font info
311 * down to the application.
313 static INT32 FONT_EnumInstance16( LPENUMLOGFONT16 plf,
314 LPNEWTEXTMETRIC16 ptm, UINT16 fType, LPARAM lp )
316 #define pfe ((fontEnum16*)lp)
317 if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
318 pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
320 memcpy( pfe->lpLogFont, plf, sizeof(ENUMLOGFONT16) );
321 memcpy( pfe->lpTextMetric, ptm, sizeof(NEWTEXTMETRIC16) );
323 return pfe->lpEnumFunc( pfe->segLogFont, pfe->segTextMetric, fType, (LPARAM)(pfe->lpData) );
325 #undef pfe
326 return 1;
329 /***********************************************************************
330 * FONT_EnumInstance32
332 static INT32 FONT_EnumInstance32( LPENUMLOGFONT16 plf,
333 LPNEWTEXTMETRIC16 ptm, UINT16 fType, LPARAM lp )
335 /* lfCharSet is at the same offset in both LOGFONT32A and LOGFONT32W */
337 #define pfe ((fontEnum32*)lp)
338 if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
339 pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
341 /* convert font metrics */
343 if( pfe->dwFlags & ENUM_UNICODE )
345 FONT_LogFont16To32W( &plf->elfLogFont, (LPLOGFONT32W)(pfe->lpLogFont) );
346 FONT_TextMetric16to32W( (LPTEXTMETRIC16)ptm, (LPTEXTMETRIC32W)(pfe->lpTextMetric) );
348 else
350 FONT_LogFont16To32A( &plf->elfLogFont, (LPLOGFONT32A)pfe->lpLogFont );
351 FONT_TextMetric16to32A( (LPTEXTMETRIC16)ptm, (LPTEXTMETRIC32A)pfe->lpTextMetric );
354 return pfe->lpEnumFunc( (LPENUMLOGFONT32W)pfe->lpLogFont,
355 (LPNEWTEXTMETRIC32W)pfe->lpTextMetric, fType, pfe->lpData );
357 #undef pfe
358 return 1;
361 /***********************************************************************
362 * EnumFontFamiliesEx16 (GDI.613)
364 INT16 WINAPI EnumFontFamiliesEx16( HDC16 hDC, LPLOGFONT16 plf,
365 FONTENUMPROCEX16 efproc, LPARAM lParam,
366 DWORD dwFlags)
368 INT16 retVal = 0;
369 DC* dc = (DC*) GDI_GetObjPtr( hDC, DC_MAGIC );
371 if( dc && dc->funcs->pEnumDeviceFonts )
373 LPNEWTEXTMETRICEX16 lptm16 = SEGPTR_ALLOC( sizeof(NEWTEXTMETRICEX16) );
374 if( lptm16 )
376 LPENUMLOGFONTEX16 lplf16 = SEGPTR_ALLOC( sizeof(ENUMLOGFONTEX16) );
377 if( lplf16 )
379 fontEnum16 fe16 = { plf, efproc, lParam, lptm16, lplf16,
380 SEGPTR_GET(lptm16), SEGPTR_GET(lplf16) };
382 retVal = dc->funcs->pEnumDeviceFonts( dc, plf, FONT_EnumInstance16, (LPARAM)&fe16 );
384 SEGPTR_FREE(lplf16);
386 SEGPTR_FREE(lptm16);
389 return retVal;
392 /***********************************************************************
393 * FONT_EnumFontFamiliesEx32
395 static INT32 FONT_EnumFontFamiliesEx32( HDC32 hDC, LPLOGFONT32W plf, FONTENUMPROC32W efproc,
396 LPARAM lParam, DWORD dwUnicode)
398 DC* dc = (DC*) GDI_GetObjPtr( hDC, DC_MAGIC );
400 if( dc && dc->funcs->pEnumDeviceFonts )
402 LOGFONT16 lf16;
403 NEWTEXTMETRICEX32W tm32w;
404 ENUMLOGFONTEX32W lf32w;
405 fontEnum32 fe32 = { plf, efproc, lParam, &tm32w, &lf32w, dwUnicode };
407 /* the only difference between LOGFONT32A and LOGFONT32W is in the lfFaceName */
409 if( plf->lfFaceName[0] )
411 if( dwUnicode )
412 lstrcpynWtoA( lf16.lfFaceName, plf->lfFaceName, LF_FACESIZE );
413 else
414 lstrcpyn32A( lf16.lfFaceName, (LPCSTR)plf->lfFaceName, LF_FACESIZE );
416 else lf16.lfFaceName[0] = '\0';
417 lf16.lfCharSet = plf->lfCharSet;
419 return dc->funcs->pEnumDeviceFonts( dc, &lf16, FONT_EnumInstance32, (LPARAM)&fe32 );
421 return 0;
424 /***********************************************************************
425 * EnumFontFamiliesEx32W (GDI32.82)
427 INT32 WINAPI EnumFontFamiliesEx32W( HDC32 hDC, LPLOGFONT32W plf,
428 FONTENUMPROCEX32W efproc,
429 LPARAM lParam, DWORD dwFlags )
431 return FONT_EnumFontFamiliesEx32( hDC, plf, (FONTENUMPROC32W)efproc,
432 lParam, ENUM_UNICODE );
435 /***********************************************************************
436 * EnumFontFamiliesEx32A (GDI32.81)
438 INT32 WINAPI EnumFontFamiliesEx32A( HDC32 hDC, LPLOGFONT32A plf,
439 FONTENUMPROCEX32A efproc,
440 LPARAM lParam, DWORD dwFlags)
442 return FONT_EnumFontFamiliesEx32( hDC, (LPLOGFONT32W)plf,
443 (FONTENUMPROC32W)efproc, lParam, 0);
446 /***********************************************************************
447 * EnumFontFamilies16 (GDI.330)
449 INT16 WINAPI EnumFontFamilies16( HDC16 hDC, LPCSTR lpFamily,
450 FONTENUMPROC16 efproc, LPARAM lpData )
452 LOGFONT16 lf;
454 lf.lfCharSet = DEFAULT_CHARSET;
455 if( lpFamily ) lstrcpyn32A( lf.lfFaceName, lpFamily, LF_FACESIZE );
456 else lf.lfFaceName[0] = '\0';
458 return EnumFontFamiliesEx16( hDC, &lf, (FONTENUMPROCEX16)efproc, lpData, 0 );
461 /***********************************************************************
462 * EnumFontFamilies32A (GDI32.80)
464 INT32 WINAPI EnumFontFamilies32A( HDC32 hDC, LPCSTR lpFamily,
465 FONTENUMPROC32A efproc, LPARAM lpData )
467 LOGFONT32A lf;
469 lf.lfCharSet = DEFAULT_CHARSET;
470 if( lpFamily ) lstrcpyn32A( lf.lfFaceName, lpFamily, LF_FACESIZE );
471 else lf.lfFaceName[0] = lf.lfFaceName[1] = '\0';
473 return FONT_EnumFontFamiliesEx32( hDC, (LPLOGFONT32W)&lf,
474 (FONTENUMPROC32W)efproc, lpData, 0 );
477 /***********************************************************************
478 * EnumFontFamilies32W (GDI32.83)
480 INT32 WINAPI EnumFontFamilies32W( HDC32 hDC, LPCWSTR lpFamily,
481 FONTENUMPROC32W efproc, LPARAM lpData )
483 LOGFONT32W lf;
485 lf.lfCharSet = DEFAULT_CHARSET;
486 if( lpFamily ) lstrcpyn32W( lf.lfFaceName, lpFamily, LF_FACESIZE );
487 else lf.lfFaceName[0] = 0;
489 return FONT_EnumFontFamiliesEx32( hDC, &lf, efproc, lpData, ENUM_UNICODE );
492 /***********************************************************************
493 * EnumFonts16 (GDI.70)
495 INT16 WINAPI EnumFonts16( HDC16 hDC, LPCSTR lpName, FONTENUMPROC16 efproc,
496 LPARAM lpData )
498 return EnumFontFamilies16( hDC, lpName, (FONTENUMPROCEX16)efproc, lpData );
501 /***********************************************************************
502 * EnumFonts32A (GDI32.84)
504 INT32 WINAPI EnumFonts32A( HDC32 hDC, LPCSTR lpName, FONTENUMPROC32A efproc,
505 LPARAM lpData )
507 return EnumFontFamilies32A( hDC, lpName, efproc, lpData );
510 /***********************************************************************
511 * EnumFonts32W (GDI32.85)
513 INT32 WINAPI EnumFonts32W( HDC32 hDC, LPCWSTR lpName, FONTENUMPROC32W efproc,
514 LPARAM lpData )
516 return EnumFontFamilies32W( hDC, lpName, efproc, lpData );
520 /***********************************************************************
521 * GetTextCharacterExtra16 (GDI.89)
523 INT16 WINAPI GetTextCharacterExtra16( HDC16 hdc )
525 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
526 if (!dc) return 0;
527 return abs( (dc->w.charExtra * dc->wndExtX + dc->vportExtX / 2)
528 / dc->vportExtX );
532 /***********************************************************************
533 * GetTextCharacterExtra32 (GDI32.225)
535 INT32 WINAPI GetTextCharacterExtra32( HDC32 hdc )
537 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
538 if (!dc) return 0;
539 return abs( (dc->w.charExtra * dc->wndExtX + dc->vportExtX / 2)
540 / dc->vportExtX );
544 /***********************************************************************
545 * SetTextCharacterExtra16 (GDI.8)
547 INT16 WINAPI SetTextCharacterExtra16( HDC16 hdc, INT16 extra )
549 return (INT16)SetTextCharacterExtra32( hdc, extra );
553 /***********************************************************************
554 * SetTextCharacterExtra32 (GDI32.337)
556 INT32 WINAPI SetTextCharacterExtra32( HDC32 hdc, INT32 extra )
558 INT32 prev;
559 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
560 if (!dc) return 0;
561 extra = (extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX;
562 prev = dc->w.charExtra;
563 dc->w.charExtra = abs(extra);
564 return (prev * dc->wndExtX + dc->vportExtX / 2) / dc->vportExtX;
568 /***********************************************************************
569 * SetTextJustification16 (GDI.10)
571 INT16 WINAPI SetTextJustification16( HDC16 hdc, INT16 extra, INT16 breaks )
573 return SetTextJustification32( hdc, extra, breaks );
577 /***********************************************************************
578 * SetTextJustification32 (GDI32.339)
580 BOOL32 WINAPI SetTextJustification32( HDC32 hdc, INT32 extra, INT32 breaks )
582 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
583 if (!dc) return 0;
585 extra = abs((extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX);
586 if (!extra) breaks = 0;
587 dc->w.breakTotalExtra = extra;
588 dc->w.breakCount = breaks;
589 if (breaks)
591 dc->w.breakExtra = extra / breaks;
592 dc->w.breakRem = extra - (dc->w.breakCount * dc->w.breakExtra);
594 else
596 dc->w.breakExtra = 0;
597 dc->w.breakRem = 0;
599 return 1;
603 /***********************************************************************
604 * GetTextFace16 (GDI.92)
606 INT16 WINAPI GetTextFace16( HDC16 hdc, INT16 count, LPSTR name )
608 return GetTextFace32A(hdc,count,name);
611 /***********************************************************************
612 * GetTextFace32A (GDI32.234)
614 INT32 WINAPI GetTextFace32A( HDC32 hdc, INT32 count, LPSTR name )
616 FONTOBJ *font;
618 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
619 if (!dc) return 0;
620 if (!(font = (FONTOBJ *) GDI_GetObjPtr( dc->w.hFont, FONT_MAGIC )))
621 return 0;
622 lstrcpyn32A( name, font->logfont.lfFaceName, count );
623 GDI_HEAP_UNLOCK( dc->w.hFont );
624 return strlen(name);
627 /***********************************************************************
628 * GetTextFace32W (GDI32.235)
630 INT32 WINAPI GetTextFace32W( HDC32 hdc, INT32 count, LPWSTR name )
632 LPSTR nameA = HeapAlloc( GetProcessHeap(), 0, count );
633 INT32 res = GetTextFace32A(hdc,count,nameA);
634 lstrcpyAtoW( name, nameA );
635 HeapFree( GetProcessHeap(), 0, nameA );
636 return res;
640 /***********************************************************************
641 * GetTextExtent (GDI.91)
643 DWORD WINAPI GetTextExtent( HDC16 hdc, LPCSTR str, INT16 count )
645 SIZE16 size;
646 if (!GetTextExtentPoint16( hdc, str, count, &size )) return 0;
647 return MAKELONG( size.cx, size.cy );
651 /***********************************************************************
652 * GetTextExtentPoint16 (GDI.471)
654 * FIXME: Should this have a bug for compatibility?
655 * Original Windows versions of GetTextExtentPoint{A,W} have documented
656 * bugs.
658 BOOL16 WINAPI GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count,
659 LPSIZE16 size )
661 SIZE32 size32;
662 BOOL32 ret = GetTextExtentPoint32A( hdc, str, count, &size32 );
663 CONV_SIZE32TO16( &size32, size );
664 return (BOOL16)ret;
668 /***********************************************************************
669 * GetTextExtentPoint32A (GDI32.230)
671 BOOL32 WINAPI GetTextExtentPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
672 LPSIZE32 size )
674 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
675 if (!dc)
677 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
678 return FALSE;
681 if (!dc->funcs->pGetTextExtentPoint ||
682 !dc->funcs->pGetTextExtentPoint( dc, str, count, size ))
683 return FALSE;
685 dprintf_font(stddeb,"GetTextExtentPoint(%08x '%.*s' %d %p): returning %d,%d\n",
686 hdc, count, str, count, size, size->cx, size->cy );
687 return TRUE;
691 /***********************************************************************
692 * GetTextExtentPoint32W (GDI32.231)
694 BOOL32 WINAPI GetTextExtentPoint32W( HDC32 hdc, LPCWSTR str, INT32 count,
695 LPSIZE32 size )
697 LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
698 BOOL32 ret = GetTextExtentPoint32A( hdc, p, count, size );
699 HeapFree( GetProcessHeap(), 0, p );
700 return ret;
704 /***********************************************************************
705 * GetTextExtentPoint32ABuggy (GDI32.232)
707 BOOL32 WINAPI GetTextExtentPoint32ABuggy( HDC32 hdc, LPCSTR str, INT32 count,
708 LPSIZE32 size )
710 dprintf_font( stddeb, "GetTextExtentPoint32ABuggy: not bug compatible.\n");
711 return GetTextExtentPoint32A( hdc, str, count, size );
714 /***********************************************************************
715 * GetTextExtentPoint32WBuggy (GDI32.233)
717 BOOL32 WINAPI GetTextExtentPoint32WBuggy( HDC32 hdc, LPCWSTR str, INT32 count,
718 LPSIZE32 size )
720 dprintf_font( stddeb, "GetTextExtentPoint32WBuggy: not bug compatible.\n");
721 return GetTextExtentPoint32W( hdc, str, count, size );
725 /***********************************************************************
726 * GetTextExtentExPoint32A (GDI32.228)
728 BOOL32 WINAPI GetTextExtentExPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
729 INT32 maxExt, LPINT32 lpnFit,
730 LPINT32 alpDx, LPSIZE32 size )
732 int index, nFit, extent;
733 SIZE32 tSize;
734 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
736 if (!dc)
738 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
739 return FALSE;
741 if (!dc->funcs->pGetTextExtentPoint) return FALSE;
743 size->cx = size->cy = nFit = extent = 0;
744 for(index = 0; index < count; index++)
746 if(!dc->funcs->pGetTextExtentPoint( dc, str, 1, &tSize )) return FALSE;
747 if( extent+tSize.cx < maxExt )
749 extent+=tSize.cx;
750 nFit++;
751 str++;
752 if( alpDx ) alpDx[index] = extent;
753 if( tSize.cy > size->cy ) size->cy = tSize.cy;
755 else break;
757 size->cx = extent;
758 *lpnFit = nFit;
760 dprintf_font(stddeb,"GetTextExtentExPoint32A(%08x '%.*s' %d) returning %d %d %d\n",
761 hdc,count,str,maxExt,nFit, size->cx,size->cy);
762 return TRUE;
766 /***********************************************************************
767 * GetTextExtentExPoint32W (GDI32.229)
770 BOOL32 WINAPI GetTextExtentExPoint32W( HDC32 hdc, LPCWSTR str, INT32 count,
771 INT32 maxExt, LPINT32 lpnFit,
772 LPINT32 alpDx, LPSIZE32 size )
774 LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
775 BOOL32 ret = GetTextExtentExPoint32A( hdc, p, count, maxExt,
776 lpnFit, alpDx, size);
777 HeapFree( GetProcessHeap(), 0, p );
778 return ret;
781 /***********************************************************************
782 * GetTextMetrics16 (GDI.93)
784 BOOL16 WINAPI GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *metrics )
786 TEXTMETRIC32A tm32;
788 if (!GetTextMetrics32A( (HDC32)hdc, &tm32 )) return FALSE;
789 FONT_TextMetric32Ato16( &tm32, metrics );
790 return TRUE;
794 /***********************************************************************
795 * GetTextMetrics32A (GDI32.236)
797 BOOL32 WINAPI GetTextMetrics32A( HDC32 hdc, TEXTMETRIC32A *metrics )
799 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
800 if (!dc)
802 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
803 return FALSE;
806 if (!dc->funcs->pGetTextMetrics ||
807 !dc->funcs->pGetTextMetrics( dc, metrics ))
808 return FALSE;
810 /* device layer returns values in device units
811 * therefore we have to convert them to logical */
813 #define WDPTOLP(x) ((x<0)? \
814 (-abs((x)*dc->wndExtX/dc->vportExtX)): \
815 (abs((x)*dc->wndExtX/dc->vportExtX)))
816 #define HDPTOLP(y) ((y<0)? \
817 (-abs((y)*dc->wndExtY/dc->vportExtY)): \
818 (abs((y)*dc->wndExtY/dc->vportExtY)))
820 metrics->tmHeight = HDPTOLP(metrics->tmHeight);
821 metrics->tmAscent = HDPTOLP(metrics->tmAscent);
822 metrics->tmDescent = HDPTOLP(metrics->tmDescent);
823 metrics->tmInternalLeading = HDPTOLP(metrics->tmInternalLeading);
824 metrics->tmExternalLeading = HDPTOLP(metrics->tmExternalLeading);
825 metrics->tmAveCharWidth = WDPTOLP(metrics->tmAveCharWidth);
826 metrics->tmMaxCharWidth = WDPTOLP(metrics->tmMaxCharWidth);
827 metrics->tmOverhang = WDPTOLP(metrics->tmOverhang);
829 dprintf_font(stddeb,"text metrics:
830 Weight = %03i\t FirstChar = %03i\t AveCharWidth = %i
831 Italic = % 3i\t LastChar = %03i\t\t MaxCharWidth = %i
832 UnderLined = %01i\t DefaultChar = %03i\t Overhang = %i
833 StruckOut = %01i\t BreakChar = %03i\t CharSet = %i
834 PitchAndFamily = %02x
835 --------------------
836 InternalLeading = %i
837 Ascent = %i
838 Descent = %i
839 Height = %i\n",
840 metrics->tmWeight, metrics->tmFirstChar, metrics->tmAveCharWidth,
841 metrics->tmItalic, metrics->tmLastChar, metrics->tmMaxCharWidth,
842 metrics->tmUnderlined, metrics->tmDefaultChar, metrics->tmOverhang,
843 metrics->tmStruckOut, metrics->tmBreakChar, metrics->tmCharSet,
844 metrics->tmPitchAndFamily,
845 metrics->tmInternalLeading,
846 metrics->tmAscent,
847 metrics->tmDescent,
848 metrics->tmHeight );
849 return TRUE;
853 /***********************************************************************
854 * GetTextMetrics32W (GDI32.237)
856 BOOL32 WINAPI GetTextMetrics32W( HDC32 hdc, TEXTMETRIC32W *metrics )
858 TEXTMETRIC32A tm;
859 if (!GetTextMetrics32A( (HDC16)hdc, &tm )) return FALSE;
860 FONT_TextMetric32Ato32W( &tm, metrics );
861 return TRUE;
865 /***********************************************************************
866 * GetCharWidth16 (GDI.350)
868 BOOL16 WINAPI GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
869 LPINT16 buffer )
871 BOOL32 retVal = FALSE;
873 if( firstChar != lastChar )
875 LPINT32 buf32 = (LPINT32)HeapAlloc(GetProcessHeap(), 0,
876 sizeof(INT32)*(1 + (lastChar - firstChar)));
877 if( buf32 )
879 LPINT32 obuf32 = buf32;
880 int i;
882 retVal = GetCharWidth32A(hdc, firstChar, lastChar, buf32);
883 if (retVal)
885 for (i = firstChar; i <= lastChar; i++)
886 *buffer++ = *buf32++;
888 HeapFree(GetProcessHeap(), 0, obuf32);
891 else /* happens quite often to warrant a special treatment */
893 INT32 chWidth;
894 retVal = GetCharWidth32A(hdc, firstChar, lastChar, &chWidth );
895 *buffer = chWidth;
897 return retVal;
901 /***********************************************************************
902 * GetCharWidth32A (GDI32.155)
904 BOOL32 WINAPI GetCharWidth32A( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
905 LPINT32 buffer )
907 UINT32 i, extra;
908 DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
909 if (!dc)
911 if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
912 return FALSE;
915 if (!dc->funcs->pGetCharWidth ||
916 !dc->funcs->pGetCharWidth( dc, firstChar, lastChar, buffer))
917 return FALSE;
919 /* convert device units to logical */
921 extra = dc->vportExtX >> 1;
922 for( i = firstChar; i <= lastChar; i++, buffer++ )
923 *buffer = (*buffer * dc->wndExtX + extra) / dc->vportExtX;
925 return TRUE;
929 /***********************************************************************
930 * GetCharWidth32W (GDI32.158)
932 BOOL32 WINAPI GetCharWidth32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
933 LPINT32 buffer )
935 return GetCharWidth32A( hdc, firstChar, lastChar, buffer );
940 /* FIXME: all following APIs *******************************************
943 * SetMapperFlags16 (GDI.349)
945 DWORD WINAPI SetMapperFlags16( HDC16 hDC, DWORD dwFlag )
947 return SetMapperFlags32( hDC, dwFlag );
951 /***********************************************************************
952 * SetMapperFlags32 (GDI32.322)
954 DWORD WINAPI SetMapperFlags32( HDC32 hDC, DWORD dwFlag )
956 dprintf_font(stdnimp,"SetmapperFlags(%04x, %08lX) // Empty Stub !\n",
957 hDC, dwFlag);
958 return 0L;
961 /***********************************************************************
962 * GetAspectRatioFilterEx16 (GDI.486)
964 BOOL16 GetAspectRatioFilterEx16( HDC16 hdc, LPVOID pAspectRatio )
966 dprintf_font(stdnimp,
967 "GetAspectRatioFilterEx(%04x, %p): // Empty Stub !\n",
968 hdc, pAspectRatio);
969 return FALSE;
973 /***********************************************************************
974 * GetCharABCWidths16 (GDI.307)
976 BOOL16 WINAPI GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
977 LPABC16 abc )
979 ABC32 abc32;
980 if (!GetCharABCWidths32A( hdc, firstChar, lastChar, &abc32 )) return FALSE;
981 abc->abcA = abc32.abcA;
982 abc->abcB = abc32.abcB;
983 abc->abcC = abc32.abcC;
984 return TRUE;
988 /***********************************************************************
989 * GetCharABCWidths32A (GDI32.149)
991 BOOL32 WINAPI GetCharABCWidths32A(HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
992 LPABC32 abc )
994 /* No TrueType fonts in Wine so far */
995 fprintf( stdnimp, "STUB: GetCharABCWidths(%04x,%04x,%04x,%p)\n",
996 hdc, firstChar, lastChar, abc );
997 return FALSE;
1001 /***********************************************************************
1002 * GetCharABCWidths32W (GDI32.152)
1004 BOOL32 WINAPI GetCharABCWidths32W(HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
1005 LPABC32 abc )
1007 return GetCharABCWidths32A( hdc, firstChar, lastChar, abc );
1011 /***********************************************************************
1012 * GetGlyphOutline16 (GDI.309)
1014 DWORD WINAPI GetGlyphOutline16( HDC16 hdc, UINT16 uChar, UINT16 fuFormat,
1015 LPGLYPHMETRICS16 lpgm, DWORD cbBuffer,
1016 LPVOID lpBuffer, const MAT2 *lpmat2 )
1018 fprintf( stdnimp,"GetGlyphOutLine16(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
1019 hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
1020 return (DWORD)-1; /* failure */
1024 /***********************************************************************
1025 * GetGlyphOutline32A (GDI32.186)
1027 DWORD WINAPI GetGlyphOutline32A( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
1028 LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
1029 LPVOID lpBuffer, const MAT2 *lpmat2 )
1031 fprintf( stdnimp,"GetGlyphOutLine32A(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
1032 hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
1033 return (DWORD)-1; /* failure */
1036 /***********************************************************************
1037 * GetGlyphOutline32W (GDI32.187)
1039 DWORD WINAPI GetGlyphOutline32W( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
1040 LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
1041 LPVOID lpBuffer, const MAT2 *lpmat2 )
1043 fprintf( stdnimp,"GetGlyphOutLine32W(%04x, '%c', %04x, %p, %ld, %p, %p) // - empty stub!\n",
1044 hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
1045 return (DWORD)-1; /* failure */
1048 /***********************************************************************
1049 * CreateScalableFontResource16 (GDI.310)
1051 BOOL16 WINAPI CreateScalableFontResource16( UINT16 fHidden,
1052 LPCSTR lpszResourceFile,
1053 LPCSTR fontFile, LPCSTR path )
1055 return CreateScalableFontResource32A( fHidden, lpszResourceFile,
1056 fontFile, path );
1059 /***********************************************************************
1060 * CreateScalableFontResource32A (GDI32.62)
1062 BOOL32 WINAPI CreateScalableFontResource32A( DWORD fHidden,
1063 LPCSTR lpszResourceFile,
1064 LPCSTR lpszFontFile,
1065 LPCSTR lpszCurrentPath )
1067 /* fHidden=1 - only visible for the calling app, read-only, not
1068 * enumbered with EnumFonts/EnumFontFamilies
1069 * lpszCurrentPath can be NULL
1071 fprintf(stdnimp,"CreateScalableFontResource(%ld,%s,%s,%s) // empty stub\n",
1072 fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
1073 return FALSE; /* create failed */
1076 /***********************************************************************
1077 * CreateScalableFontResource32W (GDI32.63)
1079 BOOL32 WINAPI CreateScalableFontResource32W( DWORD fHidden,
1080 LPCWSTR lpszResourceFile,
1081 LPCWSTR lpszFontFile,
1082 LPCWSTR lpszCurrentPath )
1084 fprintf(stdnimp,"CreateScalableFontResource32W(%ld,%p,%p,%p) // empty stub\n",
1085 fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
1086 return FALSE; /* create failed */
1090 /*************************************************************************
1091 * GetRasterizerCaps16 (GDI.313)
1093 BOOL16 WINAPI GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes)
1095 return GetRasterizerCaps32( lprs, cbNumBytes );
1099 /*************************************************************************
1100 * GetRasterizerCaps32 (GDI32.216)
1102 BOOL32 WINAPI GetRasterizerCaps32( LPRASTERIZER_STATUS lprs, UINT32 cbNumBytes)
1104 RASTERIZER_STATUS rs;
1106 rs.nSize = sizeof(rs);
1107 rs.wFlags = 0;
1108 rs.nLanguageID = 0;
1109 return TRUE;
1113 /*************************************************************************
1114 * GetKerningPairs16 (GDI.332)
1116 INT16 WINAPI GetKerningPairs16( HDC16 hDC, INT16 cPairs,
1117 LPKERNINGPAIR16 lpKerningPairs )
1119 /* At this time kerning is ignored (set to 0) */
1120 int i;
1121 fprintf(stdnimp,"GetKerningPairs16: almost empty stub!\n");
1122 for (i = 0; i < cPairs; i++) lpKerningPairs[i].iKernAmount = 0;
1123 return 0;
1128 /*************************************************************************
1129 * GetKerningPairs32A (GDI32.192)
1131 DWORD WINAPI GetKerningPairs32A( HDC32 hDC, DWORD cPairs,
1132 LPKERNINGPAIR32 lpKerningPairs )
1134 int i;
1135 fprintf(stdnimp,"GetKerningPairs32: almost empty stub!\n");
1136 for (i = 0; i < cPairs; i++) lpKerningPairs[i].iKernAmount = 0;
1137 return 0;
1141 /*************************************************************************
1142 * GetKerningPairs32W (GDI32.193)
1144 DWORD WINAPI GetKerningPairs32W( HDC32 hDC, DWORD cPairs,
1145 LPKERNINGPAIR32 lpKerningPairs )
1147 return GetKerningPairs32A( hDC, cPairs, lpKerningPairs );
1150 BOOL32 WINAPI TranslateCharSetInfo(LPDWORD lpSrc,LPCHARSETINFO lpCs,DWORD dwFlags) {
1151 fprintf(stderr,"TranslateCharSetInfo(%p,%p,0x%08lx), stub.\n",
1152 lpSrc,lpCs,dwFlags
1154 return TRUE;