Add <string.h> to files that needed it.
[wine] / dlls / ttydrv / bitmap.c
1 /*
2  * TTY bitmap driver
3  *
4  * Copyright 1999 Patrik Stridvall
5  */
6
7 #include <string.h>
8 #include "bitmap.h"
9 #include "gdi.h"
10 #include "ttydrv.h"
11 #include "winbase.h"
12 #include "debugtools.h"
13
14 DEFAULT_DEBUG_CHANNEL(ttydrv);
15
16 /**********************************************************************/
17
18 static LONG TTYDRV_DC_GetBitmapBits(BITMAPOBJ *bitmap, void *bits, LONG count);
19 static LONG TTYDRV_DC_SetBitmapBits(BITMAPOBJ *bitmap, void *bits, LONG count);
20
21 /***********************************************************************
22  *              TTYDRV_DC_AllocBitmap
23  */
24 TTYDRV_PHYSBITMAP *TTYDRV_DC_AllocBitmap(BITMAPOBJ *bitmap)
25 {
26   TTYDRV_PHYSBITMAP *physBitmap;
27   
28   if(!(physBitmap = HeapAlloc(GetProcessHeap(), 0, sizeof(TTYDRV_PHYSBITMAP)))) {
29     ERR("Can't alloc TTYDRV_PHYSBITMAP\n");
30     return NULL;
31   }
32
33   bitmap->physBitmap = physBitmap;
34   bitmap->funcs = DRIVER_FindDriver("DISPLAY");
35
36   return physBitmap;
37 }
38
39 /***********************************************************************
40  *           TTYDRV_DC_BitmapBits
41  */
42 LONG TTYDRV_DC_BitmapBits(HBITMAP hbitmap, void *bits, LONG count, WORD flags)
43 {
44   BITMAPOBJ *bitmap;
45   LONG result;
46
47   if(!(bitmap = (BITMAPOBJ *) GDI_GetObjPtr(hbitmap, BITMAP_MAGIC)))
48     return FALSE;
49   
50   if(flags == DDB_GET)
51     result = TTYDRV_DC_GetBitmapBits(bitmap, bits, count);
52   else if(flags == DDB_SET)
53     result = TTYDRV_DC_SetBitmapBits(bitmap, bits, count);
54   else {
55     ERR("Unknown flags value %d\n", flags);
56     result = 0;
57   }
58   
59   GDI_ReleaseObj(hbitmap);
60   return result;
61 }
62
63 /***********************************************************************
64  *              TTYDRV_DC_CreateBitmap
65  */
66 BOOL TTYDRV_DC_CreateBitmap(HBITMAP hbitmap)
67 {
68   TTYDRV_PHYSBITMAP *physBitmap;
69   BITMAPOBJ *bitmap;
70
71   TRACE("(0x%04x)\n", hbitmap);
72
73   if(!(bitmap = (BITMAPOBJ *) GDI_GetObjPtr(hbitmap, BITMAP_MAGIC)))
74     return FALSE;
75   
76   if(!(physBitmap = TTYDRV_DC_AllocBitmap(bitmap))) {
77     GDI_ReleaseObj(hbitmap);
78     return FALSE;
79   }
80  
81   /* Set bitmap bits */
82   if(bitmap->bitmap.bmBits) { 
83     TTYDRV_DC_BitmapBits(hbitmap, bitmap->bitmap.bmBits,
84                          bitmap->bitmap.bmHeight * bitmap->bitmap.bmWidthBytes,
85                          DDB_SET );
86   }
87
88   GDI_ReleaseObj(hbitmap);
89   
90   return TRUE;
91 }
92
93 /***********************************************************************
94  *              TTYDRV_DC_BITMAP_DeleteObject
95  */
96 BOOL TTYDRV_DC_BITMAP_DeleteObject(HBITMAP hbitmap, BITMAPOBJ *bitmap)
97 {
98   TRACE("(0x%04x, %p)\n", hbitmap, bitmap);
99
100   HeapFree(GetProcessHeap(), 0, bitmap->physBitmap);
101   bitmap->physBitmap = NULL;
102   bitmap->funcs = NULL;
103
104   return TRUE;
105 }
106
107 /***********************************************************************
108  *              TTYDRV_DC_GetBitmapBits
109  */
110 static LONG TTYDRV_DC_GetBitmapBits(BITMAPOBJ *bitmap, void *bits, LONG count)
111 {
112   FIXME("(%p, %p, %ld): stub\n", bitmap, bits, count);
113
114   memset(bits, 0, count);
115
116   return count;
117 }
118
119 /***********************************************************************
120  *              TTYDRV_DC_BITMAP_SelectObject
121  */
122 HBITMAP TTYDRV_DC_BITMAP_SelectObject(DC *dc, HBITMAP hbitmap, BITMAPOBJ *bitmap)
123 {
124   HBITMAP hPreviousBitmap;
125
126   TRACE("(%p, 0x%04x, %p)\n", dc, hbitmap, bitmap);
127
128   if(!(dc->flags & DC_MEMORY)) 
129     return 0;
130
131   /* Assure that the bitmap device dependent */
132   if(!bitmap->physBitmap && !TTYDRV_DC_CreateBitmap(hbitmap))
133     return 0;
134
135   if(bitmap->funcs != dc->funcs) {
136     ERR("Trying to select a non-TTY DDB into a TTY DC\n");
137     return 0;
138   }
139
140   dc->totalExtent.left   = 0;
141   dc->totalExtent.top    = 0;
142   dc->totalExtent.right  = bitmap->bitmap.bmWidth;
143   dc->totalExtent.bottom = bitmap->bitmap.bmHeight;
144
145   /* FIXME: Should be done in the common code instead */
146   if(dc->hVisRgn) {
147     SetRectRgn(dc->hVisRgn, 0, 0,
148                bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight);
149   } else { 
150     HRGN hrgn;
151
152     if(!(hrgn = CreateRectRgn(0, 0, bitmap->bitmap.bmWidth, bitmap->bitmap.bmHeight)))
153       return 0;
154
155     dc->hVisRgn = hrgn;
156   }
157
158   hPreviousBitmap = dc->hBitmap;
159   dc->hBitmap = hbitmap;
160
161   return hPreviousBitmap;
162 }
163
164 /***********************************************************************
165  *              TTYDRV_DC_SetBitmapBits
166  */
167 static LONG TTYDRV_DC_SetBitmapBits(BITMAPOBJ *bitmap, void *bits, LONG count)
168 {
169   FIXME("(%p, %p, %ld): semistub\n", bitmap, bits, count);
170
171   return count;
172 }
173
174 /***********************************************************************
175  *              TTYDRV_BITMAP_CreateDIBSection
176  */
177 HBITMAP TTYDRV_BITMAP_CreateDIBSection(
178   DC *dc, BITMAPINFO *bmi, UINT usage,
179   LPVOID *bits, HANDLE section, DWORD offset)
180 {
181   FIXME("(%p, %p, %u, %p, 0x%04x, %ld): stub\n",
182         dc, bmi, usage, bits, section, offset);
183
184   return (HBITMAP) NULL;
185 }
186
187 /**********************************************************************
188  *              TTYDRV_BITMAP_CreateDIBSection16
189  */
190 HBITMAP16 TTYDRV_DIB_CreateDIBSection16(
191   DC *dc, BITMAPINFO *bmi, UINT16 usage,
192   SEGPTR *bits, HANDLE section, DWORD offset)
193 {
194   FIXME("(%p, %p, %u, %p, 0x%04x, %ld): stub\n",
195         dc, bmi, usage, bits, section, offset);
196
197   return (HBITMAP16) NULL;
198 }
199
200 /***********************************************************************
201  *              TTYDRV_BITMAP_DeleteDIBSection
202  */
203 void TTYDRV_BITMAP_DeleteDIBSection(BITMAPOBJ *bmp)
204 {
205   FIXME("(%p): stub\n", bmp);
206 }
207
208 /***********************************************************************
209  *              TTYDRV_BITMAP_SetDIBColorTable
210  */
211 UINT TTYDRV_BITMAP_SetDIBColorTable(BITMAPOBJ *bmp, DC *dc, UINT start, UINT count, const RGBQUAD *colors)
212 {
213   FIXME("(%p): stub\n", bmp);
214   return 0;
215 }
216
217 /***********************************************************************
218  *              TTYDRV_BITMAP_GetDIBColorTable
219  */
220 UINT TTYDRV_BITMAP_GetDIBColorTable(BITMAPOBJ *bmp, DC *dc, UINT start, UINT count, RGBQUAD *colors)
221 {
222   FIXME("(%p): stub\n", bmp);
223   return 0;
224 }
225
226 /***********************************************************************
227  *              TTYDRV_BITMAP_Lock
228  */
229 INT TTYDRV_BITMAP_Lock(BITMAPOBJ *bmp, INT req, BOOL lossy)
230 {
231   FIXME("(%p): stub\n", bmp);
232   return DIB_Status_None;
233 }
234
235 /***********************************************************************
236  *              TTYDRV_BITMAP_Unlock
237  */
238 void TTYDRV_BITMAP_Unlock(BITMAPOBJ *bmp, BOOL commit)
239 {
240   FIXME("(%p): stub\n", bmp);
241 }
242
243 /***********************************************************************
244  *              TTYDRV_BITMAP_GetDIBits
245  */
246 INT TTYDRV_BITMAP_GetDIBits(
247   BITMAPOBJ *bmp, DC *dc, UINT startscan, UINT lines, 
248   LPVOID bits, BITMAPINFO *info, UINT coloruse, HBITMAP hbitmap)
249 {
250   FIXME("(%p, %p, %u, %u, %p, %p, %u, 0x%04x): stub\n",
251         bmp, dc, startscan, lines, bits, info, coloruse, hbitmap);
252
253   return 0;
254 }
255
256
257 /***********************************************************************
258  *              TTYDRV_BITMAP_SetDIBits
259  */
260 INT TTYDRV_BITMAP_SetDIBits(
261   BITMAPOBJ *bmp, DC *dc, UINT startscan, UINT lines, 
262   LPCVOID bits, const BITMAPINFO *info, UINT coloruse, HBITMAP hbitmap)
263 {
264   FIXME("(%p, %p, %u, %u, %p, %p, %u, 0x%04x): stub\n",
265         bmp, dc, startscan, lines, bits, info, coloruse, hbitmap);
266
267   return 0;
268 }
269
270 /***********************************************************************
271  *              TTYDRV_DC_SetDIBitsToDevice
272  */
273 INT TTYDRV_DC_SetDIBitsToDevice(DC *dc, INT xDest, INT yDest, DWORD cx,
274                                 DWORD cy, INT xSrc, INT ySrc,
275                                 UINT startscan, UINT lines, LPCVOID bits,
276                                 const BITMAPINFO *info, UINT coloruse)
277 {
278   FIXME("(%p, %d, %d, %ld, %ld, %d, %d, %u, %u, %p, %p, %u): stub\n",
279         dc, xDest, yDest, cx, cy, xSrc, ySrc, startscan, lines, bits, info, coloruse);
280
281   return 0;
282 }