Esme Povirk (@madewokherd) commented about dlls/gdiplus/graphics.c:
position.X = args->x + bounds->X / args->rel_width; position.Y = args->y + bounds->Y / args->rel_height + args->ascent;
- stat = draw_driver_string(graphics, &string[index], length, font, format, - args->brush, &position, + GdipStringFormatGetGenericTypographic(&generic_format); + LIST_FOR_EACH_ENTRY(section, &font_link_info->sections, struct gdip_font_link_section, entry) + { + if (i >= section->end) continue; + + to_draw_length = min(length - (i - index), section->end - i); + TRACE("index %d, todraw %ld, used %s\n", i, to_draw_length, section->font == font_link_info->base_font ? "base font" : "map"); + GdipMeasureString(graphics, &string[i], to_draw_length, section->font, rect, generic_format, &bound_box, NULL, NULL); + stat = draw_driver_string(graphics, &string[i], to_draw_length, + section->font, format, args->brush, &position, DriverStringOptionsCmapLookup|DriverStringOptionsRealizedAdvance, NULL);
The assignment to stat is ignored in all iterations except the last one. We should probably break the loop if it isn't Ok. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/4082#note_59949