From 2ff751a8363e7642afbb5c0f1b8897cd692b9dc6 Mon Sep 17 00:00:00 2001 From: cody271 Date: Tue, 5 Sep 2017 16:27:32 -0700 Subject: [PATCH 1/7] Add uiDrawLoadDefaultFont() API --- darwin/drawtext.m | 5 +++++ ui.h | 2 ++ unix/drawtext.c | 16 ++++++++++++++++ windows/drawtext.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+) diff --git a/darwin/drawtext.m b/darwin/drawtext.m index c04b402b..dbcbccd0 100644 --- a/darwin/drawtext.m +++ b/darwin/drawtext.m @@ -212,3 +212,8 @@ void uiDrawTextLayoutExtents(uiDrawTextLayout *tl, double *width, double *height [tl->frame returnWidth:width height:NULL]; [tl->forLines returnWidth:NULL height:height]; } + +uiDrawTextFont *uiDrawLoadDefaultFont() +{ + return mkTextFontFromNSFont([NSFont systemFontOfSize:0]); +} diff --git a/ui.h b/ui.h index b5fb9a27..228230b1 100644 --- a/ui.h +++ b/ui.h @@ -919,6 +919,8 @@ struct uiFontDescriptor { uiTextStretch Stretch; }; +_UI_EXTERN uiDrawTextFont *uiDrawLoadDefaultFont(); + // uiDrawTextLayout is a concrete representation of a // uiAttributedString that can be displayed in a uiDrawContext. // It includes information important for the drawing of a block of diff --git a/unix/drawtext.c b/unix/drawtext.c index 477e9ca3..80ed4194 100644 --- a/unix/drawtext.c +++ b/unix/drawtext.c @@ -79,3 +79,19 @@ void uiDrawTextLayoutExtents(uiDrawTextLayout *tl, double *width, double *height *width = pangoToCairo(logical.width); *height = pangoToCairo(logical.height); } + +uiDrawTextFont *uiDrawLoadDefaultFont() +{ + GtkWidget *widget; + GtkStyleContext *style; + PangoFontDescription *fontdesc; + PangoFont *font; + + widget = g_object_ref_sink(gtk_drawing_area_new()); + style = gtk_widget_get_style_context(widget); + gtk_style_context_get(style, GTK_STATE_FLAG_NORMAL, + "font", &fontdesc, NULL); + font = pangoDescToPangoFont(fontdesc); + g_object_unref(widget); + return mkTextFont(font, FALSE); +} diff --git a/windows/drawtext.cpp b/windows/drawtext.cpp index ec2ae152..09d4c151 100644 --- a/windows/drawtext.cpp +++ b/windows/drawtext.cpp @@ -534,3 +534,47 @@ void uiDrawTextLayoutExtents(uiDrawTextLayout *tl, double *width, double *height // TODO make sure the behavior of this on empty strings is the same on all platforms (ideally should be 0-width, line height-height; TODO note this in the docs too) *height = metrics.height; } + +uiDrawTextFont *uiDrawLoadDefaultFont() +{ + uiDrawTextFont *font; + fontCollection *collection; + IDWriteGdiInterop *gdi; + IDWriteFont *dwfont; + IDWriteFontFamily *dwfamily; + NONCLIENTMETRICS metrics; + WCHAR *family; + double size; + int pixels; + HRESULT hr; + + metrics.cbSize = sizeof(metrics); + if (!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0)) + logLastError(L"error getting non-client metrics"); + hr = dwfactory->GetGdiInterop(&gdi); + if (hr != S_OK) + logHRESULT(L"error getting GDI interop", hr); + + hr = gdi->CreateFontFromLOGFONT(&metrics.lfMessageFont, &dwfont); + if (hr != S_OK) + logHRESULT(L"error loading font", hr); + + hr = dwfont->GetFontFamily(&dwfamily); + if (hr != S_OK) + logHRESULT(L"error loading font family", hr); + collection = loadFontCollection(); + family = fontCollectionFamilyName(collection, dwfamily); + + pixels = GetDeviceCaps(GetDC(NULL), LOGPIXELSY); + if (pixels == 0) + logLastError(L"error getting device caps"); + size = abs(metrics.lfMessageFont.lfHeight) * 72 / pixels; + + font = mkTextFont(dwfont, FALSE, family, FALSE, size); + + fontCollectionFree(collection); + dwfamily->Release(); + gdi->Release(); + + return font; +} From a235a6b355b4fcd5ee634b5d8e1245a5269592dc Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig Date: Mon, 4 Jun 2018 11:23:21 +0200 Subject: [PATCH 2/7] macOS default font --- darwin/drawtext.m | 11 +++++++++-- ui.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/darwin/drawtext.m b/darwin/drawtext.m index dbcbccd0..68079f00 100644 --- a/darwin/drawtext.m +++ b/darwin/drawtext.m @@ -213,7 +213,14 @@ void uiDrawTextLayoutExtents(uiDrawTextLayout *tl, double *width, double *height [tl->forLines returnWidth:NULL height:height]; } -uiDrawTextFont *uiDrawLoadDefaultFont() +void uiDrawLoadDefaultFont(uiFontDescriptor *f) { - return mkTextFontFromNSFont([NSFont systemFontOfSize:0]); + CTFontRef ctfont; + CTFontDescriptorRef ctdesc; + + ctfont = (CTFontRef) [NSFont systemFontOfSize:0]; + ctdesc = CTFontCopyFontDescriptor(ctfont); + uiprivFontDescriptorFromCTFontDescriptor(ctdesc, f); + CFRelease(ctdesc); + f->Size = CTFontGetSize(ctfont); } diff --git a/ui.h b/ui.h index 228230b1..362b337e 100644 --- a/ui.h +++ b/ui.h @@ -919,7 +919,7 @@ struct uiFontDescriptor { uiTextStretch Stretch; }; -_UI_EXTERN uiDrawTextFont *uiDrawLoadDefaultFont(); +_UI_EXTERN void uiDrawLoadDefaultFont(uiFontDescriptor *f); // uiDrawTextLayout is a concrete representation of a // uiAttributedString that can be displayed in a uiDrawContext. From 6de328c1273b0a136328aff90d99aa885e141dc7 Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig Date: Mon, 4 Jun 2018 11:29:41 +0200 Subject: [PATCH 3/7] Linux default font --- unix/drawtext.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/unix/drawtext.c b/unix/drawtext.c index 80ed4194..19bd2a3f 100644 --- a/unix/drawtext.c +++ b/unix/drawtext.c @@ -80,18 +80,18 @@ void uiDrawTextLayoutExtents(uiDrawTextLayout *tl, double *width, double *height *height = pangoToCairo(logical.height); } -uiDrawTextFont *uiDrawLoadDefaultFont() +void uiDrawLoadDefaultFont(uiFontDescriptor *f) { GtkWidget *widget; GtkStyleContext *style; PangoFontDescription *fontdesc; - PangoFont *font; widget = g_object_ref_sink(gtk_drawing_area_new()); style = gtk_widget_get_style_context(widget); gtk_style_context_get(style, GTK_STATE_FLAG_NORMAL, "font", &fontdesc, NULL); - font = pangoDescToPangoFont(fontdesc); + uiprivFontDescriptorFromPangoFontDescription(fontdesc, f); + // pdesc is transfer-full and thus is a copy + pango_font_description_free(fontdesc); g_object_unref(widget); - return mkTextFont(font, FALSE); } From e114e7174110108a72b5fcd76e0ff31b8b56e018 Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig Date: Mon, 4 Jun 2018 11:45:42 +0200 Subject: [PATCH 4/7] Default font example --- examples/drawtext/main.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/examples/drawtext/main.c b/examples/drawtext/main.c index d94d2572..c52fbb17 100644 --- a/examples/drawtext/main.c +++ b/examples/drawtext/main.c @@ -8,6 +8,7 @@ uiArea *area; uiAreaHandler handler; uiFontButton *fontButton; uiCombobox *alignment; +uiCheckbox *systemFont; uiAttributedString *attrstr; @@ -97,16 +98,24 @@ static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p) uiDrawTextLayout *textLayout; uiFontDescriptor defaultFont; uiDrawTextLayoutParams params; + int useSystemFont = uiCheckboxChecked(systemFont); params.String = attrstr; - uiFontButtonFont(fontButton, &defaultFont); + if(useSystemFont) { + uiDrawLoadDefaultFont(&defaultFont); + } else { + uiFontButtonFont(fontButton, &defaultFont); + } + printf("%s\n", defaultFont.Family); params.DefaultFont = &defaultFont; params.Width = p->AreaWidth; params.Align = (uiDrawTextAlign) uiComboboxSelected(alignment); textLayout = uiDrawNewTextLayout(¶ms); uiDrawText(p->Context, textLayout, 0, 0); uiDrawFreeTextLayout(textLayout); - uiFreeFontButtonFont(&defaultFont); + if(!useSystemFont) { + uiFreeFontButtonFont(&defaultFont); + } } static void handlerMouseEvent(uiAreaHandler *a, uiArea *area, uiAreaMouseEvent *e) @@ -140,6 +149,11 @@ static void onComboboxSelected(uiCombobox *b, void *data) uiAreaQueueRedrawAll(area); } +static void onCheckboxToggled(uiCheckbox *b, void *data) +{ + uiAreaQueueRedrawAll(area); +} + static int onClosing(uiWindow *w, void *data) { uiControlDestroy(uiControl(mainwin)); @@ -208,6 +222,10 @@ int main(void) uiComboboxOnSelected(alignment, onComboboxSelected, NULL); uiFormAppend(form, "Alignment", uiControl(alignment), 0); + systemFont = uiNewCheckbox(""); + uiCheckboxOnToggled(systemFont, onCheckboxToggled, NULL); + uiFormAppend(form, "System Font", uiControl(systemFont), 0); + area = uiNewArea(&handler); uiBoxAppend(hbox, uiControl(area), 1); From 9561e87d499e4df962463e7b610b432cd6c3e57d Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig Date: Mon, 4 Jun 2018 12:25:48 +0200 Subject: [PATCH 5/7] Windows default font --- examples/drawtext/main.c | 7 ++-- windows/drawtext.cpp | 70 ++++++++++++++++++++-------------------- 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/examples/drawtext/main.c b/examples/drawtext/main.c index c52fbb17..92e48285 100644 --- a/examples/drawtext/main.c +++ b/examples/drawtext/main.c @@ -106,16 +106,15 @@ static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p) } else { uiFontButtonFont(fontButton, &defaultFont); } - printf("%s\n", defaultFont.Family); params.DefaultFont = &defaultFont; params.Width = p->AreaWidth; params.Align = (uiDrawTextAlign) uiComboboxSelected(alignment); textLayout = uiDrawNewTextLayout(¶ms); uiDrawText(p->Context, textLayout, 0, 0); uiDrawFreeTextLayout(textLayout); - if(!useSystemFont) { - uiFreeFontButtonFont(&defaultFont); - } + + //TODO RENAME? + uiFreeFontButtonFont(&defaultFont); } static void handlerMouseEvent(uiAreaHandler *a, uiArea *area, uiAreaMouseEvent *e) diff --git a/windows/drawtext.cpp b/windows/drawtext.cpp index 09d4c151..d671a7eb 100644 --- a/windows/drawtext.cpp +++ b/windows/drawtext.cpp @@ -535,46 +535,46 @@ void uiDrawTextLayoutExtents(uiDrawTextLayout *tl, double *width, double *height *height = metrics.height; } -uiDrawTextFont *uiDrawLoadDefaultFont() +void uiDrawLoadDefaultFont(uiFontDescriptor *f) { - uiDrawTextFont *font; - fontCollection *collection; - IDWriteGdiInterop *gdi; - IDWriteFont *dwfont; - IDWriteFontFamily *dwfamily; - NONCLIENTMETRICS metrics; - WCHAR *family; - double size; - int pixels; - HRESULT hr; + fontCollection *collection; + IDWriteGdiInterop *gdi; + IDWriteFont *dwfont; + IDWriteFontFamily *dwfamily; + NONCLIENTMETRICS metrics; + WCHAR *family; + double size; + int pixels; + HRESULT hr; - metrics.cbSize = sizeof(metrics); - if (!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0)) - logLastError(L"error getting non-client metrics"); - hr = dwfactory->GetGdiInterop(&gdi); - if (hr != S_OK) - logHRESULT(L"error getting GDI interop", hr); + metrics.cbSize = sizeof(metrics); + if (!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0)) + logLastError(L"error getting non-client metrics"); + hr = dwfactory->GetGdiInterop(&gdi); + if (hr != S_OK) + logHRESULT(L"error getting GDI interop", hr); - hr = gdi->CreateFontFromLOGFONT(&metrics.lfMessageFont, &dwfont); - if (hr != S_OK) - logHRESULT(L"error loading font", hr); + hr = gdi->CreateFontFromLOGFONT(&metrics.lfMessageFont, &dwfont); + if (hr != S_OK) + logHRESULT(L"error loading font", hr); - hr = dwfont->GetFontFamily(&dwfamily); - if (hr != S_OK) - logHRESULT(L"error loading font family", hr); - collection = loadFontCollection(); - family = fontCollectionFamilyName(collection, dwfamily); + hr = dwfont->GetFontFamily(&dwfamily); + if (hr != S_OK) + logHRESULT(L"error loading font family", hr); + collection = uiprivLoadFontCollection(); + family = uiprivFontCollectionFamilyName(collection, dwfamily); - pixels = GetDeviceCaps(GetDC(NULL), LOGPIXELSY); - if (pixels == 0) - logLastError(L"error getting device caps"); - size = abs(metrics.lfMessageFont.lfHeight) * 72 / pixels; + pixels = GetDeviceCaps(GetDC(NULL), LOGPIXELSY); + if (pixels == 0) + logLastError(L"error getting device caps"); + size = abs(metrics.lfMessageFont.lfHeight) * 72 / pixels; - font = mkTextFont(dwfont, FALSE, family, FALSE, size); + uiprivFontDescriptorFromIDWriteFont(dwfont, f); + f->Family = toUTF8(family); + f->Size = size; - fontCollectionFree(collection); - dwfamily->Release(); - gdi->Release(); - - return font; + uiprivFree(family); + uiprivFontCollectionFree(collection); + dwfamily->Release(); + gdi->Release(); } From 0b14022655bc1493f570f0e7408a518804010431 Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig Date: Mon, 4 Jun 2018 13:42:40 +0200 Subject: [PATCH 6/7] Cleanup --- darwin/drawtext.m | 2 +- examples/drawtext/main.c | 5 ++--- unix/drawtext.c | 2 +- windows/drawtext.cpp | 12 +++++++++--- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/darwin/drawtext.m b/darwin/drawtext.m index 68079f00..4cd110d4 100644 --- a/darwin/drawtext.m +++ b/darwin/drawtext.m @@ -218,7 +218,7 @@ void uiDrawLoadDefaultFont(uiFontDescriptor *f) CTFontRef ctfont; CTFontDescriptorRef ctdesc; - ctfont = (CTFontRef) [NSFont systemFontOfSize:0]; + ctfont = (CTFontRef) [NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSControlSizeRegular]]; ctdesc = CTFontCopyFontDescriptor(ctfont); uiprivFontDescriptorFromCTFontDescriptor(ctdesc, f); CFRelease(ctdesc); diff --git a/examples/drawtext/main.c b/examples/drawtext/main.c index 92e48285..67e15851 100644 --- a/examples/drawtext/main.c +++ b/examples/drawtext/main.c @@ -101,11 +101,10 @@ static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p) int useSystemFont = uiCheckboxChecked(systemFont); params.String = attrstr; - if(useSystemFont) { + if (useSystemFont) uiDrawLoadDefaultFont(&defaultFont); - } else { + else uiFontButtonFont(fontButton, &defaultFont); - } params.DefaultFont = &defaultFont; params.Width = p->AreaWidth; params.Align = (uiDrawTextAlign) uiComboboxSelected(alignment); diff --git a/unix/drawtext.c b/unix/drawtext.c index 19bd2a3f..d451090a 100644 --- a/unix/drawtext.c +++ b/unix/drawtext.c @@ -86,7 +86,7 @@ void uiDrawLoadDefaultFont(uiFontDescriptor *f) GtkStyleContext *style; PangoFontDescription *fontdesc; - widget = g_object_ref_sink(gtk_drawing_area_new()); + widget = g_object_ref_sink(gtk_label_new("")); style = gtk_widget_get_style_context(widget); gtk_style_context_get(style, GTK_STATE_FLAG_NORMAL, "font", &fontdesc, NULL); diff --git a/windows/drawtext.cpp b/windows/drawtext.cpp index d671a7eb..a98534ee 100644 --- a/windows/drawtext.cpp +++ b/windows/drawtext.cpp @@ -541,14 +541,15 @@ void uiDrawLoadDefaultFont(uiFontDescriptor *f) IDWriteGdiInterop *gdi; IDWriteFont *dwfont; IDWriteFontFamily *dwfamily; - NONCLIENTMETRICS metrics; + NONCLIENTMETRICSW metrics; + HDC dc; WCHAR *family; double size; int pixels; HRESULT hr; metrics.cbSize = sizeof(metrics); - if (!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0)) + if (!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0)) logLastError(L"error getting non-client metrics"); hr = dwfactory->GetGdiInterop(&gdi); if (hr != S_OK) @@ -564,7 +565,10 @@ void uiDrawLoadDefaultFont(uiFontDescriptor *f) collection = uiprivLoadFontCollection(); family = uiprivFontCollectionFamilyName(collection, dwfamily); - pixels = GetDeviceCaps(GetDC(NULL), LOGPIXELSY); + dc = GetDC(NULL); + if (dc == NULL) + logLastError(L"error getting DC"); + pixels = GetDeviceCaps(dc, LOGPIXELSY); if (pixels == 0) logLastError(L"error getting device caps"); size = abs(metrics.lfMessageFont.lfHeight) * 72 / pixels; @@ -577,4 +581,6 @@ void uiDrawLoadDefaultFont(uiFontDescriptor *f) uiprivFontCollectionFree(collection); dwfamily->Release(); gdi->Release(); + if (ReleaseDC(NULL, dc) == 0) + logLastError(L"error releasing DC"); } From 836fda6aaf166509c3ae3413a5e13b5399a07a44 Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig Date: Thu, 9 Aug 2018 13:46:04 +0200 Subject: [PATCH 7/7] Rename to uiLoadControlFont --- darwin/drawtext.m | 2 +- examples/drawtext/main.c | 2 +- ui.h | 2 +- unix/drawtext.c | 2 +- windows/drawtext.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/darwin/drawtext.m b/darwin/drawtext.m index 4cd110d4..64c4b255 100644 --- a/darwin/drawtext.m +++ b/darwin/drawtext.m @@ -213,7 +213,7 @@ void uiDrawTextLayoutExtents(uiDrawTextLayout *tl, double *width, double *height [tl->forLines returnWidth:NULL height:height]; } -void uiDrawLoadDefaultFont(uiFontDescriptor *f) +void uiLoadControlFont(uiFontDescriptor *f) { CTFontRef ctfont; CTFontDescriptorRef ctdesc; diff --git a/examples/drawtext/main.c b/examples/drawtext/main.c index 67e15851..5f1a3712 100644 --- a/examples/drawtext/main.c +++ b/examples/drawtext/main.c @@ -102,7 +102,7 @@ static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p) params.String = attrstr; if (useSystemFont) - uiDrawLoadDefaultFont(&defaultFont); + uiLoadControlFont(&defaultFont); else uiFontButtonFont(fontButton, &defaultFont); params.DefaultFont = &defaultFont; diff --git a/ui.h b/ui.h index 362b337e..81ad402d 100644 --- a/ui.h +++ b/ui.h @@ -919,7 +919,7 @@ struct uiFontDescriptor { uiTextStretch Stretch; }; -_UI_EXTERN void uiDrawLoadDefaultFont(uiFontDescriptor *f); +_UI_EXTERN void uiLoadControlFont(uiFontDescriptor *f); // uiDrawTextLayout is a concrete representation of a // uiAttributedString that can be displayed in a uiDrawContext. diff --git a/unix/drawtext.c b/unix/drawtext.c index d451090a..f6f79ec5 100644 --- a/unix/drawtext.c +++ b/unix/drawtext.c @@ -80,7 +80,7 @@ void uiDrawTextLayoutExtents(uiDrawTextLayout *tl, double *width, double *height *height = pangoToCairo(logical.height); } -void uiDrawLoadDefaultFont(uiFontDescriptor *f) +void uiLoadControlFont(uiFontDescriptor *f) { GtkWidget *widget; GtkStyleContext *style; diff --git a/windows/drawtext.cpp b/windows/drawtext.cpp index a98534ee..2bab793d 100644 --- a/windows/drawtext.cpp +++ b/windows/drawtext.cpp @@ -535,7 +535,7 @@ void uiDrawTextLayoutExtents(uiDrawTextLayout *tl, double *width, double *height *height = metrics.height; } -void uiDrawLoadDefaultFont(uiFontDescriptor *f) +void uiLoadControlFont(uiFontDescriptor *f) { fontCollection *collection; IDWriteGdiInterop *gdi;