# Bitmap

The Bitmap structure contains functions and structures to create and operate on bitmaps. Bitmaps are rectangular pictures in which the colour values for each pixel are given individually. They are often used as the basis for icons. There are two forms of bitmap: device-dependent bitmaps represented by the bitmap handle, HBITMAP, and device-independent bitmaps.

    structure Bitmap:
      sig
        type HBITMAP and HDC
        type COLORREF = Color.COLORREF
        type RECT = { top: int, left: int, bottom: int, right: int }
        type SIZE = { cx: int, cy: int }
        datatype BitmapCompression = BI_BITFIELDS | BI_RGB | BI_RLE4 | BI_RLE8
        datatype FloodFillMode = FLOODFILLBORDER | FLOODFILLSURFACE

        type BITMAP =
    	{ width: int, height: int, widthBytes: int, planes: int, bitsPerPixel: int,
    	  bits: Word8Vector.vector option }

        type StretchMode
        val BLACKONWHITE : StretchMode
        val COLORONCOLOR : StretchMode
        val HALFTONE : StretchMode
        val MAXSTRETCHBLTMODE : StretchMode
        val WHITEONBLACK : StretchMode

        type RasterOpCode
        val BLACKNESS : RasterOpCode
        val DSTINVERT : RasterOpCode
        val MERGECOPY : RasterOpCode
        val MERGEPAINT : RasterOpCode
        val NOTSRCCOPY : RasterOpCode
        val NOTSRCERASE : RasterOpCode
        val PATCOPY : RasterOpCode
        val PATINVERT : RasterOpCode
        val PATPAINT : RasterOpCode
        val SRCAND : RasterOpCode
        val SRCCOPY : RasterOpCode
        val SRCERASE : RasterOpCode
        val SRCINVERT : RasterOpCode
        val SRCPAINT : RasterOpCode
        val WHITENESS : RasterOpCode

        val BitBlt : HDC * int * int * int * int * HDC * int * int * RasterOpCode -> unit
        val CreateBitmap :
           {bits: Word8Vector.vector option, width: int, height: int,
             planes: int, bitsPerPixel: int} -> HBITMAP
        val CreateBitmapIndirect : BITMAP -> HBITMAP
        val CreateCompatibleBitmap : HDC * int * int -> HBITMAP
        val ExtFloodFill : HDC * int * int * COLORREF * FloodFillMode -> unit
        val GetBitmapBits : HBITMAP * int -> Word8Vector.vector
        val GetBitmapDimensionEx : HBITMAP -> SIZE
        val GetPixel : HDC * int * int -> COLORREF
        val GetStretchBltMode : HDC -> StretchMode

        type QuaternaryRop
        val MAKEROP4 : {back: RasterOpCode, fore: RasterOpCode} -> QuaternaryRop
        val MaskBlt :
           HDC * int * int * int * int * HDC * int * int *
           HBITMAP * int * int * QuaternaryRop -> unit

        val PlgBlt : HDC * RECT * HDC * RECT * HBITMAP * int * int -> unit
        val SetBitmapBits : HBITMAP * Word8Vector.vector -> unit
        val SetBitmapDimensionEx : HBITMAP * int * int * SIZE -> SIZE
        val SetPixel : HDC * int * int * COLORREF -> COLORREF
        val SetStretchBltMode : HDC * StretchMode -> unit
        val StretchBlt :
           HDC * int * int * int * int * HDC * int * int * int * int * RasterOpCode -> unit

        type BITMAPINFOHEADER =
    	{
    		width: int, height: int, planes: int, bitsPerPixel: int,
    		compression: BitmapCompression, sizeImage: int, xPelsPerM: int,
    		yPelsPerM: int, clrUsed: int, clrImportant: int
    	}
        val getBitmapInfoHdr: Word8Vector.vector -> BITMAPINFOHEADER
        val GetDIBits: HDC * HBITMAP * int * int * BITMAPINFOHEADER option -> Word8Vector.vector
        val SetDIBits: HDC * HBITMAP * int * int * Word8Vector.vector -> unit
      end

#### Device-independent bitmaps.

A device-independent bitmap contains information which allows it to be written to a file and read in on a different machine with different numbers of bits per pixel. It can also be passed on the clipboard using the CH_DIB clipboard format. A device-independent bitmap is simply a vector of bytes and is represented in ML by the Word8Vector.vector type.

`getBitmapInfoHdr(vec: Word8Vector.vector): BITMAPINFOHEADER`
ML Extension: Extracts the header from a vector containing a device-independent bitmap. It is often necessary to extract the header from a device-independent bitmap in order to find the size of the bitmap needed as the argument to SetDIBits.

`GetDIBits(hdc, hb, startScan, scanLines, binfo: BITMAPINFOHEADER option): Word8Vector.vector`
Extracts a bitmap as a device-independent bitmap. This function operates in two modes according to whether the binfo argument is NONE or SOME. If NONE is passed it returns only the header. This can be extracted with getBitmapInfoHdr and if necessary a modified copy of it can be made. For example, the bitsPerPixel can be changed from the default for the device. It can then be passed with SOME again to GetDIBits to extract the full device-independent bitmap.

`SetDIBits(hdc, hb, startScan, scanLines, vec: Word8Vector.vector): unit`
Sets a bitmap to the device-independent bitmap in the argument vector.