blob: 54ca0200e06668d22ef2833e62ef3ab08f5cf70a [file] [log] [blame]
Alexandre Julliard490a27e1994-06-08 13:57:50 +00001/*
2 * Escape() function.
3 *
4 * Copyright 1994 Bob Amstadt
Alexandre Julliard0e270f41996-08-24 18:26:35 +00005 */
Alexandre Julliard490a27e1994-06-08 13:57:50 +00006
David Luyeree517e81999-02-28 12:27:56 +00007#include <string.h>
Marcus Meissner04c3e1d1999-02-19 10:37:02 +00008#include "wingdi.h"
Alexandre Julliard0e270f41996-08-24 18:26:35 +00009#include "gdi.h"
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000010#include "heap.h"
11#include "ldt.h"
Alexandre Julliard01d63461997-01-20 19:43:45 +000012#include "dc.h"
Alexandre Julliard06c275a1999-05-02 14:32:27 +000013#include "debugtools.h"
Alexandre Julliard46ea8b31998-05-03 19:01:20 +000014
Alexandre Julliard06c275a1999-05-02 14:32:27 +000015DEFAULT_DEBUG_CHANNEL(driver)
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000016
Huw D M Daviesb0dd7171999-07-24 12:13:46 +000017/***********************************************************************
18 * Escape16 [GDI.38]
19 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000020INT16 WINAPI Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput,
21 SEGPTR lpszInData, SEGPTR lpvOutData )
Alexandre Julliard490a27e1994-06-08 13:57:50 +000022{
Alexandre Julliard01d63461997-01-20 19:43:45 +000023 DC * dc = DC_GetDCPtr( hdc );
24 if (!dc || !dc->funcs->pEscape) return 0;
Huw D M Davies304d9a41999-09-13 15:15:45 +000025 if(nEscape == SETABORTPROC) SetAbortProc16(hdc, lpszInData);
Alexandre Julliard0e270f41996-08-24 18:26:35 +000026 return dc->funcs->pEscape( dc, nEscape, cbInput, lpszInData, lpvOutData );
Alexandre Julliard490a27e1994-06-08 13:57:50 +000027}
Alexandre Julliard01d63461997-01-20 19:43:45 +000028
Huw D M Daviesb0dd7171999-07-24 12:13:46 +000029/************************************************************************
30 * Escape [GDI32.200]
31 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000032INT WINAPI Escape( HDC hdc, INT nEscape, INT cbInput,
Huw D M Daviesb0dd7171999-07-24 12:13:46 +000033 LPCSTR lpszInData, LPVOID lpvOutData )
Alexandre Julliard01d63461997-01-20 19:43:45 +000034{
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000035 SEGPTR segin,segout;
Alexandre Julliarda3960291999-02-26 11:11:13 +000036 INT ret;
Huw D M Davies304d9a41999-09-13 15:15:45 +000037 DC * dc = DC_GetDCPtr( hdc );
38 if (!dc || !dc->funcs->pEscape) return 0;
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000039
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000040 segin = (SEGPTR)lpszInData;
41 segout = (SEGPTR)lpvOutData;
Alexandre Julliard670cdc41997-08-24 16:00:30 +000042 switch (nEscape) {
Huw D M Daviese39b6761999-05-17 16:20:51 +000043 /* Escape(hdc,QUERYESCSUPPORT,LPINT,NULL) */
Huw D M Davies56a86441999-09-19 14:13:39 +000044 /* Escape(hdc,CLIP_TO_PATH,LPINT,NULL) */
Huw D M Daviese39b6761999-05-17 16:20:51 +000045 case QUERYESCSUPPORT:
Huw D M Davies56a86441999-09-19 14:13:39 +000046 case CLIP_TO_PATH:
Huw D M Daviese39b6761999-05-17 16:20:51 +000047 {
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000048 LPINT16 x = (LPINT16)SEGPTR_NEW(INT16);
Alexandre Julliarda3960291999-02-26 11:11:13 +000049 *x = *(INT*)lpszInData;
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000050 segin = SEGPTR_GET(x);
Huw D M Daviesd0cbe851999-05-22 18:40:36 +000051 cbInput = sizeof(INT16);
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000052 break;
Huw D M Daviese39b6761999-05-17 16:20:51 +000053 }
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000054
55 /* Escape(hdc,GETSCALINGFACTOR,NULL,LPPOINT32) */
56 /* Escape(hdc,GETPHYSPAGESIZE,NULL,LPPOINT32) */
57 /* Escape(hdc,GETPRINTINGOFFSET,NULL,LPPOINT32) */
58
59 case GETSCALINGFACTOR:
60 case GETPHYSPAGESIZE:
61 case GETPRINTINGOFFSET:
62 segout = SEGPTR_GET(SEGPTR_NEW(POINT16));
Huw D M Daviesd0cbe851999-05-22 18:40:36 +000063 cbInput = sizeof(POINT16);
Alexandre Julliard3db94ef1997-09-28 17:43:24 +000064 break;
Alexandre Julliard491502b1997-11-01 19:08:16 +000065
Huw D M Davies304d9a41999-09-13 15:15:45 +000066 /* Escape(hdc,EXT_DEVICE_CAPS,LPINT,LPDWORD) */
67 case EXT_DEVICE_CAPS:
68 {
69 LPINT16 lpIndex = (LPINT16)SEGPTR_NEW(INT16);
70 LPDWORD lpCaps = (LPDWORD)SEGPTR_NEW(DWORD);
71 *lpIndex = *(INT*)lpszInData;
72
73 segin = SEGPTR_GET(lpIndex);
74 segout = SEGPTR_GET(lpCaps);
75 cbInput = sizeof(INT16);
76 break;
77 }
Alexandre Julliard491502b1997-11-01 19:08:16 +000078
Huw D M Davies56a86441999-09-19 14:13:39 +000079 /* Escape(hdc,SETLINECAP,LPINT,LPINT) */
80 case SETLINECAP:
81 case SETLINEJOIN:
82 case SETMITERLIMIT:
83 {
84 LPINT16 new = (LPINT16)SEGPTR_NEW(INT16);
85 LPINT16 old = (LPINT16)SEGPTR_NEW(INT16);
86 *new = *(INT*)lpszInData;
87 segin = SEGPTR_GET(new);
88 segout = SEGPTR_GET(old);
89 cbInput = sizeof(INT16);
90 break;
91 }
Huw D M Davies304d9a41999-09-13 15:15:45 +000092 /* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */
Alexandre Julliard491502b1997-11-01 19:08:16 +000093 case GETTECHNOLOGY: {
94 segout = SEGPTR_GET(SEGPTR_ALLOC(200)); /* enough I hope */
95 break;
96
97 }
98
99 /* Escape(hdc,ENABLEPAIRKERNING,LPINT16,LPINT16); */
100
101 case ENABLEPAIRKERNING: {
102 LPINT16 enab = SEGPTR_NEW(INT16);
103 segout = SEGPTR_GET(SEGPTR_NEW(INT16));
104 segin = SEGPTR_GET(enab);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000105 *enab = *(INT*)lpszInData;
Huw D M Daviesd0cbe851999-05-22 18:40:36 +0000106 cbInput = sizeof(INT16);
Alexandre Julliard491502b1997-11-01 19:08:16 +0000107 break;
108 }
109
110 /* Escape(hdc,GETFACENAME,NULL,LPSTR); */
111
112 case GETFACENAME: {
113 segout = SEGPTR_GET(SEGPTR_ALLOC(200));
114 break;
115 }
Huw D M Davies6fafe9e1998-11-01 14:06:04 +0000116
Huw D M Daviesc0da44e41999-10-31 01:49:30 +0000117 /* Escape(hdc,STARTDOC,LPSTR,LPDOCINFOA);
118 * lpvOutData is actually a pointer to the DocInfo structure and used as
119 * a second input parameter
120 */
Huw D M Davies6fafe9e1998-11-01 14:06:04 +0000121
122 case STARTDOC: /* string may not be \0 terminated */
123 if(lpszInData) {
124 char *cp = SEGPTR_ALLOC(cbInput);
125 memcpy(cp, lpszInData, cbInput);
126 segin = SEGPTR_GET(cp);
127 } else
128 segin = 0;
Huw D M Daviesc0da44e41999-10-31 01:49:30 +0000129
130 if(lpvOutData) {
131 DOCINFO16 *lpsegdoc = SEGPTR_NEW(DOCINFO16);
132 DOCINFOA *lpdoc = lpvOutData;
133 memset(lpsegdoc, 0, sizeof(*lpsegdoc));
134 lpsegdoc->cbSize = sizeof(*lpsegdoc);
135 lpsegdoc->lpszDocName = SEGPTR_GET(SEGPTR_STRDUP(lpdoc->lpszDocName));
136 lpsegdoc->lpszOutput = SEGPTR_GET(SEGPTR_STRDUP(lpdoc->lpszOutput));
137 lpsegdoc->lpszDatatype = SEGPTR_GET(SEGPTR_STRDUP(lpdoc->lpszDatatype));
138 lpsegdoc->fwType = lpdoc->fwType;
139 segout = SEGPTR_GET(lpsegdoc);
140 }
Huw D M Davies6fafe9e1998-11-01 14:06:04 +0000141 break;
142
Huw D M Davies304d9a41999-09-13 15:15:45 +0000143 case SETABORTPROC:
144 SetAbortProc(hdc, (ABORTPROC)lpszInData);
145 break;
146
Huw D M Davies56a86441999-09-19 14:13:39 +0000147 /* Escape(hdc,END_PATH,PATHINFO,NULL); */
148 case END_PATH:
149 {
150 BYTE *p = SEGPTR_ALLOC(cbInput);
151 memcpy(p, lpszInData, cbInput);
152 segin = SEGPTR_GET(p);
153 break;
154 }
155
Huw D M Davies6fafe9e1998-11-01 14:06:04 +0000156 default:
157 break;
158
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000159 }
Huw D M Davies6fafe9e1998-11-01 14:06:04 +0000160
Huw D M Davies304d9a41999-09-13 15:15:45 +0000161 ret = dc->funcs->pEscape( dc, nEscape, cbInput, segin, segout );
Huw D M Davies6fafe9e1998-11-01 14:06:04 +0000162
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000163 switch(nEscape) {
164 case QUERYESCSUPPORT:
165 if (ret)
Alexandre Julliard06c275a1999-05-02 14:32:27 +0000166 TRACE("target DC implements Escape %d\n",nEscape);
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000167 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
168 break;
Huw D M Davies56a86441999-09-19 14:13:39 +0000169
Huw D M Daviesd0cbe851999-05-22 18:40:36 +0000170 case SETLINECAP:
171 case SETLINEJOIN:
Huw D M Davies56a86441999-09-19 14:13:39 +0000172 case SETMITERLIMIT:
173 *(LPINT)lpvOutData = *(LPINT16)PTR_SEG_TO_LIN(segout);
Huw D M Daviese39b6761999-05-17 16:20:51 +0000174 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
Huw D M Davies56a86441999-09-19 14:13:39 +0000175 SEGPTR_FREE(PTR_SEG_TO_LIN(segout));
Huw D M Daviese39b6761999-05-17 16:20:51 +0000176 break;
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000177 case GETSCALINGFACTOR:
178 case GETPRINTINGOFFSET:
179 case GETPHYSPAGESIZE: {
180 LPPOINT16 x = (LPPOINT16)PTR_SEG_TO_LIN(segout);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000181 CONV_POINT16TO32(x,(LPPOINT)lpvOutData);
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000182 SEGPTR_FREE(x);
183 break;
184 }
Huw D M Davies304d9a41999-09-13 15:15:45 +0000185 case EXT_DEVICE_CAPS:
186 *(LPDWORD)lpvOutData = *(LPDWORD)PTR_SEG_TO_LIN(segout);
187 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
188 SEGPTR_FREE(PTR_SEG_TO_LIN(segout));
189 break;
190
Alexandre Julliard491502b1997-11-01 19:08:16 +0000191 case GETTECHNOLOGY: {
192 LPSTR x=PTR_SEG_TO_LIN(segout);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000193 lstrcpyA(lpvOutData,x);
Alexandre Julliard491502b1997-11-01 19:08:16 +0000194 SEGPTR_FREE(x);
Alexandre Julliarde658d821997-11-30 17:45:40 +0000195 break;
Alexandre Julliard491502b1997-11-01 19:08:16 +0000196 }
197 case ENABLEPAIRKERNING: {
198 LPINT16 enab = (LPINT16)PTR_SEG_TO_LIN(segout);
199
Alexandre Julliarda3960291999-02-26 11:11:13 +0000200 *(LPINT)lpvOutData = *enab;
Alexandre Julliard491502b1997-11-01 19:08:16 +0000201 SEGPTR_FREE(enab);
202 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
Alexandre Julliarde658d821997-11-30 17:45:40 +0000203 break;
Alexandre Julliard491502b1997-11-01 19:08:16 +0000204 }
205 case GETFACENAME: {
206 LPSTR x = (LPSTR)PTR_SEG_TO_LIN(segout);
Alexandre Julliarda3960291999-02-26 11:11:13 +0000207 lstrcpyA(lpvOutData,x);
Alexandre Julliard491502b1997-11-01 19:08:16 +0000208 SEGPTR_FREE(x);
209 break;
210 }
Huw D M Daviesc0da44e41999-10-31 01:49:30 +0000211 case STARTDOC: {
212 DOCINFO16 *doc = PTR_SEG_TO_LIN(segout);
213 SEGPTR_FREE(PTR_SEG_TO_LIN(doc->lpszDocName));
214 SEGPTR_FREE(PTR_SEG_TO_LIN(doc->lpszOutput));
215 SEGPTR_FREE(PTR_SEG_TO_LIN(doc->lpszDatatype));
216 SEGPTR_FREE(doc);
217 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
218 break;
219 }
220
Huw D M Davies56a86441999-09-19 14:13:39 +0000221 case CLIP_TO_PATH:
222 case END_PATH:
Huw D M Davies6fafe9e1998-11-01 14:06:04 +0000223 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
224 break;
225
Alexandre Julliard3db94ef1997-09-28 17:43:24 +0000226 default:
227 break;
228 }
229 return ret;
230}
231
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000232/******************************************************************************
Alexandre Julliard8da12c41999-01-17 16:55:11 +0000233 * ExtEscape [GDI32.95]
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000234 *
235 * PARAMS
236 * hdc [I] Handle to device context
237 * nEscape [I] Escape function
238 * cbInput [I] Number of bytes in input structure
239 * lpszInData [I] Pointer to input structure
240 * cbOutput [I] Number of bytes in output structure
241 * lpszOutData [O] Pointer to output structure
242 *
243 * RETURNS
244 * Success: >0
245 * Not implemented: 0
246 * Failure: <0
247 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000248INT WINAPI ExtEscape( HDC hdc, INT nEscape, INT cbInput,
Huw D M Daviesb0dd7171999-07-24 12:13:46 +0000249 LPCSTR lpszInData, INT cbOutput, LPSTR lpszOutData )
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000250{
Huw D M Daviesb0dd7171999-07-24 12:13:46 +0000251 char *inBuf, *outBuf;
252 INT ret;
253
254 inBuf = SEGPTR_ALLOC(cbInput);
255 memcpy(inBuf, lpszInData, cbInput);
256 outBuf = cbOutput ? SEGPTR_ALLOC(cbOutput) : NULL;
257 ret = Escape16( hdc, nEscape, cbInput, SEGPTR_GET(inBuf),
258 SEGPTR_GET(outBuf) );
259 SEGPTR_FREE(inBuf);
260 if(outBuf) {
261 memcpy(lpszOutData, outBuf, cbOutput);
262 SEGPTR_FREE(outBuf);
263 }
264 return ret;
Alexandre Julliard01d63461997-01-20 19:43:45 +0000265}
Alexandre Julliardd30dfd21998-09-27 18:28:36 +0000266
Paul Quinn1beaae51998-12-15 15:38:36 +0000267/*******************************************************************
268 * DrawEscape [GDI32.74]
269 *
270 *
271 */
Alexandre Julliarda3960291999-02-26 11:11:13 +0000272INT WINAPI DrawEscape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpszInData)
Paul Quinn1beaae51998-12-15 15:38:36 +0000273{
Alexandre Julliard06c275a1999-05-02 14:32:27 +0000274 FIXME("DrawEscape, stub\n");
Paul Quinn1beaae51998-12-15 15:38:36 +0000275 return 0;
276}