#include "pixman-renderer.h"
+#include <linux/input.h>
+
struct pixman_output_state {
pixman_image_t *hw_buffer;
};
struct pixman_renderer {
struct weston_renderer base;
+ int repaint_debug;
+ pixman_image_t *debug_color;
};
static inline struct pixman_output_state *
pixman_region32_t *region, pixman_region32_t *surf_region,
pixman_op_t pixman_op)
{
+ struct pixman_renderer *pr =
+ (struct pixman_renderer *) output->compositor->renderer;
struct pixman_surface_state *ps = get_surface_state(es);
struct pixman_output_state *po = get_output_state(output);
pixman_region32_t final_region;
rects[i].x1, rects[i].y1, /* dest_x, dest_y */
rects[i].x2 - rects[i].x1, /* width */
rects[i].y2 - rects[i].y1 /* height */);
+
+ if (!pr->repaint_debug)
+ continue;
+
+ pixman_image_composite32(PIXMAN_OP_OVER,
+ pr->debug_color, /* src */
+ NULL /* mask */,
+ po->hw_buffer, /* dest */
+ src_x, src_y, /* src_x, src_y */
+ 0, 0, /* mask_x, mask_y */
+ rects[i].x1, rects[i].y1, /* dest_x, dest_y */
+ rects[i].x2 - rects[i].x1, /* width */
+ rects[i].y2 - rects[i].y1 /* height */);
}
pixman_region32_fini(&final_region);
}
ec->renderer = NULL;
}
+static void
+debug_binding(struct wl_seat *seat, uint32_t time, uint32_t key,
+ void *data)
+{
+ struct weston_compositor *ec = data;
+ struct pixman_renderer *pr = (struct pixman_renderer *) ec->renderer;
+
+ pr->repaint_debug ^= 1;
+
+ if (pr->repaint_debug) {
+ pixman_color_t red = {
+ 0x3fff, 0x0000, 0x0000, 0x3fff
+ };
+
+ pr->debug_color = pixman_image_create_solid_fill(&red);
+ } else {
+ pixman_image_unref(pr->debug_color);
+ weston_compositor_damage_all(ec);
+ }
+}
+
WL_EXPORT int
pixman_renderer_init(struct weston_compositor *ec)
{
- struct weston_renderer *renderer;
+ struct pixman_renderer *renderer;
renderer = malloc(sizeof *renderer);
if (renderer == NULL)
return -1;
- renderer->read_pixels = pixman_renderer_read_pixels;
- renderer->repaint_output = pixman_renderer_repaint_output;
- renderer->flush_damage = pixman_renderer_flush_damage;
- renderer->attach = pixman_renderer_attach;
- renderer->create_surface = pixman_renderer_create_surface;
- renderer->surface_set_color = pixman_renderer_surface_set_color;
- renderer->destroy_surface = pixman_renderer_destroy_surface;
- renderer->destroy = pixman_renderer_destroy;
- ec->renderer = renderer;
-
+ renderer->base.read_pixels = pixman_renderer_read_pixels;
+ renderer->base.repaint_output = pixman_renderer_repaint_output;
+ renderer->base.flush_damage = pixman_renderer_flush_damage;
+ renderer->base.attach = pixman_renderer_attach;
+ renderer->base.create_surface = pixman_renderer_create_surface;
+ renderer->base.surface_set_color = pixman_renderer_surface_set_color;
+ renderer->base.destroy_surface = pixman_renderer_destroy_surface;
+ renderer->base.destroy = pixman_renderer_destroy;
+ ec->renderer = &renderer->base;
+
+ weston_compositor_add_debug_binding(ec, KEY_R,
+ debug_binding, ec);
return 0;
}