2 * Windows driver font functions
4 * Copyright 1996 John Harvey
18 /***********************************************************************
19 * WIN16DRV_GetTextExtentPoint
21 BOOL32
WIN16DRV_GetTextExtentPoint( DC
*dc
, LPCSTR str
, INT32 count
,
24 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
27 TRACE(win16drv
, "%04x %s %d %p\n",
28 dc
->hSelf
, str
, count
, size
);
30 dwRet
= PRTDRV_ExtTextOut(physDev
->segptrPDEVICE
, 0, 0,
32 -count
, physDev
->FontInfo
,
33 win16drv_SegPtr_DrawMode
,
34 win16drv_SegPtr_TextXForm
, NULL
, NULL
, 0);
35 size
->cx
= XDSTOLS(dc
,LOWORD(dwRet
));
36 size
->cy
= YDSTOLS(dc
,HIWORD(dwRet
));
37 TRACE(win16drv
, "cx=0x%x, cy=0x%x\n",
43 /***********************************************************************
44 * WIN16DRV_GetTextMetrics
46 BOOL32
WIN16DRV_GetTextMetrics( DC
*dc
, TEXTMETRIC32A
*metrics
)
48 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
50 TRACE(win16drv
, "%04x \n", dc
->hSelf
);
52 FONT_TextMetric16to32A( &physDev
->tm
, metrics
);
54 TRACE(win16drv
, "H %d, A %d, D %d, Int %d, Ext %d, AW %d, MW %d, W %d\n",
58 metrics
->tmInternalLeading
,
59 metrics
->tmExternalLeading
,
60 metrics
->tmAveCharWidth
,
61 metrics
->tmMaxCharWidth
,
67 HFONT32
WIN16DRV_FONT_SelectObject( DC
* dc
, HFONT32 hfont
, FONTOBJ
* font
)
69 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
70 HPEN32 prevHandle
= dc
->w
.hFont
;
75 TRACE(win16drv
, "WIN16DRV_FONT_SelectObject '%s' h=%d\n",
76 font
->logfont
.lfFaceName
, font
->logfont
.lfHeight
);
79 if( physDev
->FontInfo
)
81 TRACE(win16drv
, "UnRealizing FontInfo\n");
82 nSize
= PRTDRV_RealizeObject (physDev
->segptrPDEVICE
, -DRVOBJ_FONT
,
84 physDev
->FontInfo
, 0);
87 memcpy(&physDev
->lf
, &font
->logfont
, sizeof(LOGFONT16
));
88 nSize
= PRTDRV_RealizeObject (physDev
->segptrPDEVICE
, DRVOBJ_FONT
,
91 if( physDev
->FontInfo
&&
92 HeapSize( SegptrHeap
, 0, physDev
->FontInfo
) < nSize
)
94 SEGPTR_FREE( physDev
->FontInfo
);
95 physDev
->FontInfo
= NULL
;
98 if( !physDev
->FontInfo
)
99 physDev
->FontInfo
= SEGPTR_ALLOC( nSize
);
102 nSize
= PRTDRV_RealizeObject(physDev
->segptrPDEVICE
, DRVOBJ_FONT
,
105 win16drv_SegPtr_TextXForm
);
107 #define fi physDev->FontInfo
108 physDev
->tm
.tmHeight
= YDSTOLS(dc
, fi
->dfPixHeight
);
109 physDev
->tm
.tmAscent
= YDSTOLS(dc
, fi
->dfAscent
);
110 physDev
->tm
.tmDescent
= physDev
->tm
.tmHeight
-
111 physDev
->tm
.tmAscent
;
112 physDev
->tm
.tmInternalLeading
= YDSTOLS(dc
, fi
->dfInternalLeading
);
113 physDev
->tm
.tmExternalLeading
= YDSTOLS(dc
, fi
->dfExternalLeading
);
114 physDev
->tm
.tmAveCharWidth
= XDSTOLS(dc
, fi
->dfAvgWidth
);
115 physDev
->tm
.tmMaxCharWidth
= XDSTOLS(dc
, fi
->dfMaxWidth
);
116 physDev
->tm
.tmWeight
= fi
->dfWeight
;
117 physDev
->tm
.tmOverhang
= 0; /*FIXME*/
118 physDev
->tm
.tmDigitizedAspectX
= fi
->dfHorizRes
;
119 physDev
->tm
.tmDigitizedAspectY
= fi
->dfVertRes
;
120 physDev
->tm
.tmFirstChar
= fi
->dfFirstChar
;
121 physDev
->tm
.tmLastChar
= fi
->dfLastChar
;
122 physDev
->tm
.tmDefaultChar
= fi
->dfDefaultChar
;
123 physDev
->tm
.tmBreakChar
= fi
->dfBreakChar
;
124 physDev
->tm
.tmItalic
= fi
->dfItalic
;
125 physDev
->tm
.tmUnderlined
= fi
->dfUnderline
;
126 physDev
->tm
.tmStruckOut
= fi
->dfStrikeOut
;
127 physDev
->tm
.tmPitchAndFamily
= fi
->dfPitchAndFamily
;
128 physDev
->tm
.tmCharSet
= fi
->dfCharSet
;
131 TRACE(win16drv
, "H %d, A %d, D %d, Int %d, Ext %d, AW %d, MW %d, W %d\n",
132 physDev
->tm
.tmHeight
,
133 physDev
->tm
.tmAscent
,
134 physDev
->tm
.tmDescent
,
135 physDev
->tm
.tmInternalLeading
,
136 physDev
->tm
.tmExternalLeading
,
137 physDev
->tm
.tmAveCharWidth
,
138 physDev
->tm
.tmMaxCharWidth
,
139 physDev
->tm
.tmWeight
);
144 /***********************************************************************
145 * GetCharWidth32A (GDI32.155)
147 BOOL32
WIN16DRV_GetCharWidth( DC
*dc
, UINT32 firstChar
, UINT32 lastChar
,
153 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
155 TRACE(win16drv
, "%d - %d into %p\n",
156 firstChar
, lastChar
, buffer
);
158 wRet
= PRTDRV_GetCharWidth( physDev
->segptrPDEVICE
, buffer
, firstChar
,
159 lastChar
, physDev
->FontInfo
,
160 win16drv_SegPtr_DrawMode
,
161 win16drv_SegPtr_TextXForm
);
162 if( TRACE_ON(win16drv
) ){
163 for(i
= 0; i
<= lastChar
- firstChar
; i
++)
164 TRACE(win16drv
, "Char %x: width %d\n", i
+ firstChar
,
171 /***********************************************************************
173 * WIN16DRV_EnumDeviceFonts
176 BOOL32
WIN16DRV_EnumDeviceFonts( DC
* dc
, LPLOGFONT16 plf
,
177 DEVICEFONTENUMPROC proc
, LPARAM lp
)
179 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
181 WEPFC wepfc
= {proc
, lp
};
183 /* EnumDFontCallback is GDI.158 */
184 FARPROC16 pfnCallback
= NE_GetEntryPoint( GetModuleHandle16("GDI"), 158 );
186 wRet
= PRTDRV_EnumDFonts(physDev
->segptrPDEVICE
, plf
->lfFaceName
[0] ?
187 plf
->lfFaceName
: NULL
, pfnCallback
, &wepfc
);
192 * EnumCallback (GDI.158)
194 * This is the callback function used when EnumDFonts is called.
195 * (The printer drivers uses it to pass info on available fonts).
197 * lpvClientData is the pointer passed to EnumDFonts, which points to a WEPFC
198 * structure (WEPFC = WINE_ENUM_PRINTER_FONT_CALLBACK).
203 WORD WINAPI
WineEnumDFontCallback(LPLOGFONT16 lpLogFont
,
204 LPTEXTMETRIC16 lpTextMetrics
,
205 WORD wFontType
, LONG lpClientData
)
207 TRACE(win16drv
, "In WineEnumDFontCallback plf=%p\n", lpLogFont
);
208 return (*(((WEPFC
*)lpClientData
)->proc
))( lpLogFont
, lpTextMetrics
,
209 wFontType
, ((WEPFC
*)lpClientData
)->lp
);