diff --git a/areatext/ui.h b/areatext/ui.h deleted file mode 100644 index 38c936cd..00000000 --- a/areatext/ui.h +++ /dev/null @@ -1,72 +0,0 @@ -// 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 diff --git a/areatext/windows_drawtext.c b/areatext/windows_drawtext.c deleted file mode 100644 index 5748b9ee..00000000 --- a/areatext/windows_drawtext.c +++ /dev/null @@ -1,224 +0,0 @@ -// 14 september 2015 -#include "area.h" - -struct uiDrawFont { - HFONT font; -}; - -uiDrawFont *uiDrawPrepareFont(uiDrawFontSpec *spec) -{ - uiDrawFont *df; - LOGFONTW lf; - - // TODO use uiNew - df = malloc(sizeof (uiDrawFont)); - ZeroMemory(&lf, sizeof (LOGFONTW)); - // TODO - df->font = xxxxxxxx(&lf); - if (df->font == NULL) - logLastError("error creating font in uiDrawPrepareFont()"); - return df; -} - -void uiDrawFreeFont(uiDrawFont *df) -{ - if (DeleteObject(df->font) == 0) - logLastError("error deleting font in uiDrawFreeFont()"); - // TODO use uiFree - free(df); -} - -/* uniscribe notes: -- https://msdn.microsoft.com/en-us/library/windows/desktop/dd317792%28v=vs.85%29.aspx -- https://maxradi.us/documents/uniscribe/ -- http://www.catch22.net/tuts/introduction-uniscribe -- http://www.catch22.net/tuts/uniscribe-mysteries -- http://www.catch22.net/tuts/more-uniscribe-mysteries -- http://www.catch22.net/tuts/drawing-styled-text-uniscribe -- http://www.microsoft.com/msj/1198/multilang/multilang.aspx -Even with all this we're on our own with actual paragraph layout; see the last link for example code (which we don't use here). */ - -struct uniitem { - SCRIPT_ITEM item; - - int nGlyphs; - WORD *glyphs; - SCRIPT_VISATTR *visattrs; - int *advances; - GOFFSET *goffsets; - - WCHAR *pwcChars; - int nChars; - WORD *clusters; - SCRIPT_LOGATTR *logattr; - - ABC abc; -}; - -struct uniscribe { - WCHAR *text; - size_t len; - HDC dc; - - SCRIPT_CONTROL control; - SCRIPT_STATE state; - - struct uniitem *items; - int nItems; - - SCRIPT_CACHE cache; -}; - -// the step numbers in this function are according to the "Lay Out Text Using Uniscribe" section of https://msdn.microsoft.com/en-us/library/windows/desktop/dd317792%28v=vs.85%29.aspx - -// this does step 4 -// steps 1 through 3 are irrelevent here -static void initUniscribe(struct uniscribe *s, WCHAR *text, HDC dc) -{ - SCRIPT_ITEM *items; - int nAlloc; - int i; - HRESULT hr; - - ZeroMemory(s, sizeof (struct uniscribe)); - - s->text = text; - s->len = wcslen(s->text); - s->dc = dc; - - items = NULL; - nAlloc = 32; - for (;;) { - // TODO use uiRealloc - items = realloc(items, nAlloc * sizeof (SCRIPT_ITEM)); - hr = ScriptItemize(s->text, s->len, - nAlloc, - &(s->control), &(s->state), - items, &(s->nItems)); - if (hr == S_OK) - break; - if (hr == E_OUTOFMEMORY) { - nAlloc *= 2; - continue; - } - logHRESULT("error itemizing string in initUniscribe()", hr); - } - - // this does part of step 6 - s->items = malloc(s->nItems * sizeof (struct uniitem)); -ZeroMemory(s->items, s->nItems * sizeof (struct uniitem));//TODO remove when switching to uiAlloc - for (i = 0; i < s->nItems; i++) { - s->items[i].pwcChars = s->text + items[i].iCharPos; - s->items[i].nChars = items[i + 1].iCharPos - items[i].iCharPos; - s->items[i].item = items[i]; - } - free(items); -} - -static void resetItem(struct uniitem *item) -{ - if (item->nGlyphs == 0) - return; - item->nGlyphs = 0; - // TODO switch to uiFree - free(item->glyphs); - item->glyphs = NULL; - free(item->visattrs); - item->visattrs = NULL; - free(item->advances); - item->advances = NULL; - free(item->goffsets); - item->goffsets = NULL; - free(item->clusters); - item->clusters = NULL; - free(item->logattr); - item->logattr = NULL; -} - -// step 5 -// we're not using multiple fonts; we have no lists to merge - -// step 6 -static void shapeItem(struct uniscribe *s, int n) -{ - struct uniitem *item; - int nAlloc; - HRESULT hr; - - item = &(s->items[n]); - resetItem(item); - item->clusters = malloc(nChars * sizeof (WORD)); - - // TODO move to uiAlloc - nAlloc = 1.5 * item->nChars + 16; - for (;;) { - item->glyphs = realloc(item->glyphs, nAlloc * sizeof (WORD)); - item->visattrs = realloc(item->visattrs, nAlloc * sizeof (SCRIPT_VISATTR)); - hr = ScriptShape(s->dc, &(s->cache), - item->pwcChars, item->nChars, - nAlloc, - &(item->item.a), - item->glyphs, item->clusters, - item->visattrs, &(item->nGlyphs)); - if (hr == S_OK) - break; - if (hr == E_OUTOFMEMORY) { - nAlloc *= 2; - continue; - } - logHRESULT("error shaping glyphs in shapeItem()", hr); - } -} - -// step 7 -// TODO - -// step 8 -static void placeItem(struct uniscribe *s, int n) -{ - struct uniitem *item; - HRESULT hr; - - item = &(s->items[n]); - - item->advances = malloc(item->nGlyphs * sizeof (int)); - item->goffsets = malloc(item->nGlyphs * sizeof (GOFFSET)); - hr = ScriptPlace(s->dc, &(s->cache), - item->glyphs, item->nGlyphs, item->visattrs, - &(item->item.a), - item->advances, item->goffsets, &(item->abc)); - if (hr != S_OK) - logHRESULT("error placing glyphs in placeItem()", hr); -} - -static void breakItem(struct uniscribe *s, int n) -{ - struct uniitem *item; - HRESULT hr; - - item = &(s->items[n]); - - // TODO uiAlloc - item->logattr = malloc(s->nChars * sizeof (SCRIPT_LOGATTR)); - hr = ScriptBreak(item->pwcChars, item->nChars, - &(item->item.a), - item->logattr); - if (hr != S_OK) - logLastError("error breaking item in breakItem()"); -} - -static void uninitUniscribe(struct uniscribe *s) -{ - HRESULT hr; - int i; - - // TODO use uiFree - - for (i = 0; i < s->nItems; i++) - resetItem(&(s->items[i])); - free(s->items); - - hr = ScriptCacheFree(&(s->cache)); - if (hr != S_OK) - logHRESULT("error freeing Uniscribe cache in uninitUniscribe()"); -}