2 * Windows driver font functions
4 * Copyright 1996 John Harvey
9 #include "wine/winbase16.h"
17 /***********************************************************************
18 * WIN16DRV_GetTextExtentPoint
20 BOOL
WIN16DRV_GetTextExtentPoint( DC
*dc
, LPCSTR str
, INT count
,
23 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
26 TRACE(win16drv
, "%04x %s %d %p\n",
27 dc
->hSelf
, str
, count
, size
);
29 dwRet
= PRTDRV_ExtTextOut(physDev
->segptrPDEVICE
, 0, 0,
31 -count
, physDev
->FontInfo
,
32 win16drv_SegPtr_DrawMode
,
33 win16drv_SegPtr_TextXForm
, NULL
, NULL
, 0);
34 size
->cx
= XDSTOLS(dc
,LOWORD(dwRet
));
35 size
->cy
= YDSTOLS(dc
,HIWORD(dwRet
));
36 TRACE(win16drv
, "cx=0x%x, cy=0x%x\n",
42 /***********************************************************************
43 * WIN16DRV_GetTextMetrics
45 BOOL
WIN16DRV_GetTextMetrics( DC
*dc
, TEXTMETRICA
*metrics
)
47 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
49 TRACE(win16drv
, "%04x \n", dc
->hSelf
);
51 FONT_TextMetric16to32A( &physDev
->tm
, metrics
);
53 TRACE(win16drv
, "H %d, A %d, D %d, Int %d, Ext %d, AW %d, MW %d, W %d\n",
57 metrics
->tmInternalLeading
,
58 metrics
->tmExternalLeading
,
59 metrics
->tmAveCharWidth
,
60 metrics
->tmMaxCharWidth
,
66 HFONT
WIN16DRV_FONT_SelectObject( DC
* dc
, HFONT hfont
, FONTOBJ
* font
)
68 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
69 HPEN prevHandle
= dc
->w
.hFont
;
74 TRACE(win16drv
, "WIN16DRV_FONT_SelectObject '%s' h=%d\n",
75 font
->logfont
.lfFaceName
, font
->logfont
.lfHeight
);
78 if( physDev
->FontInfo
)
80 TRACE(win16drv
, "UnRealizing FontInfo\n");
81 nSize
= PRTDRV_RealizeObject (physDev
->segptrPDEVICE
, -DRVOBJ_FONT
,
83 physDev
->FontInfo
, 0);
86 memcpy(&physDev
->lf
, &font
->logfont
, sizeof(LOGFONT16
));
87 nSize
= PRTDRV_RealizeObject (physDev
->segptrPDEVICE
, DRVOBJ_FONT
,
90 if( physDev
->FontInfo
&&
91 HeapSize( SegptrHeap
, 0, physDev
->FontInfo
) < nSize
)
93 SEGPTR_FREE( physDev
->FontInfo
);
94 physDev
->FontInfo
= NULL
;
97 if( !physDev
->FontInfo
)
98 physDev
->FontInfo
= SEGPTR_ALLOC( nSize
);
101 nSize
= PRTDRV_RealizeObject(physDev
->segptrPDEVICE
, DRVOBJ_FONT
,
104 win16drv_SegPtr_TextXForm
);
106 #define fi physDev->FontInfo
107 physDev
->tm
.tmHeight
= YDSTOLS(dc
, fi
->dfPixHeight
);
108 physDev
->tm
.tmAscent
= YDSTOLS(dc
, fi
->dfAscent
);
109 physDev
->tm
.tmDescent
= physDev
->tm
.tmHeight
-
110 physDev
->tm
.tmAscent
;
111 physDev
->tm
.tmInternalLeading
= YDSTOLS(dc
, fi
->dfInternalLeading
);
112 physDev
->tm
.tmExternalLeading
= YDSTOLS(dc
, fi
->dfExternalLeading
);
113 physDev
->tm
.tmAveCharWidth
= XDSTOLS(dc
, fi
->dfAvgWidth
);
114 physDev
->tm
.tmMaxCharWidth
= XDSTOLS(dc
, fi
->dfMaxWidth
);
115 physDev
->tm
.tmWeight
= fi
->dfWeight
;
116 physDev
->tm
.tmOverhang
= 0; /*FIXME*/
117 physDev
->tm
.tmDigitizedAspectX
= fi
->dfHorizRes
;
118 physDev
->tm
.tmDigitizedAspectY
= fi
->dfVertRes
;
119 physDev
->tm
.tmFirstChar
= fi
->dfFirstChar
;
120 physDev
->tm
.tmLastChar
= fi
->dfLastChar
;
121 physDev
->tm
.tmDefaultChar
= fi
->dfDefaultChar
;
122 physDev
->tm
.tmBreakChar
= fi
->dfBreakChar
;
123 physDev
->tm
.tmItalic
= fi
->dfItalic
;
124 physDev
->tm
.tmUnderlined
= fi
->dfUnderline
;
125 physDev
->tm
.tmStruckOut
= fi
->dfStrikeOut
;
126 physDev
->tm
.tmPitchAndFamily
= fi
->dfPitchAndFamily
;
127 physDev
->tm
.tmCharSet
= fi
->dfCharSet
;
130 TRACE(win16drv
, "H %d, A %d, D %d, Int %d, Ext %d, AW %d, MW %d, W %d\n",
131 physDev
->tm
.tmHeight
,
132 physDev
->tm
.tmAscent
,
133 physDev
->tm
.tmDescent
,
134 physDev
->tm
.tmInternalLeading
,
135 physDev
->tm
.tmExternalLeading
,
136 physDev
->tm
.tmAveCharWidth
,
137 physDev
->tm
.tmMaxCharWidth
,
138 physDev
->tm
.tmWeight
);
143 /***********************************************************************
144 * GetCharWidth32A (GDI32.155)
146 BOOL
WIN16DRV_GetCharWidth( DC
*dc
, UINT firstChar
, UINT lastChar
,
152 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
154 TRACE(win16drv
, "%d - %d into %p\n",
155 firstChar
, lastChar
, buffer
);
157 wRet
= PRTDRV_GetCharWidth( physDev
->segptrPDEVICE
, buffer
, firstChar
,
158 lastChar
, physDev
->FontInfo
,
159 win16drv_SegPtr_DrawMode
,
160 win16drv_SegPtr_TextXForm
);
161 if( TRACE_ON(win16drv
) ){
162 for(i
= 0; i
<= lastChar
- firstChar
; i
++)
163 TRACE(win16drv
, "Char %x: width %d\n", i
+ firstChar
,
170 /***********************************************************************
172 * WIN16DRV_EnumDeviceFonts
175 BOOL
WIN16DRV_EnumDeviceFonts( DC
* dc
, LPLOGFONT16 plf
,
176 DEVICEFONTENUMPROC proc
, LPARAM lp
)
178 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
180 WEPFC wepfc
= {proc
, lp
};
182 /* EnumDFontCallback is GDI.158 */
183 FARPROC16 pfnCallback
= NE_GetEntryPoint( GetModuleHandle16("GDI"), 158 );
185 wRet
= PRTDRV_EnumDFonts(physDev
->segptrPDEVICE
, plf
->lfFaceName
[0] ?
186 plf
->lfFaceName
: NULL
, pfnCallback
, &wepfc
);
191 * EnumCallback (GDI.158)
193 * This is the callback function used when EnumDFonts is called.
194 * (The printer drivers uses it to pass info on available fonts).
196 * lpvClientData is the pointer passed to EnumDFonts, which points to a WEPFC
197 * structure (WEPFC = WINE_ENUM_PRINTER_FONT_CALLBACK).
202 WORD WINAPI
WineEnumDFontCallback(LPENUMLOGFONT16 lpLogFont
,
203 LPNEWTEXTMETRIC16 lpTextMetrics
,
204 WORD wFontType
, LONG lpClientData
)
206 TRACE(win16drv
, "In WineEnumDFontCallback plf=%p\n", lpLogFont
);
207 return (*(((WEPFC
*)lpClientData
)->proc
))( lpLogFont
, lpTextMetrics
,
208 wFontType
, ((WEPFC
*)lpClientData
)->lp
);