[WIN32SS]
[reactos.git] / reactos / dll / win32 / gdi32 / objects / bitmap.c
diff --git a/reactos/dll/win32/gdi32/objects/bitmap.c b/reactos/dll/win32/gdi32/objects/bitmap.c
deleted file mode 100644 (file)
index b135d3a..0000000
+++ /dev/null
@@ -1,887 +0,0 @@
-#include "precomp.h"
-
-#define NDEBUG
-#include <debug.h>
-
-// From Yuan, ScanLineSize = (Width * bitcount + 31)/32
-#define WIDTH_BYTES_ALIGN32(cx, bpp) ((((cx) * (bpp) + 31) & ~31) >> 3)
-
-/*
- *           DIB_BitmapInfoSize
- *
- * Return the size of the bitmap info structure including color table.
- * 11/16/1999 (RJJ) lifted from wine
- */
-
-INT FASTCALL DIB_BitmapInfoSize(const BITMAPINFO * info, WORD coloruse)
-{
-    unsigned int colors, size, masks = 0;
-
-    if (info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
-    {
-        const BITMAPCOREHEADER *core = (const BITMAPCOREHEADER *)info;
-        colors = (core->bcBitCount <= 8) ? 1 << core->bcBitCount : 0;
-        return sizeof(BITMAPCOREHEADER) + colors *
-               ((coloruse == DIB_RGB_COLORS) ? sizeof(RGBTRIPLE) : sizeof(WORD));
-    }
-    else  /* assume BITMAPINFOHEADER */
-    {
-        colors = info->bmiHeader.biClrUsed;
-        if (colors > 256) colors = 256;
-        if (!colors && (info->bmiHeader.biBitCount <= 8))
-            colors = 1 << info->bmiHeader.biBitCount;
-        if (info->bmiHeader.biCompression == BI_BITFIELDS) masks = 3;
-        size = max( info->bmiHeader.biSize, sizeof(BITMAPINFOHEADER) + masks * sizeof(DWORD) );
-        return size + colors * ((coloruse == DIB_RGB_COLORS) ? sizeof(RGBQUAD) : sizeof(WORD));
-    }
-}
-
-/*
- * Return the full scan size for a bitmap.
- *
- * Based on Wine, Utils.c and Windows Graphics Prog pg 595, SDK amvideo.h.
- */
-UINT
-FASTCALL
-DIB_BitmapMaxBitsSize( PBITMAPINFO Info, UINT ScanLines )
-{
-    UINT Ret;
-
-    if (!Info) return 0;
-
-    if ( Info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
-    {
-        PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER)Info;
-        Ret = WIDTH_BYTES_ALIGN32(Core->bcWidth * Core->bcPlanes, Core->bcBitCount) * ScanLines;
-    }
-    else /* assume BITMAPINFOHEADER */
-    {
-        if (!(Info->bmiHeader.biCompression) || (Info->bmiHeader.biCompression == BI_BITFIELDS))
-        {
-           Ret = WIDTH_BYTES_ALIGN32(Info->bmiHeader.biWidth * Info->bmiHeader.biPlanes, Info->bmiHeader.biBitCount) * ScanLines;
-        }
-        else
-        {
-           Ret = Info->bmiHeader.biSizeImage;
-        }
-    }
-    return Ret;
-}
-
-/*
- * DIB_GetBitmapInfo is complete copy of wine cvs 2/9-2006
- * from file dib.c from gdi32.dll or orginal version
- * did not calc the info right for some headers.
- */
-INT
-WINAPI
-DIB_GetBitmapInfo(const BITMAPINFOHEADER *header,
-                  PLONG width,
-                  PLONG height,
-                  PWORD planes,
-                  PWORD bpp,
-                  PLONG compr,
-                  PLONG size )
-{
-    if (header->biSize == sizeof(BITMAPCOREHEADER))
-    {
-        BITMAPCOREHEADER *core = (BITMAPCOREHEADER *)header;
-        *width  = core->bcWidth;
-        *height = core->bcHeight;
-        *planes = core->bcPlanes;
-        *bpp    = core->bcBitCount;
-        *compr  = 0;
-        *size   = 0;
-        return 0;
-    }
-
-    if (header->biSize == sizeof(BITMAPINFOHEADER))
-    {
-        *width  = header->biWidth;
-        *height = header->biHeight;
-        *planes = header->biPlanes;
-        *bpp    = header->biBitCount;
-        *compr  = header->biCompression;
-        *size   = header->biSizeImage;
-        return 1;
-    }
-
-    if (header->biSize == sizeof(BITMAPV4HEADER))
-    {
-        BITMAPV4HEADER *v4hdr = (BITMAPV4HEADER *)header;
-        *width  = v4hdr->bV4Width;
-        *height = v4hdr->bV4Height;
-        *planes = v4hdr->bV4Planes;
-        *bpp    = v4hdr->bV4BitCount;
-        *compr  = v4hdr->bV4V4Compression;
-        *size   = v4hdr->bV4SizeImage;
-        return 4;
-    }
-
-    if (header->biSize == sizeof(BITMAPV5HEADER))
-    {
-        BITMAPV5HEADER *v5hdr = (BITMAPV5HEADER *)header;
-        *width  = v5hdr->bV5Width;
-        *height = v5hdr->bV5Height;
-        *planes = v5hdr->bV5Planes;
-        *bpp    = v5hdr->bV5BitCount;
-        *compr  = v5hdr->bV5Compression;
-        *size   = v5hdr->bV5SizeImage;
-        return 5;
-    }
-    DPRINT("(%ld): wrong size for header\n", header->biSize );
-    return -1;
-}
-
-/*
- * @implemented
- */
-int
-WINAPI
-GdiGetBitmapBitsSize(BITMAPINFO *lpbmi)
-{
-    UINT Ret;
-
-    if (!lpbmi) return 0;
-
-    if ( lpbmi->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
-    {
-        PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER)lpbmi;
-        Ret = WIDTH_BYTES_ALIGN32(Core->bcWidth * Core->bcPlanes, Core->bcBitCount) * Core->bcHeight;
-    }
-    else /* assume BITMAPINFOHEADER */
-    {
-        if (!(lpbmi->bmiHeader.biCompression) || (lpbmi->bmiHeader.biCompression == BI_BITFIELDS))
-        {
-           Ret = WIDTH_BYTES_ALIGN32(lpbmi->bmiHeader.biWidth * lpbmi->bmiHeader.biPlanes, lpbmi->bmiHeader.biBitCount) * abs(lpbmi->bmiHeader.biHeight);
-        }
-        else
-        {
-           Ret = lpbmi->bmiHeader.biSizeImage;
-        }
-    }
-    return Ret;
-}
-
-/*
- * @implemented
- */
-HBITMAP WINAPI
-CreateDIBSection(
-    HDC hDC,
-    CONST BITMAPINFO *BitmapInfo,
-    UINT Usage,
-    VOID **Bits,
-    HANDLE hSection,
-    DWORD dwOffset)
-{
-    PBITMAPINFO pConvertedInfo;
-    UINT ConvertedInfoSize;
-    HBITMAP hBitmap = NULL;
-    PVOID  bmBits = NULL;
-
-    pConvertedInfo = ConvertBitmapInfo(BitmapInfo, Usage,
-                                       &ConvertedInfoSize, FALSE);
-    if (pConvertedInfo)
-    {
-        // Verify header due to converted may == info.
-        if ( pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
-        {
-            if ( pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
-                    pConvertedInfo->bmiHeader.biCompression  == BI_PNG )
-            {
-                SetLastError(ERROR_INVALID_PARAMETER);
-                return NULL;
-            }
-        }
-        bmBits = Bits;
-        hBitmap = NtGdiCreateDIBSection( hDC,
-                                         hSection,
-                                         dwOffset,
-                                         pConvertedInfo,
-                                         Usage,
-                                         0,
-                                         0,
-                                         0,
-                                         &bmBits);
-        if (BitmapInfo != pConvertedInfo)
-            RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
-
-        if (!hBitmap)
-        {
-            bmBits = NULL;
-        }
-    }
-
-    if (Bits) *Bits = bmBits;
-
-    return hBitmap;
-}
-
-
-/*
- * @implemented
- */
-BOOL
-WINAPI
-BitBlt(HDC hdcDest,      /* handle to destination DC */
-       int nXOriginDest, /* x-coord of destination upper-left corner */
-       int nYOriginDest, /* y-coord of destination upper-left corner */
-       int nWidthDest,   /* width of destination rectangle */
-       int nHeightDest,  /* height of destination rectangle */
-       HDC hdcSrc,       /* handle to source DC */
-       int nXSrc,        /* x-coordinate of source upper-left corner */
-       int nYSrc,        /* y-coordinate of source upper-left corner */
-       DWORD dwRop)      /* raster operation code */
-{
-    /* use patBlt for no source blt  Like windows does */
-    if (!ROP_USES_SOURCE(dwRop))
-    {
-        return PatBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, dwRop);
-    }
-
-    return NtGdiBitBlt(hdcDest,
-                       nXOriginDest,
-                       nYOriginDest,
-                       nWidthDest,
-                       nHeightDest,
-                       hdcSrc,
-                       nXSrc,
-                       nYSrc,
-                       dwRop,
-                       0,
-                       0);
-}
-
-/*
- * @implemented
- */
-BOOL WINAPI
-StretchBlt(
-    HDC hdcDest,      /* handle to destination DC */
-    int nXOriginDest, /* x-coord of destination upper-left corner */
-    int nYOriginDest, /* y-coord of destination upper-left corner */
-    int nWidthDest,   /* width of destination rectangle */
-    int nHeightDest,  /* height of destination rectangle */
-    HDC hdcSrc,       /* handle to source DC */
-    int nXOriginSrc,  /* x-coord of source upper-left corner */
-    int nYOriginSrc,  /* y-coord of source upper-left corner */
-    int nWidthSrc,    /* width of source rectangle */
-    int nHeightSrc,   /* height of source rectangle */
-    DWORD dwRop)      /* raster operation code */
-
-{
-    if ((nWidthDest != nWidthSrc) || (nHeightDest != nHeightSrc))
-    {
-        return NtGdiStretchBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest,
-                               nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc,
-                               nWidthSrc, nHeightSrc, dwRop, 0);
-    }
-
-    return NtGdiBitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest,
-                       nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, dwRop, 0, 0);
-}
-
-/*
- * @implemented
- */
-HBITMAP WINAPI
-CreateBitmap(INT  Width,
-             INT  Height,
-             UINT  Planes,
-             UINT  BitsPixel,
-             CONST VOID* pUnsafeBits)
-{
-    if (Width && Height)
-    {
-        return NtGdiCreateBitmap(Width, Height, Planes, BitsPixel, (LPBYTE) pUnsafeBits);
-    }
-    else
-    {
-        /* Return 1x1 bitmap */
-        return GetStockObject(DEFAULT_BITMAP);
-    }
-}
-
-/*
- * @implemented
- */
-HBITMAP WINAPI
-CreateBitmapIndirect(const BITMAP *pbm)
-{
-    HBITMAP bitmap = NULL;
-
-    /* Note windows xp/2003 does not check if pbm is NULL or not */
-    if ( (pbm->bmWidthBytes != 0) &&
-            (!(pbm->bmWidthBytes & 1)) )
-
-    {
-
-        bitmap = CreateBitmap(pbm->bmWidth,
-                              pbm->bmHeight,
-                              pbm->bmPlanes,
-                              pbm->bmBitsPixel,
-                              pbm->bmBits);
-    }
-    else
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-    }
-
-    return bitmap;
-}
-
-HBITMAP WINAPI
-CreateDiscardableBitmap(
-    HDC  hDC,
-    INT  Width,
-    INT  Height)
-{
-    return  CreateCompatibleBitmap(hDC, Width, Height);
-}
-
-
-HBITMAP WINAPI
-CreateCompatibleBitmap(
-    HDC  hDC,
-    INT  Width,
-    INT  Height)
-{
-    PDC_ATTR pDc_Attr;
-
-    if (!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
-        return NULL;
-
-    if ( !Width || !Height )
-        return GetStockObject(DEFAULT_BITMAP);
-
-    if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION))
-    {
-        return  NtGdiCreateCompatibleBitmap(hDC, Width, Height);
-    }
-    else
-    {
-        HBITMAP hBmp = NULL;
-        char buffer[sizeof(DIBSECTION) + 256*sizeof(RGBQUAD)];
-        DIBSECTION* pDIBs = (DIBSECTION*)buffer;
-
-        hBmp = NtGdiGetDCObject(hDC, GDI_OBJECT_TYPE_BITMAP);
-
-        if ( GetObjectA(hBmp, sizeof(DIBSECTION), pDIBs) != sizeof(DIBSECTION) )
-            return NULL;
-
-        if ( pDIBs->dsBm.bmBitsPixel <= 8 )
-            GetDIBColorTable(hDC, 0, 256, (RGBQUAD *)&pDIBs->dsBitfields[0]);
-
-        pDIBs->dsBmih.biWidth = Width;
-        pDIBs->dsBmih.biHeight = Height;
-
-        return CreateDIBSection(hDC, (CONST BITMAPINFO *)&pDIBs->dsBmih, 0, NULL, NULL, 0);
-    }
-    return NULL;
-}
-
-
-INT
-WINAPI
-GetDIBits(
-    HDC hDC,
-    HBITMAP hbmp,
-    UINT uStartScan,
-    UINT cScanLines,
-    LPVOID lpvBits,
-    LPBITMAPINFO lpbmi,
-    UINT uUsage)
-{
-    UINT cjBmpScanSize;
-    UINT cjInfoSize;
-
-    if (!hDC || !GdiIsHandleValid((HGDIOBJ)hDC) || !lpbmi)
-    {
-        GdiSetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-
-    cjBmpScanSize = DIB_BitmapMaxBitsSize(lpbmi, cScanLines);
-    cjInfoSize = DIB_BitmapInfoSize(lpbmi, uUsage);
-
-    if ( lpvBits )
-    {
-        if ( lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
-        {
-            if ( lpbmi->bmiHeader.biCompression == BI_JPEG ||
-                    lpbmi->bmiHeader.biCompression == BI_PNG )
-            {
-                SetLastError(ERROR_INVALID_PARAMETER);
-                return 0;
-            }
-        }
-    }
-
-    return NtGdiGetDIBitsInternal(hDC,
-                                  hbmp,
-                                  uStartScan,
-                                  cScanLines,
-                                  lpvBits,
-                                  lpbmi,
-                                  uUsage,
-                                  cjBmpScanSize,
-                                  cjInfoSize);
-}
-
-/*
- * @implemented
- */
-HBITMAP
-WINAPI
-CreateDIBitmap( HDC hDC,
-                const BITMAPINFOHEADER *Header,
-                DWORD Init,
-                LPCVOID Bits,
-                const BITMAPINFO *Data,
-                UINT ColorUse)
-{
-    LONG width, height, compr, dibsize;
-    WORD planes, bpp;
-//  PDC_ATTR pDc_Attr;
-    UINT InfoSize = 0;
-    UINT cjBmpScanSize = 0;
-    HBITMAP hBmp;
-    NTSTATUS Status = STATUS_SUCCESS;
-
-    if (!Header) return 0;
-
-    if (DIB_GetBitmapInfo(Header, &width, &height, &planes, &bpp, &compr, &dibsize) == -1)
-    {
-        GdiSetLastError(ERROR_INVALID_PARAMETER);
-        return NULL;
-    }
-
-// For Icm support.
-// GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
-
-    if(Data)
-    {
-        _SEH2_TRY
-        {
-            cjBmpScanSize = GdiGetBitmapBitsSize((BITMAPINFO *)Data);
-            CalculateColorTableSize(&Data->bmiHeader, &ColorUse, &InfoSize);
-            InfoSize += Data->bmiHeader.biSize;
-        }
-        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-        {
-            Status = _SEH2_GetExceptionCode();
-        }
-        _SEH2_END
-    }
-
-    if(!NT_SUCCESS(Status))
-    {
-        GdiSetLastError(ERROR_INVALID_PARAMETER);
-        return NULL;
-    }
-
-    DPRINT("pBMI %x, Size bpp %d, dibsize %d, Conv %d, BSS %d\n", Data,bpp,dibsize,InfoSize,cjBmpScanSize);
-
-    if ( !width || !height )
-        hBmp = GetStockObject(DEFAULT_BITMAP);
-    else
-    {
-        hBmp = NtGdiCreateDIBitmapInternal(hDC,
-                                           width,
-                                           height,
-                                           Init,
-                                           (LPBYTE)Bits,
-                                           (LPBITMAPINFO)Data,
-                                           ColorUse,
-                                           InfoSize,
-                                           cjBmpScanSize,
-                                           0,
-                                           0);
-    }
-    return hBmp;
-}
-
-/*
- * @implemented
- */
-INT
-WINAPI
-SetDIBits(HDC hDC,
-          HBITMAP hBitmap,
-          UINT uStartScan,
-          UINT cScanLines,
-          CONST VOID *lpvBits,
-          CONST BITMAPINFO *lpbmi,
-          UINT fuColorUse)
-{
-    HDC hDCc, SavehDC, nhDC;
-    DWORD dwWidth, dwHeight;
-    HGDIOBJ hOldBitmap;
-    HPALETTE hPal = NULL;
-    INT LinesCopied = 0;
-    BOOL newDC = FALSE;
-
-    if ( !lpvBits || (GDI_HANDLE_GET_TYPE(hBitmap) != GDI_OBJECT_TYPE_BITMAP) )
-        return 0;
-
-    if ( lpbmi )
-    {
-        if ( lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) )
-        {
-            if ( lpbmi->bmiHeader.biCompression == BI_JPEG || lpbmi->bmiHeader.biCompression == BI_PNG )
-            {
-                SetLastError(ERROR_INVALID_PARAMETER);
-                return 0;
-            }
-        }
-    }
-
-    hDCc = NtGdiGetDCforBitmap(hBitmap); // hDC can be NULL, so, get it from the bitmap.
-    SavehDC = hDCc;
-    if ( !hDCc ) // No DC associated with bitmap, Clone or Create one.
-    {
-        nhDC = CreateCompatibleDC(hDC);
-        if ( !nhDC ) return 0;
-        newDC = TRUE;
-        SavehDC = nhDC;
-    }
-    else if ( !SaveDC(hDCc) )
-        return 0;
-
-    hOldBitmap = SelectObject(SavehDC, hBitmap);
-
-    if ( hOldBitmap )
-    {
-        if ( hDC )
-            hPal = SelectPalette(SavehDC, (HPALETTE)GetDCObject(hDC, GDI_OBJECT_TYPE_PALETTE), FALSE);
-
-        if ( lpbmi->bmiHeader.biSize < sizeof(BITMAPINFOHEADER))
-        {
-            PBITMAPCOREINFO pbci = (PBITMAPCOREINFO) lpbmi;
-            dwWidth = pbci->bmciHeader.bcWidth;
-            dwHeight = pbci->bmciHeader.bcHeight;
-        }
-        else
-        {
-            dwWidth = lpbmi->bmiHeader.biWidth;
-            dwHeight = abs(lpbmi->bmiHeader.biHeight);
-        }
-
-        LinesCopied = SetDIBitsToDevice(SavehDC,
-                                        0,
-                                        0,
-                                        dwWidth,
-                                        dwHeight,
-                                        0,
-                                        0,
-                                        uStartScan,
-                                        cScanLines,
-                                        (void *)lpvBits,
-                                        (LPBITMAPINFO)lpbmi,
-                                        fuColorUse);
-
-        if ( hDC ) SelectPalette(SavehDC, hPal, FALSE);
-
-        SelectObject(SavehDC, hOldBitmap);
-    }
-
-    if ( newDC )
-        DeleteDC(SavehDC);
-    else
-        RestoreDC(SavehDC, -1);
-
-    return LinesCopied;
-}
-
-/*
- * @implemented
- *
- */
-INT
-WINAPI
-SetDIBitsToDevice(
-    HDC hdc,
-    int XDest,
-    int YDest,
-    DWORD Width,
-    DWORD Height,
-    int XSrc,
-    int YSrc,
-    UINT StartScan,
-    UINT ScanLines,
-    CONST VOID *Bits,
-    CONST BITMAPINFO *lpbmi,
-    UINT ColorUse)
-{
-    PDC_ATTR pDc_Attr;
-    PBITMAPINFO pConvertedInfo;
-    UINT ConvertedInfoSize;
-    INT LinesCopied = 0;
-    UINT cjBmpScanSize = 0;
-    BOOL Hit = FALSE;
-    PVOID pvSafeBits = (PVOID)Bits;
-
-    if ( !ScanLines || !lpbmi || !Bits )
-        return 0;
-
-    if ( ColorUse && ColorUse != DIB_PAL_COLORS && ColorUse != DIB_PAL_COLORS+1 )
-        return 0;
-
-    pConvertedInfo = ConvertBitmapInfo(lpbmi, ColorUse,
-                                       &ConvertedInfoSize, FALSE);
-    if (!pConvertedInfo)
-        return 0;
-
-#if 0
-// Handle something other than a normal dc object.
-    if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
-    {
-        if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC)
-            return MFDRV_SetDIBitsToDevice( hdc,
-                                            XDest,
-                                            YDest,
-                                            Width,
-                                            Height,
-                                            XSrc,
-                                            YSrc,
-                                            StartScan,
-                                            ScanLines,
-                                            Bits,
-                                            lpbmi,
-                                            ColorUse);
-        else
-        {
-            PLDC pLDC = GdiGetLDC(hdc);
-            if ( !pLDC )
-            {
-                SetLastError(ERROR_INVALID_HANDLE);
-                return 0;
-            }
-            if (pLDC->iType == LDC_EMFLDC)
-            {
-                return EMFDRV_SetDIBitsToDevice(hdc,
-                                                XDest,
-                                                YDest,
-                                                Width,
-                                                Height,
-                                                XSrc,
-                                                YSrc,
-                                                StartScan,
-                                                ScanLines,
-                                                Bits,
-                                                lpbmi,
-                                                ColorUse);
-            }
-            return 0;
-        }
-    }
-#endif
-    cjBmpScanSize = DIB_BitmapMaxBitsSize((LPBITMAPINFO)lpbmi, ScanLines);
-
-       pvSafeBits = RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize);
-       if (pvSafeBits)
-       {
-               _SEH2_TRY
-               {
-                       RtlCopyMemory( pvSafeBits, Bits, cjBmpScanSize);
-               }
-               _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-               {
-                       Hit = TRUE;
-               }
-               _SEH2_END
-
-               if (Hit)
-               {
-                       // We don't die, we continue on with a allocated safe pointer to kernel
-                       // space.....
-                       DPRINT1("SetDIBitsToDevice fail to read BitMapInfo: %x or Bits: %x & Size: %d\n",pConvertedInfo,Bits,cjBmpScanSize);
-               }
-               DPRINT("SetDIBitsToDevice Allocate Bits %d!!!\n", cjBmpScanSize);
-       }
-
-    if (!GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-    /*
-      if ( !pDc_Attr || // DC is Public
-            ColorUse == DIB_PAL_COLORS ||
-           ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
-           (pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
-            pConvertedInfo->bmiHeader.biCompression  == BI_PNG )) )*/
-    {
-        LinesCopied = NtGdiSetDIBitsToDeviceInternal( hdc,
-                      XDest,
-                      YDest,
-                      Width,
-                      Height,
-                      XSrc,
-                      YSrc,
-                      StartScan,
-                      ScanLines,
-                      (LPBYTE)pvSafeBits,
-                      (LPBITMAPINFO)pConvertedInfo,
-                      ColorUse,
-                      cjBmpScanSize,
-                      ConvertedInfoSize,
-                      TRUE,
-                      NULL);
-    }
-    if ( Bits != pvSafeBits)
-        RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits);
-    if (lpbmi != pConvertedInfo)
-        RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
-
-    return LinesCopied;
-}
-
-
-/*
- * @unimplemented
- */
-int
-WINAPI
-StretchDIBits(HDC hdc,
-              int XDest,
-              int YDest,
-              int nDestWidth,
-              int nDestHeight,
-              int XSrc,
-              int YSrc,
-              int nSrcWidth,
-              int nSrcHeight,
-              CONST VOID *lpBits,
-              CONST BITMAPINFO *lpBitsInfo,
-              UINT iUsage,
-              DWORD dwRop)
-
-{
-    PDC_ATTR pDc_Attr;
-    PBITMAPINFO pConvertedInfo = NULL;
-    UINT ConvertedInfoSize = 0;
-    INT LinesCopied = 0;
-    UINT cjBmpScanSize = 0;
-    PVOID pvSafeBits = NULL;
-    BOOL Hit = FALSE;
-
-    DPRINT("StretchDIBits %x : %x : %d\n", lpBits, lpBitsInfo, iUsage);
-#if 0
-// Handle something other than a normal dc object.
-    if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
-    {
-        if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC)
-            return MFDRV_StretchBlt( hdc,
-                                     XDest,
-                                     YDest,
-                                     nDestWidth,
-                                     nDestHeight,
-                                     XSrc,
-                                     YSrc,
-                                     nSrcWidth,
-                                     nSrcHeight,
-                                     lpBits,
-                                     lpBitsInfo,
-                                     iUsage,
-                                     dwRop);
-        else
-        {
-            PLDC pLDC = GdiGetLDC(hdc);
-            if ( !pLDC )
-            {
-                SetLastError(ERROR_INVALID_HANDLE);
-                return 0;
-            }
-            if (pLDC->iType == LDC_EMFLDC)
-            {
-                return EMFDRV_StretchBlt(hdc,
-                                         XDest,
-                                         YDest,
-                                         nDestWidth,
-                                         nDestHeight,
-                                         XSrc,
-                                         YSrc,
-                                         nSrcWidth,
-                                         nSrcHeight,
-                                         lpBits,
-                                         lpBitsInfo,
-                                         iUsage,
-                                         dwRop);
-            }
-            return 0;
-        }
-    }
-#endif
-    pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage,
-                                       &ConvertedInfoSize, FALSE);
-    if (!pConvertedInfo)
-    {
-        return 0;
-    }
-
-    cjBmpScanSize = GdiGetBitmapBitsSize((BITMAPINFO *)pConvertedInfo);
-
-    if ( lpBits )
-    {
-        pvSafeBits = RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize);
-        if (pvSafeBits)
-        {
-            _SEH2_TRY
-            {
-                RtlCopyMemory( pvSafeBits, lpBits, cjBmpScanSize );
-            }
-            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-            {
-                Hit = TRUE;
-            }
-            _SEH2_END
-
-            if (Hit)
-            {
-                // We don't die, we continue on with a allocated safe pointer to kernel
-                // space.....
-                DPRINT1("StretchDIBits fail to read BitMapInfo: %x or Bits: %x & Size: %d\n",pConvertedInfo,lpBits,cjBmpScanSize);
-            }
-            DPRINT("StretchDIBits Allocate Bits %d!!!\n", cjBmpScanSize);
-        }
-    }
-
-    if (!GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
-    }
-    /*
-      if ( !pDc_Attr ||
-            iUsage == DIB_PAL_COLORS ||
-           ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) &&
-           (pConvertedInfo->bmiHeader.biCompression == BI_JPEG ||
-            pConvertedInfo->bmiHeader.biCompression  == BI_PNG )) )*/
-    {
-        LinesCopied = NtGdiStretchDIBitsInternal( hdc,
-                      XDest,
-                      YDest,
-                      nDestWidth,
-                      nDestHeight,
-                      XSrc,
-                      YSrc,
-                      nSrcWidth,
-                      nSrcHeight,
-                      pvSafeBits,
-                      pConvertedInfo,
-                      (DWORD)iUsage,
-                      dwRop,
-                      ConvertedInfoSize,
-                      cjBmpScanSize,
-                      NULL);
-    }
-    if ( pvSafeBits )
-        RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits);
-    if (lpBitsInfo != pConvertedInfo)
-        RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo);
-
-    return LinesCopied;
-}
-