[gnome-software/1205-reviews-ratings-are-rounded-to-integer-stars: 5/6] gs-star-image: Use actual star width for the fraction color fill




commit 811da545862b6aa9069f497f77df2691eaf16b07
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jun 1 21:52:38 2021 +0200

    gs-star-image: Use actual star width for the fraction color fill
    
    Rather than using the radius, use the actual drawn width for the fraction
    calculation, thus smaller numbers are evenly spread in the drawn part.

 src/gs-star-image.c | 34 ++++++++++++++++++++++++++++------
 1 file changed, 28 insertions(+), 6 deletions(-)
---
diff --git a/src/gs-star-image.c b/src/gs-star-image.c
index 2c3baec90..2fd01e30a 100644
--- a/src/gs-star-image.c
+++ b/src/gs-star-image.c
@@ -22,7 +22,9 @@ static void
 gs_star_image_outline_star (cairo_t *cr,
                            gint x,
                            gint y,
-                           gint radius)
+                           gint radius,
+                           gint *out_min_x,
+                           gint *out_max_x)
 {
        const struct _points {
                gdouble x, y;
@@ -38,16 +40,35 @@ gs_star_image_outline_star (cairo_t *cr,
                {  0.951057, -0.309017 },
                {  0.224513, -0.309017 }
        };
-       gint ii, nn = G_N_ELEMENTS (points);
+       gint ii, nn = G_N_ELEMENTS (points), xx, yy;
 
        if (radius <= 0)
                return;
 
        cairo_translate (cr, radius, radius);
-       cairo_move_to (cr, points[0].x * radius, points[0].y * radius);
+
+       xx = points[0].x * radius;
+       yy = points[0].y * radius;
+
+       if (out_min_x)
+               *out_min_x = xx;
+
+       if (out_max_x)
+               *out_max_x = xx;
+
+       cairo_move_to (cr, xx, yy);
 
        for (ii = 1; ii <= nn; ii++) {
-               cairo_line_to (cr, points[ii % nn].x * radius, points[ii % nn].y * radius);
+               xx = points[ii % nn].x * radius;
+               yy = points[ii % nn].y * radius;
+
+               if (out_min_x && *out_min_x > xx)
+                       *out_min_x = xx;
+
+               if (out_max_x && *out_max_x < xx)
+                       *out_max_x = xx;
+
+               cairo_line_to (cr, xx, yy);
        }
 }
 
@@ -101,6 +122,7 @@ gs_star_image_draw (GtkWidget *widget,
                GtkStyleContext *style_context;
                GdkRGBA *star_bg = NULL;
                GdkRGBA star_fg;
+               gint min_x = -radius, max_x = radius;
 
                gtk_widget_style_get (widget,
                        "star-bg", &star_bg,
@@ -112,7 +134,7 @@ gs_star_image_draw (GtkWidget *widget,
                                             &star_fg);
 
                cairo_save (cr);
-               gs_star_image_outline_star (cr, allocation.x, allocation.y, radius);
+               gs_star_image_outline_star (cr, allocation.x, allocation.y, radius, &min_x, &max_x);
                cairo_clip (cr);
                if (star_bg)
                        gdk_cairo_set_source_rgba (cr, star_bg);
@@ -122,7 +144,7 @@ gs_star_image_draw (GtkWidget *widget,
                cairo_fill (cr);
 
                gdk_cairo_set_source_rgba (cr, &star_fg);
-               cairo_rectangle (cr, -radius, -radius, 2 * radius * fraction, 2 * radius);
+               cairo_rectangle (cr, min_x, -radius, (max_x - min_x) * fraction, 2 * radius);
                cairo_fill (cr);
                cairo_restore (cr);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]