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