# DeviceContext

The DeviceContext structure contains functions and structures to create and operate on device contexts.

    structure DeviceContext:
      sig
        type BITMAP and HDC and HGDIOBJ and HWND and HRGN
        type LOGBRUSH = Brush.LOGBRUSH
        type LOGFONT = Font.LOGFONT
        type LOGPEN = Pen.LOGPEN
        type POINT = {x: int, y: int}

        type StockObjectType
        val ANSI_FIXED_FONT : StockObjectType
        val ANSI_VAR_FONT : StockObjectType
        val BLACK_BRUSH : StockObjectType
        val BLACK_PEN : StockObjectType
        val CLR_INVALID : StockObjectType
        val DEFAULT_PALETTE : StockObjectType
        val DEVICE_DEFAULT_FONT : StockObjectType
        val DKGRAY_BRUSH : StockObjectType
        val GRAY_BRUSH : StockObjectType
        val HOLLOW_BRUSH : StockObjectType
        val LTGRAY_BRUSH : StockObjectType
        val NULL_BRUSH : StockObjectType
        val NULL_PEN : StockObjectType
        val OEM_FIXED_FONT : StockObjectType
        val SYSTEM_FIXED_FONT : StockObjectType
        val SYSTEM_FONT : StockObjectType
        val WHITE_BRUSH : StockObjectType
        val WHITE_PEN : StockObjectType

        val GetStockObject : StockObjectType -> HGDIOBJ

        eqtype DeviceItem
        val ASPECTX : DeviceItem
        val ASPECTXY : DeviceItem
        val ASPECTY : DeviceItem
        val BITSPIXEL : DeviceItem
        val CLIPCAPS : DeviceItem
        val COLORRES : DeviceItem
        val CURVECAPS : DeviceItem
        val DRIVERVERSION : DeviceItem
        val HORZRES : DeviceItem
        val HORZSIZE : DeviceItem
        val LINECAPS : DeviceItem
        val LOGPIXELSX : DeviceItem
        val LOGPIXELSY : DeviceItem
        val NUMBRUSHES : DeviceItem
        val NUMCOLORS : DeviceItem
        val NUMFONTS : DeviceItem
        val NUMMARKERS : DeviceItem
        val NUMPENS : DeviceItem
        val NUMRESERVED : DeviceItem
        val PDEVICESIZE : DeviceItem
        val PHYSICALHEIGHT : DeviceItem
        val PHYSICALOFFSETX : DeviceItem
        val PHYSICALOFFSETY : DeviceItem
        val PHYSICALWIDTH : DeviceItem
        val PLANES : DeviceItem
        val POLYGONALCAPS : DeviceItem
        val RASTERCAPS : DeviceItem
        val SCALINGFACTORX : DeviceItem
        val SCALINGFACTORY : DeviceItem
        val SIZEPALETTE : DeviceItem
        val TECHNOLOGY : DeviceItem
        val TEXTCAPS : DeviceItem
        val VERTRES : DeviceItem
        val VERTSIZE : DeviceItem

        val GetDeviceCaps : HDC * DeviceItem -> int

       (* Results of various calls to GetDeviceCaps. *)
        val CC_CHORD : int
        val CC_CIRCLES : int
        val CC_ELLIPSES : int
        val CC_INTERIORS : int
        val CC_NONE : int
        val CC_PIE : int
        val CC_ROUNDRECT : int
        val CC_STYLED : int
        val CC_WIDE : int
        val CC_WIDESTYLED : int

        val CP_NONE : int
        val CP_RECTANGLE : int
        val CP_REGION : int

        val DT_CHARSTREAM : int
        val DT_DISPFILE : int
        val DT_METAFILE : int
        val DT_PLOTTER : int
        val DT_RASCAMERA : int
        val DT_RASDISPLAY : int
        val DT_RASPRINTER : int

        val LC_INTERIORS : int
        val LC_MARKER : int
        val LC_NONE : int
        val LC_POLYLINE : int
        val LC_POLYMARKER : int
        val LC_STYLED : int
        val LC_WIDE : int
        val LC_WIDESTYLED : int

        val PC_INTERIORS : int
        val PC_NONE : int
        val PC_PATHS : int
        val PC_POLYGON : int
        val PC_POLYPOLYGON : int
        val PC_RECTANGLE : int
        val PC_SCANLINE : int
        val PC_STYLED : int
        val PC_TRAPEZOID : int
        val PC_WIDE : int
        val PC_WIDESTYLED : int
        val PC_WINDPOLYGON : int

        val RC_BANDING : int
        val RC_BIGFONT : int
        val RC_BITBLT : int
        val RC_BITMAP64 : int
        val RC_DEVBITS : int
        val RC_DIBTODEV : int
        val RC_DI_BITMAP : int
        val RC_FLOODFILL : int
        val RC_GDI20_OUTPUT : int
        val RC_GDI20_STATE : int
        val RC_OP_DX_OUTPUT : int
        val RC_PALETTE : int
        val RC_SAVEBITMAP : int
        val RC_SCALING : int
        val RC_STRETCHBLT : int
        val RC_STRETCHDIB : int

        val TC_CP_STROKE : int
        val TC_CR_90 : int
        val TC_CR_ANY : int
        val TC_EA_DOUBLE : int
        val TC_IA_ABLE : int
        val TC_OP_CHARACTER : int
        val TC_OP_STROKE : int
        val TC_RA_ABLE : int
        val TC_RESERVED : int
        val TC_SA_CONTIN : int
        val TC_SA_DOUBLE : int
        val TC_SA_INTEGER : int
        val TC_SCROLLBLT : int
        val TC_SF_X_YINDEP : int
        val TC_SO_ABLE : int
        val TC_UA_ABLE : int
        val TC_VA_ABLE : int

        datatype DMColor = DMCOLOR_COLOR | DMCOLOR_MONOCHROME
        and DMDither =
              DMDITHER_COARSE
            | DMDITHER_FINE
            | DMDITHER_GRAYSCALE
            | DMDITHER_LINEART
            | DMDITHER_NONE
            | DMDITHER_OTHER of int
        and DMDuplex = DMDUP_HORIZONTAL | DMDUP_SIMPLEX | DMDUP_VERTICAL
        and DMICMIntent =
              DMICMINTENT_OTHER of int
            | DMICM_COLORMETRIC
            | DMICM_CONTRAST
            | DMICM_SATURATE
        and DMICMMethod =
              DMICMMETHOD_DEVICE
            | DMICMMETHOD_DRIVER
            | DMICMMETHOD_NONE
            | DMICMMETHOD_OTHER of int
            | DMICMMETHOD_SYSTEM
        and DMMedia =
              DMICMMEDIA_OTHER of int
            | DMMEDIA_GLOSSY
            | DMMEDIA_STANDARD
            | DMMEDIA_TRANSPARENCY
        and DMOrientation = DMORIENT_LANDSCAPE | DMORIENT_PORTRAIT
        and DMPaperSize =
              DMPAPER_10X11
            | DMPAPER_10X14
            | DMPAPER_11X17
            | DMPAPER_15X11
            | DMPAPER_9X11
            | DMPAPER_A2
            | DMPAPER_A3
            | DMPAPER_A3_EXTRA
            | DMPAPER_A3_EXTRA_TRANSVERSE
            | DMPAPER_A3_TRANSVERSE
            | DMPAPER_A4
            | DMPAPER_A4SMALL
            | DMPAPER_A4_EXTRA
            | DMPAPER_A4_PLUS
            | DMPAPER_A4_TRANSVERSE
            | DMPAPER_A5
            | DMPAPER_A5_EXTRA
            | DMPAPER_A5_TRANSVERSE
            | DMPAPER_A_PLUS
            | DMPAPER_B4
            | DMPAPER_B5
            | DMPAPER_B5_EXTRA
            | DMPAPER_B5_TRANSVERSE
            | DMPAPER_B_PLUS
            | DMPAPER_CSHEET
            | DMPAPER_DSHEET
            | DMPAPER_ENV_10
            | DMPAPER_ENV_11
            | DMPAPER_ENV_12
            | DMPAPER_ENV_14
            | DMPAPER_ENV_9
            | DMPAPER_ENV_B4
            | DMPAPER_ENV_B5
            | DMPAPER_ENV_B6
            | DMPAPER_ENV_C3
            | DMPAPER_ENV_C4
            | DMPAPER_ENV_C5
            | DMPAPER_ENV_C6
            | DMPAPER_ENV_C65
            | DMPAPER_ENV_DL
            | DMPAPER_ENV_INVITE
            | DMPAPER_ENV_ITALY
            | DMPAPER_ENV_MONARCH
            | DMPAPER_ENV_PERSONAL
            | DMPAPER_ESHEET
            | DMPAPER_EXECUTIVE
            | DMPAPER_FANFOLD_LGL_GERMAN
            | DMPAPER_FANFOLD_STD_GERMAN
            | DMPAPER_FANFOLD_US
            | DMPAPER_FOLIO
            | DMPAPER_ISO_B4
            | DMPAPER_JAPANESE_POSTCARD
            | DMPAPER_LEDGER
            | DMPAPER_LEGAL
            | DMPAPER_LEGAL_EXTRA
            | DMPAPER_LETTER
            | DMPAPER_LETTERSMALL
            | DMPAPER_LETTER_EXTRA
            | DMPAPER_LETTER_EXTRA_TRANSVERSE
            | DMPAPER_LETTER_PLUS
            | DMPAPER_LETTER_TRANSVERSE
            | DMPAPER_NOTE
            | DMPAPER_OTHER of int
            | DMPAPER_QUARTO
            | DMPAPER_RESERVED_48
            | DMPAPER_RESERVED_49
            | DMPAPER_STATEMENT
            | DMPAPER_TABLOID
            | DMPAPER_TABLOID_EXTRA
        and DMResolution =
              DMRES_DPI of int
            | DMRES_DRAFT
            | DMRES_HIGH
            | DMRES_LOW
            | DMRES_MEDIUM
        and DMSource =
              DMBIN_AUTO
            | DMBIN_CASSETTE
            | DMBIN_ENVELOPE
            | DMBIN_ENVMANUAL
            | DMBIN_FORMSOURCE
            | DMBIN_LARGECAPACITY
            | DMBIN_LARGEFMT
            | DMBIN_LOWER
            | DMBIN_MANUAL
            | DMBIN_MIDDLE
            | DMBIN_ONLYONE
            | DMBIN_SMALLFMT
            | DMBIN_TRACTOR
            | DMBIN_UPPER
            | DMSOURCE_OTHER of int
        and DMTrueType =
              DMTT_BITMAP
            | DMTT_DOWNLOAD
            | DMTT_DOWNLOAD_OUTLINE
            | DMTT_SUBDEV

        type DEVMODE = {
            deviceName: string,
            driverVersion: int,
            orientation: DMOrientation option,
            paperSize: DMPaperSize option,
            paperLength: int option,
            paperWidth: int option,
            scale: int option,
            copies: int option,
            defaultSource: DMSource option,
            printQuality: DMResolution option,
            color: DMColor option,
            duplex: DMDuplex option,
            yResolution: int option,
            ttOption: DMTrueType option,
            collate: bool option,
            formName: string option,
            logPixels: int option,
            bitsPerPixel: int option,
            pelsWidth: int option,
            pelsHeight: int option,
            displayFlags: int option, (* Apparently no longer used. *)
            displayFrequency: int option,
            icmMethod: DMICMMethod option,
            icmIntent: DMICMIntent option,
            mediaType: DMMedia option,
            ditherType: DMDither option,
            iccManufacturer: int option,
            iccModel: int option,
            panningWidth: int option,
            panningHeight: int option,
            driverPrivate: Word8Vector.vector
            }

        val CancelDC : HDC -> unit
        val CreateCompatibleDC : HDC -> HDC
        val CreateDC : string option * string option * string option * DEVMODE option -> HDC

        val DeleteDC : HDC -> unit
        val DeleteObject : HGDIOBJ -> unit

        datatype
          EnumObject =
              OBJ_BITMAP
            | OBJ_BRUSH
            | OBJ_DC
            | OBJ_ENHMETADC
            | OBJ_ENHMETAFILE
            | OBJ_EXTPEN
            | OBJ_FONT
            | OBJ_MEMDC
            | OBJ_METADC
            | OBJ_METAFILE
            | OBJ_PAL
            | OBJ_PEN
            | OBJ_REGION
        val GetCurrentObject : HDC * EnumObject -> HGDIOBJ
        val GetDC : HWND -> HDC

        datatype
          DeviceContextFlag =
              DCX_CACHE
            | DCX_CLIPCHILDREN
            | DCX_CLIPSIBLINGS
            | DCX_EXCLUDERGN
            | DCX_EXCLUDEUPDATE
            | DCX_INTERSECTRGN
            | DCX_INTERSECTUPDATE
            | DCX_LOCKWINDOWUPDATE
            | DCX_NORECOMPUTE
            | DCX_NORESETATTRS
            | DCX_PARENTCLIP
            | DCX_VALIDATE
            | DCX_WINDOW

        val GetDCEx : HWND * HRGN * DeviceContextFlag list -> HDC
        val GetDCOrgEx : HDC -> POINT

        datatype
          GetObject =
              GO_Bitmap of BITMAP
            | GO_Brush of LOGBRUSH
            | GO_Font of LOGFONT
            | GO_Palette of int
            | GO_Pen of LOGPEN

        val GetObject : HGDIOBJ -> GetObject
        val GetObjectType : HGDIOBJ -> EnumObject
        val ReleaseDC : HWND * HDC -> bool
        val ResetDC : HDC * DEVMODE -> HDC
        val RestoreDC : HDC * int -> unit
        val SaveDC : HDC -> int
        val SelectObject : HDC * HGDIOBJ -> HGDIOBJ

        type DEVNAMES = {driver: string, device: string, output: string, default: bool}

      end