xcb_image_t * xcb_image_shm_put (xcb_connection_t * conn, xcb_drawable_t draw, xcb_gcontext_t gc, xcb_image_t * image, xcb_shm_segment_info_t shminfo, int16_t src_x, int16_t src_y, int16_t dest_x, int16_t dest_y, uint16_t src_width, uint16_t src_height, uint8_t send_event) { if (!xcb_image_native(conn, image, 0)) return 0; if (!shminfo.shmaddr) return 0; xcb_shm_put_image(conn, draw, gc, image->width, image->height, src_x, src_y, src_width, src_height, dest_x, dest_y, image->depth, image->format, send_event, shminfo.shmseg, image->data - shminfo.shmaddr); return image; }
static void Prepare(vout_display_t *vd, picture_t *pic, subpicture_t *subpic, vlc_tick_t date) { const video_format_t *fmt = &vd->source; vout_display_sys_t *sys = vd->sys; xcb_connection_t *conn = sys->conn; size_t offset = PictureAttach(vd, pic); if (offset != (size_t)-1) { xcb_shm_put_image(conn, sys->drawable.source, sys->gc, pic->p->i_pitch / pic->p->i_pixel_pitch, pic->p->i_lines, 0, 0, pic->p->i_pitch / pic->p->i_pixel_pitch, pic->p->i_lines, 0, 0, 32, XCB_IMAGE_FORMAT_Z_PIXMAP, 0, sys->segment, offset); } else { xcb_put_image(conn, XCB_IMAGE_FORMAT_Z_PIXMAP, sys->drawable.source, sys->gc, pic->p->i_pitch / pic->p->i_pixel_pitch, pic->p->i_lines, 0, 0, 0, 32, pic->p->i_pitch * pic->p->i_lines, pic->p->p_pixels); } /* Crop the picture with pixel accuracy */ xcb_render_composite(conn, XCB_RENDER_PICT_OP_SRC, sys->picture.source, XCB_RENDER_PICTURE_NONE, sys->picture.crop, fmt->i_x_offset, fmt->i_y_offset, 0, 0, 0, 0, fmt->i_visible_width, fmt->i_visible_height); /* Blank background */ static const xcb_render_color_t black_color = { 0, 0, 0, 0xffff }; xcb_rectangle_t rects[] = { { 0, 0, vd->cfg->display.width, vd->cfg->display.height }, }; xcb_render_fill_rectangles(conn, XCB_RENDER_PICT_OP_SRC, sys->picture.scale, black_color, ARRAY_SIZE(rects), rects); /* Scale and orient the picture */ xcb_render_composite(conn, XCB_RENDER_PICT_OP_SRC, sys->picture.crop, XCB_RENDER_PICTURE_NONE, sys->picture.scale, sys->src_x, sys->src_y, 0, 0, sys->place.x, sys->place.y, sys->place.width, sys->place.height); if (offset != (size_t)-1) PictureDetach(vd); /* Blend subpictures */ if (subpic != NULL) for (subpicture_region_t *r = subpic->p_region; r != NULL; r = r->p_next) RenderRegion(vd, subpic, r); xcb_flush(conn); (void) date; }
void _cairo_xcb_connection_shm_put_image (cairo_xcb_connection_t *connection, xcb_drawable_t dst, xcb_gcontext_t gc, uint16_t total_width, uint16_t total_height, int16_t src_x, int16_t src_y, uint16_t width, uint16_t height, int16_t dst_x, int16_t dst_y, uint8_t depth, uint32_t shm, uint32_t offset) { assert (connection->flags & CAIRO_XCB_HAS_SHM); xcb_shm_put_image (connection->xcb_connection, dst, gc, total_width, total_height, src_x, src_y, width, height, dst_x, dst_y, depth, XCB_IMAGE_FORMAT_Z_PIXMAP, 0, shm, offset); }