2 * Windows driver font functions
4 * Copyright 1996 John Harvey
10 #include "wine/winbase16.h"
15 #include "debugtools.h"
17 DEFAULT_DEBUG_CHANNEL(win16drv
);
20 /***********************************************************************
21 * WIN16DRV_GetTextExtentPoint
23 BOOL
WIN16DRV_GetTextExtentPoint( DC
*dc
, LPCWSTR wstr
, INT count
,
26 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
30 TRACE("%04x %s %d %p\n",
31 dc
->hSelf
, debugstr_wn(wstr
, count
), count
, size
);
34 len
= WideCharToMultiByte( CP_ACP
, 0, wstr
, count
, NULL
, 0, NULL
, NULL
);
35 str
= HeapAlloc( GetProcessHeap(), 0, len
);
36 WideCharToMultiByte( CP_ACP
, 0, wstr
, count
, str
, len
, NULL
, NULL
);
38 dwRet
= PRTDRV_ExtTextOut(physDev
->segptrPDEVICE
, 0, 0,
39 NULL
, str
, -len
, physDev
->FontInfo
,
40 win16drv_SegPtr_DrawMode
,
41 win16drv_SegPtr_TextXForm
, NULL
, NULL
, 0);
42 size
->cx
= XDSTOLS(dc
,LOWORD(dwRet
));
43 size
->cy
= YDSTOLS(dc
,HIWORD(dwRet
));
44 TRACE("cx=%ld, cy=%ld\n", size
->cx
, size
->cy
);
45 HeapFree( GetProcessHeap(), 0, str
);
50 /***********************************************************************
51 * WIN16DRV_GetTextMetrics
53 BOOL
WIN16DRV_GetTextMetrics( DC
*dc
, TEXTMETRICW
*metrics
)
55 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
57 TRACE("%04x \n", dc
->hSelf
);
59 FONT_TextMetric16ToW( &physDev
->tm
, metrics
);
62 "H %ld, A %ld, D %ld, Int %ld, Ext %ld, AW %ld, MW %ld, W %ld\n",
66 metrics
->tmInternalLeading
,
67 metrics
->tmExternalLeading
,
68 metrics
->tmAveCharWidth
,
69 metrics
->tmMaxCharWidth
,
75 HFONT
WIN16DRV_FONT_SelectObject( DC
* dc
, HFONT hfont
)
77 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
80 if (!GetObject16( hfont
, sizeof(physDev
->lf
), &physDev
->lf
))
83 TRACE("WIN16DRV_FONT_SelectObject %s h=%d\n",
84 debugstr_a(physDev
->lf
.lfFaceName
), physDev
->lf
.lfHeight
);
86 if( physDev
->FontInfo
)
88 TRACE("UnRealizing FontInfo\n");
89 nSize
= PRTDRV_RealizeObject (physDev
->segptrPDEVICE
, -DRVOBJ_FONT
,
91 physDev
->FontInfo
, 0);
94 nSize
= PRTDRV_RealizeObject (physDev
->segptrPDEVICE
, DRVOBJ_FONT
,
97 if( physDev
->FontInfo
&&
98 HeapSize( GetProcessHeap(), HEAP_WINE_SEGPTR
, physDev
->FontInfo
) < nSize
)
100 SEGPTR_FREE( physDev
->FontInfo
);
101 physDev
->FontInfo
= NULL
;
104 if( !physDev
->FontInfo
)
105 physDev
->FontInfo
= SEGPTR_ALLOC( nSize
);
108 nSize
= PRTDRV_RealizeObject(physDev
->segptrPDEVICE
, DRVOBJ_FONT
,
111 win16drv_SegPtr_TextXForm
);
113 #define fi physDev->FontInfo
114 physDev
->tm
.tmHeight
= YDSTOLS(dc
, fi
->dfPixHeight
);
115 physDev
->tm
.tmAscent
= YDSTOLS(dc
, fi
->dfAscent
);
116 physDev
->tm
.tmDescent
= physDev
->tm
.tmHeight
-
117 physDev
->tm
.tmAscent
;
118 physDev
->tm
.tmInternalLeading
= YDSTOLS(dc
, fi
->dfInternalLeading
);
119 physDev
->tm
.tmExternalLeading
= YDSTOLS(dc
, fi
->dfExternalLeading
);
120 physDev
->tm
.tmAveCharWidth
= XDSTOLS(dc
, fi
->dfAvgWidth
);
121 physDev
->tm
.tmMaxCharWidth
= XDSTOLS(dc
, fi
->dfMaxWidth
);
122 physDev
->tm
.tmWeight
= fi
->dfWeight
;
123 physDev
->tm
.tmOverhang
= 0; /*FIXME*/
124 physDev
->tm
.tmDigitizedAspectX
= fi
->dfHorizRes
;
125 physDev
->tm
.tmDigitizedAspectY
= fi
->dfVertRes
;
126 physDev
->tm
.tmFirstChar
= fi
->dfFirstChar
;
127 physDev
->tm
.tmLastChar
= fi
->dfLastChar
;
128 physDev
->tm
.tmDefaultChar
= fi
->dfDefaultChar
;
129 physDev
->tm
.tmBreakChar
= fi
->dfBreakChar
;
130 physDev
->tm
.tmItalic
= fi
->dfItalic
;
131 physDev
->tm
.tmUnderlined
= fi
->dfUnderline
;
132 physDev
->tm
.tmStruckOut
= fi
->dfStrikeOut
;
133 physDev
->tm
.tmPitchAndFamily
= fi
->dfPitchAndFamily
;
134 physDev
->tm
.tmCharSet
= fi
->dfCharSet
;
137 TRACE("H %d, A %d, D %d, Int %d, Ext %d, AW %d, MW %d, W %d\n",
138 physDev
->tm
.tmHeight
,
139 physDev
->tm
.tmAscent
,
140 physDev
->tm
.tmDescent
,
141 physDev
->tm
.tmInternalLeading
,
142 physDev
->tm
.tmExternalLeading
,
143 physDev
->tm
.tmAveCharWidth
,
144 physDev
->tm
.tmMaxCharWidth
,
145 physDev
->tm
.tmWeight
);
147 return TRUE
; /* We'll use a device font */
150 /***********************************************************************
151 * WIN16DRV_GetCharWidth
153 BOOL
WIN16DRV_GetCharWidth( DC
*dc
, UINT firstChar
, UINT lastChar
,
159 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
161 TRACE("%d - %d into %p\n",
162 firstChar
, lastChar
, buffer
);
164 wRet
= PRTDRV_GetCharWidth( physDev
->segptrPDEVICE
, buffer
, firstChar
,
165 lastChar
, physDev
->FontInfo
,
166 win16drv_SegPtr_DrawMode
,
167 win16drv_SegPtr_TextXForm
);
168 if( TRACE_ON(win16drv
) ){
169 for(i
= 0; i
<= lastChar
- firstChar
; i
++)
170 TRACE("Char %x: width %d\n", i
+ firstChar
,
177 /***********************************************************************
179 * WIN16DRV_EnumDeviceFonts
182 BOOL
WIN16DRV_EnumDeviceFonts( HDC hdc
, LPLOGFONTW plf
,
183 DEVICEFONTENUMPROC proc
, LPARAM lp
)
185 WIN16DRV_PDEVICE
*physDev
;
189 char *FaceNameA
= NULL
;
190 /* EnumDFontCallback is GDI.158 */
191 FARPROC16 pfnCallback
= GetProcAddress16( GetModuleHandle16("GDI"), (LPCSTR
)158 );
193 if (!(dc
= DC_GetDCPtr( hdc
))) return 0;
194 physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
196 GDI_ReleaseObj( hdc
);
201 if(plf
->lfFaceName
[0]) {
203 len
= WideCharToMultiByte(CP_ACP
, 0, plf
->lfFaceName
, -1, NULL
, 0,
205 FaceNameA
= HeapAlloc(GetProcessHeap(), 0, len
);
206 WideCharToMultiByte(CP_ACP
, 0, plf
->lfFaceName
, -1, FaceNameA
, len
,
209 wRet
= PRTDRV_EnumDFonts(physDev
->segptrPDEVICE
, FaceNameA
, pfnCallback
,
211 if(FaceNameA
) HeapFree(GetProcessHeap(), 0, FaceNameA
);
215 /***********************************************************************
216 * EnumCallback (GDI.158)
218 * This is the callback function used when EnumDFonts is called.
219 * (The printer drivers uses it to pass info on available fonts).
221 * lpvClientData is the pointer passed to EnumDFonts, which points to a WEPFC
222 * structure (WEPFC = WINE_ENUM_PRINTER_FONT_CALLBACK).
225 WORD WINAPI
EnumCallback16(LPENUMLOGFONT16 lpLogFont
,
226 LPNEWTEXTMETRIC16 lpTextMetrics
,
227 WORD wFontType
, LONG lpClientData
)
230 ENUMLOGFONTEX16 lf16
;
232 NEWTEXTMETRICEXW tmW
;
233 NEWTEXTMETRICEX16 tm16
;
235 TRACE("In EnumCallback16 plf=%p\n", lpLogFont
);
237 /* we have a ENUMLOGFONT16 which is a subset of ENUMLOGFONTEX16,
238 so we copy it into one of these and then convert to ENUMLOGFONTEXW */
240 memset(&lf16
, 0, sizeof(lf16
));
241 memcpy(&lf16
, lpLogFont
, sizeof(*lpLogFont
));
242 FONT_EnumLogFontEx16ToW(&lf16
, &lfW
);
244 /* and a similar idea for NEWTEXTMETRIC16 */
245 memset(&tm16
, 0, sizeof(tm16
));
246 memcpy(&tm16
, lpTextMetrics
, sizeof(*lpTextMetrics
));
247 FONT_NewTextMetricEx16ToW(&tm16
, &tmW
);
249 return (*(((WEPFC
*)lpClientData
)->proc
))( &lfW
, &tmW
, wFontType
,
250 ((WEPFC
*)lpClientData
)->lp
);