2 * PostScript driver initialization functions
4 * Copyright 1998 Huw D M Davies
17 static BOOL32
PSDRV_CreateDC( DC
*dc
, LPCSTR driver
, LPCSTR device
,
18 LPCSTR output
, const DEVMODE16
* initData
);
19 static BOOL32
PSDRV_DeleteDC( DC
*dc
);
21 static const DC_FUNCTIONS PSDRV_Funcs
=
25 NULL
, /* pBitmapBits */
26 PSDRV_Chord
, /* pChord */
27 NULL
, /* pCreateBitmap */
28 PSDRV_CreateDC
, /* pCreateDC */
29 PSDRV_DeleteDC
, /* pDeleteDC */
30 NULL
, /* pDeleteObject */
31 PSDRV_Ellipse
, /* pEllipse */
32 PSDRV_EnumDeviceFonts
, /* pEnumDeviceFonts */
33 PSDRV_Escape
, /* pEscape */
34 NULL
, /* pExcludeClipRect */
35 NULL
, /* pExcludeVisRect */
36 NULL
, /* pExtFloodFill */
37 PSDRV_ExtTextOut
, /* pExtTextOut */
38 PSDRV_GetCharWidth
, /* pGetCharWidth */
40 PSDRV_GetTextExtentPoint
, /* pGetTextExtentPoint */
41 PSDRV_GetTextMetrics
, /* pGetTextMetrics */
42 NULL
, /* pIntersectClipRect */
43 NULL
, /* pIntersectVisRect */
44 PSDRV_LineTo
, /* pLineTo */
45 NULL
, /* pLoadOEMResource */
46 PSDRV_MoveToEx
, /* pMoveToEx */
47 NULL
, /* pOffsetClipRgn */
48 NULL
, /* pOffsetViewportOrg (optional) */
49 NULL
, /* pOffsetWindowOrg (optional) */
53 PSDRV_PolyPolygon
, /* pPolyPolygon */
54 PSDRV_PolyPolyline
, /* pPolyPolyline */
55 PSDRV_Polygon
, /* pPolygon */
56 PSDRV_Polyline
, /* pPolyline */
57 NULL
, /* pPolyBezier */
58 NULL
, /* pRealizePalette */
59 PSDRV_Rectangle
, /* pRectangle */
60 NULL
, /* pRestoreDC */
61 PSDRV_RoundRect
, /* pRoundRect */
63 NULL
, /* pScaleViewportExt (optional) */
64 NULL
, /* pScaleWindowExt (optional) */
65 NULL
, /* pSelectClipRgn */
66 PSDRV_SelectObject
, /* pSelectObject */
67 NULL
, /* pSelectPalette */
68 PSDRV_SetBkColor
, /* pSetBkColor */
69 NULL
, /* pSetBkMode */
70 NULL
, /* pSetDeviceClipping */
71 NULL
, /* pSetDIBitsToDevice */
72 NULL
, /* pSetMapMode (optional) */
73 NULL
, /* pSetMapperFlags */
74 PSDRV_SetPixel
, /* pSetPixel */
75 NULL
, /* pSetPolyFillMode */
77 NULL
, /* pSetRelAbs */
78 NULL
, /* pSetStretchBltMode */
79 NULL
, /* pSetTextAlign */
80 NULL
, /* pSetTextCharacterExtra */
81 PSDRV_SetTextColor
, /* pSetTextColor */
82 NULL
, /* pSetTextJustification */
83 NULL
, /* pSetViewportExt (optional) */
84 NULL
, /* pSetViewportOrg (optional) */
85 NULL
, /* pSetWindowExt (optional) */
86 NULL
, /* pSetWindowOrg (optional) */
87 NULL
, /* pStretchBlt */
88 PSDRV_StretchDIBits
/* pStretchDIBits */
92 /* Default entries for devcaps */
94 static DeviceCaps PSDRV_DevCaps
= {
96 /* technology */ DT_RASPRINTER
,
109 /* curveCaps */ CC_CIRCLES
| CC_PIE
| CC_CHORD
| CC_ELLIPSES
|
110 CC_WIDE
| CC_STYLED
| CC_WIDESTYLED
| CC_INTERIORS
|
112 /* lineCaps */ LC_POLYLINE
| LC_MARKER
| LC_POLYMARKER
| LC_WIDE
|
113 LC_STYLED
| LC_WIDESTYLED
| LC_INTERIORS
,
114 /* polygoalnCaps */ PC_POLYGON
| PC_RECTANGLE
| PC_WINDPOLYGON
|
115 PC_SCANLINE
| PC_WIDE
| PC_STYLED
| PC_WIDESTYLED
|
117 /* textCaps */ TC_CR_ANY
, /* psdrv 0x59f7 */
118 /* clipCaps */ CP_RECTANGLE
,
119 /* rasterCaps */ RC_BITBLT
| RC_BANDING
| RC_SCALING
| RC_BITMAP64
|
120 RC_DI_BITMAP
| RC_DIBTODEV
| RC_BIGFONT
|
121 RC_STRETCHBLT
| RC_STRETCHDIB
| RC_DEVBITS
,
127 /* logPixelsX */ 600,
128 /* logPixelsY */ 600,
130 /* palette size */ 0,
133 static PSDRV_DEVMODE16 DefaultDevmode
=
136 /* dmDeviceName */ "Wine PostScript Driver",
137 /* dmSpecVersion */ 0x30a,
138 /* dmDriverVersion */ 0x001,
139 /* dmSize */ sizeof(DEVMODE16
),
140 /* dmDriverExtra */ 0,
141 /* dmFields */ DM_ORIENTATION
| DM_PAPERSIZE
| DM_PAPERLENGTH
|
142 DM_PAPERWIDTH
| DM_SCALE
| DM_COPIES
|
143 DM_DEFAULTSOURCE
| DM_COLOR
| DM_DUPLEX
|
144 DM_YRESOLUTION
| DM_TTOPTION
,
145 /* dmOrientation */ DMORIENT_PORTRAIT
,
146 /* dmPaperSize */ DMPAPER_A4
,
147 /* dmPaperLength */ 2969,
148 /* dmPaperWidth */ 2101,
149 /* dmScale */ 100, /* ?? */
151 /* dmDefaultSource */ DMBIN_AUTO
,
152 /* dmPrintQuality */ 0,
153 /* dmColor */ DMCOLOR_MONOCHROME
,
155 /* dmYResolution */ 0,
156 /* dmTTOption */ DMTT_SUBDEV
,
159 /* dmUnusedPadding */ 0,
160 /* dmBitsPerPel */ 0,
162 /* dmPelsHeight */ 0,
163 /* dmDisplayFlags */ 0,
164 /* dmDisplayFrequency */ 0
169 /* ppdfilename */ "default.ppd"
173 HANDLE32 PSDRV_Heap
= 0;
175 static HANDLE32 PSDRV_DefaultFont
= 0;
176 static LOGFONT32A DefaultLogFont
= {
177 100, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
, 0, 0,
178 DEFAULT_QUALITY
, FIXED_PITCH
| FF_MODERN
, ""
181 /*********************************************************************
184 * Initializes font metrics and registers driver. Called from GDI_Init()
187 BOOL32
PSDRV_Init(void)
190 PSDRV_Heap
= HeapCreate(0, 0x10000, 0);
191 PSDRV_GetFontMetrics();
192 PSDRV_DefaultFont
= CreateFontIndirect32A(&DefaultLogFont
);
193 return DRIVER_RegisterDriver( "WINEPS", &PSDRV_Funcs
);
196 /**********************************************************************
199 static BOOL32
PSDRV_CreateDC( DC
*dc
, LPCSTR driver
, LPCSTR device
,
200 LPCSTR output
, const DEVMODE16
* initData
)
202 PSDRV_PDEVICE
*physDev
;
203 PRINTERINFO
*pi
= PSDRV_FindPrinterInfo(device
);
206 TRACE(psdrv
, "(%s %s %s %p)\n", driver
, device
, output
, initData
);
208 if(!pi
) return FALSE
;
211 MSG("To use WINEPS you need to install some AFM files.\n");
215 physDev
= (PSDRV_PDEVICE
*)HeapAlloc( PSDRV_Heap
, HEAP_ZERO_MEMORY
,
217 if (!physDev
) return FALSE
;
218 dc
->physDev
= physDev
;
222 physDev
->Devmode
= (PSDRV_DEVMODE16
*)HeapAlloc( PSDRV_Heap
, 0,
223 sizeof(PSDRV_DEVMODE16
) );
224 if(!physDev
->Devmode
) {
225 HeapFree( PSDRV_Heap
, 0, physDev
);
229 memcpy( physDev
->Devmode
, pi
->Devmode
, sizeof(PSDRV_DEVMODE16
) );
232 PSDRV_MergeDevmodes(physDev
->Devmode
, (PSDRV_DEVMODE16
*)initData
, pi
);
236 devCaps
= HeapAlloc( PSDRV_Heap
, 0, sizeof(PSDRV_DevCaps
) );
237 memcpy(devCaps
, &PSDRV_DevCaps
, sizeof(PSDRV_DevCaps
));
239 if(physDev
->Devmode
->dmPublic
.dmOrientation
== DMORIENT_PORTRAIT
) {
240 devCaps
->horzSize
= physDev
->Devmode
->dmPublic
.dmPaperWidth
/ 10;
241 devCaps
->vertSize
= physDev
->Devmode
->dmPublic
.dmPaperLength
/ 10;
243 devCaps
->horzSize
= physDev
->Devmode
->dmPublic
.dmPaperLength
/ 10;
244 devCaps
->vertSize
= physDev
->Devmode
->dmPublic
.dmPaperWidth
/ 10;
247 devCaps
->horzRes
= physDev
->pi
->ppd
->DefaultResolution
*
248 devCaps
->horzSize
/ 25.4;
249 devCaps
->vertRes
= physDev
->pi
->ppd
->DefaultResolution
*
250 devCaps
->vertSize
/ 25.4;
252 /* Are aspect[XY] and logPixels[XY] correct? */
253 /* Need to handle different res in x and y => fix ppd */
254 devCaps
->aspectX
= devCaps
->logPixelsX
=
255 physDev
->pi
->ppd
->DefaultResolution
;
256 devCaps
->aspectY
= devCaps
->logPixelsY
=
257 physDev
->pi
->ppd
->DefaultResolution
;
258 devCaps
->aspectXY
= (int)hypot( (double)devCaps
->aspectX
,
259 (double)devCaps
->aspectY
);
261 if(physDev
->pi
->ppd
->ColorDevice
) {
262 devCaps
->bitsPixel
= 8;
263 devCaps
->numColors
= 256;
264 /* FIXME are these values OK? */
269 dc
->w
.devCaps
= devCaps
;
271 dc
->w
.hVisRgn
= CreateRectRgn32(0, 0, dc
->w
.devCaps
->horzRes
,
272 dc
->w
.devCaps
->vertRes
);
274 dc
->w
.hFont
= PSDRV_DefaultFont
;
275 physDev
->job
.output
= HEAP_strdupA( PSDRV_Heap
, 0, output
);
276 physDev
->job
.hJob
= 0;
281 /**********************************************************************
284 static BOOL32
PSDRV_DeleteDC( DC
*dc
)
286 PSDRV_PDEVICE
*physDev
= (PSDRV_PDEVICE
*)dc
->physDev
;
290 HeapFree( PSDRV_Heap
, 0, physDev
->Devmode
);
291 HeapFree( PSDRV_Heap
, 0, physDev
->job
.output
);
292 HeapFree( PSDRV_Heap
, 0, (void *)dc
->w
.devCaps
);
293 HeapFree( PSDRV_Heap
, 0, physDev
);
302 /**********************************************************************
303 * PSDRV_FindPrinterInfo
305 PRINTERINFO
*PSDRV_FindPrinterInfo(LPCSTR name
)
307 static PRINTERINFO
*PSDRV_PrinterList
;
308 DWORD type
= REG_BINARY
, needed
, res
;
309 PRINTERINFO
*pi
= PSDRV_PrinterList
, **last
= &PSDRV_PrinterList
;
313 TRACE(psdrv
, "'%s'\n", name
);
315 for( ; pi
; last
= &pi
->next
, pi
= pi
->next
) {
316 if(!strcmp(pi
->FriendlyName
, name
))
320 pi
= *last
= HeapAlloc( PSDRV_Heap
, 0, sizeof(*pi
) );
321 pi
->FriendlyName
= HEAP_strdupA( PSDRV_Heap
, 0, name
);
322 res
= DrvGetPrinterData((LPSTR
)name
, (LPSTR
)INT_PD_DEFAULT_DEVMODE
, &type
,
325 if(res
== ERROR_INVALID_PRINTER_NAME
) {
326 pi
->Devmode
= HeapAlloc( PSDRV_Heap
, 0, sizeof(DefaultDevmode
) );
327 memcpy(pi
->Devmode
, &DefaultDevmode
, sizeof(DefaultDevmode
) );
328 DrvSetPrinterData((LPSTR
)name
, (LPSTR
)INT_PD_DEFAULT_DEVMODE
,
329 REG_BINARY
, (LPBYTE
)&DefaultDevmode
, sizeof(DefaultDevmode
) );
331 /* need to do something here AddPrinter?? */
333 pi
->Devmode
= HeapAlloc( PSDRV_Heap
, 0, needed
);
334 DrvGetPrinterData((LPSTR
)name
, (LPSTR
)INT_PD_DEFAULT_DEVMODE
, &type
,
335 (LPBYTE
)pi
->Devmode
, needed
, &needed
);
338 pi
->ppd
= PSDRV_ParsePPD(pi
->Devmode
->dmDrvPrivate
.ppdFileName
);
340 HeapFree(PSDRV_Heap
, 0, pi
->FriendlyName
);
341 HeapFree(PSDRV_Heap
, 0, pi
->Devmode
);
342 HeapFree(PSDRV_Heap
, 0, pi
);
344 MSG("Couldn't find PPD file '%s', expect a crash now!\n",
345 pi
->Devmode
->dmDrvPrivate
.ppdFileName
);
352 for(font
= pi
->ppd
->InstalledFonts
; font
; font
= font
->next
) {
353 afm
= PSDRV_FindAFMinList(PSDRV_AFMFontList
, font
->Name
);
356 "Couldn't find AFM file for installed printer font '%s' - ignoring\n",
359 PSDRV_AddAFMtoList(&pi
->Fonts
, afm
);