2 * Copyright 2000 Bradley Baetz
4 * Fixme: Some flags are ignored
5 * Should be doing buffering when requested
13 #include "wine/winbase16.h"
14 #include "debugtools.h"
19 DEFAULT_DEBUG_CHANNEL(msvideo);
24 LPBITMAPINFOHEADER lpbi;
27 HPALETTE hpal; /* Palette to use for the DIB */
28 BOOL begun; /* DrawDibBegin has been called */
29 LPBITMAPINFOHEADER lpbiOut; /* Output format */
30 HIC hic; /* HIC for decompression */
31 HDC hMemDC; /* DC for buffering */
32 HBITMAP hOldDib; /* Original Dib */
33 HBITMAP hDib; /* DibSection */
34 LPVOID lpvbits; /* Buffer for holding decompressed dib */
37 /***********************************************************************
38 * DrawDibOpen [MSVFW32.10]
40 HDRAWDIB VFWAPI DrawDibOpen(void) {
44 hdd = GlobalAlloc16(GHND,sizeof(WINE_HDD));
49 /***********************************************************************
50 * DrawDibOpen [MSVIDEO.102]
52 HDRAWDIB16 VFWAPI DrawDibOpen16(void) {
53 return (HDRAWDIB16)DrawDibOpen();
56 /***********************************************************************
57 * DrawDibClose [MSVFW32.5]
59 BOOL VFWAPI DrawDibClose(HDRAWDIB hdd) {
60 WINE_HDD *whdd = GlobalLock16(hdd);
62 TRACE("(0x%08lx)\n",(DWORD)hdd);
75 /***********************************************************************
76 * DrawDibClose [MSVIDEO.103]
78 BOOL16 VFWAPI DrawDibClose16(HDRAWDIB16 hdd) {
79 return DrawDibClose(hdd);
82 /***********************************************************************
83 * DrawDibEnd [MSVFW32.7]
85 BOOL VFWAPI DrawDibEnd(HDRAWDIB hdd) {
87 WINE_HDD *whdd = GlobalLock16(hdd);
89 TRACE("(0x%08lx)\n",(DWORD)hdd);
91 whdd->hpal = 0; /* Do not free this */
94 HeapFree(GetProcessHeap(),0,whdd->lpbi);
98 HeapFree(GetProcessHeap(),0,whdd->lpbiOut);
105 HeapFree(GetProcessHeap(),0,whdd->lpvbuf);*/
108 SelectObject(whdd->hMemDC,whdd->hOldDib);
109 DeleteDC(whdd->hMemDC);
113 DeleteObject(whdd->hDib);
116 ICDecompressEnd(whdd->hic);
120 whdd->lpvbits = NULL;
126 /***********************************************************************
127 * DrawDibEnd [MSVIDEO.105]
129 BOOL16 VFWAPI DrawDibEnd16(HDRAWDIB16 hdd) {
130 return DrawDibEnd(hdd);
133 /***********************************************************************
134 * DrawDibBegin [MSVFW32.3]
136 BOOL VFWAPI DrawDibBegin(HDRAWDIB hdd,
140 LPBITMAPINFOHEADER lpbi,
147 TRACE("(%d,0x%lx,%d,%d,%p,%d,%d,0x%08lx)\n",
148 hdd,(DWORD)hdc,dxDst,dyDst,lpbi,dxSrc,dySrc,(DWORD)wFlags
152 FIXME("wFlags == 0x%08lx not handled\n",(DWORD)wFlags);
154 whdd = (WINE_HDD*)GlobalLock16(hdd);
159 if (lpbi->biCompression) {
162 whdd->hic = ICOpen(ICTYPE_VIDEO,lpbi->biCompression,ICMODE_DECOMPRESS);
164 ERR("Could not open IC. biCompression == 0x%08lx\n",lpbi->biCompression);
169 size = ICDecompressGetFormat(whdd->hic,lpbi,NULL);
170 if (size == ICERR_UNSUPPORTED) {
171 FIXME("Codec doesn't support GetFormat, giving up.\n");
177 whdd->lpbiOut = HeapAlloc(GetProcessHeap(),0,size);
179 if (ICDecompressGetFormat(whdd->hic,lpbi,whdd->lpbiOut) != ICERR_OK)
184 /* FIXME: Use Ex functions if available? */
185 if (ICDecompressBegin(whdd->hic,lpbi,whdd->lpbiOut) != ICERR_OK)
188 TRACE("biSizeImage == %ld\n",whdd->lpbiOut->biSizeImage);
189 TRACE("biCompression == %ld\n",whdd->lpbiOut->biCompression);
190 TRACE("biBitCount == %d\n",whdd->lpbiOut->biBitCount);
194 TRACE("Not compressed!\n");
195 whdd->lpbiOut = HeapAlloc(GetProcessHeap(),0,lpbi->biSize);
196 memcpy(whdd->lpbiOut,lpbi,lpbi->biSize);
200 /*whdd->lpvbuf = HeapAlloc(GetProcessHeap(),0,whdd->lpbiOut->biSizeImage);*/
202 whdd->hMemDC = CreateCompatibleDC(hdc);
203 TRACE("Creating: %ld,%p\n",whdd->lpbiOut->biSize,whdd->lpvbits);
204 whdd->hDib = CreateDIBSection(whdd->hMemDC,(BITMAPINFO *)whdd->lpbiOut,DIB_RGB_COLORS,&(whdd->lpvbits),0,0);
206 TRACE("Error: %ld\n",GetLastError());
208 TRACE("Created: %d,%p\n",whdd->hDib,whdd->lpvbits);
209 whdd->hOldDib = SelectObject(whdd->hMemDC,whdd->hDib);
216 whdd->lpbi = HeapAlloc(GetProcessHeap(),0,lpbi->biSize);
217 memcpy(whdd->lpbi,lpbi,lpbi->biSize);
226 HeapFree(GetProcessHeap(),0,whdd->lpbiOut);
227 whdd->lpbiOut = NULL;
236 /************************************************************************
237 * DrawDibBegin [MSVIDEO.104]
239 BOOL16 VFWAPI DrawDibBegin16(HDRAWDIB16 hdd,
243 LPBITMAPINFOHEADER lpbi,
247 return DrawDibBegin(hdd,hdc,dxDst,dyDst,lpbi,dxSrc,dySrc,wFlags);
250 /**********************************************************************
251 * DrawDibDraw [MSVFW32.6]
253 BOOL VFWAPI DrawDibDraw(HDRAWDIB hdd,
259 LPBITMAPINFOHEADER lpbi,
269 TRACE("(%d,0x%lx,%d,%d,%d,%d,%p,%p,%d,%d,%d,%d,0x%08lx)\n",
270 hdd,(DWORD)hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,xSrc,ySrc,dxSrc,dySrc,(DWORD)wFlags
273 if (wFlags & ~(DDF_SAME_HDC | DDF_SAME_DRAW | DDF_NOTKEYFRAME))
274 FIXME("wFlags == 0x%08lx not handled\n",(DWORD)wFlags);
278 lpBits = (LPSTR)lpbi + (WORD)(lpbi->biSize) + (WORD)(lpbi->biClrUsed*sizeof(RGBQUAD));
281 whdd = GlobalLock16(hdd);
283 #define CHANGED(x) (whdd->##x != ##x)
285 if ((!whdd->begun) || (!(wFlags & DDF_SAME_HDC) && CHANGED(hdc)) || (!(wFlags & DDF_SAME_DRAW) &&
286 (CHANGED(lpbi) || CHANGED(dxSrc) || CHANGED(dySrc) || CHANGED(dxDst) || CHANGED(dyDst)))) {
287 TRACE("Something changed!\n");
288 ret = DrawDibBegin(hdd,hdc,dxDst,dyDst,lpbi,dxSrc,dySrc,0);
293 if ((dxDst == -1) && (dyDst == -1)) {
298 if (lpbi->biCompression) {
301 TRACE("Compression == 0x%08lx\n",lpbi->biCompression);
303 if (wFlags & DDF_NOTKEYFRAME)
304 flags |= ICDECOMPRESS_NOTKEYFRAME;
306 ICDecompress(whdd->hic,flags,lpbi,lpBits,whdd->lpbiOut,whdd->lpvbits);
308 memcpy(whdd->lpvbits,lpBits,lpbi->biSizeImage);
311 SelectPalette(hdc,whdd->hpal,FALSE);
313 StretchBlt(whdd->hdc,xDst,yDst,dxDst,dyDst,whdd->hMemDC,xSrc,ySrc,dxSrc,dySrc,SRCCOPY);
319 /**********************************************************************
320 * DrawDibDraw [MSVIDEO.106]
322 BOOL16 VFWAPI DrawDibDraw16(HDRAWDIB16 hdd,
328 LPBITMAPINFOHEADER lpbi,
335 return DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,xSrc,ySrc,dxSrc,dySrc,wFlags);
338 /*************************************************************************
339 * DrawDibStart [MSVFW32.14]
341 BOOL VFWAPI DrawDibStart(HDRAWDIB hdd, DWORD rate) {
342 FIXME("(0x%08lx,%ld), stub\n",(DWORD)hdd,rate);
346 /*************************************************************************
347 * DrawDibStart [MSVIDEO.118]
349 BOOL16 VFWAPI DrawDibStart16(HDRAWDIB16 hdd, DWORD rate) {
350 return DrawDibStart(hdd,rate);
353 /*************************************************************************
354 * DrawDibStop [MSVFW32.15]
356 BOOL VFWAPI DrawDibStop(HDRAWDIB hdd) {
357 FIXME("(0x%08lx), stub\n",(DWORD)hdd);
361 /*************************************************************************
362 * DrawDibStop [MSVIDEO.119]
364 BOOL16 DrawDibStop16(HDRAWDIB16 hdd) {
365 return DrawDibStop(hdd);
368 /***********************************************************************
369 * DrawDibSetPalette [MSVFW32.13]
371 BOOL VFWAPI DrawDibSetPalette(HDRAWDIB hdd, HPALETTE hpal) {
374 TRACE("(0x%08lx,0x%08lx)\n",(DWORD)hdd,(DWORD)hpal);
376 whdd = GlobalLock16(hdd);
380 SelectPalette(whdd->hdc,hpal,0);
381 RealizePalette(whdd->hdc);
387 /***********************************************************************
388 * DrawDibSetPalette [MSVIDEO.110]
390 BOOL16 VFWAPI DrawDibSetPalette16(HDRAWDIB16 hdd, HPALETTE16 hpal) {
391 return DrawDibSetPalette(hdd,hpal);
394 /***********************************************************************
395 * DrawDibGetPalette [MSVFW32.9]
397 HPALETTE VFWAPI DrawDibGetPalette(HDRAWDIB hdd) {
401 TRACE("(0x%08lx)\n",(DWORD)hdd);
403 whdd = GlobalLock16(hdd);
409 /***********************************************************************
410 * DrawDibGetPalette [MSVIDEO.108]]
412 HPALETTE16 VFWAPI DrawDibGetPalette16(HDRAWDIB16 hdd) {
413 return (HPALETTE16)DrawDibGetPalette(hdd);
416 /***********************************************************************
417 * DrawDibRealize [MSVFW32.12]
419 UINT VFWAPI DrawDibRealize(HDRAWDIB hdd, HDC hdc, BOOL fBackground) {
424 FIXME("(%d,0x%08lx,%d), stub\n",hdd,(DWORD)hdc,fBackground);
426 whdd = GlobalLock16(hdd);
428 if (!whdd || !(whdd->begun)) {
434 whdd->hpal = CreateHalftonePalette(hdc);
436 oldPal = SelectPalette(hdc,whdd->hpal,fBackground);
437 ret = RealizePalette(hdc);
442 TRACE("=> %u\n",ret);
446 /***********************************************************************
447 * DrawDibRealize [MSVIDEO.112]
449 UINT16 VFWAPI DrawDibRealize16(HDRAWDIB16 hdd, HDC16 hdc, BOOL16 fBackground) {
450 return (UINT16)DrawDibRealize(hdd,hdc,fBackground);