33 int len = strlen(
string);
35 text.resize(MultiByteToWideChar(CP_UTF8, 0,
string,
len, &
text[0],
len));
42 LOGFONTA font_to_find{};
43 font_to_find.lfCharSet = ANSI_CHARSET;
44 size_t font_len = strlen(fontname);
45 if (font_len >
sizeof(font_to_find.lfFaceName) - 1) {
46 font_len =
sizeof(font_to_find.lfFaceName) - 1;
48 memcpy(font_to_find.lfFaceName, fontname, font_len);
51 (LPARAM)&found_font, 0) == 0) {
52 found_font.lfHeight = (LONG)-fontsize;
53 found_font.lfWidth = 0;
54 font = std::make_unique<Font>(reference.
hdc, &found_font);
56 font = std::make_unique<Font>(FontFamily::GenericSerif(),
57 static_cast<REAL>(fontsize));
77 Graphics measureGraphics(deviceContext.
hdc);
78 measureGraphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
79 measureGraphics.MeasureString(&
layout->text[0],
layout->text.size(),
80 layout->font.get(), PointF(0.0f, 0.0f),
83 FontFamily fontFamily;
84 layout->font->GetFamily(&fontFamily);
85 int style =
layout->font->GetStyle();
89 span->
size.
x = boundingBox.Width;
90 span->
size.
y =
layout->font->GetHeight(&measureGraphics);
92 fontFamily.GetCellAscent(style) * span->
font->
size /
93 fontFamily.GetEmHeight(style);
static int CALLBACK fetch_first_font(const LOGFONTA *logFont, const TEXTMETRICA *, DWORD, LPARAM lParam)
static gvtextlayout_engine_t gdiplus_textlayout_engine
void gdiplus_free_layout(void *layout)
bool gdiplus_textlayout(textspan_t *span, char **)
gvplugin_installed_t gvtextlayout_gdiplus_types[]
double yoffset_centerline
void(* free_layout)(void *layout)