summaryrefslogtreecommitdiff
path: root/clutter
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2017-05-25 15:54:37 +0800
committerJonas Ådahl <jadahl@gmail.com>2017-07-14 20:54:26 +0800
commitc2e49f1bb51a304e2d09617fd209ff4d5aa68275 (patch)
tree686348480d9a8bfd7349ef6931e14c72e53a9d6f /clutter
parenta3d63d0ac084e276664a835e83e379b563943c79 (diff)
downloadmutter-c2e49f1bb51a304e2d09617fd209ff4d5aa68275.tar.gz
clutter: Change stage view scale to be float
To support fractional scaling, change the stage view scale to be a float instead of an int. Also change the places where it is retrieved and used when scaling things. https://bugzilla.gnome.org/show_bug.cgi?id=765011
Diffstat (limited to 'clutter')
-rw-r--r--clutter/clutter/clutter-stage-view.c39
-rw-r--r--clutter/clutter/clutter-stage-view.h2
-rw-r--r--clutter/clutter/clutter-stage.c8
-rw-r--r--clutter/clutter/cogl/clutter-stage-cogl.c4
4 files changed, 34 insertions, 19 deletions
diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c
index c78475941..7efb9e252 100644
--- a/clutter/clutter/clutter-stage-view.c
+++ b/clutter/clutter/clutter-stage-view.c
@@ -20,6 +20,7 @@
#include "clutter/clutter-stage-view.h"
#include <cairo-gobject.h>
+#include <math.h>
enum
{
@@ -38,7 +39,7 @@ static GParamSpec *obj_props[PROP_LAST];
typedef struct _ClutterStageViewPrivate
{
cairo_rectangle_int_t layout;
- int scale;
+ float scale;
CoglFramebuffer *framebuffer;
CoglOffscreen *offscreen;
@@ -143,7 +144,7 @@ clutter_stage_view_blit_offscreen (ClutterStageView *view,
cogl_framebuffer_pop_matrix (priv->framebuffer);
}
-int
+float
clutter_stage_view_get_scale (ClutterStageView *view)
{
ClutterStageViewPrivate *priv =
@@ -241,7 +242,7 @@ clutter_stage_view_get_property (GObject *object,
g_value_set_boxed (value, priv->offscreen);
break;
case PROP_SCALE:
- g_value_set_int (value, priv->scale);
+ g_value_set_float (value, priv->scale);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -267,12 +268,26 @@ clutter_stage_view_set_property (GObject *object,
break;
case PROP_FRAMEBUFFER:
priv->framebuffer = g_value_dup_boxed (value);
+#ifndef G_DISABLE_CHECKS
+ if (priv->framebuffer)
+ {
+ int fb_width, fb_height;
+
+ fb_width = cogl_framebuffer_get_width (priv->framebuffer);
+ fb_height = cogl_framebuffer_get_height (priv->framebuffer);
+
+ g_warn_if_fail (fabsf (roundf (fb_width / priv->scale) -
+ fb_width / priv->scale) < FLT_EPSILON);
+ g_warn_if_fail (fabsf (roundf (fb_height / priv->scale) -
+ fb_height / priv->scale) < FLT_EPSILON);
+ }
+#endif
break;
case PROP_OFFSCREEN:
priv->offscreen = g_value_dup_boxed (value);
break;
case PROP_SCALE:
- priv->scale = g_value_get_int (value);
+ priv->scale = g_value_get_float (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -301,7 +316,7 @@ clutter_stage_view_init (ClutterStageView *view)
priv->dirty_viewport = TRUE;
priv->dirty_projection = TRUE;
- priv->scale = 1;
+ priv->scale = 1.0;
}
static void
@@ -344,13 +359,13 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
G_PARAM_STATIC_STRINGS);
obj_props[PROP_SCALE] =
- g_param_spec_int ("scale",
- "View scale",
- "The view scale",
- 1, G_MAXINT, 1,
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_STRINGS);
+ g_param_spec_float ("scale",
+ "View scale",
+ "The view scale",
+ 1.0, G_MAXFLOAT, 1.0,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, PROP_LAST, obj_props);
}
diff --git a/clutter/clutter/clutter-stage-view.h b/clutter/clutter/clutter-stage-view.h
index a358d4dd9..a737090c7 100644
--- a/clutter/clutter/clutter-stage-view.h
+++ b/clutter/clutter/clutter-stage-view.h
@@ -61,7 +61,7 @@ void clutter_stage_view_blit_offscreen (ClutterStageView *view,
const cairo_rectangle_int_t *clip);
CLUTTER_AVAILABLE_IN_MUTTER
-int clutter_stage_view_get_scale (ClutterStageView *view);
+float clutter_stage_view_get_scale (ClutterStageView *view);
gboolean clutter_stage_view_is_dirty_viewport (ClutterStageView *view);
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
index d1dfdd240..b7e7cd349 100644
--- a/clutter/clutter/clutter-stage.c
+++ b/clutter/clutter/clutter-stage.c
@@ -1445,7 +1445,7 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
gint read_x;
gint read_y;
float fb_width, fb_height;
- int fb_scale;
+ float fb_scale;
int viewport_offset_x;
int viewport_offset_y;
@@ -1474,8 +1474,8 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS)))
{
CLUTTER_NOTE (PICK, "Pushing pick scissor clip x: %d, y: %d, 1x1",
- dirty_x * fb_scale,
- dirty_y * fb_scale);
+ (int) dirty_x * fb_scale,
+ (int) dirty_y * fb_scale);
cogl_framebuffer_push_scissor_clip (fb, dirty_x * fb_scale, dirty_y * fb_scale, 1, 1);
}
@@ -3622,7 +3622,7 @@ _clutter_stage_maybe_setup_viewport (ClutterStage *stage,
{
cairo_rectangle_int_t view_layout;
ClutterPerspective perspective;
- int fb_scale;
+ float fb_scale;
int viewport_offset_x;
int viewport_offset_y;
float z_2d;
diff --git a/clutter/clutter/cogl/clutter-stage-cogl.c b/clutter/clutter/cogl/clutter-stage-cogl.c
index 02a0955b4..436494a10 100644
--- a/clutter/clutter/cogl/clutter-stage-cogl.c
+++ b/clutter/clutter/cogl/clutter-stage-cogl.c
@@ -503,7 +503,7 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
cairo_rectangle_int_t swap_region;
cairo_rectangle_int_t clip_region;
gboolean clip_region_empty;
- int fb_scale;
+ float fb_scale;
wrapper = CLUTTER_ACTOR (stage_cogl->wrapper);
@@ -653,7 +653,7 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
int scissor_x;
int scissor_y;
- scissor_x = (clip_region.x - view_rect.x) * fb_scale;;
+ scissor_x = (clip_region.x - view_rect.x) * fb_scale;
scissor_y = (clip_region.y - view_rect.y) * fb_scale;
cogl_framebuffer_push_scissor_clip (fb,
scissor_x,