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