2 * Windows driver font functions
4 * Copyright 1996 John Harvey
9 #include "wine/winbase16.h"
16 DEFAULT_DEBUG_CHANNEL(win16drv
)
19 /***********************************************************************
20 * WIN16DRV_GetTextExtentPoint
22 BOOL
WIN16DRV_GetTextExtentPoint( DC
*dc
, LPCSTR str
, INT count
,
25 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
28 TRACE(win16drv
, "%04x %s %d %p\n",
29 dc
->hSelf
, str
, count
, size
);
31 dwRet
= PRTDRV_ExtTextOut(physDev
->segptrPDEVICE
, 0, 0,
33 -count
, physDev
->FontInfo
,
34 win16drv_SegPtr_DrawMode
,
35 win16drv_SegPtr_TextXForm
, NULL
, NULL
, 0);
36 size
->cx
= XDSTOLS(dc
,LOWORD(dwRet
));
37 size
->cy
= YDSTOLS(dc
,HIWORD(dwRet
));
38 TRACE(win16drv
, "cx=0x%x, cy=0x%x\n",
44 /***********************************************************************
45 * WIN16DRV_GetTextMetrics
47 BOOL
WIN16DRV_GetTextMetrics( DC
*dc
, TEXTMETRICA
*metrics
)
49 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
51 TRACE(win16drv
, "%04x \n", dc
->hSelf
);
53 FONT_TextMetric16to32A( &physDev
->tm
, metrics
);
55 TRACE(win16drv
, "H %d, A %d, D %d, Int %d, Ext %d, AW %d, MW %d, W %d\n",
59 metrics
->tmInternalLeading
,
60 metrics
->tmExternalLeading
,
61 metrics
->tmAveCharWidth
,
62 metrics
->tmMaxCharWidth
,
68 HFONT
WIN16DRV_FONT_SelectObject( DC
* dc
, HFONT hfont
, FONTOBJ
* font
)
70 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
71 HPEN prevHandle
= dc
->w
.hFont
;
76 TRACE(win16drv
, "WIN16DRV_FONT_SelectObject '%s' h=%d\n",
77 font
->logfont
.lfFaceName
, font
->logfont
.lfHeight
);
80 if( physDev
->FontInfo
)
82 TRACE(win16drv
, "UnRealizing FontInfo\n");
83 nSize
= PRTDRV_RealizeObject (physDev
->segptrPDEVICE
, -DRVOBJ_FONT
,
85 physDev
->FontInfo
, 0);
88 memcpy(&physDev
->lf
, &font
->logfont
, sizeof(LOGFONT16
));
89 nSize
= PRTDRV_RealizeObject (physDev
->segptrPDEVICE
, DRVOBJ_FONT
,
92 if( physDev
->FontInfo
&&
93 HeapSize( SegptrHeap
, 0, physDev
->FontInfo
) < nSize
)
95 SEGPTR_FREE( physDev
->FontInfo
);
96 physDev
->FontInfo
= NULL
;
99 if( !physDev
->FontInfo
)
100 physDev
->FontInfo
= SEGPTR_ALLOC( nSize
);
103 nSize
= PRTDRV_RealizeObject(physDev
->segptrPDEVICE
, DRVOBJ_FONT
,
106 win16drv_SegPtr_TextXForm
);
108 #define fi physDev->FontInfo
109 physDev
->tm
.tmHeight
= YDSTOLS(dc
, fi
->dfPixHeight
);
110 physDev
->tm
.tmAscent
= YDSTOLS(dc
, fi
->dfAscent
);
111 physDev
->tm
.tmDescent
= physDev
->tm
.tmHeight
-
112 physDev
->tm
.tmAscent
;
113 physDev
->tm
.tmInternalLeading
= YDSTOLS(dc
, fi
->dfInternalLeading
);
114 physDev
->tm
.tmExternalLeading
= YDSTOLS(dc
, fi
->dfExternalLeading
);
115 physDev
->tm
.tmAveCharWidth
= XDSTOLS(dc
, fi
->dfAvgWidth
);
116 physDev
->tm
.tmMaxCharWidth
= XDSTOLS(dc
, fi
->dfMaxWidth
);
117 physDev
->tm
.tmWeight
= fi
->dfWeight
;
118 physDev
->tm
.tmOverhang
= 0; /*FIXME*/
119 physDev
->tm
.tmDigitizedAspectX
= fi
->dfHorizRes
;
120 physDev
->tm
.tmDigitizedAspectY
= fi
->dfVertRes
;
121 physDev
->tm
.tmFirstChar
= fi
->dfFirstChar
;
122 physDev
->tm
.tmLastChar
= fi
->dfLastChar
;
123 physDev
->tm
.tmDefaultChar
= fi
->dfDefaultChar
;
124 physDev
->tm
.tmBreakChar
= fi
->dfBreakChar
;
125 physDev
->tm
.tmItalic
= fi
->dfItalic
;
126 physDev
->tm
.tmUnderlined
= fi
->dfUnderline
;
127 physDev
->tm
.tmStruckOut
= fi
->dfStrikeOut
;
128 physDev
->tm
.tmPitchAndFamily
= fi
->dfPitchAndFamily
;
129 physDev
->tm
.tmCharSet
= fi
->dfCharSet
;
132 TRACE(win16drv
, "H %d, A %d, D %d, Int %d, Ext %d, AW %d, MW %d, W %d\n",
133 physDev
->tm
.tmHeight
,
134 physDev
->tm
.tmAscent
,
135 physDev
->tm
.tmDescent
,
136 physDev
->tm
.tmInternalLeading
,
137 physDev
->tm
.tmExternalLeading
,
138 physDev
->tm
.tmAveCharWidth
,
139 physDev
->tm
.tmMaxCharWidth
,
140 physDev
->tm
.tmWeight
);
145 /***********************************************************************
146 * GetCharWidth32A (GDI32.155)
148 BOOL
WIN16DRV_GetCharWidth( DC
*dc
, UINT firstChar
, UINT lastChar
,
154 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
156 TRACE(win16drv
, "%d - %d into %p\n",
157 firstChar
, lastChar
, buffer
);
159 wRet
= PRTDRV_GetCharWidth( physDev
->segptrPDEVICE
, buffer
, firstChar
,
160 lastChar
, physDev
->FontInfo
,
161 win16drv_SegPtr_DrawMode
,
162 win16drv_SegPtr_TextXForm
);
163 if( TRACE_ON(win16drv
) ){
164 for(i
= 0; i
<= lastChar
- firstChar
; i
++)
165 TRACE(win16drv
, "Char %x: width %d\n", i
+ firstChar
,
172 /***********************************************************************
174 * WIN16DRV_EnumDeviceFonts
177 BOOL
WIN16DRV_EnumDeviceFonts( DC
* dc
, LPLOGFONT16 plf
,
178 DEVICEFONTENUMPROC proc
, LPARAM lp
)
180 WIN16DRV_PDEVICE
*physDev
= (WIN16DRV_PDEVICE
*)dc
->physDev
;
182 WEPFC wepfc
= {proc
, lp
};
184 /* EnumDFontCallback is GDI.158 */
185 FARPROC16 pfnCallback
= NE_GetEntryPoint( GetModuleHandle16("GDI"), 158 );
187 wRet
= PRTDRV_EnumDFonts(physDev
->segptrPDEVICE
, plf
->lfFaceName
[0] ?
188 plf
->lfFaceName
: NULL
, pfnCallback
, &wepfc
);
193 * EnumCallback (GDI.158)
195 * This is the callback function used when EnumDFonts is called.
196 * (The printer drivers uses it to pass info on available fonts).
198 * lpvClientData is the pointer passed to EnumDFonts, which points to a WEPFC
199 * structure (WEPFC = WINE_ENUM_PRINTER_FONT_CALLBACK).
204 WORD WINAPI
WineEnumDFontCallback(LPENUMLOGFONT16 lpLogFont
,
205 LPNEWTEXTMETRIC16 lpTextMetrics
,
206 WORD wFontType
, LONG lpClientData
)
208 TRACE(win16drv
, "In WineEnumDFontCallback plf=%p\n", lpLogFont
);
209 return (*(((WEPFC
*)lpClientData
)->proc
))( lpLogFont
, lpTextMetrics
,
210 wFontType
, ((WEPFC
*)lpClientData
)->lp
);