You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
8.4 KiB
218 lines
8.4 KiB
7 years ago
|
From e69a6ac0e44e8d5fd72d7bc60f118044b0407e8f Mon Sep 17 00:00:00 2001
|
||
|
From: rpm-build <rpm-build>
|
||
|
Date: Thu, 9 Nov 2017 16:18:02 -0500
|
||
|
Subject: [PATCH] 0001-clutter-stage-don-t-use-deprecated-api.patch
|
||
|
|
||
|
---
|
||
|
clutter/clutter/clutter-stage.c | 21 ++++++++++++---------
|
||
|
1 file changed, 12 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
|
||
|
index 02ab07b..e4f9342 100644
|
||
|
--- a/clutter/clutter/clutter-stage.c
|
||
|
+++ b/clutter/clutter/clutter-stage.c
|
||
|
@@ -1459,64 +1459,65 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
|
||
|
fb_height = view_layout.height * fb_scale;
|
||
|
cogl_push_framebuffer (fb);
|
||
|
|
||
|
/* needed for when a context switch happens */
|
||
|
_clutter_stage_maybe_setup_viewport (stage, view);
|
||
|
|
||
|
/* FIXME: For some reason leaving the cogl clip stack empty causes the
|
||
|
* picking to not work at all, so setting it the whole framebuffer content
|
||
|
* for now. */
|
||
|
cogl_framebuffer_push_scissor_clip (fb, 0, 0,
|
||
|
view_layout.width * fb_scale,
|
||
|
view_layout.height * fb_scale);
|
||
|
|
||
|
_clutter_stage_window_get_dirty_pixel (priv->impl, view, &dirty_x, &dirty_y);
|
||
|
|
||
|
if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS)))
|
||
|
{
|
||
|
CLUTTER_NOTE (PICK, "Pushing pick scissor clip x: %d, y: %d, 1x1",
|
||
|
(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);
|
||
|
}
|
||
|
|
||
|
viewport_offset_x = x * fb_scale - dirty_x * fb_scale;
|
||
|
viewport_offset_y = y * fb_scale - dirty_y * fb_scale;
|
||
|
CLUTTER_NOTE (PICK, "Setting viewport to %f, %f, %f, %f",
|
||
|
priv->viewport[0] * fb_scale - viewport_offset_x,
|
||
|
priv->viewport[1] * fb_scale - viewport_offset_y,
|
||
|
priv->viewport[2] * fb_scale,
|
||
|
priv->viewport[3] * fb_scale);
|
||
|
- cogl_set_viewport (priv->viewport[0] * fb_scale - viewport_offset_x,
|
||
|
- priv->viewport[1] * fb_scale - viewport_offset_y,
|
||
|
- priv->viewport[2] * fb_scale,
|
||
|
- priv->viewport[3] * fb_scale);
|
||
|
+ cogl_framebuffer_set_viewport (fb,
|
||
|
+ priv->viewport[0] * fb_scale - viewport_offset_x,
|
||
|
+ priv->viewport[1] * fb_scale - viewport_offset_y,
|
||
|
+ priv->viewport[2] * fb_scale,
|
||
|
+ priv->viewport[3] * fb_scale);
|
||
|
|
||
|
read_x = dirty_x * fb_scale;
|
||
|
read_y = dirty_y * fb_scale;
|
||
|
|
||
|
CLUTTER_NOTE (PICK, "Performing pick at %i,%i on view %dx%d+%d+%d s: %d",
|
||
|
x, y,
|
||
|
view_layout.width, view_layout.height,
|
||
|
view_layout.x, view_layout.y, fb_scale);
|
||
|
|
||
|
cogl_color_init_from_4ub (&stage_pick_id, 255, 255, 255, 255);
|
||
|
cogl_clear (&stage_pick_id, COGL_BUFFER_BIT_COLOR | COGL_BUFFER_BIT_DEPTH);
|
||
|
|
||
|
/* Disable dithering (if any) when doing the painting in pick mode */
|
||
|
dither_enabled_save = cogl_framebuffer_get_dither_enabled (fb);
|
||
|
cogl_framebuffer_set_dither_enabled (fb, FALSE);
|
||
|
|
||
|
/* Render the entire scence in pick mode - just single colored silhouette's
|
||
|
* are drawn offscreen (as we never swap buffers)
|
||
|
*/
|
||
|
context->pick_mode = mode;
|
||
|
_clutter_stage_paint_view (stage, view, NULL);
|
||
|
context->pick_mode = CLUTTER_PICK_NONE;
|
||
|
|
||
|
/* Read the color of the screen co-ords pixel. RGBA_8888_PRE is used
|
||
|
even though we don't care about the alpha component because under
|
||
|
GLES this is the only format that is guaranteed to work so Cogl
|
||
|
will end up having to do a conversion if any other format is
|
||
|
used. The format is requested as pre-multiplied because Cogl
|
||
|
assumes that all pixels in the framebuffer are premultiplied so
|
||
|
it avoids a conversion. */
|
||
|
@@ -3590,123 +3591,125 @@ calculate_z_translation (float z_near)
|
||
|
* z_2d = --------------------------- + z_near
|
||
|
* sin (0.5°)
|
||
|
*/
|
||
|
|
||
|
/* We expect the compiler should boil this down to z_near * CONSTANT
|
||
|
* already, but just in case we use precomputed constants
|
||
|
*/
|
||
|
#if 0
|
||
|
# define A tanf (_DEG_TO_RAD (30.f))
|
||
|
# define B sinf (_DEG_TO_RAD (120.f))
|
||
|
# define C cosf (_DEG_TO_RAD (30.5f))
|
||
|
# define D sinf (_DEG_TO_RAD (.5f))
|
||
|
#else
|
||
|
# define A 0.57735025882720947265625f
|
||
|
# define B 0.866025388240814208984375f
|
||
|
# define C 0.86162912845611572265625f
|
||
|
# define D 0.00872653536498546600341796875f
|
||
|
#endif
|
||
|
|
||
|
return z_near
|
||
|
* A * B * C
|
||
|
/ D
|
||
|
+ z_near;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
_clutter_stage_maybe_setup_viewport (ClutterStage *stage,
|
||
|
ClutterStageView *view)
|
||
|
{
|
||
|
ClutterStagePrivate *priv = stage->priv;
|
||
|
+ CoglFramebuffer *fb = clutter_stage_view_get_framebuffer (view);
|
||
|
|
||
|
if (clutter_stage_view_is_dirty_viewport (view))
|
||
|
{
|
||
|
cairo_rectangle_int_t view_layout;
|
||
|
ClutterPerspective perspective;
|
||
|
float fb_scale;
|
||
|
float viewport_offset_x;
|
||
|
float viewport_offset_y;
|
||
|
float z_2d;
|
||
|
|
||
|
CLUTTER_NOTE (PAINT,
|
||
|
"Setting up the viewport { w:%f, h:%f }",
|
||
|
priv->viewport[2],
|
||
|
priv->viewport[3]);
|
||
|
|
||
|
fb_scale = clutter_stage_view_get_scale (view);
|
||
|
clutter_stage_view_get_layout (view, &view_layout);
|
||
|
|
||
|
viewport_offset_x = view_layout.x * fb_scale;
|
||
|
viewport_offset_y = view_layout.y * fb_scale;
|
||
|
- cogl_set_viewport (priv->viewport[0] * fb_scale - viewport_offset_x,
|
||
|
- priv->viewport[1] * fb_scale - viewport_offset_y,
|
||
|
- priv->viewport[2] * fb_scale,
|
||
|
- priv->viewport[3] * fb_scale);
|
||
|
+ cogl_framebuffer_set_viewport (fb,
|
||
|
+ priv->viewport[0] * fb_scale - viewport_offset_x,
|
||
|
+ priv->viewport[1] * fb_scale - viewport_offset_y,
|
||
|
+ priv->viewport[2] * fb_scale,
|
||
|
+ priv->viewport[3] * fb_scale);
|
||
|
|
||
|
perspective = priv->perspective;
|
||
|
|
||
|
/* Ideally we want to regenerate the perspective matrix whenever
|
||
|
* the size changes but if the user has provided a custom matrix
|
||
|
* then we don't want to override it */
|
||
|
if (!priv->has_custom_perspective)
|
||
|
{
|
||
|
perspective.aspect = priv->viewport[2] / priv->viewport[3];
|
||
|
z_2d = calculate_z_translation (perspective.z_near);
|
||
|
|
||
|
/* NB: z_2d is only enough room for 85% of the stage_height between
|
||
|
* the stage and the z_near plane. For behind the stage plane we
|
||
|
* want a more consistent gap of 10 times the stage_height before
|
||
|
* hitting the far plane so we calculate that relative to the final
|
||
|
* height of the stage plane at the z_2d_distance we got... */
|
||
|
perspective.z_far = z_2d +
|
||
|
tanf (_DEG_TO_RAD (perspective.fovy / 2.0f)) * z_2d * 20.0f;
|
||
|
|
||
|
clutter_stage_set_perspective_internal (stage, &perspective);
|
||
|
}
|
||
|
else
|
||
|
z_2d = calculate_z_translation (perspective.z_near);
|
||
|
|
||
|
cogl_matrix_init_identity (&priv->view);
|
||
|
cogl_matrix_view_2d_in_perspective (&priv->view,
|
||
|
perspective.fovy,
|
||
|
perspective.aspect,
|
||
|
perspective.z_near,
|
||
|
z_2d,
|
||
|
priv->viewport[2],
|
||
|
priv->viewport[3]);
|
||
|
|
||
|
clutter_stage_view_set_dirty_viewport (view, FALSE);
|
||
|
}
|
||
|
|
||
|
if (clutter_stage_view_is_dirty_projection (view))
|
||
|
{
|
||
|
- cogl_set_projection_matrix (&priv->projection);
|
||
|
+ cogl_framebuffer_set_projection_matrix (fb, &priv->projection);
|
||
|
|
||
|
clutter_stage_view_set_dirty_projection (view, FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#undef _DEG_TO_RAD
|
||
|
|
||
|
/**
|
||
|
* clutter_stage_ensure_redraw:
|
||
|
* @stage: a #ClutterStage
|
||
|
*
|
||
|
* Ensures that @stage is redrawn
|
||
|
*
|
||
|
* This function should not be called by applications: it is
|
||
|
* used when embedding a #ClutterStage into a toolkit with
|
||
|
* another windowing system, like GTK+.
|
||
|
*
|
||
|
* Since: 1.0
|
||
|
*/
|
||
|
void
|
||
|
clutter_stage_ensure_redraw (ClutterStage *stage)
|
||
|
{
|
||
|
ClutterMasterClock *master_clock;
|
||
|
ClutterStagePrivate *priv;
|
||
|
|
||
|
g_return_if_fail (CLUTTER_IS_STAGE (stage));
|
||
|
|
||
|
priv = stage->priv;
|
||
|
|
||
|
if (!priv->relayout_pending && !priv->redraw_pending)
|
||
|
--
|
||
|
2.14.3
|
||
|
|