Initialize Xlib threading support to see what it breaks...
[wine.git] / graphics / escape.c
bloba269a177c8d798c6a47714050d536f177edfc58b
1 /*
2 * Escape() function.
4 * Copyright 1994 Bob Amstadt
5 * Copyright 2001 Alexandre Julliard
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <stdarg.h>
23 #include <string.h>
24 #include "windef.h"
25 #include "winbase.h"
26 #include "wingdi.h"
27 #include "gdi.h"
28 #include "wine/debug.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(driver);
33 /************************************************************************
34 * Escape [GDI32.@]
36 INT WINAPI Escape( HDC hdc, INT escape, INT in_count, LPCSTR in_data, LPVOID out_data )
38 INT ret;
39 POINT *pt;
41 switch (escape)
43 case ABORTDOC:
44 return AbortDoc( hdc );
46 case ENDDOC:
47 return EndDoc( hdc );
49 case GETPHYSPAGESIZE:
50 pt = out_data;
51 pt->x = GetDeviceCaps( hdc, PHYSICALWIDTH );
52 pt->y = GetDeviceCaps( hdc, PHYSICALHEIGHT );
53 return 1;
55 case GETPRINTINGOFFSET:
56 pt = out_data;
57 pt->x = GetDeviceCaps( hdc, PHYSICALOFFSETX );
58 pt->y = GetDeviceCaps( hdc, PHYSICALOFFSETY );
59 return 1;
61 case GETSCALINGFACTOR:
62 pt = out_data;
63 pt->x = GetDeviceCaps( hdc, SCALINGFACTORX );
64 pt->y = GetDeviceCaps( hdc, SCALINGFACTORY );
65 return 1;
67 case NEWFRAME:
68 return EndPage( hdc );
70 case SETABORTPROC:
71 return SetAbortProc( hdc, (ABORTPROC)in_data );
73 case STARTDOC:
75 DOCINFOA doc;
76 char *name = NULL;
78 /* in_data may not be 0 terminated so we must copy it */
79 if (in_data)
81 name = HeapAlloc( GetProcessHeap(), 0, in_count+1 );
82 memcpy( name, in_data, in_count );
83 name[in_count] = 0;
85 /* out_data is actually a pointer to the DocInfo structure and used as
86 * a second input parameter */
87 if (out_data) doc = *(DOCINFOA *)out_data;
88 else
90 doc.cbSize = sizeof(doc);
91 doc.lpszOutput = NULL;
92 doc.lpszDatatype = NULL;
93 doc.fwType = 0;
95 doc.lpszDocName = name;
96 ret = StartDocA( hdc, &doc );
97 if (name) HeapFree( GetProcessHeap(), 0, name );
98 if (ret > 0) ret = StartPage( hdc );
99 return ret;
102 case QUERYESCSUPPORT:
104 INT *ptr = (INT *)in_data;
105 if (in_count < sizeof(INT)) return 0;
106 switch(*ptr)
108 case ABORTDOC:
109 case ENDDOC:
110 case GETPHYSPAGESIZE:
111 case GETPRINTINGOFFSET:
112 case GETSCALINGFACTOR:
113 case NEWFRAME:
114 case QUERYESCSUPPORT:
115 case SETABORTPROC:
116 case STARTDOC:
117 return TRUE;
119 break;
123 /* if not handled internally, pass it to the driver */
124 return ExtEscape( hdc, escape, in_count, in_data, 0, out_data );
128 /******************************************************************************
129 * ExtEscape [GDI32.@]
131 * PARAMS
132 * hdc [I] Handle to device context
133 * nEscape [I] Escape function
134 * cbInput [I] Number of bytes in input structure
135 * lpszInData [I] Pointer to input structure
136 * cbOutput [I] Number of bytes in output structure
137 * lpszOutData [O] Pointer to output structure
139 * RETURNS
140 * Success: >0
141 * Not implemented: 0
142 * Failure: <0
144 INT WINAPI ExtEscape( HDC hdc, INT nEscape, INT cbInput, LPCSTR lpszInData,
145 INT cbOutput, LPSTR lpszOutData )
147 INT ret = 0;
148 DC * dc = DC_GetDCPtr( hdc );
149 if (dc)
151 if (dc->funcs->pExtEscape)
152 ret = dc->funcs->pExtEscape( dc->physDev, nEscape, cbInput, lpszInData, cbOutput, lpszOutData );
153 GDI_ReleaseObj( hdc );
155 return ret;
159 /*******************************************************************
160 * DrawEscape [GDI32.@]
164 INT WINAPI DrawEscape(HDC hdc, INT nEscape, INT cbInput, LPCSTR lpszInData)
166 FIXME("DrawEscape, stub\n");
167 return 0;