This function allows to create a RedDrawable command passing some raw data. Actually the data has to be a buffer free-able with free and with a depth of 32 bit. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/display-channel.c | 42 ++++++++++++++++++++++++++++++++++++++++++ server/red-worker.c | 4 +++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/server/display-channel.c b/server/display-channel.c index 073d45e..2154878 100644 --- a/server/display-channel.c +++ b/server/display-channel.c @@ -23,6 +23,8 @@ static void drawable_draw(DisplayChannel *display, Drawable *drawable); static Drawable *display_channel_drawable_try_new(DisplayChannel *display, int process_commands_generation); +static RedDrawable *get_dummy_drawable(DisplayChannel *display, int w, int h, int y_0_top, + uint8_t *data, uint32_t data_size); uint32_t display_channel_generate_uid(DisplayChannel *display) { @@ -2032,3 +2034,43 @@ void display_channel_gl_draw_done(DisplayChannel *display) { set_gl_draw_async_count(display, display->gl_draw_async_count - 1); } + +/** + * Returns a RedDrawable with a bitmap image pointing to the data image + * we provide + */ +static RedDrawable *get_dummy_drawable(DisplayChannel *display, int w, int h, int y_0_top, + uint8_t *data, uint32_t data_size) +{ + SpiceChunks *chunks = spice_chunks_new(1); + chunks->flags = SPICE_CHUNKS_FLAGS_FREE; + chunks->data_size = data_size; + chunks->chunk[0].data = data; + chunks->chunk[0].len = data_size; + + SpiceImage *image = spice_new0(SpiceImage, 1); + image->descriptor.type = SPICE_IMAGE_TYPE_BITMAP; + image->descriptor.width = w; + image->descriptor.height = h; + image->u.bitmap.x = w; + image->u.bitmap.y = h; + image->u.bitmap.format = SPICE_BITMAP_FMT_32BIT; + image->u.bitmap.flags = y_0_top ? 0: SPICE_BITMAP_FLAGS_TOP_DOWN; + image->u.bitmap.stride = w * 4; + image->u.bitmap.data = chunks; + + RedDrawable *red = spice_new0(RedDrawable, 1); + red->refs = 1; + red->effect = QXL_EFFECT_OPAQUE; + red->type = QXL_DRAW_COPY; + red->bbox.bottom = h; + red->bbox.right = w; + red->surface_deps[0] = -1; + red->surface_deps[1] = -1; + red->surface_deps[2] = -1; + red->u.copy.src_area = red->bbox; + red->u.copy.rop_descriptor = SPICE_ROPD_OP_PUT; + red->u.copy.src_bitmap = image; + + return red; +} diff --git a/server/red-worker.c b/server/red-worker.c index 9238632..9eac0ad 100644 --- a/server/red-worker.c +++ b/server/red-worker.c @@ -128,7 +128,9 @@ void red_drawable_unref(RedDrawable *red_drawable) if (--red_drawable->refs) { return; } - red_qxl_release_resource(red_drawable->qxl, red_drawable->release_info_ext); + if (red_drawable->qxl) { + red_qxl_release_resource(red_drawable->qxl, red_drawable->release_info_ext); + } red_put_drawable(red_drawable); free(red_drawable); } -- 2.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel