2 * Copyright 2000 Bradley Baetz
4 * Fixme: Some flags are ignored
5 * Should be doing buffering when requested
13 #include "debugtools.h"
17 DEFAULT_DEBUG_CHANNEL(msvideo
);
22 LPBITMAPINFOHEADER lpbi
;
25 HPALETTE hpal
; /* Palette to use for the DIB */
26 BOOL begun
; /* DrawDibBegin has been called */
27 LPBITMAPINFOHEADER lpbiOut
; /* Output format */
28 HIC hic
; /* HIC for decompression */
29 HDC hMemDC
; /* DC for buffering */
30 HBITMAP hOldDib
; /* Original Dib */
31 HBITMAP hDib
; /* DibSection */
32 LPVOID lpvbits
; /* Buffer for holding decompressed dib */
35 /***********************************************************************
36 * DrawDibOpen [MSVFW32.10]
38 HDRAWDIB VFWAPI
DrawDibOpen(void) {
42 hdd
= GlobalAlloc16(GHND
,sizeof(WINE_HDD
));
47 /***********************************************************************
48 * DrawDibOpen [MSVIDEO.102]
50 HDRAWDIB16 VFWAPI
DrawDibOpen16(void) {
51 return (HDRAWDIB16
)DrawDibOpen();
54 /***********************************************************************
55 * DrawDibClose [MSVFW32.5]
57 BOOL VFWAPI
DrawDibClose(HDRAWDIB hdd
) {
58 WINE_HDD
*whdd
= GlobalLock16(hdd
);
60 TRACE("(0x%08lx)\n",(DWORD
)hdd
);
73 /***********************************************************************
74 * DrawDibClose [MSVIDEO.103]
76 BOOL16 VFWAPI
DrawDibClose16(HDRAWDIB16 hdd
) {
77 return DrawDibClose(hdd
);
80 /***********************************************************************
81 * DrawDibEnd [MSVFW32.7]
83 BOOL VFWAPI
DrawDibEnd(HDRAWDIB hdd
) {
85 WINE_HDD
*whdd
= GlobalLock16(hdd
);
87 TRACE("(0x%08lx)\n",(DWORD
)hdd
);
89 whdd
->hpal
= 0; /* Do not free this */
92 HeapFree(GetProcessHeap(),0,whdd
->lpbi
);
96 HeapFree(GetProcessHeap(),0,whdd
->lpbiOut
);
103 HeapFree(GetProcessHeap(),0,whdd->lpvbuf);*/
106 SelectObject(whdd
->hMemDC
,whdd
->hOldDib
);
107 DeleteDC(whdd
->hMemDC
);
111 DeleteObject(whdd
->hDib
);
114 ICDecompressEnd(whdd
->hic
);
118 whdd
->lpvbits
= NULL
;
124 /***********************************************************************
125 * DrawDibEnd [MSVIDEO.105]
127 BOOL16 VFWAPI
DrawDibEnd16(HDRAWDIB16 hdd
) {
128 return DrawDibEnd(hdd
);
131 /***********************************************************************
132 * DrawDibBegin [MSVFW32.3]
134 BOOL VFWAPI
DrawDibBegin(HDRAWDIB hdd
,
138 LPBITMAPINFOHEADER lpbi
,
145 TRACE("(%d,0x%lx,%d,%d,%p,%d,%d,0x%08lx)\n",
146 hdd
,(DWORD
)hdc
,dxDst
,dyDst
,lpbi
,dxSrc
,dySrc
,(DWORD
)wFlags
150 FIXME("wFlags == 0x%08lx not handled\n",(DWORD
)wFlags
);
152 whdd
= (WINE_HDD
*)GlobalLock16(hdd
);
157 if (lpbi
->biCompression
) {
160 whdd
->hic
= ICOpen(ICTYPE_VIDEO
,lpbi
->biCompression
,ICMODE_DECOMPRESS
);
162 ERR("Could not open IC. biCompression == 0x%08lx\n",lpbi
->biCompression
);
167 size
= ICDecompressGetFormat(whdd
->hic
,lpbi
,NULL
);
168 if (size
== ICERR_UNSUPPORTED
) {
169 FIXME("Codec doesn't support GetFormat, giving up.\n");
175 whdd
->lpbiOut
= HeapAlloc(GetProcessHeap(),0,size
);
177 if (ICDecompressGetFormat(whdd
->hic
,lpbi
,whdd
->lpbiOut
) != ICERR_OK
)
182 /* FIXME: Use Ex functions if available? */
183 if (ICDecompressBegin(whdd
->hic
,lpbi
,whdd
->lpbiOut
) != ICERR_OK
)
186 TRACE("biSizeImage == %ld\n",whdd
->lpbiOut
->biSizeImage
);
187 TRACE("biCompression == %ld\n",whdd
->lpbiOut
->biCompression
);
188 TRACE("biBitCount == %d\n",whdd
->lpbiOut
->biBitCount
);
192 TRACE("Not compressed!\n");
193 whdd
->lpbiOut
= HeapAlloc(GetProcessHeap(),0,lpbi
->biSize
);
194 memcpy(whdd
->lpbiOut
,lpbi
,lpbi
->biSize
);
198 /*whdd->lpvbuf = HeapAlloc(GetProcessHeap(),0,whdd->lpbiOut->biSizeImage);*/
200 whdd
->hMemDC
= CreateCompatibleDC(hdc
);
201 TRACE("Creating: %ld,%p\n",whdd
->lpbiOut
->biSize
,whdd
->lpvbits
);
202 whdd
->hDib
= CreateDIBSection(whdd
->hMemDC
,(BITMAPINFO
*)whdd
->lpbiOut
,DIB_RGB_COLORS
,&(whdd
->lpvbits
),0,0);
204 TRACE("Error: %ld\n",GetLastError());
206 TRACE("Created: %d,%p\n",whdd
->hDib
,whdd
->lpvbits
);
207 whdd
->hOldDib
= SelectObject(whdd
->hMemDC
,whdd
->hDib
);
214 whdd
->lpbi
= HeapAlloc(GetProcessHeap(),0,lpbi
->biSize
);
215 memcpy(whdd
->lpbi
,lpbi
,lpbi
->biSize
);
224 HeapFree(GetProcessHeap(),0,whdd
->lpbiOut
);
225 whdd
->lpbiOut
= NULL
;
234 /************************************************************************
235 * DrawDibBegin [MSVIDEO.104]
237 BOOL16 VFWAPI
DrawDibBegin16(HDRAWDIB16 hdd
,
241 LPBITMAPINFOHEADER lpbi
,
245 return DrawDibBegin(hdd
,hdc
,dxDst
,dyDst
,lpbi
,dxSrc
,dySrc
,wFlags
);
248 /**********************************************************************
249 * DrawDibDraw [MSVFW32.6]
251 BOOL VFWAPI
DrawDibDraw(HDRAWDIB hdd
,
257 LPBITMAPINFOHEADER lpbi
,
267 TRACE("(%d,0x%lx,%d,%d,%d,%d,%p,%p,%d,%d,%d,%d,0x%08lx)\n",
268 hdd
,(DWORD
)hdc
,xDst
,yDst
,dxDst
,dyDst
,lpbi
,lpBits
,xSrc
,ySrc
,dxSrc
,dySrc
,(DWORD
)wFlags
271 if (wFlags
& ~(DDF_SAME_HDC
| DDF_SAME_DRAW
| DDF_NOTKEYFRAME
))
272 FIXME("wFlags == 0x%08lx not handled\n",(DWORD
)wFlags
);
276 lpBits
= (LPSTR
)lpbi
+ (WORD
)(lpbi
->biSize
) + (WORD
)(lpbi
->biClrUsed
*sizeof(RGBQUAD
));
279 whdd
= GlobalLock16(hdd
);
281 #define CHANGED(x) (whdd->##x != ##x)
283 if ((!whdd
->begun
) || (!(wFlags
& DDF_SAME_HDC
) && CHANGED(hdc
)) || (!(wFlags
& DDF_SAME_DRAW
) &&
284 (CHANGED(lpbi
) || CHANGED(dxSrc
) || CHANGED(dySrc
) || CHANGED(dxDst
) || CHANGED(dyDst
)))) {
285 TRACE("Something changed!\n");
286 ret
= DrawDibBegin(hdd
,hdc
,dxDst
,dyDst
,lpbi
,dxSrc
,dySrc
,0);
291 if ((dxDst
== -1) && (dyDst
== -1)) {
296 if (lpbi
->biCompression
) {
299 TRACE("Compression == 0x%08lx\n",lpbi
->biCompression
);
301 if (wFlags
& DDF_NOTKEYFRAME
)
302 flags
|= ICDECOMPRESS_NOTKEYFRAME
;
304 ICDecompress(whdd
->hic
,flags
,lpbi
,lpBits
,whdd
->lpbiOut
,whdd
->lpvbits
);
306 memcpy(whdd
->lpvbits
,lpBits
,lpbi
->biSizeImage
);
309 SelectPalette(hdc
,whdd
->hpal
,FALSE
);
311 StretchBlt(whdd
->hdc
,xDst
,yDst
,dxDst
,dyDst
,whdd
->hMemDC
,xSrc
,ySrc
,dxSrc
,dySrc
,SRCCOPY
);
317 /**********************************************************************
318 * DrawDibDraw [MSVIDEO.106]
320 BOOL16 VFWAPI
DrawDibDraw16(HDRAWDIB16 hdd
,
326 LPBITMAPINFOHEADER lpbi
,
333 return DrawDibDraw(hdd
,hdc
,xDst
,yDst
,dxDst
,dyDst
,lpbi
,lpBits
,xSrc
,ySrc
,dxSrc
,dySrc
,wFlags
);
336 /*************************************************************************
337 * DrawDibStart [MSVFW32.14]
339 BOOL VFWAPI
DrawDibStart(HDRAWDIB hdd
, DWORD rate
) {
340 FIXME("(0x%08lx,%ld), stub\n",(DWORD
)hdd
,rate
);
344 /*************************************************************************
345 * DrawDibStart [MSVIDEO.118]
347 BOOL16 VFWAPI
DrawDibStart16(HDRAWDIB16 hdd
, DWORD rate
) {
348 return DrawDibStart(hdd
,rate
);
351 /*************************************************************************
352 * DrawDibStop [MSVFW32.15]
354 BOOL VFWAPI
DrawDibStop(HDRAWDIB hdd
) {
355 FIXME("(0x%08lx), stub\n",(DWORD
)hdd
);
359 /*************************************************************************
360 * DrawDibStop [MSVIDEO.119]
362 BOOL16
DrawDibStop16(HDRAWDIB16 hdd
) {
363 return DrawDibStop(hdd
);
366 /***********************************************************************
367 * DrawDibSetPalette [MSVFW32.13]
369 BOOL VFWAPI
DrawDibSetPalette(HDRAWDIB hdd
, HPALETTE hpal
) {
372 TRACE("(0x%08lx,0x%08lx)\n",(DWORD
)hdd
,(DWORD
)hpal
);
374 whdd
= GlobalLock16(hdd
);
378 SelectPalette(whdd
->hdc
,hpal
,0);
379 RealizePalette(whdd
->hdc
);
385 /***********************************************************************
386 * DrawDibSetPalette [MSVIDEO.110]
388 BOOL16 VFWAPI
DrawDibSetPalette16(HDRAWDIB16 hdd
, HPALETTE16 hpal
) {
389 return DrawDibSetPalette(hdd
,hpal
);
392 /***********************************************************************
393 * DrawDibGetPalette [MSVFW32.9]
395 HPALETTE VFWAPI
DrawDibGetPalette(HDRAWDIB hdd
) {
399 TRACE("(0x%08lx)\n",(DWORD
)hdd
);
401 whdd
= GlobalLock16(hdd
);
407 /***********************************************************************
408 * DrawDibGetPalette [MSVIDEO.108]]
410 HPALETTE16 VFWAPI
DrawDibGetPalette16(HDRAWDIB16 hdd
) {
411 return (HPALETTE16
)DrawDibGetPalette(hdd
);
414 /***********************************************************************
415 * DrawDibRealize [MSVFW32.12]
417 UINT VFWAPI
DrawDibRealize(HDRAWDIB hdd
, HDC hdc
, BOOL fBackground
) {
422 FIXME("(%d,0x%08lx,%d), stub\n",hdd
,(DWORD
)hdc
,fBackground
);
424 whdd
= GlobalLock16(hdd
);
426 if (!whdd
|| !(whdd
->begun
)) {
432 whdd
->hpal
= CreateHalftonePalette(hdc
);
434 oldPal
= SelectPalette(hdc
,whdd
->hpal
,fBackground
);
435 ret
= RealizePalette(hdc
);
440 TRACE("=> %u\n",ret
);
444 /***********************************************************************
445 * DrawDibRealize [MSVIDEO.112]
447 UINT16 VFWAPI
DrawDibRealize16(HDRAWDIB16 hdd
, HDC16 hdc
, BOOL16 fBackground
) {
448 return (UINT16
)DrawDibRealize(hdd
,hdc
,fBackground
);