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
This commit is contained in:
parent
a3d63d0ac0
commit
c2e49f1bb5
@ -20,6 +20,7 @@
|
|||||||
#include "clutter/clutter-stage-view.h"
|
#include "clutter/clutter-stage-view.h"
|
||||||
|
|
||||||
#include <cairo-gobject.h>
|
#include <cairo-gobject.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
@ -38,7 +39,7 @@ static GParamSpec *obj_props[PROP_LAST];
|
|||||||
typedef struct _ClutterStageViewPrivate
|
typedef struct _ClutterStageViewPrivate
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t layout;
|
cairo_rectangle_int_t layout;
|
||||||
int scale;
|
float scale;
|
||||||
CoglFramebuffer *framebuffer;
|
CoglFramebuffer *framebuffer;
|
||||||
|
|
||||||
CoglOffscreen *offscreen;
|
CoglOffscreen *offscreen;
|
||||||
@ -143,7 +144,7 @@ clutter_stage_view_blit_offscreen (ClutterStageView *view,
|
|||||||
cogl_framebuffer_pop_matrix (priv->framebuffer);
|
cogl_framebuffer_pop_matrix (priv->framebuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
float
|
||||||
clutter_stage_view_get_scale (ClutterStageView *view)
|
clutter_stage_view_get_scale (ClutterStageView *view)
|
||||||
{
|
{
|
||||||
ClutterStageViewPrivate *priv =
|
ClutterStageViewPrivate *priv =
|
||||||
@ -241,7 +242,7 @@ clutter_stage_view_get_property (GObject *object,
|
|||||||
g_value_set_boxed (value, priv->offscreen);
|
g_value_set_boxed (value, priv->offscreen);
|
||||||
break;
|
break;
|
||||||
case PROP_SCALE:
|
case PROP_SCALE:
|
||||||
g_value_set_int (value, priv->scale);
|
g_value_set_float (value, priv->scale);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
@ -267,12 +268,26 @@ clutter_stage_view_set_property (GObject *object,
|
|||||||
break;
|
break;
|
||||||
case PROP_FRAMEBUFFER:
|
case PROP_FRAMEBUFFER:
|
||||||
priv->framebuffer = g_value_dup_boxed (value);
|
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;
|
break;
|
||||||
case PROP_OFFSCREEN:
|
case PROP_OFFSCREEN:
|
||||||
priv->offscreen = g_value_dup_boxed (value);
|
priv->offscreen = g_value_dup_boxed (value);
|
||||||
break;
|
break;
|
||||||
case PROP_SCALE:
|
case PROP_SCALE:
|
||||||
priv->scale = g_value_get_int (value);
|
priv->scale = g_value_get_float (value);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
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_viewport = TRUE;
|
||||||
priv->dirty_projection = TRUE;
|
priv->dirty_projection = TRUE;
|
||||||
priv->scale = 1;
|
priv->scale = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -344,10 +359,10 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
|
|||||||
G_PARAM_STATIC_STRINGS);
|
G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
obj_props[PROP_SCALE] =
|
obj_props[PROP_SCALE] =
|
||||||
g_param_spec_int ("scale",
|
g_param_spec_float ("scale",
|
||||||
"View scale",
|
"View scale",
|
||||||
"The view scale",
|
"The view scale",
|
||||||
1, G_MAXINT, 1,
|
1.0, G_MAXFLOAT, 1.0,
|
||||||
G_PARAM_READWRITE |
|
G_PARAM_READWRITE |
|
||||||
G_PARAM_CONSTRUCT |
|
G_PARAM_CONSTRUCT |
|
||||||
G_PARAM_STATIC_STRINGS);
|
G_PARAM_STATIC_STRINGS);
|
||||||
|
@ -61,7 +61,7 @@ void clutter_stage_view_blit_offscreen (ClutterStageView *view,
|
|||||||
const cairo_rectangle_int_t *clip);
|
const cairo_rectangle_int_t *clip);
|
||||||
|
|
||||||
CLUTTER_AVAILABLE_IN_MUTTER
|
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);
|
gboolean clutter_stage_view_is_dirty_viewport (ClutterStageView *view);
|
||||||
|
|
||||||
|
@ -1445,7 +1445,7 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
|
|||||||
gint read_x;
|
gint read_x;
|
||||||
gint read_y;
|
gint read_y;
|
||||||
float fb_width, fb_height;
|
float fb_width, fb_height;
|
||||||
int fb_scale;
|
float fb_scale;
|
||||||
int viewport_offset_x;
|
int viewport_offset_x;
|
||||||
int viewport_offset_y;
|
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)))
|
if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS)))
|
||||||
{
|
{
|
||||||
CLUTTER_NOTE (PICK, "Pushing pick scissor clip x: %d, y: %d, 1x1",
|
CLUTTER_NOTE (PICK, "Pushing pick scissor clip x: %d, y: %d, 1x1",
|
||||||
dirty_x * fb_scale,
|
(int) dirty_x * fb_scale,
|
||||||
dirty_y * fb_scale);
|
(int) dirty_y * fb_scale);
|
||||||
cogl_framebuffer_push_scissor_clip (fb, dirty_x * fb_scale, dirty_y * fb_scale, 1, 1);
|
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;
|
cairo_rectangle_int_t view_layout;
|
||||||
ClutterPerspective perspective;
|
ClutterPerspective perspective;
|
||||||
int fb_scale;
|
float fb_scale;
|
||||||
int viewport_offset_x;
|
int viewport_offset_x;
|
||||||
int viewport_offset_y;
|
int viewport_offset_y;
|
||||||
float z_2d;
|
float z_2d;
|
||||||
|
@ -503,7 +503,7 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
cairo_rectangle_int_t swap_region;
|
cairo_rectangle_int_t swap_region;
|
||||||
cairo_rectangle_int_t clip_region;
|
cairo_rectangle_int_t clip_region;
|
||||||
gboolean clip_region_empty;
|
gboolean clip_region_empty;
|
||||||
int fb_scale;
|
float fb_scale;
|
||||||
|
|
||||||
wrapper = CLUTTER_ACTOR (stage_cogl->wrapper);
|
wrapper = CLUTTER_ACTOR (stage_cogl->wrapper);
|
||||||
|
|
||||||
@ -653,7 +653,7 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
|||||||
int scissor_x;
|
int scissor_x;
|
||||||
int scissor_y;
|
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;
|
scissor_y = (clip_region.y - view_rect.y) * fb_scale;
|
||||||
cogl_framebuffer_push_scissor_clip (fb,
|
cogl_framebuffer_push_scissor_clip (fb,
|
||||||
scissor_x,
|
scissor_x,
|
||||||
|
@ -1743,7 +1743,7 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
|
|||||||
|
|
||||||
view = g_object_new (META_TYPE_RENDERER_VIEW,
|
view = g_object_new (META_TYPE_RENDERER_VIEW,
|
||||||
"layout", &logical_monitor->rect,
|
"layout", &logical_monitor->rect,
|
||||||
"scale", scale,
|
"scale", (float) scale,
|
||||||
"framebuffer", onscreen,
|
"framebuffer", onscreen,
|
||||||
"offscreen", offscreen,
|
"offscreen", offscreen,
|
||||||
"logical-monitor", logical_monitor,
|
"logical-monitor", logical_monitor,
|
||||||
|
@ -210,7 +210,7 @@ meta_renderer_x11_nested_create_view (MetaRenderer *renderer,
|
|||||||
"framebuffer", COGL_FRAMEBUFFER (fake_onscreen),
|
"framebuffer", COGL_FRAMEBUFFER (fake_onscreen),
|
||||||
"offscreen", COGL_FRAMEBUFFER (offscreen),
|
"offscreen", COGL_FRAMEBUFFER (offscreen),
|
||||||
"transform", view_transform,
|
"transform", view_transform,
|
||||||
"scale", view_scale,
|
"scale", (float) view_scale,
|
||||||
"logical-monitor", logical_monitor,
|
"logical-monitor", logical_monitor,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user