[gtk+] gsk: Add gsk_rounded_rect_shrink()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gsk: Add gsk_rounded_rect_shrink()
- Date: Tue, 20 Dec 2016 17:15:03 +0000 (UTC)
commit a9809e5d30fbf4d5e3b555b5489d75102d5d30d0
Author: Benjamin Otte <otte redhat com>
Date: Sun Dec 18 17:10:45 2016 +0100
gsk: Add gsk_rounded_rect_shrink()
... and replace _gtk_rounded_box_grow() and _gtk_rounded_box_shrink()
with it.
docs/reference/gsk/gsk4-sections.txt | 1 +
gsk/gskroundedrect.c | 72 ++++++++++++++++++++++++++++++++++
gsk/gskroundedrect.h | 6 +++
gtk/gtkcssshadowvalue.c | 8 ++--
gtk/gtkrender.c | 2 +-
gtk/gtkrenderbackground.c | 4 +-
gtk/gtkrenderborder.c | 10 ++--
gtk/gtkroundedbox.c | 62 -----------------------------
gtk/gtkroundedboxprivate.h | 11 -----
9 files changed, 91 insertions(+), 85 deletions(-)
---
diff --git a/docs/reference/gsk/gsk4-sections.txt b/docs/reference/gsk/gsk4-sections.txt
index f5cc151..3b47dab 100644
--- a/docs/reference/gsk/gsk4-sections.txt
+++ b/docs/reference/gsk/gsk4-sections.txt
@@ -72,5 +72,6 @@ gsk_rounded_rect_init_copy
gsk_rounded_rect_init_from_rect
gsk_rounded_rect_normalize
gsk_rounded_rect_offset
+gsk_rounded_rect_shrink
gsk_rounded_rect_is_rectilinear
</SECTION>
diff --git a/gsk/gskroundedrect.c b/gsk/gskroundedrect.c
index 0e4173a..f1ecc2b 100644
--- a/gsk/gskroundedrect.c
+++ b/gsk/gskroundedrect.c
@@ -205,6 +205,78 @@ gsk_rounded_rect_offset (GskRoundedRect *self,
return self;
}
+static void
+border_radius_shrink (graphene_size_t *corner,
+ double width,
+ double height)
+{
+ if (corner->width > 0)
+ corner->width -= width;
+ if (corner->height > 0)
+ corner->height -= height;
+
+ if (corner->width <= 0 || corner->height <= 0)
+ {
+ corner->width = 0;
+ corner->height = 0;
+ }
+}
+
+/**
+ * gsk_rounded_rect_shrink:
+ * @self: The @GskRoundedRect to shrink or grow
+ * @top: How far to move the top side downwards
+ * @right: How far to move the right side to the left
+ * @bottom: How far to move the bottom side upwards
+ * @left: How far to move the left side to the right
+ *
+ * Shrinks (or grows) the given rectangle by moving the 4 sides
+ * according to the offsets given. The corner radii will be changed
+ * in a way that tries to keep the center of the corner circle intact.
+ * This emulates CSS behavior.
+ *
+ * This function also works for growing rectangles if you pass
+ * negative values for the @top, @right, @bottom or @left.
+ *
+ * Returns: @self
+ **/
+GskRoundedRect *
+gsk_rounded_rect_shrink (GskRoundedRect *self,
+ float top,
+ float right,
+ float bottom,
+ float left)
+{
+ if (self->bounds.size.width - left - right < 0)
+ {
+ self->bounds.origin.x += left * self->bounds.size.width / (left + right);
+ self->bounds.size.width = 0;
+ }
+ else
+ {
+ self->bounds.origin.x += left;
+ self->bounds.size.width -= left + right;
+ }
+
+ if (self->bounds.size.height - bottom - top < 0)
+ {
+ self->bounds.origin.y += top * self->bounds.size.height / (top + bottom);
+ self->bounds.size.height = 0;
+ }
+ else
+ {
+ self->bounds.origin.y += top;
+ self->bounds.size.height -= top + bottom;
+ }
+
+ border_radius_shrink (&self->corner[GSK_CORNER_TOP_LEFT], left, top);
+ border_radius_shrink (&self->corner[GSK_CORNER_TOP_RIGHT], right, top);
+ border_radius_shrink (&self->corner[GSK_CORNER_BOTTOM_RIGHT], right, bottom);
+ border_radius_shrink (&self->corner[GSK_CORNER_BOTTOM_LEFT], left, bottom);
+
+ return self;
+}
+
/**
* gsk_rounded_rect_is_rectilinear:
* @self: the #GskRoundedRect to check
diff --git a/gsk/gskroundedrect.h b/gsk/gskroundedrect.h
index 96551ed..9a3d33e 100644
--- a/gsk/gskroundedrect.h
+++ b/gsk/gskroundedrect.h
@@ -87,6 +87,12 @@ GDK_AVAILABLE_IN_3_90
GskRoundedRect * gsk_rounded_rect_offset (GskRoundedRect *self,
float dx,
float dy);
+GDK_AVAILABLE_IN_3_90
+GskRoundedRect * gsk_rounded_rect_shrink (GskRoundedRect *self,
+ float top,
+ float right,
+ float bottom,
+ float left);
GDK_AVAILABLE_IN_3_90
gboolean gsk_rounded_rect_is_rectilinear (GskRoundedRect *self);
diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c
index 24e852b..6edd51a 100644
--- a/gtk/gtkcssshadowvalue.c
+++ b/gtk/gtkcssshadowvalue.c
@@ -925,7 +925,7 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue *shadow,
gsk_rounded_rect_path (padding_box, cr);
outside = spread + clip_radius + MAX (fabs (x), fabs (y));
clip_box = *padding_box;
- _gtk_rounded_box_grow (&clip_box, outside, outside, outside, outside);
+ gsk_rounded_rect_shrink (&clip_box, -outside, -outside, -outside, -outside);
_gtk_rounded_box_clip_path (&clip_box, cr);
cairo_clip (cr);
@@ -935,12 +935,12 @@ _gtk_css_shadow_value_paint_box (const GtkCssValue *shadow,
gsk_rounded_rect_offset (&box, x, y);
if (shadow->inset)
- _gtk_rounded_box_shrink (&box, spread, spread, spread, spread);
+ gsk_rounded_rect_shrink (&box, spread, spread, spread, spread);
else /* Outset */
- _gtk_rounded_box_grow (&box, spread, spread, spread, spread);
+ gsk_rounded_rect_shrink (&box, -spread, -spread, -spread, -spread);
clip_box = *padding_box;
- _gtk_rounded_box_shrink (&clip_box, -clip_radius, -clip_radius, -clip_radius, -clip_radius);
+ gsk_rounded_rect_shrink (&clip_box, -clip_radius, -clip_radius, -clip_radius, -clip_radius);
if (!needs_blur (shadow))
draw_shadow (shadow, cr, &box, &clip_box, GTK_BLUR_NONE);
diff --git a/gtk/gtkrender.c b/gtk/gtkrender.c
index e23d712..a0c086b 100644
--- a/gtk/gtkrender.c
+++ b/gtk/gtkrender.c
@@ -986,7 +986,7 @@ gtk_render_content_path (GtkStyleContext *context,
_gtk_rounded_box_init_rect (&box, x, y, width, height);
_gtk_rounded_box_apply_border_radius_for_style (&box, gtk_style_context_lookup_style (context), 0);
- _gtk_rounded_box_shrink (&box,
+ gsk_rounded_rect_shrink (&box,
_gtk_css_number_value_get (_gtk_style_context_peek_property (context,
GTK_CSS_PROPERTY_BORDER_TOP_WIDTH), 100)
+ _gtk_css_number_value_get (_gtk_style_context_peek_property (context,
GTK_CSS_PROPERTY_PADDING_TOP), 100),
_gtk_css_number_value_get (_gtk_style_context_peek_property (context,
GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH), 100)
diff --git a/gtk/gtkrenderbackground.c b/gtk/gtkrenderbackground.c
index 10f54c6..4beafb2 100644
--- a/gtk/gtkrenderbackground.c
+++ b/gtk/gtkrenderbackground.c
@@ -555,12 +555,12 @@ gtk_theming_background_init (GtkThemingBackground *bg,
_gtk_rounded_box_apply_border_radius_for_style (&bg->boxes[GTK_CSS_AREA_BORDER_BOX], bg->style, junction);
bg->boxes[GTK_CSS_AREA_PADDING_BOX] = bg->boxes[GTK_CSS_AREA_BORDER_BOX];
- _gtk_rounded_box_shrink (&bg->boxes[GTK_CSS_AREA_PADDING_BOX],
+ gsk_rounded_rect_shrink (&bg->boxes[GTK_CSS_AREA_PADDING_BOX],
border.top, border.right,
border.bottom, border.left);
bg->boxes[GTK_CSS_AREA_CONTENT_BOX] = bg->boxes[GTK_CSS_AREA_PADDING_BOX];
- _gtk_rounded_box_shrink (&bg->boxes[GTK_CSS_AREA_CONTENT_BOX],
+ gsk_rounded_rect_shrink (&bg->boxes[GTK_CSS_AREA_CONTENT_BOX],
padding.top, padding.right,
padding.bottom, padding.left);
}
diff --git a/gtk/gtkrenderborder.c b/gtk/gtkrenderborder.c
index 7c41861..9696c6c 100644
--- a/gtk/gtkrenderborder.c
+++ b/gtk/gtkrenderborder.c
@@ -362,7 +362,7 @@ render_frame_fill (cairo_t *cr,
guint i, j;
padding_box = *border_box;
- _gtk_rounded_box_shrink (&padding_box,
+ gsk_rounded_rect_shrink (&padding_box,
border_width[GTK_CSS_TOP],
border_width[GTK_CSS_RIGHT],
border_width[GTK_CSS_BOTTOM],
@@ -486,7 +486,7 @@ render_frame_stroke (cairo_t *cr,
border_width[0] != border_width[3] ;
stroke_box = *border_box;
- _gtk_rounded_box_shrink (&stroke_box,
+ gsk_rounded_rect_shrink (&stroke_box,
border_width[GTK_CSS_TOP] / 2.0,
border_width[GTK_CSS_RIGHT] / 2.0,
border_width[GTK_CSS_BOTTOM] / 2.0,
@@ -513,7 +513,7 @@ render_frame_stroke (cairo_t *cr,
GskRoundedRect padding_box;
padding_box = *border_box;
- _gtk_rounded_box_shrink (&padding_box,
+ gsk_rounded_rect_shrink (&padding_box,
border_width[GTK_CSS_TOP],
border_width[GTK_CSS_RIGHT],
border_width[GTK_CSS_BOTTOM],
@@ -640,7 +640,7 @@ render_border (cairo_t *cr,
render_frame_fill (cr, border_box, other_border, colors, dont_draw);
other_box = *border_box;
- _gtk_rounded_box_shrink (&other_box,
+ gsk_rounded_rect_shrink (&other_box,
2 * other_border[GTK_CSS_TOP],
2 * other_border[GTK_CSS_RIGHT],
2 * other_border[GTK_CSS_BOTTOM],
@@ -674,7 +674,7 @@ render_border (cairo_t *cr,
render_frame_fill (cr, border_box, other_border, colors, dont_draw);
other_box = *border_box;
- _gtk_rounded_box_shrink (&other_box,
+ gsk_rounded_rect_shrink (&other_box,
other_border[GTK_CSS_TOP],
other_border[GTK_CSS_RIGHT],
other_border[GTK_CSS_BOTTOM],
diff --git a/gtk/gtkroundedbox.c b/gtk/gtkroundedbox.c
index 73b9746..5dafd63 100644
--- a/gtk/gtkroundedbox.c
+++ b/gtk/gtkroundedbox.c
@@ -151,68 +151,6 @@ _gtk_rounded_box_apply_outline_radius_for_style (GskRoundedRect *box,
_gtk_rounded_box_apply_border_radius (box, corner, junction);
}
-static void
-gtk_css_border_radius_grow (graphene_size_t *corner,
- double width,
- double height)
-{
- if (corner->width)
- corner->width += width;
- if (corner->height)
- corner->height += height;
-
- if (corner->width <= 0 || corner->height <= 0)
- {
- corner->width = 0;
- corner->height = 0;
- }
-}
-
-void
-_gtk_rounded_box_grow (GskRoundedRect *box,
- double top,
- double right,
- double bottom,
- double left)
-{
- if (box->bounds.size.width + left + right < 0)
- {
- box->bounds.origin.x -= left * box->bounds.size.width / (left + right);
- box->bounds.size.width = 0;
- }
- else
- {
- box->bounds.origin.x -= left;
- box->bounds.size.width += left + right;
- }
-
- if (box->bounds.size.height + bottom + top < 0)
- {
- box->bounds.origin.y -= top * box->bounds.size.height / (top + bottom);
- box->bounds.size.height = 0;
- }
- else
- {
- box->bounds.origin.y -= top;
- box->bounds.size.height += top + bottom;
- }
-
- gtk_css_border_radius_grow (&box->corner[GSK_CORNER_TOP_LEFT], left, top);
- gtk_css_border_radius_grow (&box->corner[GSK_CORNER_TOP_RIGHT], right, top);
- gtk_css_border_radius_grow (&box->corner[GSK_CORNER_BOTTOM_RIGHT], right, bottom);
- gtk_css_border_radius_grow (&box->corner[GSK_CORNER_BOTTOM_LEFT], left, bottom);
-}
-
-void
-_gtk_rounded_box_shrink (GskRoundedRect *box,
- double top,
- double right,
- double bottom,
- double left)
-{
- _gtk_rounded_box_grow (box, -top, -right, -bottom, -left);
-}
-
typedef struct {
double angle1;
double angle2;
diff --git a/gtk/gtkroundedboxprivate.h b/gtk/gtkroundedboxprivate.h
index 957bb3e..474c56c 100644
--- a/gtk/gtkroundedboxprivate.h
+++ b/gtk/gtkroundedboxprivate.h
@@ -42,17 +42,6 @@ void _gtk_rounded_box_apply_outline_radius_for_style (GskRoundedRect
GtkCssStyle *style,
GtkJunctionSides junction);
-void _gtk_rounded_box_grow (GskRoundedRect *box,
- double top,
- double right,
- double bottom,
- double left);
-void _gtk_rounded_box_shrink (GskRoundedRect *box,
- double top,
- double right,
- double bottom,
- double left);
-
double _gtk_rounded_box_guess_length (const GskRoundedRect *box,
GtkCssSide side);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]