xref: /reactos/win32ss/drivers/font/bmfd/bmfd.h (revision e1ef0787)
1 /*
2  * PROJECT:         ReactOS win32 subsystem
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         GDI font driver for bitmap fonts
5  * PROGRAMMER:      Timo Kreuzer (timo.kreuzer@reactos.org)
6  */
7 
8 #include <stdarg.h>
9 #include <windef.h>
10 #include <wingdi.h>
11 #include <winddi.h>
12 
13 #if defined(_M_IX86) || defined(_M_AMD64)
14 /* on x86 and x64, unaligned access is allowed, byteorder is LE */
15 #define GETVAL(x) (x)
16 #else
17 // FIXME: BE
18 #define GETVAL(x) \
19     sizeof(x) == 1 ? (x) : \
20     sizeof(x) == 2 ? (((PCHAR)&(x))[0] + (((PCHAR)&(x))[1] << 8)) : \
21     (((PCHAR)&(x))[0] + (((PCHAR)&(x))[1] << 8) + (((PCHAR)&(x))[2] << 16) + \
22      (((PCHAR)&(x))[3] << 24))
23 
24 #endif
25 
26 #define FDM_MASK \
27     FDM_TYPE_CONST_BEARINGS | FDM_TYPE_ZERO_BEARINGS | \
28     FDM_TYPE_CHAR_INC_EQUAL_BM_BASE | FDM_TYPE_MAXEXT_EQUAL_BM_SIDE | \
29     FDM_TYPE_BM_SIDE_CONST
30 
31 #define FM_INFO_MASK \
32     FM_INFO_TECH_BITMAP | FM_INFO_1BPP | FM_INFO_INTEGER_WIDTH | \
33     FM_INFO_RETURNS_BITMAPS | FM_INFO_RIGHT_HANDED | FM_INFO_INTEGRAL_SCALING |\
34     FM_INFO_90DEGREE_ROTATIONS | FM_INFO_OPTICALLY_FIXED_PITCH | FM_INFO_NONNEGATIVE_AC
35 
36 #define FLOATL_1 0x3f800000
37 
38 #define TAG_PDEV 'veDP'
39 #define TAG_GLYPHSET 'GlSt'
40 #define TAG_IFIMETRICS 'Ifim'
41 #define TAG_FONTINFO 'Font'
42 
43 
44 /** FON / FNT specific types **************************************************/
45 
46 #define IMAGE_DOS_MAGIC 0x594D // FIXME: hack hack hack
47 
48 #include <pshpack1.h>
49 typedef struct
50 {
51     WORD offset;
52     WORD length;
53     WORD flags;
54     WORD id;
55     WORD handle;
56     WORD usage;
57 } NE_NAMEINFO, *PNE_NAMEINFO;
58 
59 #define NE_RSCTYPE_FONT    0x8008
60 #define NE_RSCTYPE_FONTDIR 0x8007
61 typedef struct
62 {
63     WORD type_id;
64     WORD count;
65     DWORD resloader;
66     NE_NAMEINFO nameinfo[1];
67 } NE_TYPEINFO, *PNE_TYPEINFO;
68 
69 typedef struct
70 {
71     WORD  size_shift;
72     NE_TYPEINFO typeinfo[1];
73 } NE_RESTABLE, *PNE_RESTABLE;
74 
75 // Values of dfFlags:
76 #define DFF_FIXED            0x0001
77 #define DFF_PROPORTIONAL     0x0002
78 #define DFF_ABCFIXED         0x0004
79 #define DFF_ABCPROPORTIONAL  0x0008
80 #define DFF_1COLOR           0x0010
81 #define DFF_16COLOR          0x0020
82 #define DFF_256COLOR         0x0040
83 #define DFF_RGBCOLOR         0x0080
84 
85 // see http://msdn.microsoft.com/en-us/library/ms648014(VS.85).aspx
86 typedef struct _FONTDIRENTRY
87 {
88     WORD dfVersion;
89     DWORD dfSize;
90     char dfCopyright[60];
91     WORD dfType;
92     WORD dfPoints;
93     WORD dfVertRes;
94     WORD dfHorizRes;
95     WORD dfAscent;
96     WORD dfInternalLeading;
97     WORD dfExternalLeading;
98     BYTE dfItalic;
99     BYTE dfUnderline;
100     BYTE dfStrikeOut;
101     WORD dfWeight;
102     BYTE dfCharSet;
103     WORD dfPixWidth;
104     WORD dfPixHeight;
105     BYTE dfPitchAndFamily;
106     WORD dfAvgWidth;
107     WORD dfMaxWidth;
108     BYTE dfFirstChar;
109     BYTE dfLastChar;
110     BYTE dfDefaultChar;
111     BYTE dfBreakChar;
112     WORD dfWidthBytes;
113     DWORD dfDevice;
114     DWORD dfFace;
115     DWORD dfReserved;
116     char szDeviceName[1];
117     char szFaceName[1];
118 } FONTDIRENTRY, *PFONTDIRENTRY;
119 
120 typedef struct _DIRENTRY
121 {
122     WORD fontOrdinal;
123     FONTDIRENTRY fde;
124 } DIRENTRY, *PDIRENTRY;
125 
126 typedef struct _FONTGROUPHDR
127 {
128   WORD NumberOfFonts;
129   DIRENTRY ade[1];
130 } FONTGROUPHDR, *PFONTGROUPHDR;
131 
132 typedef struct
133 {
134     WORD dfVersion;
135     DWORD dfSize;
136     CHAR dfCopyright[60];
137     WORD dfType;
138     WORD dfPoints;
139     WORD dfVertRes;
140     WORD dfHorizRes;
141     WORD dfAscent;
142     WORD dfInternalLeading;
143     WORD dfExternalLeading;
144     BYTE dfItalic;
145     BYTE dfUnderline;
146     BYTE dfStrikeOut;
147     WORD dfWeight;
148     BYTE dfCharSet;
149     WORD dfPixWidth;
150     WORD dfPixHeight;
151     BYTE dfPitchAndFamily;
152     WORD dfAvgWidth;
153     WORD dfMaxWidth;
154     BYTE dfFirstChar;
155     BYTE dfLastChar;
156     BYTE dfDefaultChar;
157     BYTE dfBreakChar;
158     WORD dfWidthBytes;
159     DWORD dfDevice;
160     DWORD dfFace;
161     DWORD dfBitsPointer;
162     DWORD dfBitsOffset;
163     BYTE dfReserved;
164     /* Version 3.00: */
165     DWORD dfFlags;
166     WORD dfAspace;
167     WORD dfBspace;
168     WORD dfCspace;
169     DWORD dfColorPointer;
170     DWORD dfReserved1[4];
171     BYTE dfCharTable[1];
172 } FONTINFO16, *LPFONTINFO16, *PFONTINFO16;
173 
174 typedef struct
175 {
176      WORD geWidth;
177      WORD geOffset;
178 } GLYPHENTRY20, *PGLYPHENTRY20;
179 
180 typedef struct
181 {
182      WORD geWidth;
183      DWORD geOffset;
184 } GLYPHENTRY30, *PGLYPHENTRY30;
185 
186 typedef union
187 {
188     GLYPHENTRY20 ge20;
189     GLYPHENTRY30 ge30;
190 } GLYPHENTRY, *PGLYPHENTRY;
191 
192 #include <poppack.h>
193 
194 
195 /** Driver specific types *****************************************************/
196 
197 typedef enum
198 {
199     FONTTYPE_FON,
200     FONTTYPE_FNT,
201 } FONTTYPE;
202 
203 typedef struct
204 {
205     PFONTDIRENTRY pFontDirEntry;
206     PFONTINFO16 pFontInfo;
207     PBYTE pCharTable;
208     ULONG cjEntrySize;
209     ULONG ulVersion;
210     PCHAR pszFaceName;
211     PCHAR pszCopyright;
212     ULONG cGlyphs;
213     CHAR chFirstChar;
214     CHAR chLastChar;
215     WCHAR wcFirstChar;
216     WCHAR wcLastChar;
217     WCHAR wcDefaultChar;
218     WCHAR wcBreakChar;
219     WORD wPixHeight;
220     WORD wPixWidth;
221     WORD wWidthBytes;
222     WORD wA;
223     WORD wB;
224     WORD wC;
225     WORD wAscent;
226     WORD wDescent;
227     FLONG flInfo;
228 } BMFD_FACE, *PBMFD_FACE;
229 
230 typedef struct
231 {
232     PVOID pvView;
233     ULONG_PTR iFile;
234     PFONTGROUPHDR pFontDir;
235     FONTTYPE ulFontType;
236     ULONG cNumFaces;
237     BMFD_FACE aface[1];
238 } BMFD_FILE, *PBMFD_FILE;
239 
240 typedef struct
241 {
242     FONTOBJ *pfo;
243     PBMFD_FACE pface;
244     ULONG xScale;
245     ULONG yScale;
246     ULONG ulAngle;
247 } BMFD_FONT, *PBMFD_FONT;
248 
249 //"Bold Italic Underline Strikeout"
250 #define MAX_STYLESIZE 35
251 typedef struct
252 {
253     IFIMETRICS ifim;
254     BYTE ajCharSet[16];
255     WCHAR wszFamilyName[LF_FACESIZE];
256     WCHAR wszFaceName[LF_FACESIZE];
257     WCHAR wszStyleName[MAX_STYLESIZE];
258 } BMFD_IFIMETRICS, *PBMFD_IFIMETRICS;
259 
260 
261 /** Function prototypes *******************************************************/
262 
263 ULONG
264 DbgPrint(IN PCHAR Format, IN ...);
265 
266 DHPDEV
267 APIENTRY
268 BmfdEnablePDEV(
269     IN DEVMODEW *pdm,
270     IN LPWSTR pwszLogAddress,
271     IN ULONG cPat,
272     OUT HSURF *phsurfPatterns,
273     IN ULONG cjCaps,
274     OUT ULONG *pdevcaps,
275     IN ULONG cjDevInfo,
276     OUT DEVINFO *pdi,
277     IN HDEV hdev,
278     IN LPWSTR pwszDeviceName,
279     IN HANDLE hDriver);
280 
281 VOID
282 APIENTRY
283 BmfdCompletePDEV(
284     IN DHPDEV dhpdev,
285     IN HDEV hdev);
286 
287 VOID
288 APIENTRY
289 BmfdDisablePDEV(
290     IN DHPDEV dhpdev);
291 
292 ULONG_PTR
293 APIENTRY
294 BmfdLoadFontFile(
295     ULONG cFiles,
296     ULONG_PTR *piFile,
297     PVOID *ppvView,
298     ULONG *pcjView,
299     DESIGNVECTOR *pdv,
300     ULONG ulLangID,
301     ULONG ulFastCheckSum);
302 
303 BOOL
304 APIENTRY
305 BmfdUnloadFontFile(
306     IN ULONG_PTR iFile);
307 
308 LONG
309 APIENTRY
310 BmfdQueryFontFile(
311     ULONG_PTR iFile,
312     ULONG ulMode,
313     ULONG cjBuf,
314     ULONG *pulBuf);
315 
316 LONG
317 APIENTRY
318 BmfdQueryFontCaps(
319     ULONG culCaps,
320     ULONG *pulCaps);
321 
322 PVOID
323 APIENTRY
324 BmfdQueryFontTree(
325     DHPDEV dhpdev,
326     ULONG_PTR iFile,
327     ULONG iFace,
328     ULONG iMode,
329     ULONG_PTR *pid);
330 
331 PIFIMETRICS
332 APIENTRY
333 BmfdQueryFont(
334     IN DHPDEV dhpdev,
335     IN ULONG_PTR iFile,
336     IN ULONG iFace,
337     IN ULONG_PTR *pid);
338 
339 VOID
340 APIENTRY
341 BmfdFree(
342     PVOID pv,
343     ULONG_PTR id);
344 
345 PFD_GLYPHATTR
346 APIENTRY
347 BmfdQueryGlyphAttrs(
348 	FONTOBJ *pfo,
349 	ULONG iMode);
350 
351 LONG
352 APIENTRY
353 BmfdQueryFontData(
354 	DHPDEV dhpdev,
355 	FONTOBJ *pfo,
356 	ULONG iMode,
357 	HGLYPH hg,
358 	OUT GLYPHDATA *pgd,
359 	PVOID pv,
360 	ULONG cjSize);
361 
362 VOID
363 APIENTRY
364 BmfdDestroyFont(
365     IN FONTOBJ *pfo);
366 
367