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