# Fonts and Text

The Font structure contains functions and structures to manipulate fonts and draw text.

    structure Font :
      sig
        type HDC and HFONT
        type COLORREF = Color.COLORREF
        type POINT = {x: int, y: int}
        and  SIZE = {cx: int, cy: int }
        and  RECT = { top: int, left: int, bottom: int, right: int }

        datatype FontFamily =
              FF_DECORATIVE
            | FF_DONTCARE
            | FF_MODERN
            | FF_ROMAN
            | FF_SCRIPT
            | FF_SWISS
        and FontPitch = DEFAULT_PITCH | FIXED_PITCH | VARIABLE_PITCH
        and OutputPrecision =
              OUT_CHARACTER_PRECIS
            | OUT_DEFAULT_PRECIS
            | OUT_DEVICE_PRECIS
            | OUT_OUTLINE_PRECIS
            | OUT_RASTER_PRECIS
            | OUT_SCREEN_OUTLINE_PRECIS
            | OUT_STRING_PRECIS
            | OUT_STROKE_PRECIS
            | OUT_TT_ONLY_PRECIS
            | OUT_TT_PRECIS
        and OutputQuality =
              DEFAULT_QUALITY
            | DRAFT_QUALITY
            | OTHER_QUALITY of int
            | PROOF_QUALITY
        and CharacterSet =
              ANSI_CHARSET
            | CHINESEBIG5_CHARSET
            | DEFAULT_CHARSET
            | HANGEUL_CHARSET
            | OEM_CHARSET
            | OTHER_CHARSET of int
            | SHIFTJIS_CHARSET
            | SYMBOL_CHARSET

        type FontWeight =  int
        val FW_BLACK : FontWeight
        val FW_BOLD : FontWeight
        val FW_DEMIBOLD : FontWeight
        val FW_DONTCARE : FontWeight
        val FW_EXTRABOLD : FontWeight
        val FW_EXTRALIGHT : FontWeight
        val FW_HEAVY : FontWeight
        val FW_LIGHT : FontWeight
        val FW_MEDIUM : FontWeight
        val FW_NORMAL : FontWeight
        val FW_REGULAR : FontWeight
        val FW_SEMIBOLD : FontWeight
        val FW_THIN : FontWeight
        val FW_ULTRABOLD : FontWeight
        val FW_ULTRALIGHT : FontWeight

        type ClippingPrecision
        val CLIP_CHARACTER_PRECIS : ClippingPrecision
        val CLIP_DEFAULT_PRECIS : ClippingPrecision
        val CLIP_EMBEDDED : ClippingPrecision
        val CLIP_LH_ANGLES : ClippingPrecision
        val CLIP_MASK : ClippingPrecision
        val CLIP_STROKE_PRECIS : ClippingPrecision
        val CLIP_TT_ALWAYS : ClippingPrecision

        type LOGFONT =
        {
            height : int,
            width : int,
            escapement : int,
            orientation : int,
            weight : FontWeight,
            italic : bool,
            underline : bool,
            strikeOut : bool,
            charSet : CharacterSet,
            outputPrecision: OutputPrecision,
            clipPrecision : ClippingPrecision,
            quality : OutputQuality,
            pitch: FontPitch,
            family: FontFamily,
            faceName : string
        }

        datatype DrawTextMode =
              DT_BOTTOM
            | DT_CALCRECT
            | DT_CENTER
            | DT_EXPANDTABS
            | DT_EXTERNALLEADING
            | DT_INTERNAL
            | DT_LEFT
            | DT_NOCLIP
            | DT_NOPREFIX
            | DT_RIGHT
            | DT_SINGLELINE
            | DT_TABSTOP of int
            | DT_TOP
            | DT_VCENTER
            | DT_WORDBREAK
        and TextAlign =
              TA_BASELINE
            | TA_BOTTOM
            | TA_CENTER
            | TA_LEFT
            | TA_NOUPDATECP
            | TA_RIGHT
            | TA_TOP
            | TA_UPDATECP
        and TextMetricPitch =
              TMPF_DEVICE
            | TMPF_FIXED_PITCH
            | TMPF_TRUETYPE
            | TMPF_VECTOR
        and ExtendedTextMode =
              ETO_CLIPPED
            | ETO_GLYPH_INDEX
            | ETO_IGNORELANGUAGE
            | ETO_OPAQUE
            | ETO_RTLREADING

        type TEXTMETRIC =
                { height: int, ascent: int, descent: int, internalLeading: int, externalLeading: int,
                  aveCharWidth: int, maxCharWidth: int, weight: int, overhang: int,
                  digitizedAspectX: int, digitizedAspectY: int, firstChar: char, lastChar: char,
                  defaultChar: char, breakChar: char, italic: bool, underlined: bool, struckOut: bool,
                  pitch: TextMetricPitch list, family: FontFamily, charSet : CharacterSet }

        val AddFontResource : string -> int
        val CreateFont : LOGFONT -> HFONT
        val CreateFontIndirect : LOGFONT -> HFONT
        val CreateScalableFontResource : int * string * string * string -> unit
        val DrawText : HDC * string * RECT * DrawTextMode list -> int
        val ExtTextOut : HDC * POINT * ExtendedTextMode list *
           RECT option * string * int list -> unit
        val GetAspectRatioFilterEx : HDC -> SIZE
        val GetCharABCWidths : HDC * char * char -> (int * int * int) list
        val GetCharABCWidthsFloat : HDC * char * char -> (real * real * real) list
        val GetCharWidth32 : HDC * char * char -> int list
        val GetTabbedTextExtent : HDC * string * int list -> SIZE
        val GetCharWidthFloat : HDC * int * int -> real list
        val GetTextAlign : HDC -> TextAlign list
        val GetTextCharacterExtra : HDC -> int
        val GetTextColor : HDC -> COLORREF
        val GetTextExtentExPoint : HDC * string * int option ->
           {fit: int option, size: SIZE, extents: int list}
        val GetTextExtentPoint32 : HDC * string -> SIZE
        val GetTextFace : HDC -> string
        val GetTextMetrics : HDC -> TEXTMETRIC
        val RemoveFontResource : string -> unit
        val SetMapperFlags : HDC * bool -> bool
        val SetTextAlign : HDC * TextAlign list -> TextAlign list
        val SetTextCharacterExtra : HDC * int -> int
        val SetTextColor : HDC * COLORREF -> COLORREF
        val SetTextJustification : HDC * int * int -> unit
        val TabbedTextOut: HDC * POINT * string * int list * int -> SIZE
        val TextOut : HDC * POINT * String.string -> unit
      end