From dfd05c0717031e83994c4f1610d02edde8e123ad Mon Sep 17 00:00:00 2001 From: Jehan Date: Wed, 16 Feb 2022 17:42:53 +0100 Subject: [PATCH] libgimpwidgets: improve a bit the position of progress and normal text. The logics to get the progress position is not proper because the text area (as returned by gtk_entry_get_text_area()) is actually slightly smaller than the progress area. Unfortunately it doesn't look like there is an API to get the exact progress area. This commit improves a bit the situation by starting the progress rectangle when excluding the intersection of 2 rectangles in pango at the start of the text area (not at 0). It's still not perfect as the progress width will be anyway a bit too small and we don't have the data to compute it properly, but it's better than it used to be. I also set several variables to double instead of int to be more accurate, though this part doesn't help much. Finally I used the ink extents rather than the logical extents. Since we are here to draw, this is the ink extents which is really needed. Note: for the bug to be visible, you need to have a different text color for the progress and non-progress part of the scale. Also I'm unsure about the right-to-left logics which seems very broken. --- libgimpwidgets/gimpspinscale.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/libgimpwidgets/gimpspinscale.c b/libgimpwidgets/gimpspinscale.c index 7a7329c820..f9b6a8a8de 100644 --- a/libgimpwidgets/gimpspinscale.c +++ b/libgimpwidgets/gimpspinscale.c @@ -373,16 +373,16 @@ gimp_spin_scale_draw (GtkWidget *widget, GtkStateFlags state; gint minimum_width; gint natural_width; - PangoRectangle logical; + PangoRectangle ink; gint layout_offset_x; gint layout_offset_y; GdkRGBA text_color; GdkRGBA bar_text_color; gdouble progress_fraction; - gint progress_x; - gint progress_y; - gint progress_width; - gint progress_height; + gdouble progress_x; + gdouble progress_y; + gdouble progress_width; + gdouble progress_height; gtk_widget_get_allocation (widget, &allocation); @@ -417,16 +417,16 @@ gimp_spin_scale_draw (GtkWidget *widget, pango_layout_set_width (private->layout, PANGO_SCALE * (allocation.width - minimum_width)); - pango_layout_get_pixel_extents (private->layout, NULL, &logical); + pango_layout_get_pixel_extents (private->layout, &ink, NULL); gtk_entry_get_layout_offsets (GTK_ENTRY (widget), NULL, &layout_offset_y); if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) - layout_offset_x = text_area.x + text_area.width - logical.width - 2; + layout_offset_x = text_area.x + text_area.width - ink.width - 2; else layout_offset_x = text_area.x + 2; - layout_offset_x -= logical.x; + layout_offset_x -= ink.x; gtk_style_context_get_color (style, state, &text_color); @@ -441,16 +441,16 @@ gimp_spin_scale_draw (GtkWidget *widget, { progress_fraction = 1.0 - progress_fraction; - progress_x = text_area.width * progress_fraction; - progress_y = 0; + progress_x = (gdouble) text_area.width * progress_fraction + text_area.x; + progress_y = 0.0; progress_width = text_area.width - progress_x; progress_height = text_area.height; } else { - progress_x = 0; - progress_y = 0; - progress_width = text_area.width * progress_fraction; + progress_x = text_area.x; + progress_y = 0.0; + progress_width = (gdouble) text_area.width * progress_fraction; progress_height = text_area.height; }