d3d9: Use color_match() in test_vshader_input().
[wine] / dlls / gdi32 / enhmfdrv / dc.c
1 /*
2  * Enhanced MetaFile driver dc value functions
3  *
4  * Copyright 1999 Huw D M Davies
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "enhmfdrv/enhmetafiledrv.h"
22 #include "wine/debug.h"
23
24 WINE_DEFAULT_DEBUG_CHANNEL(enhmetafile);
25
26 INT EMFDRV_SaveDC( PHYSDEV dev )
27 {
28     EMRSAVEDC emr;
29     emr.emr.iType = EMR_SAVEDC;
30     emr.emr.nSize = sizeof(emr);
31     return EMFDRV_WriteRecord( dev, &emr.emr );
32 }
33
34 BOOL EMFDRV_RestoreDC( PHYSDEV dev, INT level )
35 {
36     EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev;
37     DC *dc = get_dc_ptr( physDev->hdc );
38     EMRRESTOREDC emr;
39
40     emr.emr.iType = EMR_RESTOREDC;
41     emr.emr.nSize = sizeof(emr);
42
43     if (level < 0)
44         emr.iRelative = level;
45     else
46         emr.iRelative = level - dc->saveLevel - 1;
47
48     EMFDRV_WriteRecord( dev, &emr.emr );
49
50     release_dc_ptr( dc );
51     return TRUE;
52 }
53
54 UINT EMFDRV_SetTextAlign( PHYSDEV dev, UINT align )
55 {
56     EMRSETTEXTALIGN emr;
57     emr.emr.iType = EMR_SETTEXTALIGN;
58     emr.emr.nSize = sizeof(emr);
59     emr.iMode = align;
60     return EMFDRV_WriteRecord( dev, &emr.emr );
61 }
62
63 BOOL EMFDRV_SetTextJustification(PHYSDEV dev, INT nBreakExtra, INT nBreakCount)
64 {
65     EMRSETTEXTJUSTIFICATION emr;
66     emr.emr.iType = EMR_SETTEXTJUSTIFICATION;
67     emr.emr.nSize = sizeof(emr);
68     emr.nBreakExtra = nBreakExtra;
69     emr.nBreakCount = nBreakCount;
70     return EMFDRV_WriteRecord(dev, &emr.emr);
71 }
72
73 INT EMFDRV_SetBkMode( PHYSDEV dev, INT mode )
74 {
75     EMRSETBKMODE emr;
76     emr.emr.iType = EMR_SETBKMODE;
77     emr.emr.nSize = sizeof(emr);
78     emr.iMode = mode;
79     return EMFDRV_WriteRecord( dev, &emr.emr );
80 }
81
82 INT EMFDRV_SetROP2( PHYSDEV dev, INT rop )
83 {
84     EMRSETROP2 emr;
85     emr.emr.iType = EMR_SETROP2;
86     emr.emr.nSize = sizeof(emr);
87     emr.iMode = rop;
88     return EMFDRV_WriteRecord( dev, &emr.emr );
89 }
90
91 INT EMFDRV_SetPolyFillMode( PHYSDEV dev, INT mode )
92 {
93     EMRSETPOLYFILLMODE emr;
94     emr.emr.iType = EMR_SETPOLYFILLMODE;
95     emr.emr.nSize = sizeof(emr);
96     emr.iMode = mode;
97     return EMFDRV_WriteRecord( dev, &emr.emr );
98 }
99
100 INT EMFDRV_SetStretchBltMode( PHYSDEV dev, INT mode )
101 {
102     EMRSETSTRETCHBLTMODE emr;
103     emr.emr.iType = EMR_SETSTRETCHBLTMODE;
104     emr.emr.nSize = sizeof(emr);
105     emr.iMode = mode;
106     return EMFDRV_WriteRecord( dev, &emr.emr );
107 }
108
109 INT EMFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
110 {
111     EMREXCLUDECLIPRECT emr;
112     emr.emr.iType      = EMR_EXCLUDECLIPRECT;
113     emr.emr.nSize      = sizeof(emr);
114     emr.rclClip.left   = left;
115     emr.rclClip.top    = top;
116     emr.rclClip.right  = right;
117     emr.rclClip.bottom = bottom;
118     return EMFDRV_WriteRecord( dev, &emr.emr );
119 }
120
121 INT EMFDRV_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom)
122 {
123     EMRINTERSECTCLIPRECT emr;
124     emr.emr.iType      = EMR_INTERSECTCLIPRECT;
125     emr.emr.nSize      = sizeof(emr);
126     emr.rclClip.left   = left;
127     emr.rclClip.top    = top;
128     emr.rclClip.right  = right;
129     emr.rclClip.bottom = bottom;
130     return EMFDRV_WriteRecord( dev, &emr.emr );
131 }
132
133 INT EMFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y )
134 {
135     EMROFFSETCLIPRGN emr;
136     emr.emr.iType   = EMR_OFFSETCLIPRGN;
137     emr.emr.nSize   = sizeof(emr);
138     emr.ptlOffset.x = x;
139     emr.ptlOffset.y = y;
140     return EMFDRV_WriteRecord( dev, &emr.emr );
141 }
142
143 INT EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode )
144 {
145     EMREXTSELECTCLIPRGN *emr;
146     DWORD size, rgnsize;
147     BOOL ret;
148
149     if (!hrgn)
150     {
151         if (mode != RGN_COPY) return ERROR;
152         rgnsize = 0;
153     }
154     else rgnsize = GetRegionData( hrgn, 0, NULL );
155
156     size = rgnsize + offsetof(EMREXTSELECTCLIPRGN,RgnData);
157     emr = HeapAlloc( GetProcessHeap(), 0, size );
158     if (rgnsize) GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData );
159
160     emr->emr.iType = EMR_EXTSELECTCLIPRGN;
161     emr->emr.nSize = size;
162     emr->cbRgnData = rgnsize;
163     emr->iMode     = mode;
164
165     ret = EMFDRV_WriteRecord( dev, &emr->emr );
166     HeapFree( GetProcessHeap(), 0, emr );
167     return ret ? SIMPLEREGION : ERROR;
168 }
169
170 DWORD EMFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags )
171 {
172     EMRSETMAPPERFLAGS emr;
173
174     emr.emr.iType = EMR_SETMAPPERFLAGS;
175     emr.emr.nSize = sizeof(emr);
176     emr.dwFlags   = flags;
177
178     return EMFDRV_WriteRecord( dev, &emr.emr );
179 }
180
181 BOOL EMFDRV_AbortPath( PHYSDEV dev )
182 {
183     EMRABORTPATH emr;
184
185     emr.emr.iType = EMR_ABORTPATH;
186     emr.emr.nSize = sizeof(emr);
187
188     return EMFDRV_WriteRecord( dev, &emr.emr );
189 }
190
191 BOOL EMFDRV_BeginPath( PHYSDEV dev )
192 {
193     EMRBEGINPATH emr;
194
195     emr.emr.iType = EMR_BEGINPATH;
196     emr.emr.nSize = sizeof(emr);
197
198     return EMFDRV_WriteRecord( dev, &emr.emr );
199 }
200
201 BOOL EMFDRV_CloseFigure( PHYSDEV dev )
202 {
203     EMRCLOSEFIGURE emr;
204
205     emr.emr.iType = EMR_CLOSEFIGURE;
206     emr.emr.nSize = sizeof(emr);
207
208     return EMFDRV_WriteRecord( dev, &emr.emr );
209 }
210
211 BOOL EMFDRV_EndPath( PHYSDEV dev )
212 {
213     EMRENDPATH emr;
214
215     emr.emr.iType = EMR_ENDPATH;
216     emr.emr.nSize = sizeof(emr);
217
218     return EMFDRV_WriteRecord( dev, &emr.emr );
219 }
220
221 BOOL EMFDRV_FillPath( PHYSDEV dev )
222 {
223     EMRFILLPATH emr;
224
225     emr.emr.iType = EMR_FILLPATH;
226     emr.emr.nSize = sizeof(emr);
227     FIXME("Bounds\n");
228     emr.rclBounds.left = 0;
229     emr.rclBounds.top = 0;
230     emr.rclBounds.right = 0;
231     emr.rclBounds.bottom = 0;
232     return EMFDRV_WriteRecord( dev, &emr.emr );
233 }
234
235 BOOL EMFDRV_FlattenPath( PHYSDEV dev )
236 {
237     EMRFLATTENPATH emr;
238
239     emr.emr.iType = EMR_FLATTENPATH;
240     emr.emr.nSize = sizeof(emr);
241
242     return EMFDRV_WriteRecord( dev, &emr.emr );
243 }
244
245 BOOL EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode )
246 {
247     EMRSELECTCLIPPATH emr;
248
249     emr.emr.iType = EMR_SELECTCLIPPATH;
250     emr.emr.nSize = sizeof(emr);
251     emr.iMode = iMode;
252
253     return EMFDRV_WriteRecord( dev, &emr.emr );
254 }
255
256 BOOL EMFDRV_StrokeAndFillPath( PHYSDEV dev )
257 {
258     EMRSTROKEANDFILLPATH emr;
259
260     emr.emr.iType = EMR_STROKEANDFILLPATH;
261     emr.emr.nSize = sizeof(emr);
262     FIXME("Bounds\n");
263     emr.rclBounds.left = 0;
264     emr.rclBounds.top = 0;
265     emr.rclBounds.right = 0;
266     emr.rclBounds.bottom = 0;
267     return EMFDRV_WriteRecord( dev, &emr.emr );
268 }
269
270 BOOL EMFDRV_StrokePath( PHYSDEV dev )
271 {
272     EMRSTROKEPATH emr;
273
274     emr.emr.iType = EMR_STROKEPATH;
275     emr.emr.nSize = sizeof(emr);
276     FIXME("Bounds\n");
277     emr.rclBounds.left = 0;
278     emr.rclBounds.top = 0;
279     emr.rclBounds.right = 0;
280     emr.rclBounds.bottom = 0;
281     return EMFDRV_WriteRecord( dev, &emr.emr );
282 }
283
284 BOOL EMFDRV_WidenPath( PHYSDEV dev )
285 {
286     EMRWIDENPATH emr;
287
288     emr.emr.iType = EMR_WIDENPATH;
289     emr.emr.nSize = sizeof(emr);
290
291     return EMFDRV_WriteRecord( dev, &emr.emr );
292 }
293
294 INT EMFDRV_GetDeviceCaps(PHYSDEV dev, INT cap)
295 {
296     EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev;
297
298     switch(cap) {
299
300     case HORZRES:
301         return physDev->horzres;
302     case VERTRES:
303         return physDev->vertres;
304     case LOGPIXELSX:
305         return physDev->logpixelsx;
306     case LOGPIXELSY:
307         return physDev->logpixelsy;
308     case HORZSIZE:
309         return physDev->horzsize;
310     case VERTSIZE:
311         return physDev->vertsize;
312     case BITSPIXEL:
313         return physDev->bitspixel;
314     case TEXTCAPS:
315         return physDev->textcaps;
316     case RASTERCAPS:
317         return physDev->rastercaps;
318     case TECHNOLOGY:
319         return physDev->technology;
320     case PLANES:
321         return physDev->planes;
322     case NUMCOLORS:
323         return physDev->numcolors;
324     default:
325         FIXME("Unimplemented cap %d\n", cap);
326         return 0;
327     }
328 }