source: trunk/src/msvfw32/drawdib.c@ 8706

Last change on this file since 8706 was 7511, checked in by sandervl, 24 years ago

removed TRACE/WARN macro redefinition

File size: 11.8 KB
Line 
1/*
2 * Copyright 2000 Bradley Baetz
3 *
4 * Fixme: Some flags are ignored
5 *
6 * Handle palettes
7 */
8
9#include <string.h>
10#include "windef.h"
11#include "winbase.h"
12#include "wingdi.h"
13#include "winuser.h"
14#include "wine/winbase16.h"
15#include "debugtools.h"
16#include "vfw.h"
17#include "vfw16.h"
18#include "windef.h"
19
20DEFAULT_DEBUG_CHANNEL(msvideo);
21
22typedef struct {
23 HDC hdc;
24 INT dxDst;
25 INT dyDst;
26 LPBITMAPINFOHEADER lpbi;
27 INT dxSrc;
28 INT dySrc;
29 HPALETTE hpal; /* Palette to use for the DIB */
30 BOOL begun; /* DrawDibBegin has been called */
31 LPBITMAPINFOHEADER lpbiOut; /* Output format */
32 HIC hic; /* HIC for decompression */
33 HDC hMemDC; /* DC for buffering */
34 HBITMAP hOldDib; /* Original Dib */
35 HBITMAP hDib; /* DibSection */
36 LPVOID lpvbits; /* Buffer for holding decompressed dib */
37} WINE_HDD;
38
39#ifdef __WIN32OS2__
40#include <heapstring.h>
41
42#define GlobalAlloc16 GlobalAlloc
43#define GlobalLock16 GlobalLock
44#define GlobalUnlock16 GlobalUnlock
45#define GlobalFree16 GlobalFree
46
47#endif
48
49/***********************************************************************
50 * DrawDibOpen [MSVFW32.@]
51 */
52HDRAWDIB VFWAPI DrawDibOpen(void) {
53 HDRAWDIB hdd;
54
55 TRACE("(void)\n");
56 hdd = GlobalAlloc16(GHND,sizeof(WINE_HDD));
57 TRACE("=> %d\n",hdd);
58 return hdd;
59}
60
61/***********************************************************************
62 * DrawDibOpen [MSVIDEO.102]
63 */
64HDRAWDIB16 VFWAPI DrawDibOpen16(void) {
65 return (HDRAWDIB16)DrawDibOpen();
66}
67
68/***********************************************************************
69 * DrawDibClose [MSVFW32.@]
70 */
71BOOL VFWAPI DrawDibClose(HDRAWDIB hdd) {
72 WINE_HDD *whdd = GlobalLock16(hdd);
73
74 TRACE("(0x%08lx)\n",(DWORD)hdd);
75
76 if (!whdd)
77 return FALSE;
78
79 if (whdd->begun)
80 DrawDibEnd(hdd);
81
82 GlobalUnlock16(hdd);
83 GlobalFree16(hdd);
84 return TRUE;
85}
86
87/***********************************************************************
88 * DrawDibClose [MSVIDEO.103]
89 */
90BOOL16 VFWAPI DrawDibClose16(HDRAWDIB16 hdd) {
91 return DrawDibClose(hdd);
92}
93
94/***********************************************************************
95 * DrawDibEnd [MSVFW32.@]
96 */
97BOOL VFWAPI DrawDibEnd(HDRAWDIB hdd) {
98 BOOL ret = TRUE;
99 WINE_HDD *whdd = GlobalLock16(hdd);
100
101 TRACE("(0x%08lx)\n",(DWORD)hdd);
102
103 whdd->hpal = 0; /* Do not free this */
104 whdd->hdc = 0;
105 if (whdd->lpbi) {
106 HeapFree(GetProcessHeap(),0,whdd->lpbi);
107 whdd->lpbi = NULL;
108 }
109 if (whdd->lpbiOut) {
110 HeapFree(GetProcessHeap(),0,whdd->lpbiOut);
111 whdd->lpbiOut = NULL;
112 }
113
114 whdd->begun = FALSE;
115
116 /*if (whdd->lpvbits)
117 HeapFree(GetProcessHeap(),0,whdd->lpvbuf);*/
118
119 if (whdd->hMemDC) {
120 SelectObject(whdd->hMemDC,whdd->hOldDib);
121 DeleteDC(whdd->hMemDC);
122 }
123
124 if (whdd->hDib)
125 DeleteObject(whdd->hDib);
126
127 if (whdd->hic) {
128 ICDecompressEnd(whdd->hic);
129 ICClose(whdd->hic);
130 }
131
132 whdd->lpvbits = NULL;
133
134 GlobalUnlock16(hdd);
135 return ret;
136}
137
138/***********************************************************************
139 * DrawDibEnd [MSVIDEO.105]
140 */
141BOOL16 VFWAPI DrawDibEnd16(HDRAWDIB16 hdd) {
142 return DrawDibEnd(hdd);
143}
144
145/***********************************************************************
146 * DrawDibBegin [MSVFW32.@]
147 */
148BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd,
149 HDC hdc,
150 INT dxDst,
151 INT dyDst,
152 LPBITMAPINFOHEADER lpbi,
153 INT dxSrc,
154 INT dySrc,
155 UINT wFlags) {
156 BOOL ret = TRUE;
157 WINE_HDD *whdd;
158
159 TRACE("(%d,0x%lx,%d,%d,%p,%d,%d,0x%08lx)\n",
160 hdd,(DWORD)hdc,dxDst,dyDst,lpbi,dxSrc,dySrc,(DWORD)wFlags
161 );
162 TRACE("lpbi: %ld,%ld/%ld,%d,%d,%ld,%ld,%ld,%ld,%ld,%ld\n",
163 lpbi->biSize, lpbi->biWidth, lpbi->biHeight, lpbi->biPlanes,
164 lpbi->biBitCount, lpbi->biCompression, lpbi->biSizeImage,
165 lpbi->biXPelsPerMeter, lpbi->biYPelsPerMeter, lpbi->biClrUsed,
166 lpbi->biClrImportant);
167
168 if (wFlags & ~(DDF_BUFFER))
169 FIXME("wFlags == 0x%08x not handled\n", wFlags & ~(DDF_BUFFER));
170
171 whdd = (WINE_HDD*)GlobalLock16(hdd);
172 if (!whdd) return FALSE;
173
174 if (whdd->begun)
175 DrawDibEnd(hdd);
176
177 if (lpbi->biCompression) {
178 DWORD size = 0;
179
180 whdd->hic = ICOpen(ICTYPE_VIDEO,lpbi->biCompression,ICMODE_DECOMPRESS);
181 if (!whdd->hic) {
182 WARN("Could not open IC. biCompression == 0x%08lx\n",lpbi->biCompression);
183 ret = FALSE;
184 }
185
186 if (ret) {
187 size = ICDecompressGetFormat(whdd->hic,lpbi,NULL);
188 if (size == ICERR_UNSUPPORTED) {
189 WARN("Codec doesn't support GetFormat, giving up.\n");
190 ret = FALSE;
191 }
192 }
193
194 if (ret) {
195 whdd->lpbiOut = HeapAlloc(GetProcessHeap(),0,size);
196
197 if (ICDecompressGetFormat(whdd->hic,lpbi,whdd->lpbiOut) != ICERR_OK)
198 ret = FALSE;
199 }
200
201 if (ret) {
202 /* FIXME: Use Ex functions if available? */
203 if (ICDecompressBegin(whdd->hic,lpbi,whdd->lpbiOut) != ICERR_OK)
204 ret = FALSE;
205
206 TRACE("biSizeImage == %ld\n",whdd->lpbiOut->biSizeImage);
207 TRACE("biCompression == %ld\n",whdd->lpbiOut->biCompression);
208 TRACE("biBitCount == %d\n",whdd->lpbiOut->biBitCount);
209 }
210 } else {
211 DWORD dwSize;
212 /* No compression */
213 TRACE("Not compressed!\n");
214 dwSize = lpbi->biSize + lpbi->biClrUsed*sizeof(RGBQUAD);
215 whdd->lpbiOut = HeapAlloc(GetProcessHeap(),0,dwSize);
216 memcpy(whdd->lpbiOut,lpbi,dwSize);
217 }
218
219 if (ret) {
220 /*whdd->lpvbuf = HeapAlloc(GetProcessHeap(),0,whdd->lpbiOut->biSizeImage);*/
221
222 whdd->hMemDC = CreateCompatibleDC(hdc);
223 TRACE("Creating: %ld,%p\n",whdd->lpbiOut->biSize,whdd->lpvbits);
224 whdd->hDib = CreateDIBSection(whdd->hMemDC,(BITMAPINFO *)whdd->lpbiOut,DIB_RGB_COLORS,&(whdd->lpvbits),0,0);
225 if (!whdd->hDib) {
226 TRACE("Error: %ld\n",GetLastError());
227 }
228 TRACE("Created: %d,%p\n",whdd->hDib,whdd->lpvbits);
229 whdd->hOldDib = SelectObject(whdd->hMemDC,whdd->hDib);
230 }
231
232 if (ret) {
233 whdd->hdc = hdc;
234 whdd->dxDst = dxDst;
235 whdd->dyDst = dyDst;
236 whdd->lpbi = HeapAlloc(GetProcessHeap(),0,lpbi->biSize);
237 memcpy(whdd->lpbi,lpbi,lpbi->biSize);
238 whdd->dxSrc = dxSrc;
239 whdd->dySrc = dySrc;
240 whdd->begun = TRUE;
241 whdd->hpal = 0;
242 } else {
243 if (whdd->hic)
244 ICClose(whdd->hic);
245 if (whdd->lpbiOut) {
246 HeapFree(GetProcessHeap(),0,whdd->lpbiOut);
247 whdd->lpbiOut = NULL;
248 }
249 }
250
251 GlobalUnlock16(hdd);
252
253 return ret;
254}
255
256/************************************************************************
257 * DrawDibBegin [MSVIDEO.104]
258 */
259BOOL16 VFWAPI DrawDibBegin16(HDRAWDIB16 hdd,
260 HDC16 hdc,
261 INT16 dxDst,
262 INT16 dyDst,
263 LPBITMAPINFOHEADER lpbi,
264 INT16 dxSrc,
265 INT16 dySrc,
266 UINT16 wFlags) {
267 return DrawDibBegin(hdd,hdc,dxDst,dyDst,lpbi,dxSrc,dySrc,wFlags);
268}
269
270/**********************************************************************
271 * DrawDibDraw [MSVFW32.@]
272 */
273BOOL VFWAPI DrawDibDraw(HDRAWDIB hdd, HDC hdc,
274 INT xDst, INT yDst, INT dxDst, INT dyDst,
275 LPBITMAPINFOHEADER lpbi,
276 LPVOID lpBits,
277 INT xSrc, INT ySrc, INT dxSrc, INT dySrc,
278 UINT wFlags
279) {
280 WINE_HDD *whdd;
281 BOOL ret = TRUE;
282
283 TRACE("(%d,0x%lx,%d,%d,%d,%d,%p,%p,%d,%d,%d,%d,0x%08lx)\n",
284 hdd,(DWORD)hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,xSrc,ySrc,dxSrc,dySrc,(DWORD)wFlags
285 );
286
287 if (wFlags & ~(DDF_SAME_HDC | DDF_SAME_DRAW | DDF_NOTKEYFRAME |
288 DDF_UPDATE | DDF_DONTDRAW))
289 FIXME("wFlags == 0x%08lx not handled\n",(DWORD)wFlags);
290
291 if (!lpBits) {
292 /* Undocumented? */
293 lpBits = (LPSTR)lpbi + (WORD)(lpbi->biSize) + (WORD)(lpbi->biClrUsed*sizeof(RGBQUAD));
294 }
295
296 whdd = GlobalLock16(hdd);
297
298#define CHANGED(x) (whdd->x != x)
299
300 if ((!whdd->begun) || (!(wFlags & DDF_SAME_HDC) && CHANGED(hdc)) || (!(wFlags & DDF_SAME_DRAW) &&
301 (CHANGED(lpbi) || CHANGED(dxSrc) || CHANGED(dySrc) || CHANGED(dxDst) || CHANGED(dyDst)))) {
302 TRACE("Something changed!\n");
303 ret = DrawDibBegin(hdd,hdc,dxDst,dyDst,lpbi,dxSrc,dySrc,0);
304 }
305
306#undef CHANGED
307
308 if ((dxDst == -1) && (dyDst == -1)) {
309 dxDst = dxSrc;
310 dyDst = dySrc;
311 }
312
313 if (!(wFlags & DDF_UPDATE)) {
314 /* biSizeImage may be set to 0 for BI_RGB (uncompressed) bitmaps */
315 if ((lpbi->biCompression == BI_RGB) && (lpbi->biSizeImage == 0))
316 lpbi->biSizeImage = ((lpbi->biWidth * lpbi->biBitCount + 31) / 32) * 4 * lpbi->biHeight;
317
318 if (lpbi->biCompression) {
319 DWORD flags = 0;
320
321 TRACE("Compression == 0x%08lx\n",lpbi->biCompression);
322
323 if (wFlags & DDF_NOTKEYFRAME)
324 flags |= ICDECOMPRESS_NOTKEYFRAME;
325
326 ICDecompress(whdd->hic,flags,lpbi,lpBits,whdd->lpbiOut,whdd->lpvbits);
327 } else {
328 memcpy(whdd->lpvbits,lpBits,lpbi->biSizeImage);
329 }
330 }
331 if (!(wFlags & DDF_DONTDRAW) && whdd->hpal)
332 SelectPalette(hdc,whdd->hpal,FALSE);
333
334 if (!(StretchBlt(whdd->hdc,xDst,yDst,dxDst,dyDst,whdd->hMemDC,xSrc,ySrc,dxSrc,dySrc,SRCCOPY)))
335 ret = FALSE;
336
337 GlobalUnlock16(hdd);
338 return ret;
339}
340
341/**********************************************************************
342 * DrawDibDraw [MSVIDEO.106]
343 */
344BOOL16 VFWAPI DrawDibDraw16(HDRAWDIB16 hdd,
345 HDC16 hdc,
346 INT16 xDst,
347 INT16 yDst,
348 INT16 dxDst,
349 INT16 dyDst,
350 LPBITMAPINFOHEADER lpbi,
351 LPVOID lpBits,
352 INT16 xSrc,
353 INT16 ySrc,
354 INT16 dxSrc,
355 INT16 dySrc,
356 UINT16 wFlags) {
357 return DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,xSrc,ySrc,dxSrc,dySrc,wFlags);
358}
359
360/*************************************************************************
361 * DrawDibStart [MSVFW32.@]
362 */
363BOOL VFWAPI DrawDibStart(HDRAWDIB hdd, DWORD rate) {
364 FIXME("(0x%08lx,%ld), stub\n",(DWORD)hdd,rate);
365 return TRUE;
366}
367
368/*************************************************************************
369 * DrawDibStart [MSVIDEO.118]
370 */
371BOOL16 VFWAPI DrawDibStart16(HDRAWDIB16 hdd, DWORD rate) {
372 return DrawDibStart(hdd,rate);
373}
374
375/*************************************************************************
376 * DrawDibStop [MSVFW32.@]
377 */
378BOOL VFWAPI DrawDibStop(HDRAWDIB hdd) {
379 FIXME("(0x%08lx), stub\n",(DWORD)hdd);
380 return TRUE;
381}
382
383/*************************************************************************
384 * DrawDibStop [MSVIDEO.119]
385 */
386BOOL16 DrawDibStop16(HDRAWDIB16 hdd) {
387 return DrawDibStop(hdd);
388}
389
390/***********************************************************************
391 * DrawDibSetPalette [MSVFW32.@]
392 */
393BOOL VFWAPI DrawDibSetPalette(HDRAWDIB hdd, HPALETTE hpal) {
394 WINE_HDD *whdd;
395
396 TRACE("(0x%08lx,0x%08lx)\n",(DWORD)hdd,(DWORD)hpal);
397
398 whdd = GlobalLock16(hdd);
399 whdd->hpal = hpal;
400
401 if (whdd->begun) {
402 SelectPalette(whdd->hdc,hpal,0);
403 RealizePalette(whdd->hdc);
404 }
405 GlobalUnlock16(hdd);
406 return TRUE;
407}
408
409/***********************************************************************
410 * DrawDibSetPalette [MSVIDEO.110]
411 */
412BOOL16 VFWAPI DrawDibSetPalette16(HDRAWDIB16 hdd, HPALETTE16 hpal) {
413 return DrawDibSetPalette(hdd,hpal);
414}
415
416/***********************************************************************
417 * DrawDibGetPalette [MSVFW32.@]
418 */
419HPALETTE VFWAPI DrawDibGetPalette(HDRAWDIB hdd) {
420 WINE_HDD *whdd;
421 HPALETTE ret;
422
423 TRACE("(0x%08lx)\n",(DWORD)hdd);
424
425 whdd = GlobalLock16(hdd);
426 ret = whdd->hpal;
427 GlobalUnlock16(hdd);
428 return ret;
429}
430
431/***********************************************************************
432 * DrawDibGetPalette [MSVIDEO.108]
433 */
434HPALETTE16 VFWAPI DrawDibGetPalette16(HDRAWDIB16 hdd) {
435 return (HPALETTE16)DrawDibGetPalette(hdd);
436}
437
438/***********************************************************************
439 * DrawDibRealize [MSVFW32.@]
440 */
441UINT VFWAPI DrawDibRealize(HDRAWDIB hdd, HDC hdc, BOOL fBackground) {
442 WINE_HDD *whdd;
443 HPALETTE oldPal;
444 UINT ret = 0;
445
446 FIXME("(%d,0x%08lx,%d), stub\n",hdd,(DWORD)hdc,fBackground);
447
448 whdd = GlobalLock16(hdd);
449
450 if (!whdd || !(whdd->begun)) {
451 ret = 0;
452 goto out;
453 }
454
455 if (!whdd->hpal)
456 whdd->hpal = CreateHalftonePalette(hdc);
457
458 oldPal = SelectPalette(hdc,whdd->hpal,fBackground);
459 ret = RealizePalette(hdc);
460
461 out:
462 GlobalUnlock16(hdd);
463
464 TRACE("=> %u\n",ret);
465 return ret;
466}
467
468/***********************************************************************
469 * DrawDibRealize [MSVIDEO.112]
470 */
471UINT16 VFWAPI DrawDibRealize16(HDRAWDIB16 hdd, HDC16 hdc, BOOL16 fBackground) {
472 return (UINT16)DrawDibRealize(hdd,hdc,fBackground);
473}
Note: See TracBrowser for help on using the repository browser.