static void recorder_fetch_cursor_image (ShellRecorder *recorder) { CoglTexture *texture; int width, height; int stride; guint8 *data; texture = meta_cursor_tracker_get_sprite (recorder->cursor_tracker); if (!texture) return; width = cogl_texture_get_width (texture); height = cogl_texture_get_height (texture); stride = 4 * width; data = g_new (guint8, stride * height); cogl_texture_get_data (texture, CLUTTER_CAIRO_FORMAT_ARGB32, stride, data); /* FIXME: cairo-gl? */ recorder->cursor_image = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32, width, height, stride); recorder->cursor_memory = data; }
void shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker, ClutterTexture *texture) { CoglTexture *sprite; sprite = meta_cursor_tracker_get_sprite (tracker); clutter_texture_set_cogl_texture (texture, sprite); }
static void _draw_cursor_image (MetaCursorTracker *tracker, cairo_surface_t *surface, cairo_rectangle_int_t area) { CoglTexture *texture; int width, height; int stride; guint8 *data; cairo_surface_t *cursor_surface; cairo_region_t *screenshot_region; cairo_t *cr; int x, y; int xhot, yhot; screenshot_region = cairo_region_create_rectangle (&area); get_pointer_coords (&x, &y); if (!cairo_region_contains_point (screenshot_region, x, y)) { cairo_region_destroy (screenshot_region); return; } texture = meta_cursor_tracker_get_sprite (tracker); meta_cursor_tracker_get_hot (tracker, &xhot, &yhot); width = cogl_texture_get_width (texture); height = cogl_texture_get_height (texture); stride = 4 * width; data = g_new (guint8, stride * height); cogl_texture_get_data (texture, CLUTTER_CAIRO_FORMAT_ARGB32, stride, data); /* FIXME: cairo-gl? */ cursor_surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32, width, height, stride); cr = cairo_create (surface); cairo_set_source_surface (cr, cursor_surface, x - xhot - area.x, y - yhot - area.y); cairo_paint (cr); cairo_destroy (cr); cairo_surface_destroy (cursor_surface); cairo_region_destroy (screenshot_region); g_free (data); }