9 * Return the size of the bitmap info structure including color table.
10 * 11/16/1999 (RJJ) lifted from wine
13 INT FASTCALL
DIB_BitmapInfoSize(const BITMAPINFO
* info
, WORD coloruse
)
15 unsigned int colors
, size
, masks
= 0;
17 if (info
->bmiHeader
.biSize
== sizeof(BITMAPCOREHEADER
))
19 const BITMAPCOREHEADER
*core
= (const BITMAPCOREHEADER
*)info
;
20 colors
= (core
->bcBitCount
<= 8) ? 1 << core
->bcBitCount
: 0;
21 return sizeof(BITMAPCOREHEADER
) + colors
*
22 ((coloruse
== DIB_RGB_COLORS
) ? sizeof(RGBTRIPLE
) : sizeof(WORD
));
24 else /* assume BITMAPINFOHEADER */
26 colors
= info
->bmiHeader
.biClrUsed
;
27 if (colors
> 256) colors
= 256;
28 if (!colors
&& (info
->bmiHeader
.biBitCount
<= 8))
29 colors
= 1 << info
->bmiHeader
.biBitCount
;
30 if (info
->bmiHeader
.biCompression
== BI_BITFIELDS
) masks
= 3;
31 size
= max( info
->bmiHeader
.biSize
, sizeof(BITMAPINFOHEADER
) + masks
* sizeof(DWORD
) );
32 return size
+ colors
* ((coloruse
== DIB_RGB_COLORS
) ? sizeof(RGBQUAD
) : sizeof(WORD
));
37 * Return the full scan size for a bitmap.
39 * Based on Wine, Utils.c and Windows Graphics Prog pg 595, SDK amvideo.h.
43 DIB_BitmapMaxBitsSize( PBITMAPINFO Info
, UINT ScanLines
)
49 if (Info
->bmiHeader
.biSize
== sizeof(BITMAPCOREHEADER
))
51 PBITMAPCOREHEADER Core
= (PBITMAPCOREHEADER
)Info
;
52 MaxBits
= Core
->bcBitCount
* Core
->bcPlanes
* Core
->bcWidth
;
54 else /* assume BITMAPINFOHEADER */
56 if ((Info
->bmiHeader
.biCompression
) && (Info
->bmiHeader
.biCompression
!= BI_BITFIELDS
))
57 return Info
->bmiHeader
.biSizeImage
;
58 // Planes are over looked by Yuan. I guess assumed always 1.
59 MaxBits
= Info
->bmiHeader
.biBitCount
* Info
->bmiHeader
.biPlanes
* Info
->bmiHeader
.biWidth
;
61 MaxBits
= ((MaxBits
+ 31) & ~31 ) / 8; // From Yuan, ScanLineSize = (Width * bitcount + 31)/32
62 return (MaxBits
* ScanLines
); // ret the full Size.
67 DIB_BitmapBitsSize( CONST BITMAPINFO
* Info
)
73 if ( Info
->bmiHeader
.biSize
== sizeof(BITMAPCOREHEADER
))
75 PBITMAPCOREHEADER Core
= (PBITMAPCOREHEADER
)Info
;
76 Ret
= Core
->bcHeight
*
77 ((Core
->bcWidth
* Core
->bcPlanes
* Core
->bcBitCount
+ 31) & ~31 ) / 8;
79 else /* assume BITMAPINFOHEADER */
81 if ((Info
->bmiHeader
.biCompression
) &&
82 (Info
->bmiHeader
.biCompression
!= BI_BITFIELDS
))
83 return Info
->bmiHeader
.biSizeImage
;
84 // Make Height positive always....
85 Ret
= abs(Info
->bmiHeader
.biHeight
) *
86 ((Info
->bmiHeader
.biWidth
* Info
->bmiHeader
.biPlanes
* Info
->bmiHeader
.biBitCount
+ 31) & ~31 ) / 8;
93 * DIB_GetBitmapInfo is complete copy of wine cvs 2/9-2006
94 * from file dib.c from gdi32.dll or orginal version
95 * did not calc the info right for some headers.
99 DIB_GetBitmapInfo(const BITMAPINFOHEADER
*header
,
107 if (header
->biSize
== sizeof(BITMAPCOREHEADER
))
109 BITMAPCOREHEADER
*core
= (BITMAPCOREHEADER
*)header
;
110 *width
= core
->bcWidth
;
111 *height
= core
->bcHeight
;
112 *planes
= core
->bcPlanes
;
113 *bpp
= core
->bcBitCount
;
119 if (header
->biSize
== sizeof(BITMAPINFOHEADER
))
121 *width
= header
->biWidth
;
122 *height
= header
->biHeight
;
123 *planes
= header
->biPlanes
;
124 *bpp
= header
->biBitCount
;
125 *compr
= header
->biCompression
;
126 *size
= header
->biSizeImage
;
130 if (header
->biSize
== sizeof(BITMAPV4HEADER
))
132 BITMAPV4HEADER
*v4hdr
= (BITMAPV4HEADER
*)header
;
133 *width
= v4hdr
->bV4Width
;
134 *height
= v4hdr
->bV4Height
;
135 *planes
= v4hdr
->bV4Planes
;
136 *bpp
= v4hdr
->bV4BitCount
;
137 *compr
= v4hdr
->bV4V4Compression
;
138 *size
= v4hdr
->bV4SizeImage
;
142 if (header
->biSize
== sizeof(BITMAPV5HEADER
))
144 BITMAPV5HEADER
*v5hdr
= (BITMAPV5HEADER
*)header
;
145 *width
= v5hdr
->bV5Width
;
146 *height
= v5hdr
->bV5Height
;
147 *planes
= v5hdr
->bV5Planes
;
148 *bpp
= v5hdr
->bV5BitCount
;
149 *compr
= v5hdr
->bV5Compression
;
150 *size
= v5hdr
->bV5SizeImage
;
153 DPRINT("(%ld): wrong size for header\n", header
->biSize
);
162 GdiGetBitmapBitsSize(BITMAPINFO
*lpbmi
)
166 if (lpbmi
->bmiHeader
.biSize
== FIELD_OFFSET(BITMAPINFOHEADER
, biPlanes
))
168 /* Calc the bits Size and align it*/
169 retSize
= HIWORD(lpbmi
->bmiHeader
.biWidth
) * ((LOWORD(lpbmi
->bmiHeader
.biWidth
) *
170 LOWORD(lpbmi
->bmiHeader
.biHeight
) * HIWORD(lpbmi
->bmiHeader
.biHeight
) + 31)
175 if ( (lpbmi
->bmiHeader
.biCompression
== BI_BITFIELDS
) ||
176 (lpbmi
->bmiHeader
.biCompression
== BI_RGB
))
178 if (lpbmi
->bmiHeader
.biHeight
>=0 )
180 /* Calc the bits Size and align it*/
181 retSize
= lpbmi
->bmiHeader
.biHeight
* ((lpbmi
->bmiHeader
.biWidth
*
182 lpbmi
->bmiHeader
.biPlanes
* lpbmi
->bmiHeader
.biBitCount
+ 31) & -32) / 8;
186 /* Make height postiive if it negitve then calc the bits Size and align it*/
187 retSize
= (-lpbmi
->bmiHeader
.biHeight
) * ((lpbmi
->bmiHeader
.biWidth
*
188 lpbmi
->bmiHeader
.biPlanes
* lpbmi
->bmiHeader
.biBitCount
+ 31) & -32) / 8;
193 retSize
= lpbmi
->bmiHeader
.biSizeImage
;
205 CONST BITMAPINFO
*BitmapInfo
,
211 PBITMAPINFO pConvertedInfo
;
212 UINT ConvertedInfoSize
;
213 HBITMAP hBitmap
= NULL
;
216 pConvertedInfo
= ConvertBitmapInfo(BitmapInfo
, Usage
,
217 &ConvertedInfoSize
, FALSE
);
220 // Verify header due to converted may == info.
221 if ( pConvertedInfo
->bmiHeader
.biSize
>= sizeof(BITMAPINFOHEADER
) )
223 if ( pConvertedInfo
->bmiHeader
.biCompression
== BI_JPEG
||
224 pConvertedInfo
->bmiHeader
.biCompression
== BI_PNG
)
226 SetLastError(ERROR_INVALID_PARAMETER
);
231 hBitmap
= NtGdiCreateDIBSection( hDC
,
240 if (BitmapInfo
!= pConvertedInfo
)
241 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo
);
249 if (Bits
) *Bits
= bmBits
;
260 BitBlt(HDC hdcDest
, /* handle to destination DC */
261 int nXOriginDest
, /* x-coord of destination upper-left corner */
262 int nYOriginDest
, /* y-coord of destination upper-left corner */
263 int nWidthDest
, /* width of destination rectangle */
264 int nHeightDest
, /* height of destination rectangle */
265 HDC hdcSrc
, /* handle to source DC */
266 int nXSrc
, /* x-coordinate of source upper-left corner */
267 int nYSrc
, /* y-coordinate of source upper-left corner */
268 DWORD dwRop
) /* raster operation code */
270 /* use patBlt for no source blt Like windows does */
271 if (!ROP_USES_SOURCE(dwRop
))
273 return PatBlt(hdcDest
, nXOriginDest
, nYOriginDest
, nWidthDest
, nHeightDest
, dwRop
);
276 return NtGdiBitBlt(hdcDest
,
294 HDC hdcDest
, /* handle to destination DC */
295 int nXOriginDest
, /* x-coord of destination upper-left corner */
296 int nYOriginDest
, /* y-coord of destination upper-left corner */
297 int nWidthDest
, /* width of destination rectangle */
298 int nHeightDest
, /* height of destination rectangle */
299 HDC hdcSrc
, /* handle to source DC */
300 int nXOriginSrc
, /* x-coord of source upper-left corner */
301 int nYOriginSrc
, /* y-coord of source upper-left corner */
302 int nWidthSrc
, /* width of source rectangle */
303 int nHeightSrc
, /* height of source rectangle */
304 DWORD dwRop
) /* raster operation code */
307 if ((nWidthDest
!= nWidthSrc
) || (nHeightDest
!= nHeightSrc
))
309 return NtGdiStretchBlt(hdcDest
, nXOriginDest
, nYOriginDest
, nWidthDest
,
310 nHeightDest
, hdcSrc
, nXOriginSrc
, nYOriginSrc
,
311 nWidthSrc
, nHeightSrc
, dwRop
, 0);
314 return NtGdiBitBlt(hdcDest
, nXOriginDest
, nYOriginDest
, nWidthDest
,
315 nHeightDest
, hdcSrc
, nXOriginSrc
, nYOriginSrc
, dwRop
, 0, 0);
322 CreateBitmap(INT Width
,
326 CONST VOID
* pUnsafeBits
)
328 /* FIXME some part should be done in user mode */
331 return NtGdiCreateBitmap(Width
, Height
, Planes
, BitsPixel
, (LPBYTE
) pUnsafeBits
);
335 /* Return 1x1 bitmap */
336 return GetStockObject(DEFAULT_BITMAP
);
344 CreateBitmapIndirect(const BITMAP
*pbm
)
346 HBITMAP bitmap
= NULL
;
348 /* Note windows xp/2003 does not check if pbm is NULL or not */
349 if ( (pbm
->bmWidthBytes
!= 0) &&
350 (!(pbm
->bmWidthBytes
& 1)) )
354 bitmap
= CreateBitmap(pbm
->bmWidth
,
362 SetLastError(ERROR_INVALID_PARAMETER
);
369 CreateDiscardableBitmap(
374 return CreateCompatibleBitmap(hDC
, Width
, Height
);
379 CreateCompatibleBitmap(
388 if (!GdiGetHandleUserData(hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
)&pDc_Attr
))
391 if ( !Width
|| !Height
)
392 return GetStockObject(DEFAULT_BITMAP
);
394 if (!(pDc_Attr
->ulDirty_
& DC_DIBSECTION
))
396 return NtGdiCreateCompatibleBitmap(hDC
, Width
, Height
);
399 hBmp
= NtGdiGetDCObject(hDC
, GDI_OBJECT_TYPE_BITMAP
);
401 if ( GetObjectA(hBmp
, sizeof(DIBSECTION
), &dibs
) != sizeof(DIBSECTION
) )
404 if ( dibs
.dsBm
.bmBitsPixel
<= 8 )
405 GetDIBColorTable(hDC
, 0, 256, (RGBQUAD
*)&dibs
.dsBitfields
);
407 dibs
.dsBmih
.biWidth
= Width
;
408 dibs
.dsBmih
.biHeight
= Height
;
410 return CreateDIBSection(hDC
, (CONST BITMAPINFO
*)&dibs
.dsBmih
, 0, NULL
, NULL
, 0);
414 ConvertBackBitmapInfo(PBITMAPINFO pbmi
, PBITMAPINFO pbmiConverted
)
416 /* Check if we converted from PBITMAPCOREINFO */
417 if (pbmiConverted
!= pbmi
)
419 PBITMAPCOREINFO pbci
= (PBITMAPCOREINFO
)pbmi
;
421 /* Convert back header */
422 pbci
->bmciHeader
.biSize
= sizeof(BITMAPCOREHEADER
);
423 pbci
->bmciHeader
.bcWidth
= pbmiConverted
->bmiHeader
.biWidth
;
424 pbci
->bmciHeader
.bcHeight
= pbmiConverted
->bmiHeader
.biHeight
;
425 pbci
->bmciHeader
.bcPlanes
= 1;
426 pbci
->bmciHeader
.bcBitCount
= pbmiConverted
->bmiHeader
.biBitCount
;
428 /* Convert back colors */
429 for (i
= 0; i
< pbmiConverted
->bmiHeader
.biClrUsed
; i
++)
431 pbci
->bmciColors
.rgbtRed
= pbmiConverted
->bmiColors
.rgbRed
;
432 pbci
->bmciColors
.rgbtGreen
= pbmiConverted
->bmiColors
.rgbGreen
;
433 pbci
->bmciColors
.rgbtBlue
= pbmiConverted
->bmiColors
.rgbBlue
;
437 RtlFreeHeap(RtlGetProcessHeap(), 0, pbmiConverted
);
452 PBITMAPINFO pbmiConverted
;
453 UINT cjBmpScanSize
, cjInfoSize
;
456 if (!hDC
|| !GdiIsHandleValid((HGDIOBJ
)hDC
) || !lpbmi
)
458 GdiSetLastError(ERROR_INVALID_PARAMETER
);
462 /* Convert BITMAPINFO to a proper format */
463 pbmiConverted
= ConvertBitmapInfo(lpbmi
, uUsage
, &cjInfoSize
, FALSE
);
466 GdiSetLastError(ERROR_INVALID_PARAMETER
);
470 cjBmpScanSize
= DIB_BitmapMaxBitsSize(lpbmi
, cScanLines
);
474 if (lpbmi
->bmiHeader
.biSize
>= sizeof(BITMAPINFOHEADER
))
476 if (lpbmi
->bmiHeader
.biCompression
== BI_JPEG
||
477 lpbmi
->bmiHeader
.biCompression
== BI_PNG
)
479 SetLastError(ERROR_INVALID_PARAMETER
);
485 iResult
= NtGdiGetDIBitsInternal(hDC
,
495 ConvertBackBitmapInfo(lpbmi
, pbmiConverted
);
506 CreateDIBitmap( HDC hDC
,
507 const BITMAPINFOHEADER
*Header
,
510 const BITMAPINFO
*Data
,
513 LONG width
, height
, compr
, dibsize
;
515 // PDC_ATTR pDc_Attr;
517 UINT cjBmpScanSize
= 0;
519 NTSTATUS Status
= STATUS_SUCCESS
;
521 if (!Header
) return 0;
523 if (DIB_GetBitmapInfo(Header
, &width
, &height
, &planes
, &bpp
, &compr
, &dibsize
) == -1)
525 GdiSetLastError(ERROR_INVALID_PARAMETER
);
530 // GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
536 cjBmpScanSize
= DIB_BitmapBitsSize(Data
);
537 CalculateColorTableSize(&Data
->bmiHeader
, &ColorUse
, &InfoSize
);
538 InfoSize
+= Data
->bmiHeader
.biSize
;
540 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
542 Status
= _SEH2_GetExceptionCode();
547 if(!NT_SUCCESS(Status
))
549 GdiSetLastError(ERROR_INVALID_PARAMETER
);
553 DPRINT("pBMI %x, Size bpp %d, dibsize %d, Conv %d, BSS %d\n", Data
,bpp
,dibsize
,InfoSize
,cjBmpScanSize
);
555 if ( !width
|| !height
)
556 hBmp
= GetStockObject(DEFAULT_BITMAP
);
559 hBmp
= NtGdiCreateDIBitmapInternal(hDC
,
574 #if 0 // FIXME!!! This is a victim of the Win32k Initialization BUG!!!!!
585 CONST BITMAPINFO
*lpbmi
,
588 HDC hDCc
, SavehDC
, nhDC
;
589 DWORD dwWidth
, dwHeight
;
591 HPALETTE hPal
= NULL
;
595 if ( !lpvBits
|| (GDI_HANDLE_GET_TYPE(hBitmap
) != GDI_OBJECT_TYPE_BITMAP
) )
600 if ( lpbmi
->bmiHeader
.biSize
>= sizeof(BITMAPINFOHEADER
) )
602 if ( lpbmi
->bmiHeader
.biCompression
== BI_JPEG
|| lpbmi
->bmiHeader
.biCompression
== BI_PNG
)
604 SetLastError(ERROR_INVALID_PARAMETER
);
610 hDCc
= NtGdiGetDCforBitmap(hBitmap
);
614 nhDC
= CreateCompatibleDC(hDC
);
615 if ( !nhDC
) return 0;
619 else if ( !SaveDC(hDCc
) )
622 hOldBitmap
= SelectObject(SavehDC
, hBitmap
);
627 hPal
= SelectPalette(SavehDC
, (HPALETTE
)GetDCObject(hDC
, GDI_OBJECT_TYPE_PALETTE
), FALSE
);
629 if ( lpbmi
->bmiHeader
.biSize
< sizeof(BITMAPINFOHEADER
))
631 PBITMAPCOREINFO pbci
= (PBITMAPCOREINFO
) lpbmi
;
632 dwWidth
= pbci
->bmciHeader
.bcWidth
;
633 dwHeight
= pbci
->bmciHeader
.bcHeight
;
637 dwWidth
= lpbmi
->bmiHeader
.biWidth
;
638 dwHeight
= abs(lpbmi
->bmiHeader
.biHeight
);
641 LinesCopied
= SetDIBitsToDevice(SavehDC
,
654 if ( hDC
) SelectPalette(SavehDC
, hPal
, FALSE
);
656 SelectObject(SavehDC
, hOldBitmap
);
662 RestoreDC(SavehDC
, -1);
675 CONST BITMAPINFO
*lpbmi
,
678 PBITMAPINFO pConvertedInfo
;
679 UINT ConvertedInfoSize
;
681 UINT cjBmpScanSize
= 0;
682 PVOID pvSafeBits
= (PVOID
)lpvBits
;
684 // This needs to be almost the sames as SetDIBitsToDevice
686 if ( !cScanLines
|| !lpbmi
|| !lpvBits
|| (GDI_HANDLE_GET_TYPE(hbmp
) != GDI_OBJECT_TYPE_BITMAP
))
689 if ( fuColorUse
&& fuColorUse
!= DIB_PAL_COLORS
&& fuColorUse
!= DIB_PAL_COLORS
+1 )
692 pConvertedInfo
= ConvertBitmapInfo(lpbmi
, fuColorUse
,
693 &ConvertedInfoSize
, FALSE
);
697 cjBmpScanSize
= DIB_BitmapMaxBitsSize((LPBITMAPINFO
)lpbmi
, cScanLines
);
701 pvSafeBits
= RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize
);
703 RtlCopyMemory( pvSafeBits
, lpvBits
, cjBmpScanSize
);
706 LinesCopied
= NtGdiSetDIBits( hdc
,
714 if ( lpvBits
!= pvSafeBits
)
715 RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits
);
716 if (lpbmi
!= pConvertedInfo
)
717 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo
);
738 CONST BITMAPINFO
*lpbmi
,
742 PBITMAPINFO pConvertedInfo
;
743 UINT ConvertedInfoSize
;
745 UINT cjBmpScanSize
= 0;
746 PVOID pvSafeBits
= (PVOID
)Bits
;
748 if ( !ScanLines
|| !lpbmi
|| !Bits
)
751 if ( ColorUse
&& ColorUse
!= DIB_PAL_COLORS
&& ColorUse
!= DIB_PAL_COLORS
+1 )
754 pConvertedInfo
= ConvertBitmapInfo(lpbmi
, ColorUse
,
755 &ConvertedInfoSize
, FALSE
);
760 // Handle something other than a normal dc object.
761 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
763 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
764 return MFDRV_SetDIBitsToDevice( hdc
,
778 PLDC pLDC
= GdiGetLDC(hdc
);
781 SetLastError(ERROR_INVALID_HANDLE
);
784 if (pLDC
->iType
== LDC_EMFLDC
)
786 return EMFDRV_SetDIBitsToDevice(hdc
,
803 cjBmpScanSize
= DIB_BitmapMaxBitsSize((LPBITMAPINFO
)lpbmi
, ScanLines
);
807 pvSafeBits
= RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize
);
809 RtlCopyMemory( pvSafeBits
, Bits
, cjBmpScanSize
);
812 if (!GdiGetHandleUserData(hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
)&pDc_Attr
))
814 SetLastError(ERROR_INVALID_PARAMETER
);
819 ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
820 (pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
821 pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/
823 LinesCopied
= NtGdiSetDIBitsToDeviceInternal( hdc
,
833 (LPBITMAPINFO
)pConvertedInfo
,
840 if ( Bits
!= pvSafeBits
)
841 RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits
);
842 if (lpbmi
!= pConvertedInfo
)
843 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo
);
854 StretchDIBits(HDC hdc
,
864 CONST BITMAPINFO
*lpBitsInfo
,
870 PBITMAPINFO pConvertedInfo
= NULL
;
871 UINT ConvertedInfoSize
= 0;
873 UINT cjBmpScanSize
= 0;
874 PVOID pvSafeBits
= NULL
;
877 DPRINT("StretchDIBits %x : %x : %d\n", lpBits
, lpBitsInfo
, iUsage
);
879 // Handle something other than a normal dc object.
880 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
882 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
883 return MFDRV_StretchBlt( hdc
,
898 PLDC pLDC
= GdiGetLDC(hdc
);
901 SetLastError(ERROR_INVALID_HANDLE
);
904 if (pLDC
->iType
== LDC_EMFLDC
)
906 return EMFDRV_StretchBlt(hdc
,
924 pConvertedInfo
= ConvertBitmapInfo(lpBitsInfo
, iUsage
,
925 &ConvertedInfoSize
, FALSE
);
931 cjBmpScanSize
= DIB_BitmapBitsSize((LPBITMAPINFO
)pConvertedInfo
);
935 pvSafeBits
= RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize
);
940 RtlCopyMemory( pvSafeBits
, lpBits
, cjBmpScanSize
);
942 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
950 // We don't die, we continue on with a allocated safe pointer to kernel
952 DPRINT1("StretchDIBits fail to read BitMapInfo: %x or Bits: %x & Size: %d\n",pConvertedInfo
,lpBits
,cjBmpScanSize
);
954 DPRINT("StretchDIBits Allocate Bits %d!!!\n", cjBmpScanSize
);
958 if (!GdiGetHandleUserData(hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
)&pDc_Attr
))
960 SetLastError(ERROR_INVALID_PARAMETER
);
965 ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
966 (pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
967 pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/
969 LinesCopied
= NtGdiStretchDIBitsInternal( hdc
,
987 RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits
);
988 if (lpBitsInfo
!= pConvertedInfo
)
989 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo
);