Esme Povirk (@madewokherd) commented about dlls/gdiplus/graphics.c:
- switch (halign) + switch (format->line_align) { case StringAlignmentNear: default: - bounds.X = rect->X; break; case StringAlignmentCenter: - bounds.X = rect->X + (rect->Width/2) - (bounds.Width/2); + bounds.Y += (rect->Height - bounds.Height) / 2; break; case StringAlignmentFar: - bounds.X = rect->X + rect->Width - bounds.Width; + bounds.Y += rect->Height - bounds.Height; break; } I don't think it's possible to adjust Y properly within this loop. We need to know the total height of all lines, after wrapping and clipping, first.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/9775#note_136815