Move a bunch of common code from the drivers into gdi.
[wine] / dlls / gdi / 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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     EMRRESTOREDC emr;
38
39     emr.emr.iType = EMR_RESTOREDC;
40     emr.emr.nSize = sizeof(emr);
41     emr.iRelative = -1;
42     if (level == -1) 
43         return EMFDRV_WriteRecord( dev, &emr.emr );
44     else if (level > 0 && level <= physDev->dc->saveLevel) 
45     {
46         while (level >= physDev->dc->saveLevel) 
47         {
48             EMFDRV_WriteRecord( dev, &emr.emr );
49             level--;
50         }
51         return TRUE;
52     }
53     return FALSE;
54 }
55
56 UINT EMFDRV_SetTextAlign( PHYSDEV dev, UINT align )
57 {
58     EMRSETTEXTALIGN emr;
59     emr.emr.iType = EMR_SETTEXTALIGN;
60     emr.emr.nSize = sizeof(emr);
61     emr.iMode = align;
62     return EMFDRV_WriteRecord( dev, &emr.emr );
63 }
64
65 BOOL EMFDRV_SetTextJustification(PHYSDEV dev, INT nBreakExtra, INT nBreakCount)
66 {
67     EMRSETTEXTJUSTIFICATION emr;
68     emr.emr.iType = EMR_SETTEXTJUSTIFICATION;
69     emr.emr.nSize = sizeof(emr);
70     emr.nBreakExtra = nBreakExtra;
71     emr.nBreakCount = nBreakCount;
72     return EMFDRV_WriteRecord(dev, &emr.emr);
73 }
74
75 INT EMFDRV_SetBkMode( PHYSDEV dev, INT mode )
76 {
77     EMRSETBKMODE emr;
78     emr.emr.iType = EMR_SETBKMODE;
79     emr.emr.nSize = sizeof(emr);
80     emr.iMode = mode;
81     return EMFDRV_WriteRecord( dev, &emr.emr );
82 }
83
84 INT EMFDRV_SetROP2( PHYSDEV dev, INT rop )
85 {
86     EMRSETROP2 emr;
87     emr.emr.iType = EMR_SETROP2;
88     emr.emr.nSize = sizeof(emr);
89     emr.iMode = rop;
90     return EMFDRV_WriteRecord( dev, &emr.emr );
91 }
92
93 INT EMFDRV_SetPolyFillMode( PHYSDEV dev, INT mode )
94 {
95     EMRSETPOLYFILLMODE emr;
96     emr.emr.iType = EMR_SETPOLYFILLMODE;
97     emr.emr.nSize = sizeof(emr);
98     emr.iMode = mode;
99     return EMFDRV_WriteRecord( dev, &emr.emr );
100 }
101
102 INT EMFDRV_SetStretchBltMode( PHYSDEV dev, INT mode )
103 {
104     EMRSETSTRETCHBLTMODE emr;
105     emr.emr.iType = EMR_SETSTRETCHBLTMODE;
106     emr.emr.nSize = sizeof(emr);
107     emr.iMode = mode;
108     return EMFDRV_WriteRecord( dev, &emr.emr );
109 }
110
111 INT EMFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
112 {
113     EMREXCLUDECLIPRECT emr;
114     emr.emr.iType      = EMR_EXCLUDECLIPRECT;
115     emr.emr.nSize      = sizeof(emr);
116     emr.rclClip.left   = left;
117     emr.rclClip.top    = top;
118     emr.rclClip.right  = right;
119     emr.rclClip.bottom = bottom;
120     return EMFDRV_WriteRecord( dev, &emr.emr );
121 }
122
123 INT EMFDRV_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom)
124 {
125     EMRINTERSECTCLIPRECT emr;
126     emr.emr.iType      = EMR_INTERSECTCLIPRECT;
127     emr.emr.nSize      = sizeof(emr);
128     emr.rclClip.left   = left;
129     emr.rclClip.top    = top;
130     emr.rclClip.right  = right;
131     emr.rclClip.bottom = bottom;
132     return EMFDRV_WriteRecord( dev, &emr.emr );
133 }
134
135 INT EMFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y )
136 {
137     EMROFFSETCLIPRGN emr;
138     emr.emr.iType   = EMR_OFFSETCLIPRGN;
139     emr.emr.nSize   = sizeof(emr);
140     emr.ptlOffset.x = x;
141     emr.ptlOffset.y = y;
142     return EMFDRV_WriteRecord( dev, &emr.emr );
143 }
144
145 INT EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode )
146 {
147     EMREXTSELECTCLIPRGN *emr;
148     DWORD size, rgnsize;
149     BOOL ret;
150
151     if (!hrgn)
152     {
153         if (mode != RGN_COPY) return ERROR;
154         rgnsize = 0;
155     }
156     else rgnsize = GetRegionData( hrgn, 0, NULL );
157
158     size = rgnsize + offsetof(EMREXTSELECTCLIPRGN,RgnData);
159     emr = HeapAlloc( GetProcessHeap(), 0, size );
160     if (rgnsize) GetRegionData( hrgn, rgnsize, (RGNDATA *)&emr->RgnData );
161
162     emr->emr.iType = EMR_EXTSELECTCLIPRGN;
163     emr->emr.nSize = size;
164     emr->cbRgnData = rgnsize;
165     emr->iMode     = mode;
166
167     ret = EMFDRV_WriteRecord( dev, &emr->emr );
168     HeapFree( GetProcessHeap(), 0, emr );
169     return ret ? SIMPLEREGION : ERROR;
170 }
171
172 DWORD EMFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags )
173 {
174     EMRSETMAPPERFLAGS emr;
175
176     emr.emr.iType = EMR_SETMAPPERFLAGS;
177     emr.emr.nSize = sizeof(emr);
178     emr.dwFlags   = flags;
179
180     return EMFDRV_WriteRecord( dev, &emr.emr );
181 }
182
183 BOOL EMFDRV_AbortPath( PHYSDEV dev )
184 {
185     EMRABORTPATH emr;
186
187     emr.emr.iType = EMR_ABORTPATH;
188     emr.emr.nSize = sizeof(emr);
189
190     return EMFDRV_WriteRecord( dev, &emr.emr );
191 }
192
193 BOOL EMFDRV_BeginPath( PHYSDEV dev )
194 {
195     EMRBEGINPATH emr;
196
197     emr.emr.iType = EMR_BEGINPATH;
198     emr.emr.nSize = sizeof(emr);
199
200     return EMFDRV_WriteRecord( dev, &emr.emr );
201 }
202
203 BOOL EMFDRV_CloseFigure( PHYSDEV dev )
204 {
205     EMRCLOSEFIGURE emr;
206
207     emr.emr.iType = EMR_CLOSEFIGURE;
208     emr.emr.nSize = sizeof(emr);
209
210     return EMFDRV_WriteRecord( dev, &emr.emr );
211 }
212
213 BOOL EMFDRV_EndPath( PHYSDEV dev )
214 {
215     EMRENDPATH emr;
216
217     emr.emr.iType = EMR_ENDPATH;
218     emr.emr.nSize = sizeof(emr);
219
220     return EMFDRV_WriteRecord( dev, &emr.emr );
221 }
222
223 BOOL EMFDRV_FillPath( PHYSDEV dev )
224 {
225     EMRFILLPATH emr;
226
227     emr.emr.iType = EMR_FILLPATH;
228     emr.emr.nSize = sizeof(emr);
229     FIXME("Bounds\n");
230     emr.rclBounds.left = 0;
231     emr.rclBounds.top = 0;
232     emr.rclBounds.right = 0;
233     emr.rclBounds.bottom = 0;
234     return EMFDRV_WriteRecord( dev, &emr.emr );
235 }
236
237 BOOL EMFDRV_FlattenPath( PHYSDEV dev )
238 {
239     EMRFLATTENPATH emr;
240
241     emr.emr.iType = EMR_FLATTENPATH;
242     emr.emr.nSize = sizeof(emr);
243
244     return EMFDRV_WriteRecord( dev, &emr.emr );
245 }
246
247 BOOL EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode )
248 {
249     EMRSELECTCLIPPATH emr;
250
251     emr.emr.iType = EMR_SELECTCLIPPATH;
252     emr.emr.nSize = sizeof(emr);
253     emr.iMode = iMode;
254
255     return EMFDRV_WriteRecord( dev, &emr.emr );
256 }
257
258 BOOL EMFDRV_StrokeAndFillPath( PHYSDEV dev )
259 {
260     EMRSTROKEANDFILLPATH emr;
261
262     emr.emr.iType = EMR_STROKEANDFILLPATH;
263     emr.emr.nSize = sizeof(emr);
264     FIXME("Bounds\n");
265     emr.rclBounds.left = 0;
266     emr.rclBounds.top = 0;
267     emr.rclBounds.right = 0;
268     emr.rclBounds.bottom = 0;
269     return EMFDRV_WriteRecord( dev, &emr.emr );
270 }
271
272 BOOL EMFDRV_StrokePath( PHYSDEV dev )
273 {
274     EMRSTROKEPATH emr;
275
276     emr.emr.iType = EMR_STROKEPATH;
277     emr.emr.nSize = sizeof(emr);
278     FIXME("Bounds\n");
279     emr.rclBounds.left = 0;
280     emr.rclBounds.top = 0;
281     emr.rclBounds.right = 0;
282     emr.rclBounds.bottom = 0;
283     return EMFDRV_WriteRecord( dev, &emr.emr );
284 }
285
286 BOOL EMFDRV_WidenPath( PHYSDEV dev )
287 {
288     EMRWIDENPATH emr;
289
290     emr.emr.iType = EMR_WIDENPATH;
291     emr.emr.nSize = sizeof(emr);
292
293     return EMFDRV_WriteRecord( dev, &emr.emr );
294 }
295
296 INT EMFDRV_GetDeviceCaps(PHYSDEV dev, INT cap)
297 {
298     EMFDRV_PDEVICE *physDev = (EMFDRV_PDEVICE*) dev;
299
300     switch(cap) {
301
302     case HORZRES:
303         return physDev->horzres;
304     case VERTRES:
305         return physDev->vertres;
306     case LOGPIXELSX:
307         return physDev->logpixelsx;
308     case LOGPIXELSY:
309         return physDev->logpixelsy;
310     case HORZSIZE:
311         return physDev->horzsize;
312     case VERTSIZE:
313         return physDev->vertsize;
314     case BITSPIXEL:
315         return physDev->bitspixel;
316     case TEXTCAPS:
317         return physDev->textcaps;
318     case RASTERCAPS:
319         return physDev->rastercaps;
320     case TECHNOLOGY:
321         return physDev->technology;
322     case PLANES:
323         return physDev->planes;
324
325     default:
326         FIXME("Unimplemented cap %d\n", cap);
327         return 0;
328
329     }
330 }