2 * Copyright 2000 Bradley Baetz
4 * Fixme: Some flags are ignored
5 * Should be doing buffering when requested
13 #include "debugtools.h"
18 DEFAULT_DEBUG_CHANNEL(msvideo);
23 LPBITMAPINFOHEADER lpbi;
26 HPALETTE hpal; /* Palette to use for the DIB */
27 BOOL begun; /* DrawDibBegin has been called */
28 LPBITMAPINFOHEADER lpbiOut; /* Output format */
29 HIC hic; /* HIC for decompression */
30 HDC hMemDC; /* DC for buffering */
31 HBITMAP hOldDib; /* Original Dib */
32 HBITMAP hDib; /* DibSection */
33 LPVOID lpvbits; /* Buffer for holding decompressed dib */
36 /***********************************************************************
37 * DrawDibOpen [MSVFW32.10]
39 HDRAWDIB VFWAPI DrawDibOpen(void) {
43 hdd = GlobalAlloc16(GHND,sizeof(WINE_HDD));
48 /***********************************************************************
49 * DrawDibOpen [MSVIDEO.102]
51 HDRAWDIB16 VFWAPI DrawDibOpen16(void) {
52 return (HDRAWDIB16)DrawDibOpen();
55 /***********************************************************************
56 * DrawDibClose [MSVFW32.5]
58 BOOL VFWAPI DrawDibClose(HDRAWDIB hdd) {
59 WINE_HDD *whdd = GlobalLock16(hdd);
61 TRACE("(0x%08lx)\n",(DWORD)hdd);
74 /***********************************************************************
75 * DrawDibClose [MSVIDEO.103]
77 BOOL16 VFWAPI DrawDibClose16(HDRAWDIB16 hdd) {
78 return DrawDibClose(hdd);
81 /***********************************************************************
82 * DrawDibEnd [MSVFW32.7]
84 BOOL VFWAPI DrawDibEnd(HDRAWDIB hdd) {
86 WINE_HDD *whdd = GlobalLock16(hdd);
88 TRACE("(0x%08lx)\n",(DWORD)hdd);
90 whdd->hpal = 0; /* Do not free this */
93 HeapFree(GetProcessHeap(),0,whdd->lpbi);
97 HeapFree(GetProcessHeap(),0,whdd->lpbiOut);
104 HeapFree(GetProcessHeap(),0,whdd->lpvbuf);*/
107 SelectObject(whdd->hMemDC,whdd->hOldDib);
108 DeleteDC(whdd->hMemDC);
112 DeleteObject(whdd->hDib);
115 ICDecompressEnd(whdd->hic);
119 whdd->lpvbits = NULL;
125 /***********************************************************************
126 * DrawDibEnd [MSVIDEO.105]
128 BOOL16 VFWAPI DrawDibEnd16(HDRAWDIB16 hdd) {
129 return DrawDibEnd(hdd);
132 /***********************************************************************
133 * DrawDibBegin [MSVFW32.3]
135 BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd,
139 LPBITMAPINFOHEADER lpbi,
146 TRACE("(%d,0x%lx,%d,%d,%p,%d,%d,0x%08lx)\n",
147 hdd,(DWORD)hdc,dxDst,dyDst,lpbi,dxSrc,dySrc,(DWORD)wFlags
151 FIXME("wFlags == 0x%08lx not handled\n",(DWORD)wFlags);
153 whdd = (WINE_HDD*)GlobalLock16(hdd);
158 if (lpbi->biCompression) {
161 whdd->hic = ICOpen(ICTYPE_VIDEO,lpbi->biCompression,ICMODE_DECOMPRESS);
163 ERR("Could not open IC. biCompression == 0x%08lx\n",lpbi->biCompression);
168 size = ICDecompressGetFormat(whdd->hic,lpbi,NULL);
169 if (size == ICERR_UNSUPPORTED) {
170 FIXME("Codec doesn't support GetFormat, giving up.\n");
176 whdd->lpbiOut = HeapAlloc(GetProcessHeap(),0,size);
178 if (ICDecompressGetFormat(whdd->hic,lpbi,whdd->lpbiOut) != ICERR_OK)
183 /* FIXME: Use Ex functions if available? */
184 if (ICDecompressBegin(whdd->hic,lpbi,whdd->lpbiOut) != ICERR_OK)
187 TRACE("biSizeImage == %ld\n",whdd->lpbiOut->biSizeImage);
188 TRACE("biCompression == %ld\n",whdd->lpbiOut->biCompression);
189 TRACE("biBitCount == %d\n",whdd->lpbiOut->biBitCount);
193 TRACE("Not compressed!\n");
194 whdd->lpbiOut = HeapAlloc(GetProcessHeap(),0,lpbi->biSize);
195 memcpy(whdd->lpbiOut,lpbi,lpbi->biSize);
199 /*whdd->lpvbuf = HeapAlloc(GetProcessHeap(),0,whdd->lpbiOut->biSizeImage);*/
201 whdd->hMemDC = CreateCompatibleDC(hdc);
202 TRACE("Creating: %ld,%p\n",whdd->lpbiOut->biSize,whdd->lpvbits);
203 whdd->hDib = CreateDIBSection(whdd->hMemDC,(BITMAPINFO *)whdd->lpbiOut,DIB_RGB_COLORS,&(whdd->lpvbits),0,0);
205 TRACE("Error: %ld\n",GetLastError());
207 TRACE("Created: %d,%p\n",whdd->hDib,whdd->lpvbits);
208 whdd->hOldDib = SelectObject(whdd->hMemDC,whdd->hDib);
215 whdd->lpbi = HeapAlloc(GetProcessHeap(),0,lpbi->biSize);
216 memcpy(whdd->lpbi,lpbi,lpbi->biSize);
225 HeapFree(GetProcessHeap(),0,whdd->lpbiOut);
226 whdd->lpbiOut = NULL;
235 /************************************************************************
236 * DrawDibBegin [MSVIDEO.104]
238 BOOL16 VFWAPI DrawDibBegin16(HDRAWDIB16 hdd,
242 LPBITMAPINFOHEADER lpbi,
246 return DrawDibBegin(hdd,hdc,dxDst,dyDst,lpbi,dxSrc,dySrc,wFlags);
249 /**********************************************************************
250 * DrawDibDraw [MSVFW32.6]
252 BOOL VFWAPI DrawDibDraw(HDRAWDIB hdd,
258 LPBITMAPINFOHEADER lpbi,
268 TRACE("(%d,0x%lx,%d,%d,%d,%d,%p,%p,%d,%d,%d,%d,0x%08lx)\n",
269 hdd,(DWORD)hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,xSrc,ySrc,dxSrc,dySrc,(DWORD)wFlags
272 if (wFlags & ~(DDF_SAME_HDC | DDF_SAME_DRAW | DDF_NOTKEYFRAME))
273 FIXME("wFlags == 0x%08lx not handled\n",(DWORD)wFlags);
277 lpBits = (LPSTR)lpbi + (WORD)(lpbi->biSize) + (WORD)(lpbi->biClrUsed*sizeof(RGBQUAD));
280 whdd = GlobalLock16(hdd);
282 #define CHANGED(x) (whdd->##x != ##x)
284 if ((!whdd->begun) || (!(wFlags & DDF_SAME_HDC) && CHANGED(hdc)) || (!(wFlags & DDF_SAME_DRAW) &&
285 (CHANGED(lpbi) || CHANGED(dxSrc) || CHANGED(dySrc) || CHANGED(dxDst) || CHANGED(dyDst)))) {
286 TRACE("Something changed!\n");
287 ret = DrawDibBegin(hdd,hdc,dxDst,dyDst,lpbi,dxSrc,dySrc,0);
292 if ((dxDst == -1) && (dyDst == -1)) {
297 if (lpbi->biCompression) {
300 TRACE("Compression == 0x%08lx\n",lpbi->biCompression);
302 if (wFlags & DDF_NOTKEYFRAME)
303 flags |= ICDECOMPRESS_NOTKEYFRAME;
305 ICDecompress(whdd->hic,flags,lpbi,lpBits,whdd->lpbiOut,whdd->lpvbits);
307 memcpy(whdd->lpvbits,lpBits,lpbi->biSizeImage);
310 SelectPalette(hdc,whdd->hpal,FALSE);
312 StretchBlt(whdd->hdc,xDst,yDst,dxDst,dyDst,whdd->hMemDC,xSrc,ySrc,dxSrc,dySrc,SRCCOPY);
318 /**********************************************************************
319 * DrawDibDraw [MSVIDEO.106]
321 BOOL16 VFWAPI DrawDibDraw16(HDRAWDIB16 hdd,
327 LPBITMAPINFOHEADER lpbi,
334 return DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,xSrc,ySrc,dxSrc,dySrc,wFlags);
337 /*************************************************************************
338 * DrawDibStart [MSVFW32.14]
340 BOOL VFWAPI DrawDibStart(HDRAWDIB hdd, DWORD rate) {
341 FIXME("(0x%08lx,%ld), stub\n",(DWORD)hdd,rate);
345 /*************************************************************************
346 * DrawDibStart [MSVIDEO.118]
348 BOOL16 VFWAPI DrawDibStart16(HDRAWDIB16 hdd, DWORD rate) {
349 return DrawDibStart(hdd,rate);
352 /*************************************************************************
353 * DrawDibStop [MSVFW32.15]
355 BOOL VFWAPI DrawDibStop(HDRAWDIB hdd) {
356 FIXME("(0x%08lx), stub\n",(DWORD)hdd);
360 /*************************************************************************
361 * DrawDibStop [MSVIDEO.119]
363 BOOL16 DrawDibStop16(HDRAWDIB16 hdd) {
364 return DrawDibStop(hdd);
367 /***********************************************************************
368 * DrawDibSetPalette [MSVFW32.13]
370 BOOL VFWAPI DrawDibSetPalette(HDRAWDIB hdd, HPALETTE hpal) {
373 TRACE("(0x%08lx,0x%08lx)\n",(DWORD)hdd,(DWORD)hpal);
375 whdd = GlobalLock16(hdd);
379 SelectPalette(whdd->hdc,hpal,0);
380 RealizePalette(whdd->hdc);
386 /***********************************************************************
387 * DrawDibSetPalette [MSVIDEO.110]
389 BOOL16 VFWAPI DrawDibSetPalette16(HDRAWDIB16 hdd, HPALETTE16 hpal) {
390 return DrawDibSetPalette(hdd,hpal);
393 /***********************************************************************
394 * DrawDibGetPalette [MSVFW32.9]
396 HPALETTE VFWAPI DrawDibGetPalette(HDRAWDIB hdd) {
400 TRACE("(0x%08lx)\n",(DWORD)hdd);
402 whdd = GlobalLock16(hdd);
408 /***********************************************************************
409 * DrawDibGetPalette [MSVIDEO.108]]
411 HPALETTE16 VFWAPI DrawDibGetPalette16(HDRAWDIB16 hdd) {
412 return (HPALETTE16)DrawDibGetPalette(hdd);
415 /***********************************************************************
416 * DrawDibRealize [MSVFW32.12]
418 UINT VFWAPI DrawDibRealize(HDRAWDIB hdd, HDC hdc, BOOL fBackground) {
423 FIXME("(%d,0x%08lx,%d), stub\n",hdd,(DWORD)hdc,fBackground);
425 whdd = GlobalLock16(hdd);
427 if (!whdd || !(whdd->begun)) {
433 whdd->hpal = CreateHalftonePalette(hdc);
435 oldPal = SelectPalette(hdc,whdd->hpal,fBackground);
436 ret = RealizePalette(hdc);
441 TRACE("=> %u\n",ret);
445 /***********************************************************************
446 * DrawDibRealize [MSVIDEO.112]
448 UINT16 VFWAPI DrawDibRealize16(HDRAWDIB16 hdd, HDC16 hdc, BOOL16 fBackground) {
449 return (UINT16)DrawDibRealize(hdd,hdc,fBackground);