source: trunk/src/gdi32/printer.cpp@ 10597

Last change on this file since 10597 was 10597, checked in by sandervl, 21 years ago

updates

File size: 8.8 KB
Line 
1/* $Id: printer.cpp,v 1.3 2004-05-05 09:19:11 sandervl Exp $ */
2
3/*
4 * GDI32 printer apis
5 *
6 * Copyright 2001 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * Parts based on Wine code (StartDocW)
10 *
11 * Copyright 1996 John Harvey
12 * Copyright 1998 Huw Davies
13 * Copyright 1998 Andreas Mohr
14 * Copyright 1999 Klaas van Gend
15 *
16 * Project Odin Software License can be found in LICENSE.TXT
17 *
18 */
19#include <os2win.h>
20#include <stdarg.h>
21#include <string.h>
22#include <dcdata.h>
23#include <dbglog.h>
24#include <heapstring.h>
25#include "oslibgpi.h"
26
27#define DBG_LOCALLOG DBG_printer
28#include "dbglocal.h"
29
30static char *lpszPassThrough = NULL;
31static int cbPassThrough = 0;
32
33//NOTE: We need to insert this postscript statement into the stream or else
34// the output will be completely inverted (x & y)
35static char szSetupString[] = "%%BeginSetup\n[{\n%%BeginColorModelSetup\n<< /ProcessColorModel /DeviceCMYK >> setpagedevice\n%%EndColorModelSetup\n} stopped cleartomark\n%%EndSetup\n";
36
37//******************************************************************************
38//******************************************************************************
39int WIN32API Escape( HDC hdc, int nEscape, int cbInput, LPCSTR lpvInData, PVOID lpvOutData)
40{
41 int rc;
42 char *lpszEscape = NULL;
43
44 switch(nEscape)
45 {
46 case SET_BOUNDS:
47 {
48 RECT *r = (RECT *)lpvInData;
49 if(cbInput != sizeof(RECT)) {
50 dprintf(("WARNING: cbInput != sizeof(RECT) (=%d) for SET_BOUNDS", cbInput));
51 return 0;
52 }
53 dprintf(("SET_BOUNDS (%d,%d) (%d,%d)", r->left, r->top, r->right, r->bottom));
54 return 0;
55 }
56 case POSTSCRIPT_PASSTHROUGH:
57 if(!lpszEscape) lpszEscape = "POSTSCRIPT_PASSTHROUGH";
58 nEscape = PASSTHROUGH;
59 case POSTSCRIPT_DATA:
60 if(!lpszEscape) lpszEscape = "POSTSCRIPT_DATA";
61 case PASSTHROUGH:
62 {
63 if(!lpszEscape) lpszEscape = "PASSTHROUGH";
64 dprintf(("Postscript %s data of size %d", lpszEscape, *(WORD *)lpvInData));
65
66 rc = O32_Escape(hdc, nEscape, cbInput, lpvInData, lpvOutData);
67 if(rc == 1) rc = *(WORD *)lpvInData;
68 else rc = 0;
69 return rc;
70 }
71
72 case SPCLPASSTHROUGH2:
73 {
74 int rawsize = *(WORD *)(lpvInData+4);
75
76 dprintf(("SPCLPASSTHROUGH2: pretend success"));
77 dprintf(("SPCLPASSTHROUGH2: virt mem %x size %x", *(DWORD *)lpvInData, rawsize));
78 return 1;
79 }
80
81 case DOWNLOADFACE:
82 dprintf(("DOWNLOADFACE: pretend success"));
83 return 1;
84
85 case POSTSCRIPT_IGNORE:
86 {
87 BOOL ret = FALSE;
88 dprintf(("POSTSCRIPT_IGNORE %d", *(WORD *)lpvInData));
89 return ret;
90 }
91 case EPSPRINTING:
92 {
93 UINT epsprint = *(UINT*)lpvInData;
94 dprintf(("EPSPRINTING support %sable.\n",epsprint?"en":"dis"));
95 return 1;
96 }
97
98 case QUERYESCSUPPORT:
99 {
100 DWORD nEscapeSup = *(DWORD *)lpvInData;
101 BOOL fdprintf = FALSE;
102
103 switch(nEscapeSup) {
104 case SET_BOUNDS:
105 if(!fdprintf) dprintf(("QUERYESCSUPPORT: SET_BOUNDS"));
106 fdprintf = TRUE;
107/* case SPCLPASSTHROUGH2:
108 if(!fdprintf) dprintf(("QUERYESCSUPPORT: SPCLPASSTHROUGH2"));
109 fdprintf = TRUE;
110 case DOWNLOADHEADER:
111 if(!fdprintf) dprintf(("QUERYESCSUPPORT: DOWNLOADHEADER"));
112 fdprintf = TRUE;
113 case DOWNLOADFACE:
114 if(!fdprintf) dprintf(("QUERYESCSUPPORT: DOWNLOADFACE"));
115 fdprintf = TRUE;
116*/
117 case POSTSCRIPT_IGNORE:
118 if(!fdprintf) dprintf(("QUERYESCSUPPORT: POSTSCRIPT_IGNORE"));
119 fdprintf = TRUE;
120 case EPSPRINTING:
121 {
122 if(!fdprintf) dprintf(("QUERYESCSUPPORT: EPSPRINTING"));
123 fdprintf = TRUE;
124
125 nEscapeSup = POSTSCRIPT_PASSTHROUGH;
126 return Escape(hdc, QUERYESCSUPPORT, sizeof(nEscapeSup), (LPCSTR)&nEscapeSup, NULL);
127 }
128 default:
129 break;
130 }
131 }
132 default:
133 if(cbInput && lpvInData) {
134 ULONG *tmp = (ULONG *)lpvInData;
135 for(int i=0;i<min(16,cbInput/4);i++) {
136 dprintf(("GDI32: Escape par %d: %x", i, *tmp++));
137 }
138 }
139 break;
140 }
141
142 rc = O32_Escape(hdc, nEscape, cbInput, lpvInData, lpvOutData);
143 if(rc == 0) {
144 dprintf(("GDI32: Escape %x %d %d %x %x returned %d (WARNING: might not be implemented!!) ", hdc, nEscape, cbInput, lpvInData, lpvOutData, rc));
145 }
146 else dprintf(("GDI32: Escape %x %d %d %x %x returned %d ", hdc, nEscape, cbInput, lpvInData, lpvOutData, rc));
147
148 return rc;
149}
150//******************************************************************************
151//******************************************************************************
152INT WIN32API ExtEscape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpszInData,
153 INT cbOutput, LPSTR lpszOutData)
154{
155 dprintf(("GDI32: ExtEscape, %x %x %d %x %d %x partly implemented", hdc, nEscape, cbInput, lpszInData, cbOutput, lpszOutData));
156
157 switch(nEscape) {
158 case DOWNLOADHEADER:
159 {
160 dprintf(("DOWNLOADHEADER: hardcoded result"));
161 if(lpszOutData && cbOutput >= 8) {
162 strcpy(lpszOutData, "PM_1.2");
163 return 1;
164 }
165 dprintf(("Not enough room for proc name"));
166 return 0;
167 }
168 }
169 return Escape(hdc, nEscape, cbInput, lpszInData, lpszOutData);
170}
171//******************************************************************************
172//******************************************************************************
173INT WIN32API StartDocA(HDC hdc, const DOCINFOA *lpDocInfo)
174{
175 INT ret;
176
177 if(lpDocInfo) {
178 dprintf(("GDI32: StartDocA %x %x (%s %s %s %x)", hdc, lpDocInfo, lpDocInfo->lpszDocName, lpDocInfo->lpszOutput, lpDocInfo->lpszDatatype, lpDocInfo->fwType));
179 }
180 else dprintf(("GDI32: StartDocA %x %x", hdc, lpDocInfo));
181
182 dprintf(("lpDocInfo->cbSize %x", lpDocInfo->cbSize));
183 dprintf(("lpDocInfo->lpszDocName %s", lpDocInfo->lpszDocName));
184 dprintf(("lpDocInfo->lpszOutput %s", lpDocInfo->lpszOutput));
185 dprintf(("lpDocInfo->lpszDatatype %s", lpDocInfo->lpszDatatype));
186 dprintf(("lpDocInfo->fwType %x", lpDocInfo->fwType));
187
188 ret = O32_StartDoc(hdc, (LPDOCINFOA)lpDocInfo);
189
190 if(ret != 0) {
191 pDCData pHps = (pDCData)OSLibGpiQueryDCData((HPS)hdc);
192 if(pHps)
193 {
194 pHps->Reserved |= DC_FLAG_SEND_POSTSCRIPT_SETUP_STRING;
195 }
196 else DebugInt3();
197 }
198
199 return ret;
200}
201//******************************************************************************
202//******************************************************************************
203INT WIN32API StartDocW(HDC hdc, const DOCINFOW* doc)
204{
205 DOCINFOA docA;
206 INT ret;
207
208 docA.cbSize = doc->cbSize;
209 docA.lpszDocName = doc->lpszDocName ?
210 HEAP_strdupWtoA( GetProcessHeap(), 0, doc->lpszDocName ) : NULL;
211 docA.lpszOutput = doc->lpszOutput ?
212 HEAP_strdupWtoA( GetProcessHeap(), 0, doc->lpszOutput ) : NULL;
213 docA.lpszDatatype = doc->lpszDatatype ?
214 HEAP_strdupWtoA( GetProcessHeap(), 0, doc->lpszDatatype ) : NULL;
215 docA.fwType = doc->fwType;
216
217 ret = StartDocA(hdc, &docA);
218
219 if(docA.lpszDocName)
220 HeapFree( GetProcessHeap(), 0, (LPSTR)docA.lpszDocName );
221 if(docA.lpszOutput)
222 HeapFree( GetProcessHeap(), 0, (LPSTR)docA.lpszOutput );
223 if(docA.lpszDatatype)
224 HeapFree( GetProcessHeap(), 0, (LPSTR)docA.lpszDatatype );
225
226 return ret;
227}
228//******************************************************************************
229//******************************************************************************
230int WIN32API EndDoc( HDC hdc)
231{
232 dprintf(("GDI32: EndDoc %x", hdc));
233 return O32_EndDoc(hdc);
234}
235//******************************************************************************
236//******************************************************************************
237int WIN32API AbortDoc(HDC hdc)
238{
239 dprintf(("GDI32: AbortDoc %x", hdc));
240 return O32_AbortDoc(hdc);
241}
242//******************************************************************************
243//******************************************************************************
244int WIN32API StartPage( HDC hdc)
245{
246 dprintf(("GDI32: StartPage %x", hdc));
247 return O32_StartPage(hdc);
248}
249//******************************************************************************
250//******************************************************************************
251int WIN32API EndPage( HDC hdc)
252{
253 dprintf(("GDI32: EndPage %x", hdc));
254 return O32_EndPage(hdc);
255}
256//******************************************************************************
257//******************************************************************************
258int WIN32API SetAbortProc(HDC hdc, ABORTPROC lpAbortProc)
259{
260 dprintf(("GDI32: SetAbortProc %x %x - stub (1)", hdc, lpAbortProc));
261 return(1);
262}
263//******************************************************************************
264//******************************************************************************
Note: See TracBrowser for help on using the repository browser.