diff --git a/legacy/evas/src/modules/engines/software_x11/evas_xcb_buffer.c b/legacy/evas/src/modules/engines/software_x11/evas_xcb_buffer.c index 0fe6b8cf0a..03f2386aab 100644 --- a/legacy/evas/src/modules/engines/software_x11/evas_xcb_buffer.c +++ b/legacy/evas/src/modules/engines/software_x11/evas_xcb_buffer.c @@ -234,7 +234,7 @@ evas_software_xcb_can_do_shm(xcb_connection_t *conn, xcb_screen_t *screen) xcbob = evas_software_xcb_output_buffer_new(conn, visual, screen->root_depth, - 16, 16, 2, NULL); // 1, 1 EINA_TRUE + 16, 16, 2, NULL); if (!xcbob) cached_result = 0; else @@ -260,7 +260,6 @@ evas_software_xcb_output_buffer_new(xcb_connection_t *conn, xcb_visualtype_t *vi xcbob->shm_info = NULL; xcbob->w = w; xcbob->h = h; - xcbob->data = data; if (try_shm > 0) { @@ -273,9 +272,12 @@ evas_software_xcb_output_buffer_new(xcb_connection_t *conn, xcb_visualtype_t *vi depth, NULL, ~0, NULL); if (xcbob->xim) { - /* was 0666 */ xcbob->shm_info->shmid = - shmget(IPC_PRIVATE, xcbob->xim->size, (IPC_CREAT | 0777)); + shmget(IPC_PRIVATE, + xcbob->xim->stride * xcbob->xim->height, + (IPC_CREAT | 0777)); + /* xcbob->shm_info->shmid = */ + /* shmget(IPC_PRIVATE, xcbob->xim->size, (IPC_CREAT | 0777)); */ if (xcbob->shm_info->shmid == (uint32_t)-1) { xcb_image_destroy(xcbob->xim); @@ -283,14 +285,14 @@ evas_software_xcb_output_buffer_new(xcb_connection_t *conn, xcb_visualtype_t *vi free(xcbob); return NULL; } - xcbob->shm_info->shmaddr = + xcbob->shm_info->shmaddr = xcbob->xim->data = shmat(xcbob->shm_info->shmid, 0, 0); if (xcbob->shm_info->shmaddr != ((void *)-1)) { /* Sync only needed for testing */ if (try_shm == 2) _xcbob_sync(conn); - xcbob->xim->data = xcbob->shm_info->shmaddr; +// xcbob->xim->data = xcbob->shm_info->shmaddr; #if defined(EVAS_FRAME_QUEUING) && defined(LIBXEXT_VERSION_LOW) if (evas_common_frameq_enabled()) xcb_grab_server(conn); @@ -307,28 +309,14 @@ evas_software_xcb_output_buffer_new(xcb_connection_t *conn, xcb_visualtype_t *vi xcbob->psize = (xcbob->bpl * xcbob->h); return xcbob; } - else - { - shmdt(xcbob->shm_info->shmaddr); - shmctl(xcbob->shm_info->shmid, IPC_RMID, 0); - xcb_image_destroy(xcbob->xim); - free(xcbob->shm_info); - free(xcbob); - return NULL; - } - } - else - { - free(xcbob->shm_info); - free(xcbob); - return NULL; + shmdt(xcbob->shm_info->shmaddr); + shmctl(xcbob->shm_info->shmid, IPC_RMID, 0); } + if (xcbob->xim) xcb_image_destroy(xcbob->xim); + xcbob->xim = NULL; } - else - { - free(xcbob); - return NULL; - } + if (xcbob->shm_info) free(xcbob->shm_info); + xcbob->shm_info = NULL; } if (try_shm > 1) return NULL; @@ -343,9 +331,11 @@ evas_software_xcb_output_buffer_new(xcb_connection_t *conn, xcb_visualtype_t *vi return NULL; } + xcbob->data = data; + if (!xcbob->xim->data) { - xcbob->xim->data = malloc(xcbob->xim->size); + xcbob->xim->data = malloc(xcbob->xim->stride * xcbob->xim->height); if (!xcbob->xim->data) { xcb_image_destroy(xcbob->xim); @@ -354,7 +344,7 @@ evas_software_xcb_output_buffer_new(xcb_connection_t *conn, xcb_visualtype_t *vi } } xcbob->bpl = xcbob->xim->stride; - xcbob->psize = xcbob->xim->size; + xcbob->psize = (xcbob->bpl * xcbob->h); return xcbob; } @@ -373,7 +363,7 @@ evas_software_xcb_output_buffer_free(Xcb_Output_Buffer *xcbob, Eina_Bool sync) else { if (xcbob->data) xcbob->xim->data = NULL; - free(xcbob->xim->data); +// free(xcbob->xim->data); xcb_image_destroy(xcbob->xim); } free(xcbob); @@ -396,7 +386,7 @@ DATA8 * evas_software_xcb_output_buffer_data(Xcb_Output_Buffer *xcbob, int *bpl_ret) { if (bpl_ret) *bpl_ret = xcbob->xim->stride; - return xcbob->xim->data; + return (DATA8 *)xcbob->xim->data; } int @@ -433,8 +423,8 @@ _xcbob_create_native(xcb_connection_t *conn, int w, int h, xcb_image_format_t fo xcb_image_format_t xif; /* NB: We cannot use xcb_image_create_native as it only creates images - * using MSB_FIRST, so this routine recreates that function and checks - * endian-ness correctly */ + * using MSB_FIRST, so this routine recreates that function and uses + * the endian-ness of the server setup */ setup = xcb_get_setup(conn); xif = format; @@ -449,13 +439,13 @@ _xcbob_create_native(xcb_connection_t *conn, int w, int h, xcb_image_format_t fo case XCB_IMAGE_FORMAT_XY_BITMAP: if (depth != 1) return 0; case XCB_IMAGE_FORMAT_XY_PIXMAP: - return xcb_image_create(w, h, xif, - fmt->scanline_pad, - fmt->depth, fmt->bits_per_pixel, - setup->bitmap_format_scanline_unit, - setup->image_byte_order, - setup->bitmap_format_bit_order, - base, bytes, data); + /* return xcb_image_create(w, h, xif, */ + /* fmt->scanline_pad, */ + /* fmt->depth, fmt->bits_per_pixel, */ + /* setup->bitmap_format_scanline_unit, */ + /* setup->image_byte_order, */ + /* setup->bitmap_format_bit_order, */ + /* base, bytes, data); */ case XCB_IMAGE_FORMAT_Z_PIXMAP: return xcb_image_create(w, h, xif, fmt->scanline_pad, diff --git a/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c b/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c index e5e7729cd7..88bfa80627 100644 --- a/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c +++ b/legacy/evas/src/modules/engines/software_x11/evas_xcb_outbuf.c @@ -254,10 +254,11 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, { Eina_Rectangle *rect; + RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h); + if (!(obr = calloc(1, sizeof(Outbuf_Region)))) return NULL; - RECTS_CLIP_TO_RECT(x, y, w, h, 0, 0, buf->w, buf->h); if (!(rect = eina_rectangle_new(x, y, w, h))) { free(obr); @@ -287,10 +288,12 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, if (cy) *cy = y; if (cw) *cw = w; if (ch) *ch = h; + alpha = ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha)); use_shm = buf->priv.x11.xcb.shm; + if ((buf->rot == 0) && (buf->priv.mask.r == 0xff0000) && - (buf->priv.mask.g == 0x00ff00) && (buf->priv.mask.b == 0x0000ff)) + (buf->priv.mask.g == 0x00ff00) && (buf->priv.mask.b == 0x0000ff)) { obr->xcbob = evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn, @@ -393,7 +396,7 @@ evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, use_shm = buf->priv.x11.xcb.shm; alpha = ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha)); if ((buf->rot == 0) && (buf->priv.mask.r == 0xff0000) && - (buf->priv.mask.g == 0x00ff00) && (buf->priv.mask.b == 0x0000ff)) + (buf->priv.mask.g == 0x00ff00) && (buf->priv.mask.b == 0x0000ff)) { obr->xcbob = _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, @@ -622,7 +625,7 @@ evas_software_xcb_outbuf_flush(Outbuf *buf) if (obr->xcbob) _unfind_xcbob(obr->xcbob, EINA_FALSE); if (obr->mask) _unfind_xcbob(obr->mask, EINA_FALSE); free(obr); - evas_cache_image_drop(&im->cache_entry); +// evas_cache_image_drop(&im->cache_entry); } #endif } @@ -640,12 +643,12 @@ evas_software_xcb_outbuf_idle_flush(Outbuf *buf) im = buf->priv.onebuf; buf->priv.onebuf = NULL; obr = im->extended_info; + evas_cache_image_drop(&im->cache_entry); if (obr->xcbob) evas_software_xcb_output_buffer_free(obr->xcbob, EINA_FALSE); if (obr->mask) evas_software_xcb_output_buffer_free(obr->mask, EINA_FALSE); free(obr); - evas_cache_image_drop(&im->cache_entry); } else { @@ -822,14 +825,12 @@ evas_software_xcb_outbuf_push_updated_region(Outbuf *buf, RGBA_Image *update, in } #if 1 #else - /* Async Push */ - if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions))) - { - evas_software_xcb_output_buffer_paste(obr->xcbob, - buf->priv.x11.xcb.mask, - buf->priv.x11.xcb.gcm, - obr->x, obr->y, 0); - } + /* Async Push */ + if (!((buf->priv.onebuf) && (buf->priv.onebuf_regions))) + evas_software_xcb_output_buffer_paste(obr->xcbob, + buf->priv.x11.xcb.mask, + buf->priv.x11.xcb.gcm, + obr->x, obr->y, 0); #endif } #if 1 @@ -938,7 +939,7 @@ evas_software_xcb_outbuf_debug_show(Outbuf *buf, xcb_drawable_t drawable, int x, xcb_get_geometry_unchecked(buf->priv.x11.xcb.conn, drawable), 0); root = geom->root; - free (geom); + free(geom); geom = xcb_get_geometry_reply(buf->priv.x11.xcb.conn, xcb_get_geometry_unchecked(buf->priv.x11.xcb.conn, @@ -953,7 +954,7 @@ evas_software_xcb_outbuf_debug_show(Outbuf *buf, xcb_drawable_t drawable, int x, break; } } - free (geom); + free(geom); for (i = 0; i < 20; i++) { @@ -969,6 +970,7 @@ evas_software_xcb_outbuf_debug_show(Outbuf *buf, xcb_drawable_t drawable, int x, xcb_poly_fill_rectangle(buf->priv.x11.xcb.conn, drawable, buf->priv.x11.xcb.gc, 1, &rect); _xcbob_sync(buf->priv.x11.xcb.conn); + _xcbob_sync(buf->priv.x11.xcb.conn); mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES; value[0] = screen->white_pixel; @@ -978,16 +980,17 @@ evas_software_xcb_outbuf_debug_show(Outbuf *buf, xcb_drawable_t drawable, int x, xcb_poly_fill_rectangle(buf->priv.x11.xcb.conn, drawable, buf->priv.x11.xcb.gc, 1, &rect); _xcbob_sync(buf->priv.x11.xcb.conn); + _xcbob_sync(buf->priv.x11.xcb.conn); } } -# ifdef EVAS_FRAME_QUEUING +#ifdef EVAS_FRAME_QUEUING void evas_software_xcb_outbuf_priv_set(Outbuf *buf, void *cur, void *prev __UNUSED__) { buf->priv.pending_writes = (Eina_List *)cur; } -# endif +#endif /* local functions */ static Xcb_Output_Buffer *