diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-01-25 12:58:36 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-01-25 12:58:36 +0000 |
commit | 421088c3a0d71bc4fc60e70ab0be8973cb42177c (patch) | |
tree | 499b40d12fa1cc5cc9810621f97ffab5d5ca13de | |
parent | 43d553dcfbee7c58816d44017cd3cf518cd0662b (diff) | |
parent | 749f1a7c00b215b6c99d2c628868c12c44ff2e78 (diff) | |
download | gtk+-421088c3a0d71bc4fc60e70ab0be8973cb42177c.tar.gz |
Merge branch 'transform-origin' into 'master'
Transform origin
See merge request GNOME/gtk!3108
-rw-r--r-- | docs/reference/gtk/css-properties.md | 5 | ||||
-rw-r--r-- | gtk/gtkcssanimatedstyle.c | 4 | ||||
-rw-r--r-- | gtk/gtkcssstaticstyle.c | 5 | ||||
-rw-r--r-- | gtk/gtkcssstyle.c | 2 | ||||
-rw-r--r-- | gtk/gtkcssstyleprivate.h | 1 | ||||
-rw-r--r-- | gtk/gtkcssstylepropertyimpl.c | 14 | ||||
-rw-r--r-- | gtk/gtkcsstypesprivate.h | 1 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 10 | ||||
-rw-r--r-- | testsuite/reftests/transform-origin.css | 15 | ||||
-rw-r--r-- | testsuite/reftests/transform-origin.ref.ui | 17 | ||||
-rw-r--r-- | testsuite/reftests/transform-origin.ui | 17 |
11 files changed, 87 insertions, 4 deletions
diff --git a/docs/reference/gtk/css-properties.md b/docs/reference/gtk/css-properties.md index 7e6fcdedaa..e50f577650 100644 --- a/docs/reference/gtk/css-properties.md +++ b/docs/reference/gtk/css-properties.md @@ -159,11 +159,12 @@ done with |-gtk-icon-source| [Image](https://www.w3.org/TR/css-backgrounds-3/#typedef-image), `builtin` or `none` | used for builtin icons in buttons and expanders | |-gtk-icon-size| [Length](https://www.w3.org/TR/css3-values/#length-value) | size used for builtin icons in buttons and expanders | |-gtk-icon-style| `requested`, `regular` or `symbolic` | preferred style for application-loaded icons | -|-gtk-icon-transform| [Transform list](https://drafts.csswg.org/css-transforms-1/#typedef-transform-list) or `none` | applied to builtin and application-loaded icons | +|-gtk-icon-transform| [Transform list](https://www.w3.org/TR/css-transforms-1/#typedef-transform-list) or `none` | applied to builtin and application-loaded icons | |-gtk-icon-palette| Color palette, as explained above | used to recolor symbolic icons | |-gtk-icon-shadow| [Shadow](https://www.w3.org/TR/css-backgrounds-3/#typedef-shadow) or `none` | applied to builtin and application-loaded icons | |-gtk-icon-filter| [Filter value list](https://www.w3.org/TR/filter-effects-1/#typedef-filter-value-list) or `none` | applied to builtin and application-loaded icons | -|transform| [CSS Transforms Level 2](https://drafts.csswg.org/css-transforms-2/) | | +|transform| [CSS Transforms Level 1](https://www.w3.org/TR/css-transforms-1/#transform-property) | | +|transform-origin| [CSS Transforms Level 1](https://www.w3.org/TR/css-transforms-1/#transform-origin-property) | CSS allows specifying a z component| |min-width| [CSS Box Model Level 3](https://www.w3.org/TR/css3-box/#min-width) | CSS allows percentages | |min-height| [CSS Box Model Level 3](https://www.w3.org/TR/css3-box/#min-height) | CSS allows percentages | |margin-top| [CSS Box Model Level 3](https://www.w3.org/TR/css3-box/#margin-top) | CSS allows percentages or auto | diff --git a/gtk/gtkcssanimatedstyle.c b/gtk/gtkcssanimatedstyle.c index bef4a9028c..52e0cabc3b 100644 --- a/gtk/gtkcssanimatedstyle.c +++ b/gtk/gtkcssanimatedstyle.c @@ -440,6 +440,10 @@ gtk_css_animated_style_set_animated_value (GtkCssAnimatedStyle *animated, unshare_other (animated); gtk_css_take_value (&style->other->transform, value); break; + case GTK_CSS_PROPERTY_TRANSFORM_ORIGIN: + unshare_other (animated); + gtk_css_take_value (&style->other->transform_origin, value); + break; case GTK_CSS_PROPERTY_MIN_WIDTH: unshare_size (animated); gtk_css_take_value (&style->size->min_width, value); diff --git a/gtk/gtkcssstaticstyle.c b/gtk/gtkcssstaticstyle.c index d4f7bb5fc7..1c8dd80c56 100644 --- a/gtk/gtkcssstaticstyle.c +++ b/gtk/gtkcssstaticstyle.c @@ -163,6 +163,7 @@ static const int other_props[] = { GTK_CSS_PROPERTY_ICON_TRANSFORM, GTK_CSS_PROPERTY_ICON_FILTER, GTK_CSS_PROPERTY_TRANSFORM, + GTK_CSS_PROPERTY_TRANSFORM_ORIGIN, GTK_CSS_PROPERTY_OPACITY, GTK_CSS_PROPERTY_FILTER, }; @@ -593,6 +594,9 @@ gtk_css_static_style_set_value (GtkCssStaticStyle *sstyle, case GTK_CSS_PROPERTY_TRANSFORM: gtk_css_take_value (&style->other->transform, value); break; + case GTK_CSS_PROPERTY_TRANSFORM_ORIGIN: + gtk_css_take_value (&style->other->transform_origin, value); + break; case GTK_CSS_PROPERTY_MIN_WIDTH: gtk_css_take_value (&style->size->min_width, value); break; @@ -880,6 +884,7 @@ gtk_css_other_create_initial_values (void) values->icon_transform = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_TRANSFORM, NULL, NULL, NULL); values->icon_filter = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_ICON_FILTER, NULL, NULL, NULL); values->transform = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSFORM, NULL, NULL, NULL); + values->transform_origin = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_TRANSFORM_ORIGIN, NULL, NULL, NULL); values->opacity = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_OPACITY, NULL, NULL, NULL); values->filter = _gtk_css_initial_value_new_compute (GTK_CSS_PROPERTY_FILTER, NULL, NULL, NULL); diff --git a/gtk/gtkcssstyle.c b/gtk/gtkcssstyle.c index 106a90ea5a..5d5fc2b44f 100644 --- a/gtk/gtkcssstyle.c +++ b/gtk/gtkcssstyle.c @@ -235,6 +235,8 @@ gtk_css_style_get_value (GtkCssStyle *style, return style->size->border_spacing; case GTK_CSS_PROPERTY_TRANSFORM: return style->other->transform; + case GTK_CSS_PROPERTY_TRANSFORM_ORIGIN: + return style->other->transform_origin; case GTK_CSS_PROPERTY_MIN_WIDTH: return style->size->min_width; case GTK_CSS_PROPERTY_MIN_HEIGHT: diff --git a/gtk/gtkcssstyleprivate.h b/gtk/gtkcssstyleprivate.h index 65c8c6f700..27666e9978 100644 --- a/gtk/gtkcssstyleprivate.h +++ b/gtk/gtkcssstyleprivate.h @@ -208,6 +208,7 @@ struct _GtkCssOtherValues { GtkCssValue *icon_transform; GtkCssValue *icon_filter; GtkCssValue *transform; + GtkCssValue *transform_origin; GtkCssValue *opacity; GtkCssValue *filter; }; diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c index de7f2e3762..3eb4ac7c5c 100644 --- a/gtk/gtkcssstylepropertyimpl.c +++ b/gtk/gtkcssstylepropertyimpl.c @@ -790,6 +790,13 @@ background_position_parse (GtkCssStyleProperty *property, return _gtk_css_array_value_parse (parser, _gtk_css_position_value_parse); } +static GtkCssValue * +transform_origin_parse (GtkCssStyleProperty *property, + GtkCssParser *parser) +{ + return _gtk_css_position_value_parse (parser); +} + /*** REGISTRATION ***/ G_STATIC_ASSERT (GTK_CSS_PROPERTY_COLOR == 0); @@ -1248,6 +1255,13 @@ _gtk_css_style_property_init_properties (void) GTK_CSS_AFFECTS_TRANSFORM, transform_value_parse, _gtk_css_transform_value_new_none ()); + gtk_css_style_property_register ("transform-origin", + GTK_CSS_PROPERTY_TRANSFORM_ORIGIN, + GTK_STYLE_PROPERTY_ANIMATED, + GTK_CSS_AFFECTS_TRANSFORM, + transform_origin_parse, + _gtk_css_position_value_new (_gtk_css_number_value_new (50, GTK_CSS_PERCENT), + _gtk_css_number_value_new (50, GTK_CSS_PERCENT))); gtk_css_style_property_register ("min-width", GTK_CSS_PROPERTY_MIN_WIDTH, GTK_STYLE_PROPERTY_ANIMATED, diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h index e95e31ac9c..fe30beaae1 100644 --- a/gtk/gtkcsstypesprivate.h +++ b/gtk/gtkcsstypesprivate.h @@ -254,6 +254,7 @@ enum { /*< skip >*/ GTK_CSS_PROPERTY_ICON_FILTER, GTK_CSS_PROPERTY_BORDER_SPACING, GTK_CSS_PROPERTY_TRANSFORM, + GTK_CSS_PROPERTY_TRANSFORM_ORIGIN, GTK_CSS_PROPERTY_MIN_WIDTH, GTK_CSS_PROPERTY_MIN_HEIGHT, GTK_CSS_PROPERTY_TRANSITION_PROPERTY, diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 217293cd23..0daeef7a6d 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -36,6 +36,7 @@ #include "gtkcssboxesprivate.h" #include "gtkcssfiltervalueprivate.h" #include "gtkcsstransformvalueprivate.h" +#include "gtkcsspositionvalueprivate.h" #include "gtkcssfontvariationsvalueprivate.h" #include "gtkcssnumbervalueprivate.h" #include "gtkcssstylepropertyprivate.h" @@ -3937,12 +3938,17 @@ gtk_widget_allocate (GtkWidget *widget, if (css_transform) { + double origin_x, origin_y; + + origin_x = _gtk_css_position_value_get_x (style->other->transform_origin, adjusted.width); + origin_y = _gtk_css_position_value_get_y (style->other->transform_origin, adjusted.height); + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (adjusted.x, adjusted.y)); adjusted.x = adjusted.y = 0; - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (adjusted.width / 2, adjusted.height / 2)); + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (origin_x, origin_y)); transform = gsk_transform_transform (transform, css_transform); - transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- adjusted.width / 2, - adjusted.height / 2)); + transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (- origin_x, - origin_y)); gsk_transform_unref (css_transform); } diff --git a/testsuite/reftests/transform-origin.css b/testsuite/reftests/transform-origin.css new file mode 100644 index 0000000000..554321f815 --- /dev/null +++ b/testsuite/reftests/transform-origin.css @@ -0,0 +1,15 @@ +@import "reset-to-defaults.css"; + +window { + background: yellow; +} + +#box { + transform-origin: top left; + transform: rotate(-90deg); + background: linear-gradient(to bottom, red 0%, blue 100%); +} + +#reference { + background: linear-gradient(to right, red 0%, blue 100%); +} diff --git a/testsuite/reftests/transform-origin.ref.ui b/testsuite/reftests/transform-origin.ref.ui new file mode 100644 index 0000000000..656781692f --- /dev/null +++ b/testsuite/reftests/transform-origin.ref.ui @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <object class="GtkWindow" id="window1"> + <property name="decorated">0</property> + <property name="width-request">300</property> + <property name="height-request">300</property> + <child> + <object class="GtkBox"> + <property name="name">reference</property> + <property name="halign">center</property> + <property name="valign">start</property> + <property name="width-request">100</property> + <property name="height-request">100</property> + </object> + </child> + </object> +</interface> diff --git a/testsuite/reftests/transform-origin.ui b/testsuite/reftests/transform-origin.ui new file mode 100644 index 0000000000..889202973f --- /dev/null +++ b/testsuite/reftests/transform-origin.ui @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <object class="GtkWindow" id="window1"> + <property name="decorated">0</property> + <property name="width-request">300</property> + <property name="height-request">300</property> + <child> + <object class="GtkBox"> + <property name="name">box</property> + <property name="halign">center</property> + <property name="valign">center</property> + <property name="width-request">100</property> + <property name="height-request">100</property> + </object> + </child> + </object> +</interface> |