clutter/stage-cogl: Add function to scale and clamp fractional values to pixels
Compute pixels rectangles using various clutter utility functions that take care of the subpixel compensation. https://gitlab.gnome.org/GNOME/mutter/merge_requests/3
This commit is contained in:
parent
3d89b47757
commit
cbd3ad8585
1 changed files with 54 additions and 32 deletions
|
@ -575,6 +575,18 @@ is_buffer_age_enabled (void)
|
||||||
cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
|
cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
scale_and_clamp_rect (const ClutterRect *rect,
|
||||||
|
float scale,
|
||||||
|
cairo_rectangle_int_t *dest)
|
||||||
|
|
||||||
|
{
|
||||||
|
ClutterRect tmp = *rect;
|
||||||
|
|
||||||
|
clutter_rect_scale (&tmp, scale, scale);
|
||||||
|
_clutter_util_rectangle_int_extents (&tmp, dest);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
||||||
ClutterStageView *view)
|
ClutterStageView *view)
|
||||||
|
@ -638,21 +650,22 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
||||||
* frames when starting up... */
|
* frames when starting up... */
|
||||||
cogl_onscreen_get_frame_counter (COGL_ONSCREEN (fb)) > 3)
|
cogl_onscreen_get_frame_counter (COGL_ONSCREEN (fb)) > 3)
|
||||||
{
|
{
|
||||||
|
ClutterRect rect;
|
||||||
|
|
||||||
may_use_clipped_redraw = TRUE;
|
may_use_clipped_redraw = TRUE;
|
||||||
|
|
||||||
if (fb_scale != floorf (fb_scale))
|
_clutter_util_rect_from_rectangle (&redraw_clip, &rect);
|
||||||
subpixel_compensation = ceilf (fb_scale);
|
clutter_rect_offset (&rect, -view_rect.x, -view_rect.y);
|
||||||
|
scale_and_clamp_rect (&rect, fb_scale, &fb_clip_region);
|
||||||
|
|
||||||
fb_clip_region = (cairo_rectangle_int_t) {
|
if (fb_scale != floorf (fb_scale))
|
||||||
.x = (floorf ((redraw_clip.x - view_rect.x) * fb_scale) -
|
{
|
||||||
subpixel_compensation),
|
subpixel_compensation = ceilf (fb_scale);
|
||||||
.y = (floorf ((redraw_clip.y - view_rect.y) * fb_scale) -
|
fb_clip_region.x -= subpixel_compensation;
|
||||||
subpixel_compensation),
|
fb_clip_region.y -= subpixel_compensation;
|
||||||
.width = (ceilf (redraw_clip.width * fb_scale) +
|
fb_clip_region.width += 2 * subpixel_compensation;
|
||||||
(2 * subpixel_compensation)),
|
fb_clip_region.height += 2 * subpixel_compensation;
|
||||||
.height = (ceilf (redraw_clip.height * fb_scale) +
|
}
|
||||||
(2 * subpixel_compensation))
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -680,6 +693,7 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
||||||
|
|
||||||
if (valid_buffer_age (view_cogl, age))
|
if (valid_buffer_age (view_cogl, age))
|
||||||
{
|
{
|
||||||
|
ClutterRect rect;
|
||||||
cairo_rectangle_int_t damage_region;
|
cairo_rectangle_int_t damage_region;
|
||||||
|
|
||||||
*current_fb_damage = fb_clip_region;
|
*current_fb_damage = fb_clip_region;
|
||||||
|
@ -695,12 +709,12 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the bounding redraw clip state with the extra damage. */
|
/* Update the bounding redraw clip state with the extra damage. */
|
||||||
damage_region = (cairo_rectangle_int_t) {
|
_clutter_util_rect_from_rectangle (&fb_clip_region, &rect);
|
||||||
.x = view_rect.x + floorf (fb_clip_region.x / fb_scale),
|
scale_and_clamp_rect (&rect, 1.0f / fb_scale, &damage_region);
|
||||||
.y = view_rect.y + floorf (fb_clip_region.y / fb_scale),
|
_clutter_util_rectangle_offset (&damage_region,
|
||||||
.width = ceilf (fb_clip_region.width / fb_scale),
|
view_rect.x,
|
||||||
.height = ceilf (fb_clip_region.height / fb_scale)
|
view_rect.y,
|
||||||
};
|
&damage_region);
|
||||||
_clutter_util_rectangle_union (&stage_cogl->bounding_redraw_clip,
|
_clutter_util_rectangle_union (&stage_cogl->bounding_redraw_clip,
|
||||||
&damage_region,
|
&damage_region,
|
||||||
&stage_cogl->bounding_redraw_clip);
|
&stage_cogl->bounding_redraw_clip);
|
||||||
|
@ -739,7 +753,9 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
||||||
}
|
}
|
||||||
else if (use_clipped_redraw)
|
else if (use_clipped_redraw)
|
||||||
{
|
{
|
||||||
|
ClutterRect rect;
|
||||||
cairo_rectangle_int_t scissor_rect;
|
cairo_rectangle_int_t scissor_rect;
|
||||||
|
cairo_rectangle_int_t paint_rect;
|
||||||
|
|
||||||
calculate_scissor_region (&fb_clip_region,
|
calculate_scissor_region (&fb_clip_region,
|
||||||
subpixel_compensation,
|
subpixel_compensation,
|
||||||
|
@ -760,13 +776,15 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
||||||
scissor_rect.y,
|
scissor_rect.y,
|
||||||
scissor_rect.width,
|
scissor_rect.width,
|
||||||
scissor_rect.height);
|
scissor_rect.height);
|
||||||
paint_stage (stage_cogl, view,
|
|
||||||
&(cairo_rectangle_int_t) {
|
_clutter_util_rect_from_rectangle (&fb_clip_region, &rect);
|
||||||
.x = view_rect.x + floorf ((fb_clip_region.x - 0) / fb_scale),
|
scale_and_clamp_rect (&rect, 1.0f / fb_scale, &paint_rect);
|
||||||
.y = view_rect.y + floorf ((fb_clip_region.y - 0) / fb_scale),
|
_clutter_util_rectangle_offset (&paint_rect,
|
||||||
.width = ceilf ((fb_clip_region.width + 0) / fb_scale),
|
view_rect.x,
|
||||||
.height = ceilf ((fb_clip_region.height + 0) / fb_scale)
|
view_rect.y,
|
||||||
});
|
&paint_rect);
|
||||||
|
|
||||||
|
paint_stage (stage_cogl, view, &paint_rect);
|
||||||
cogl_framebuffer_pop_clip (fb);
|
cogl_framebuffer_pop_clip (fb);
|
||||||
|
|
||||||
stage_cogl->using_clipped_redraw = FALSE;
|
stage_cogl->using_clipped_redraw = FALSE;
|
||||||
|
@ -781,7 +799,9 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
||||||
may_use_clipped_redraw &&
|
may_use_clipped_redraw &&
|
||||||
!clip_region_empty)
|
!clip_region_empty)
|
||||||
{
|
{
|
||||||
|
ClutterRect rect;
|
||||||
cairo_rectangle_int_t scissor_rect;
|
cairo_rectangle_int_t scissor_rect;
|
||||||
|
cairo_rectangle_int_t paint_rect;
|
||||||
|
|
||||||
calculate_scissor_region (&fb_clip_region,
|
calculate_scissor_region (&fb_clip_region,
|
||||||
subpixel_compensation,
|
subpixel_compensation,
|
||||||
|
@ -793,13 +813,15 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
|
||||||
scissor_rect.y,
|
scissor_rect.y,
|
||||||
scissor_rect.width,
|
scissor_rect.width,
|
||||||
scissor_rect.height);
|
scissor_rect.height);
|
||||||
paint_stage (stage_cogl, view,
|
|
||||||
&(cairo_rectangle_int_t) {
|
_clutter_util_rect_from_rectangle (&fb_clip_region, &rect);
|
||||||
.x = view_rect.x + floorf (fb_clip_region.x / fb_scale),
|
scale_and_clamp_rect (&rect, 1.0f / fb_scale, &paint_rect);
|
||||||
.y = view_rect.y + floorf (fb_clip_region.y / fb_scale),
|
_clutter_util_rectangle_offset (&paint_rect,
|
||||||
.width = ceilf (fb_clip_region.width / fb_scale),
|
view_rect.x,
|
||||||
.height = ceilf (fb_clip_region.height / fb_scale)
|
view_rect.y,
|
||||||
});
|
&paint_rect);
|
||||||
|
|
||||||
|
paint_stage (stage_cogl, view, &paint_rect);
|
||||||
cogl_framebuffer_pop_clip (fb);
|
cogl_framebuffer_pop_clip (fb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue