Removed a lot of occurences of windows.h (and added necessary other
[wine] / graphics / escape.c
1 /*
2  * Escape() function.
3  *
4  * Copyright 1994  Bob Amstadt
5  */
6
7 #include <stdio.h>
8 #include "wingdi.h"
9 #include "gdi.h"
10 #include "heap.h"
11 #include "ldt.h"
12 #include "dc.h"
13 #include <debug.h>
14
15
16 INT16 WINAPI Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput,
17                        SEGPTR lpszInData, SEGPTR lpvOutData )
18 {
19     DC * dc = DC_GetDCPtr( hdc );
20     if (!dc || !dc->funcs->pEscape) return 0;
21     return dc->funcs->pEscape( dc, nEscape, cbInput, lpszInData, lpvOutData );
22 }
23
24 INT32 WINAPI Escape32( HDC32 hdc, INT32 nEscape, INT32 cbInput,
25                        LPCSTR lpszInData, LPVOID lpvOutData )
26 {
27     DC          *dc = DC_GetDCPtr( hdc );
28     SEGPTR      segin,segout;
29     INT32       ret;
30
31     if (!dc || !dc->funcs->pEscape) return 0;
32     segin       = (SEGPTR)lpszInData;
33     segout      = (SEGPTR)lpvOutData;
34     switch (nEscape) {
35         /* Escape(hdc,QUERYESCSUPPORT,LPINT32,NULL) */
36     case QUERYESCSUPPORT: {
37         LPINT16 x = (LPINT16)SEGPTR_NEW(INT16);
38         *x = *(INT32*)lpszInData;
39         segin = SEGPTR_GET(x);
40         break;
41     }
42
43         /* Escape(hdc,GETSCALINGFACTOR,NULL,LPPOINT32) */
44         /* Escape(hdc,GETPHYSPAGESIZE,NULL,LPPOINT32) */
45         /* Escape(hdc,GETPRINTINGOFFSET,NULL,LPPOINT32) */
46
47     case GETSCALINGFACTOR:
48     case GETPHYSPAGESIZE:
49     case GETPRINTINGOFFSET:
50         segout = SEGPTR_GET(SEGPTR_NEW(POINT16));
51         break;
52
53       /* Escape(hdc,GETTECHNOLOGY,NULL,LPSTR); */
54
55     case GETTECHNOLOGY: {
56         segout = SEGPTR_GET(SEGPTR_ALLOC(200)); /* enough I hope */
57         break;
58
59     }
60
61       /* Escape(hdc,ENABLEPAIRKERNING,LPINT16,LPINT16); */
62
63     case ENABLEPAIRKERNING: {
64         LPINT16 enab = SEGPTR_NEW(INT16);
65         segout = SEGPTR_GET(SEGPTR_NEW(INT16));
66         segin = SEGPTR_GET(enab);
67         *enab = *(INT32*)lpszInData;
68         break;
69     }
70
71       /* Escape(hdc,GETFACENAME,NULL,LPSTR); */
72
73     case GETFACENAME: {
74         segout = SEGPTR_GET(SEGPTR_ALLOC(200));
75         break;
76     }
77
78       /* Escape(hdc,STARTDOC,LPSTR,NULL); */
79
80     case STARTDOC: /* string may not be \0 terminated */
81         if(lpszInData) {
82             char *cp = SEGPTR_ALLOC(cbInput);
83             memcpy(cp, lpszInData, cbInput);
84             segin = SEGPTR_GET(cp);
85         } else
86             segin = 0;
87         break;
88
89     default:
90         break;
91
92     }
93
94     ret = dc->funcs->pEscape( dc, nEscape, cbInput, segin, segout );
95
96     switch(nEscape) {
97     case QUERYESCSUPPORT:
98         if (ret)
99                 TRACE(driver,"target DC implements Escape %d\n",nEscape);
100         SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
101         break;
102     case GETSCALINGFACTOR:
103     case GETPRINTINGOFFSET:
104     case GETPHYSPAGESIZE: {
105         LPPOINT16 x = (LPPOINT16)PTR_SEG_TO_LIN(segout);
106         CONV_POINT16TO32(x,(LPPOINT32)lpvOutData);
107         SEGPTR_FREE(x);
108         break;
109     }
110     case GETTECHNOLOGY: {
111         LPSTR x=PTR_SEG_TO_LIN(segout);
112         lstrcpy32A(lpvOutData,x);
113         SEGPTR_FREE(x);
114         break;
115     }
116     case ENABLEPAIRKERNING: {
117         LPINT16 enab = (LPINT16)PTR_SEG_TO_LIN(segout);
118
119         *(LPINT32)lpvOutData = *enab;
120         SEGPTR_FREE(enab);
121         SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
122         break;
123     }
124     case GETFACENAME: {
125         LPSTR x = (LPSTR)PTR_SEG_TO_LIN(segout);
126         lstrcpy32A(lpvOutData,x);
127         SEGPTR_FREE(x);
128         break;
129     }
130     case STARTDOC:
131         SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
132         break;
133
134     default:
135         break;
136     }
137     return ret;
138 }
139
140 /******************************************************************************
141  *              ExtEscape       [GDI32.95]
142  *
143  * PARAMS
144  *    hdc         [I] Handle to device context
145  *    nEscape     [I] Escape function
146  *    cbInput     [I] Number of bytes in input structure
147  *    lpszInData  [I] Pointer to input structure
148  *    cbOutput    [I] Number of bytes in output structure
149  *    lpszOutData [O] Pointer to output structure
150  *
151  * RETURNS
152  *    Success: >0
153  *    Not implemented: 0
154  *    Failure: <0
155  */
156 INT32 WINAPI ExtEscape( HDC32 hdc, INT32 nEscape, INT32 cbInput, 
157                         LPCSTR lpszInData, INT32 cbOutput, LPSTR lpszOutData )
158 {
159     FIXME(driver,"(0x%04x,0x%x,%d,%s,%d,%p):stub\n",
160           hdc,nEscape,cbInput,debugstr_a(lpszInData),cbOutput,lpszOutData);
161     return 0;
162 }
163
164 /*******************************************************************
165  *      DrawEscape [GDI32.74]
166  *
167  *
168  */
169 INT32 WINAPI DrawEscape(HDC32 hdc, INT32 nEscape, INT32 cbInput, LPCSTR lpszInData)
170 {
171     FIXME(gdi, "DrawEscape, stub\n");
172     return 0;
173 }