2 * PostScript driver initialization functions
4 * Copyright 1998 Huw D M Davies
11 #include "debugtools.h"
17 DEFAULT_DEBUG_CHANNEL(psdrv
)
19 static BOOL
PSDRV_CreateDC( DC
*dc
, LPCSTR driver
, LPCSTR device
,
20 LPCSTR output
, const DEVMODEA
* initData
);
21 static BOOL
PSDRV_DeleteDC( DC
*dc
);
23 static const DC_FUNCTIONS PSDRV_Funcs
=
28 NULL
, /* pBitmapBits */
29 PSDRV_Chord
, /* pChord */
30 NULL
, /* pCreateBitmap */
31 PSDRV_CreateDC
, /* pCreateDC */
32 NULL
, /* pCreateDIBSection */
33 NULL
, /* pCreateDIBSection16 */
34 PSDRV_DeleteDC
, /* pDeleteDC */
35 NULL
, /* pDeleteObject */
36 PSDRV_DeviceCapabilities
, /* pDeviceCapabilities */
37 PSDRV_Ellipse
, /* pEllipse */
40 PSDRV_EnumDeviceFonts
, /* pEnumDeviceFonts */
41 PSDRV_Escape
, /* pEscape */
42 NULL
, /* pExcludeClipRect */
43 PSDRV_ExtDeviceMode
, /* pExtDeviceMode */
44 NULL
, /* pExtFloodFill */
45 PSDRV_ExtTextOut
, /* pExtTextOut */
48 PSDRV_GetCharWidth
, /* pGetCharWidth */
50 PSDRV_GetTextExtentPoint
, /* pGetTextExtentPoint */
51 PSDRV_GetTextMetrics
, /* pGetTextMetrics */
52 NULL
, /* pIntersectClipRect */
53 NULL
, /* pInvertRgn */
54 PSDRV_LineTo
, /* pLineTo */
55 NULL
, /* pLoadOEMResource */
56 PSDRV_MoveToEx
, /* pMoveToEx */
57 NULL
, /* pOffsetClipRgn */
58 NULL
, /* pOffsetViewportOrg (optional) */
59 NULL
, /* pOffsetWindowOrg (optional) */
61 PSDRV_PatBlt
, /* pPatBlt */
63 PSDRV_PolyPolygon
, /* pPolyPolygon */
64 PSDRV_PolyPolyline
, /* pPolyPolyline */
65 PSDRV_Polygon
, /* pPolygon */
66 PSDRV_Polyline
, /* pPolyline */
67 NULL
, /* pPolyBezier */
68 NULL
, /* pRealizePalette */
69 PSDRV_Rectangle
, /* pRectangle */
70 NULL
, /* pRestoreDC */
71 PSDRV_RoundRect
, /* pRoundRect */
73 NULL
, /* pScaleViewportExt (optional) */
74 NULL
, /* pScaleWindowExt (optional) */
75 NULL
, /* pSelectClipRgn */
76 PSDRV_SelectObject
, /* pSelectObject */
77 NULL
, /* pSelectPalette */
78 PSDRV_SetBkColor
, /* pSetBkColor */
79 NULL
, /* pSetBkMode */
80 NULL
, /* pSetDeviceClipping */
81 NULL
, /* pSetDIBitsToDevice */
82 NULL
, /* pSetMapMode (optional) */
83 NULL
, /* pSetMapperFlags */
84 PSDRV_SetPixel
, /* pSetPixel */
85 NULL
, /* pSetPolyFillMode */
87 NULL
, /* pSetRelAbs */
88 NULL
, /* pSetStretchBltMode */
89 NULL
, /* pSetTextAlign */
90 NULL
, /* pSetTextCharacterExtra */
91 PSDRV_SetTextColor
, /* pSetTextColor */
92 NULL
, /* pSetTextJustification */
93 NULL
, /* pSetViewportExt (optional) */
94 NULL
, /* pSetViewportOrg (optional) */
95 NULL
, /* pSetWindowExt (optional) */
96 NULL
, /* pSetWindowOrg (optional) */
98 NULL
, /* pStartPage */
99 NULL
, /* pStretchBlt */
100 PSDRV_StretchDIBits
/* pStretchDIBits */
104 /* Default entries for devcaps */
106 static DeviceCaps PSDRV_DevCaps
= {
108 /* technology */ DT_RASPRINTER
,
121 /* curveCaps */ CC_CIRCLES
| CC_PIE
| CC_CHORD
| CC_ELLIPSES
|
122 CC_WIDE
| CC_STYLED
| CC_WIDESTYLED
| CC_INTERIORS
|
124 /* lineCaps */ LC_POLYLINE
| LC_MARKER
| LC_POLYMARKER
| LC_WIDE
|
125 LC_STYLED
| LC_WIDESTYLED
| LC_INTERIORS
,
126 /* polygoalnCaps */ PC_POLYGON
| PC_RECTANGLE
| PC_WINDPOLYGON
|
127 PC_SCANLINE
| PC_WIDE
| PC_STYLED
| PC_WIDESTYLED
|
129 /* textCaps */ TC_CR_ANY
, /* psdrv 0x59f7 */
130 /* clipCaps */ CP_RECTANGLE
,
131 /* rasterCaps */ RC_BITBLT
| RC_BITMAP64
| RC_GDI20_OUTPUT
|
132 RC_DIBTODEV
| RC_STRETCHBLT
|
133 RC_STRETCHDIB
, /* psdrv 0x6e99 */
138 /* logPixelsX */ 600,
139 /* logPixelsY */ 600,
141 /* palette size */ 0,
144 static PSDRV_DEVMODEA DefaultDevmode
=
147 /* dmDeviceName */ "Wine PostScript Driver",
148 /* dmSpecVersion */ 0x30a,
149 /* dmDriverVersion */ 0x001,
150 /* dmSize */ sizeof(DEVMODEA
),
151 /* dmDriverExtra */ 0,
152 /* dmFields */ DM_ORIENTATION
| DM_PAPERSIZE
| DM_PAPERLENGTH
|
153 DM_PAPERWIDTH
| DM_SCALE
| DM_COPIES
|
154 DM_DEFAULTSOURCE
| DM_COLOR
| DM_DUPLEX
|
155 DM_YRESOLUTION
| DM_TTOPTION
,
158 /* dmOrientation */ DMORIENT_PORTRAIT
,
159 /* dmPaperSize */ DMPAPER_A4
,
160 /* dmPaperLength */ 2969,
161 /* dmPaperWidth */ 2101
164 /* dmScale */ 100, /* ?? */
166 /* dmDefaultSource */ DMBIN_AUTO
,
167 /* dmPrintQuality */ 0,
168 /* dmColor */ DMCOLOR_MONOCHROME
,
170 /* dmYResolution */ 0,
171 /* dmTTOption */ DMTT_SUBDEV
,
174 /* dmUnusedPadding */ 0,
175 /* dmBitsPerPel */ 0,
177 /* dmPelsHeight */ 0,
178 /* dmDisplayFlags */ 0,
179 /* dmDisplayFrequency */ 0
185 /* ppdfilename */ "default.ppd"
189 HANDLE PSDRV_Heap
= 0;
191 static HANDLE PSDRV_DefaultFont
= 0;
192 static LOGFONTA DefaultLogFont
= {
193 100, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
, 0, 0,
194 DEFAULT_QUALITY
, FIXED_PITCH
| FF_MODERN
, ""
197 /*********************************************************************
200 * Initializes font metrics and registers driver. Called from GDI_Init()
203 BOOL
PSDRV_Init(void)
206 PSDRV_Heap
= HeapCreate(0, 0x10000, 0);
207 PSDRV_GetFontMetrics();
208 PSDRV_DefaultFont
= CreateFontIndirectA(&DefaultLogFont
);
209 return DRIVER_RegisterDriver( "WINEPS", &PSDRV_Funcs
);
212 /**********************************************************************
215 static BOOL
PSDRV_CreateDC( DC
*dc
, LPCSTR driver
, LPCSTR device
,
216 LPCSTR output
, const DEVMODEA
* initData
)
218 PSDRV_PDEVICE
*physDev
;
222 /* If no device name was specified, retrieve the device name
223 * from the DEVMODE structure from the DC's physDev.
224 * (See CreateCompatibleDC) */
225 if ( !device
&& dc
->physDev
)
227 physDev
= (PSDRV_PDEVICE
*)dc
->physDev
;
228 device
= physDev
->Devmode
->dmPublic
.dmDeviceName
;
230 pi
= PSDRV_FindPrinterInfo(device
);
232 TRACE("(%s %s %s %p)\n", driver
, device
, output
, initData
);
234 if(!pi
) return FALSE
;
237 MESSAGE("To use WINEPS you need to install some AFM files.\n");
241 physDev
= (PSDRV_PDEVICE
*)HeapAlloc( PSDRV_Heap
, HEAP_ZERO_MEMORY
,
243 if (!physDev
) return FALSE
;
244 dc
->physDev
= physDev
;
248 physDev
->Devmode
= (PSDRV_DEVMODEA
*)HeapAlloc( PSDRV_Heap
, 0,
249 sizeof(PSDRV_DEVMODEA
) );
250 if(!physDev
->Devmode
) {
251 HeapFree( PSDRV_Heap
, 0, physDev
);
255 memcpy( physDev
->Devmode
, pi
->Devmode
, sizeof(PSDRV_DEVMODEA
) );
258 PSDRV_MergeDevmodes(physDev
->Devmode
, (PSDRV_DEVMODEA
*)initData
, pi
);
262 devCaps
= HeapAlloc( PSDRV_Heap
, 0, sizeof(PSDRV_DevCaps
) );
263 memcpy(devCaps
, &PSDRV_DevCaps
, sizeof(PSDRV_DevCaps
));
265 if(physDev
->Devmode
->dmPublic
.u1
.s1
.dmOrientation
== DMORIENT_PORTRAIT
) {
266 devCaps
->horzSize
= physDev
->Devmode
->dmPublic
.u1
.s1
.dmPaperWidth
/ 10;
267 devCaps
->vertSize
= physDev
->Devmode
->dmPublic
.u1
.s1
.dmPaperLength
/ 10;
269 devCaps
->horzSize
= physDev
->Devmode
->dmPublic
.u1
.s1
.dmPaperLength
/ 10;
270 devCaps
->vertSize
= physDev
->Devmode
->dmPublic
.u1
.s1
.dmPaperWidth
/ 10;
273 devCaps
->horzRes
= physDev
->pi
->ppd
->DefaultResolution
*
274 devCaps
->horzSize
/ 25.4;
275 devCaps
->vertRes
= physDev
->pi
->ppd
->DefaultResolution
*
276 devCaps
->vertSize
/ 25.4;
278 /* Are aspect[XY] and logPixels[XY] correct? */
279 /* Need to handle different res in x and y => fix ppd */
280 devCaps
->aspectX
= devCaps
->logPixelsX
=
281 physDev
->pi
->ppd
->DefaultResolution
;
282 devCaps
->aspectY
= devCaps
->logPixelsY
=
283 physDev
->pi
->ppd
->DefaultResolution
;
284 devCaps
->aspectXY
= (int)hypot( (double)devCaps
->aspectX
,
285 (double)devCaps
->aspectY
);
287 if(physDev
->pi
->ppd
->ColorDevice
) {
288 devCaps
->bitsPixel
= 8;
289 devCaps
->numColors
= 256;
290 /* FIXME are these values OK? */
295 dc
->w
.devCaps
= devCaps
;
297 dc
->w
.hVisRgn
= CreateRectRgn(0, 0, dc
->w
.devCaps
->horzRes
,
298 dc
->w
.devCaps
->vertRes
);
300 dc
->w
.hFont
= PSDRV_DefaultFont
;
301 physDev
->job
.output
= output
? HEAP_strdupA( PSDRV_Heap
, 0, output
) :
303 physDev
->job
.hJob
= 0;
308 /**********************************************************************
311 static BOOL
PSDRV_DeleteDC( DC
*dc
)
313 PSDRV_PDEVICE
*physDev
= (PSDRV_PDEVICE
*)dc
->physDev
;
317 HeapFree( PSDRV_Heap
, 0, physDev
->Devmode
);
318 HeapFree( PSDRV_Heap
, 0, physDev
->job
.output
);
319 HeapFree( PSDRV_Heap
, 0, (void *)dc
->w
.devCaps
);
320 HeapFree( PSDRV_Heap
, 0, physDev
);
329 /**********************************************************************
330 * PSDRV_FindPrinterInfo
332 PRINTERINFO
*PSDRV_FindPrinterInfo(LPCSTR name
)
334 static PRINTERINFO
*PSDRV_PrinterList
;
335 DWORD type
= REG_BINARY
, needed
, res
;
336 PRINTERINFO
*pi
= PSDRV_PrinterList
, **last
= &PSDRV_PrinterList
;
340 TRACE("'%s'\n", name
);
342 for( ; pi
; last
= &pi
->next
, pi
= pi
->next
) {
343 if(!strcmp(pi
->FriendlyName
, name
))
347 pi
= *last
= HeapAlloc( PSDRV_Heap
, 0, sizeof(*pi
) );
348 pi
->FriendlyName
= HEAP_strdupA( PSDRV_Heap
, 0, name
);
349 res
= DrvGetPrinterData16((LPSTR
)name
, (LPSTR
)INT_PD_DEFAULT_DEVMODE
, &type
,
352 if(res
== ERROR_INVALID_PRINTER_NAME
|| needed
!= sizeof(DefaultDevmode
)) {
353 pi
->Devmode
= HeapAlloc( PSDRV_Heap
, 0, sizeof(DefaultDevmode
) );
354 memcpy(pi
->Devmode
, &DefaultDevmode
, sizeof(DefaultDevmode
) );
355 DrvSetPrinterData16((LPSTR
)name
, (LPSTR
)INT_PD_DEFAULT_DEVMODE
,
356 REG_BINARY
, (LPBYTE
)&DefaultDevmode
, sizeof(DefaultDevmode
) );
358 /* need to do something here AddPrinter?? */
360 pi
->Devmode
= HeapAlloc( PSDRV_Heap
, 0, needed
);
361 DrvGetPrinterData16((LPSTR
)name
, (LPSTR
)INT_PD_DEFAULT_DEVMODE
, &type
,
362 (LPBYTE
)pi
->Devmode
, needed
, &needed
);
365 pi
->ppd
= PSDRV_ParsePPD(pi
->Devmode
->dmDrvPrivate
.ppdFileName
);
367 HeapFree(PSDRV_Heap
, 0, pi
->FriendlyName
);
368 HeapFree(PSDRV_Heap
, 0, pi
->Devmode
);
369 HeapFree(PSDRV_Heap
, 0, pi
);
371 MESSAGE("Couldn't find PPD file '%s', expect a crash now!\n",
372 pi
->Devmode
->dmDrvPrivate
.ppdFileName
);
379 for(font
= pi
->ppd
->InstalledFonts
; font
; font
= font
->next
) {
380 afm
= PSDRV_FindAFMinList(PSDRV_AFMFontList
, font
->Name
);
383 "Couldn't find AFM file for installed printer font '%s' - ignoring\n",
386 PSDRV_AddAFMtoList(&pi
->Fonts
, afm
);