// 15 september 2015

// TODO uiDrawBeginTextRGB(/RGBA?)
// might need something more flexible for attributed text

typedef struct uiDrawFont uiDrawFont;
typedef struct uiDrawFontSpec uiDrawFontSpec;
typedef struct uiDrawTextBlockParams uiDrawTextBlockParams;
typedef struct uiDrawFontMetrics uiDrawFontMetrics;
typedef enum uiDrawTextWeight uiDrawTextWeight;
typedef enum uiDrawTextAlign uiDrawTextAlign;

enum uiDrawTextWeight {
	uiDrawTextWeightThin,
	uiDrawTextWeightExtraLight,
	uiDrawTextWeightLight,
	uiDrawTextWeightNormal,
	uiDrawTextWeightMedium,
	uiDrawTextWeightSemiBold,
	uiDrawTextWeightBold,
	uiDrawTextWeightExtraBold,
	uiDrawTextWeightHeavy,
};

struct uiDrawFontSpec {
	const char *Family;
	uintmax_t PointSize;
	uiDrawTextWeight Weight;
	int Italic;			// always prefers true italics over obliques whenever possible
	int Vertical;
};

enum uiDrawTextAlign {
	uiDrawTextAlignLeft,
	uiDrawTextAlignCenter,
	uiDrawTextAlignRight,
};

struct uiDrawTextBlockParams {
	intmax_t Width;
	intmax_t FirstLineIndent;
	intmax_t LineSpacing;
	uiDrawTextAlign Align;
	int Justify;
};

struct uiDrawFontMetrics {
	// TODO
	// metrics on Windows are per-device; other platforms not?
};

#define uiDrawTextPixelSizeToPointSize(pix, dpiY) \
	((uintmax_t) ((((double) (pix)) * 72.0) / ((double) (dpiY))))
#define uiDrawTextPointSizeToPixelSize(pt, dpiY) \
	((uintmax_t) (((double) (pt)) * (((double) (dpiY)) / 72.0)))

uiDrawFont *uiDrawPrepareFont(uiDrawFontSpec *);
void uiDrawFreeFont(uiDrawFont *);

void uiDrawText(uiDrawContext *, const char *, uiDrawFont *, intmax_t, intmax_t);
void uiDrawTextBlock(uiDrawContext *, const char *, uiDrawFont *, intmax_t, intmax_t, uiDrawTextBlockParams *);
void uiDrawTextExtents(uiDrawContext *, const char *, uiDrawFont *, intmax_t *, intmax_t *);
intmax_t uiDrawTextExtentsBlockHeight(uiDrawContext *, const char *, uiDrawFont *, uiDrawTextBlockParams *);
// TODO width for number of lines
//TODOvoid uiDrawContextFontMetrics(uiDrawContext *, uiDrawFont *, uiDrawFontMetrics *);

// TODO draw text, single line, control font
// TODO draw text, wrapped to width, control font
// TODO get text extents, single line, control font
// TODO get text height for width, control font
// TODO width for number of lines, control font
// TODO get font metrics, control font