From eef459968a480cb62c422cecb38f8844644779dd Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Wed, 21 Mar 2012 12:50:11 -0500 Subject: [PATCH] gdiplus: Detect hotkey prefixes when drawing strings. --- dlls/gdiplus/gdiplus_private.h | 3 ++- dlls/gdiplus/graphics.c | 57 +++++++++++++++++++++++++++++++++++++++--- dlls/gdiplus/graphicspath.c | 6 ++++- 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index 3cd01b4e170..24df3dd3f00 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -424,7 +424,8 @@ struct GpRegion{ typedef GpStatus (*gdip_format_string_callback)(HDC hdc, GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - INT lineno, const RectF *bounds, void *user_data); + INT lineno, const RectF *bounds, INT *underlined_indexes, + INT underlined_index_count, void *user_data); GpStatus gdip_format_string(HDC hdc, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index cbaf3ed0d2e..c5ac9d14608 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -4686,6 +4686,11 @@ GpStatus gdip_format_string(HDC hdc, StringAlignment halign; GpStatus stat = Ok; SIZE size; + HotkeyPrefix hkprefix; + INT *hotkeyprefix_offsets=NULL; + INT hotkeyprefix_count=0; + INT hotkeyprefix_pos=0, hotkeyprefix_end_pos=0; + int seen_prefix=0; if(length == -1) length = lstrlenW(string); @@ -4698,11 +4703,40 @@ GpStatus gdip_format_string(HDC hdc, if (rect->Width >= INT_MAX || rect->Width < 0.5) nwidth = INT_MAX; if (rect->Height >= INT_MAX || rect->Height < 0.5) nheight = INT_MAX; + if (format) + hkprefix = format->hkprefix; + else + hkprefix = HotkeyPrefixNone; + + if (hkprefix == HotkeyPrefixShow) + { + for (i=0; i= sum + lineend) + break; + stat = callback(hdc, stringdup, sum, lineend, - font, rect, format, lineno, &bounds, user_data); + font, rect, format, lineno, &bounds, + &hotkeyprefix_offsets[hotkeyprefix_pos], + hotkeyprefix_end_pos-hotkeyprefix_pos, user_data); if (stat != Ok) break; @@ -4787,6 +4827,8 @@ GpStatus gdip_format_string(HDC hdc, height += size.cy; lineno++; + hotkeyprefix_pos = hotkeyprefix_end_pos; + if(height > nheight) break; @@ -4796,6 +4838,7 @@ GpStatus gdip_format_string(HDC hdc, } GdipFree(stringdup); + GdipFree(hotkeyprefix_offsets); return stat; } @@ -4807,7 +4850,8 @@ struct measure_ranges_args { static GpStatus measure_ranges_callback(HDC hdc, GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - INT lineno, const RectF *bounds, void *user_data) + INT lineno, const RectF *bounds, INT *underlined_indexes, + INT underlined_index_count, void *user_data) { int i; GpStatus stat = Ok; @@ -4904,7 +4948,8 @@ struct measure_string_args { static GpStatus measure_string_callback(HDC hdc, GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - INT lineno, const RectF *bounds, void *user_data) + INT lineno, const RectF *bounds, INT *underlined_indexes, + INT underlined_index_count, void *user_data) { struct measure_string_args *args = user_data; @@ -4988,11 +5033,15 @@ struct draw_string_args { static GpStatus draw_string_callback(HDC hdc, GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - INT lineno, const RectF *bounds, void *user_data) + INT lineno, const RectF *bounds, INT *underlined_indexes, + INT underlined_index_count, void *user_data) { struct draw_string_args *args = user_data; PointF position; + if (underlined_index_count) + FIXME("hotkey underlines not drawn yet\n"); + position.X = args->x + bounds->X / args->rel_width; position.Y = args->y + bounds->Y / args->rel_height + args->ascent; diff --git a/dlls/gdiplus/graphicspath.c b/dlls/gdiplus/graphicspath.c index 131477e1c9b..c41278c250d 100644 --- a/dlls/gdiplus/graphicspath.c +++ b/dlls/gdiplus/graphicspath.c @@ -846,7 +846,8 @@ struct format_string_args static GpStatus format_string_callback(HDC dc, GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - INT lineno, const RectF *bounds, void *priv) + INT lineno, const RectF *bounds, INT *underlined_indexes, + INT underlined_index_count, void *priv) { static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} }; struct format_string_args *args = priv; @@ -856,6 +857,9 @@ static GpStatus format_string_callback(HDC dc, float y = bounds->Y; int i; + if (underlined_index_count) + FIXME("hotkey underlines not drawn yet\n"); + for (i = index; i < length; ++i) { GLYPHMETRICS gm; -- 2.11.4.GIT