Add a few more 32->16 Escape conversions.
[wine.git] / graphics / escape.c
blobc2ca6705b93b26ebadfe312d6b8e6c5523f1e521
1 /*
2 * Escape() function.
4 * Copyright 1994 Bob Amstadt
5 */
7 #include <string.h>
8 #include "wingdi.h"
9 #include "gdi.h"
10 #include "heap.h"
11 #include "ldt.h"
12 #include "dc.h"
13 #include "debugtools.h"
15 DEFAULT_DEBUG_CHANNEL(driver)
18 INT16 WINAPI Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput,
19 SEGPTR lpszInData, SEGPTR lpvOutData )
21 DC * dc = DC_GetDCPtr( hdc );
22 if (!dc || !dc->funcs->pEscape) return 0;
23 return dc->funcs->pEscape( dc, nEscape, cbInput, lpszInData, lpvOutData );
26 INT WINAPI Escape( HDC hdc, INT nEscape, INT cbInput,
27 LPCSTR lpszInData, LPVOID lpvOutData )
29 DC *dc = DC_GetDCPtr( hdc );
30 SEGPTR segin,segout;
31 INT ret;
33 if (!dc || !dc->funcs->pEscape) return 0;
34 segin = (SEGPTR)lpszInData;
35 segout = (SEGPTR)lpvOutData;
36 switch (nEscape) {
37 /* Escape(hdc,QUERYESCSUPPORT,LPINT,NULL) */
38 /* Escape(hdc,EXT_DEVICE_CAPS,LPINT,NULL) */
39 /* Escape(hdc,SETLINECAP,LPINT,NULL) */
40 case QUERYESCSUPPORT:
41 case EXT_DEVICE_CAPS:
42 case SETLINECAP:
43 case SETLINEJOIN:
45 LPINT16 x = (LPINT16)SEGPTR_NEW(INT16);
46 *x = *(INT*)lpszInData;
47 segin = SEGPTR_GET(x);
48 cbInput = sizeof(INT16);
49 break;
52 /* Escape(hdc,GETSCALINGFACTOR,NULL,LPPOINT32) */
53 /* Escape(hdc,GETPHYSPAGESIZE,NULL,LPPOINT32) */
54 /* Escape(hdc,GETPRINTINGOFFSET,NULL,LPPOINT32) */
56 case GETSCALINGFACTOR:
57 case GETPHYSPAGESIZE:
58 case GETPRINTINGOFFSET:
59 segout = SEGPTR_GET(SEGPTR_NEW(POINT16));
60 cbInput = sizeof(POINT16);
61 break;
63 /* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */
65 case GETTECHNOLOGY: {
66 segout = SEGPTR_GET(SEGPTR_ALLOC(200)); /* enough I hope */
67 break;
71 /* Escape(hdc,ENABLEPAIRKERNING,LPINT16,LPINT16); */
73 case ENABLEPAIRKERNING: {
74 LPINT16 enab = SEGPTR_NEW(INT16);
75 segout = SEGPTR_GET(SEGPTR_NEW(INT16));
76 segin = SEGPTR_GET(enab);
77 *enab = *(INT*)lpszInData;
78 cbInput = sizeof(INT16);
79 break;
82 /* Escape(hdc,GETFACENAME,NULL,LPSTR); */
84 case GETFACENAME: {
85 segout = SEGPTR_GET(SEGPTR_ALLOC(200));
86 break;
89 /* Escape(hdc,STARTDOC,LPSTR,NULL); */
91 case STARTDOC: /* string may not be \0 terminated */
92 if(lpszInData) {
93 char *cp = SEGPTR_ALLOC(cbInput);
94 memcpy(cp, lpszInData, cbInput);
95 segin = SEGPTR_GET(cp);
96 } else
97 segin = 0;
98 break;
100 default:
101 break;
105 ret = dc->funcs->pEscape( dc, nEscape, cbInput, segin, segout );
107 switch(nEscape) {
108 case QUERYESCSUPPORT:
109 if (ret)
110 TRACE("target DC implements Escape %d\n",nEscape);
111 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
112 break;
113 case EXT_DEVICE_CAPS:
114 case SETLINECAP:
115 case SETLINEJOIN:
116 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
117 break;
118 case GETSCALINGFACTOR:
119 case GETPRINTINGOFFSET:
120 case GETPHYSPAGESIZE: {
121 LPPOINT16 x = (LPPOINT16)PTR_SEG_TO_LIN(segout);
122 CONV_POINT16TO32(x,(LPPOINT)lpvOutData);
123 SEGPTR_FREE(x);
124 break;
126 case GETTECHNOLOGY: {
127 LPSTR x=PTR_SEG_TO_LIN(segout);
128 lstrcpyA(lpvOutData,x);
129 SEGPTR_FREE(x);
130 break;
132 case ENABLEPAIRKERNING: {
133 LPINT16 enab = (LPINT16)PTR_SEG_TO_LIN(segout);
135 *(LPINT)lpvOutData = *enab;
136 SEGPTR_FREE(enab);
137 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
138 break;
140 case GETFACENAME: {
141 LPSTR x = (LPSTR)PTR_SEG_TO_LIN(segout);
142 lstrcpyA(lpvOutData,x);
143 SEGPTR_FREE(x);
144 break;
146 case STARTDOC:
147 SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
148 break;
150 default:
151 break;
153 return ret;
156 /******************************************************************************
157 * ExtEscape [GDI32.95]
159 * PARAMS
160 * hdc [I] Handle to device context
161 * nEscape [I] Escape function
162 * cbInput [I] Number of bytes in input structure
163 * lpszInData [I] Pointer to input structure
164 * cbOutput [I] Number of bytes in output structure
165 * lpszOutData [O] Pointer to output structure
167 * RETURNS
168 * Success: >0
169 * Not implemented: 0
170 * Failure: <0
172 INT WINAPI ExtEscape( HDC hdc, INT nEscape, INT cbInput,
173 LPCSTR lpszInData, INT cbOutput, LPSTR lpszOutData )
175 FIXME("(0x%04x,0x%x,%d,%s,%d,%p):stub\n",
176 hdc,nEscape,cbInput,debugstr_a(lpszInData),cbOutput,lpszOutData);
177 return 0;
180 /*******************************************************************
181 * DrawEscape [GDI32.74]
185 INT WINAPI DrawEscape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpszInData)
187 FIXME("DrawEscape, stub\n");
188 return 0;