void evas_buffer_outbuf_buf_update_fb(Outbuf *buf, int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level, void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes), void (*free_update_region) (int x, int y, int w, int h, void *data), void * (*switch_buffer) (void *data, void *dest_buffer), void *switch_data) { buf->w = w; buf->h = h; buf->depth = depth; buf->dest = dest; buf->dest_row_bytes = dest_row_bytes; buf->alpha_level = alpha_level; buf->color_key = color_key; buf->use_color_key = use_color_key; buf->first_frame = 1; buf->func.new_update_region = new_update_region; buf->func.free_update_region = free_update_region; buf->func.switch_buffer = switch_buffer; buf->switch_data = switch_data; if ((buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888) && (buf->dest) && (buf->dest_row_bytes == (buf->w * sizeof(DATA32)))) { memset(buf->dest, 0, h * buf->dest_row_bytes); #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) buf->priv.back_buf = (RGBA_Image *) evas_cache2_image_data(evas_common_image_cache2_get(), w, h, buf->dest, 1, EVAS_COLORSPACE_ARGB8888); else #endif buf->priv.back_buf = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), w, h, buf->dest, 1, EVAS_COLORSPACE_ARGB8888); } else if ((buf->depth == OUTBUF_DEPTH_RGB_32BPP_888_8888) && (buf->dest) && (buf->dest_row_bytes == (buf->w * sizeof(DATA32)))) { #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) buf->priv.back_buf = (RGBA_Image *) evas_cache2_image_data(evas_common_image_cache2_get(), w, h, buf->dest, 0, EVAS_COLORSPACE_ARGB8888); else #endif buf->priv.back_buf = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), w, h, buf->dest, 0, EVAS_COLORSPACE_ARGB8888); } }
void evas_buffer_outbuf_buf_switch_buffer(Outbuf *buf) { if (buf->func.switch_buffer) { buf->dest = buf->func.switch_buffer(buf->switch_data, buf->dest); if (buf->priv.back_buf) { #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) { evas_cache2_image_close(&buf->priv.back_buf->cache_entry); buf->priv.back_buf = (RGBA_Image *) evas_cache2_image_data(evas_common_image_cache2_get(), buf->w, buf->h, buf->dest, buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888 ? 1 : 0, EVAS_COLORSPACE_ARGB8888); } else #endif { evas_cache_image_drop(&buf->priv.back_buf->cache_entry); buf->priv.back_buf = (RGBA_Image *) evas_cache_image_data(evas_common_image_cache_get(), buf->w, buf->h, buf->dest, buf->depth == OUTBUF_DEPTH_ARGB_32BPP_8888_8888 ? 1 : 0, EVAS_COLORSPACE_ARGB8888); } } } }
FB_Output_Buffer * evas_software_wince_gapi_output_buffer_new(void *priv, int width, int height) { FB_Output_Buffer *fbob; void *buffer; fbob = calloc(1, sizeof(FB_Output_Buffer)); if (!fbob) return NULL; buffer = malloc (width * height * 2); /* we are sure to have 16bpp */ if (!buffer) { free(fbob); return NULL; } fbob->priv = priv; fbob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *)buffer, 0, EVAS_COLORSPACE_RGB565_A5P); if (fbob->im) fbob->im->stride = ((Evas_Engine_WinCE_GAPI_Priv *)priv)->stride >> 1; return fbob; }
/* internal engine routines */ static void * _output_setup(int w, int h) { Render_Engine *re; int i; u16 width, height; DATA32 *image_data = NULL; int image_size; printf ("_output_setup called : %dx%d\n", w, h); re = calloc(1, sizeof(Render_Engine)); if (!re) return NULL; /* Allocate a 1Mb buffer, alligned to a 1Mb boundary * to be our shared IO memory with the RSX. */ re->host_addr = memalign (1024 * 1024, HOST_SIZE); if (re->host_addr == NULL) { free (re); return NULL; } re->context = initScreen (re->host_addr, HOST_SIZE); if (re->context == NULL) { free (re->host_addr); free (re); return NULL; } width = w; height = h; setResolution (re->context, &width, &height); re->currentBuffer = 0; re->width = width; re->height = height; for (i = 0; i < MAX_BUFFERS; i++) makeBuffer (&re->buffers[i], width, height, i); flipBuffer(re->context, MAX_BUFFERS - 1); re->tb = evas_common_tilebuf_new(w, h); /* in preliminary tests 16x16 gave highest framerates */ evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); /* Allocate our memaligned backbuffer */ image_size = ((w * h * sizeof(u32)) + 0xfffff) & - 0x100000; image_data = memalign (1024 * 1024, image_size); re->rgba_image = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, 1, EVAS_COLORSPACE_ARGB8888); gcmMapMainMemory(image_data, image_size, &re->rgba_image_offset); return re; }
DDraw_Output_Buffer * evas_software_ddraw_output_buffer_new(HWND window, LPDIRECTDRAW object, LPDIRECTDRAWSURFACE surface_primary, LPDIRECTDRAWSURFACE surface_back, LPDIRECTDRAWSURFACE surface_source, int width, int height) { DDSURFACEDESC surface_desc; DDraw_Output_Buffer *ddob; ddob = (DDraw_Output_Buffer *)calloc(1, sizeof(DDraw_Output_Buffer)); if (!ddob) return NULL; ddob->dd.window = window; ddob->dd.object = object; ddob->dd.surface_primary = surface_primary; ddob->dd.surface_back = surface_back; ddob->dd.surface_source = surface_source; ddob->width = width; ddob->height = height; ddob->pitch = width * 2; ZeroMemory(&surface_desc, sizeof(surface_desc)); surface_desc.dwSize = sizeof(surface_desc); if (FAILED(ddob->dd.surface_source->Lock(NULL, &surface_desc, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL))) { free(ddob); return NULL; } ddob->data = (DATA16 *)surface_desc.lpSurface; if (FAILED(ddob->dd.surface_source->Unlock(NULL))) { free(ddob); return NULL; } if (ddob->im) evas_cache_image_drop(&ddob->im->cache_entry); ddob->im = (Soft16_Image *) evas_cache_image_data(evas_common_soft16_image_cache_get(), width, height, (DATA32 *) ddob->data, 0, EVAS_COLORSPACE_RGB565_A5P); if (ddob->im) ddob->im->stride = ddob->pitch; return ddob; }
Outbuf * evas_outbuf_setup(int w, int h, int rot, Eina_Bool alpha, void *dest) { Outbuf *ob = NULL; if (!(ob = calloc(1, sizeof(Outbuf)))) return NULL; ob->w = w; ob->h = h; ob->rotation = rot; ob->priv.dest = dest; ob->priv.destination_alpha = alpha; ob->priv.buffer = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), w, h, ob->priv.dest, 1, EVAS_COLORSPACE_ARGB8888); return ob; }
void * evas_software_xcb_outbuf_new_region_for_update(Outbuf *buf, int x, int y, int w, int h, int *cx, int *cy, int *cw, int *ch) { RGBA_Image *im = NULL; Outbuf_Region *obr = NULL; Eina_Bool use_shm = EINA_TRUE; Eina_Bool alpha = EINA_FALSE; int bpl = 0; if ((buf->onebuf) && (buf->priv.x11.xcb.shm)) { 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; if (!(rect = eina_rectangle_new(x, y, w, h))) { free(obr); return NULL; } if ((eina_array_push(&buf->priv.onebuf_regions, rect)) && (buf->priv.onebuf)) { if (cx) *cx = x; if (cy) *cy = y; if (cw) *cw = w; if (ch) *ch = h; if (!buf->priv.synced) { _xcbob_sync(buf->priv.x11.xcb.conn); buf->priv.synced = EINA_TRUE; } free(obr); return buf->priv.onebuf; } obr->x = 0; obr->y = 0; obr->w = buf->w; obr->h = buf->h; if (cx) *cx = x; 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.x11.xcb.imdepth == 32) && (buf->priv.mask.r == 0xff0000) && (buf->priv.mask.g == 0x00ff00) && (buf->priv.mask.b == 0x0000ff)) { obr->xcbob = evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, buf->priv.x11.xcb.depth, buf->w, buf->h, use_shm, NULL); if (!obr->xcbob) { free(obr); return NULL; } #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) { im = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(), buf->w, buf->h, (DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl), alpha, EVAS_COLORSPACE_ARGB8888); } else #endif { im = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), buf->w, buf->h, (DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl), alpha, EVAS_COLORSPACE_ARGB8888); } if (!im) { evas_software_xcb_output_buffer_free(obr->xcbob, EINA_FALSE); free(obr); return NULL; } im->extended_info = obr; if (buf->priv.x11.xcb.mask) { obr->mask = evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, 1, buf->w, buf->h, use_shm, NULL); } } else { int bw = 0, bh = 0; #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) { im = (RGBA_Image *)evas_cache2_image_empty(evas_common_image_cache2_get()); } else #endif { im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get()); } if (!im) { free(obr); return NULL; } im->cache_entry.flags.alpha |= (alpha ? 1 : 0); #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) evas_cache2_image_surface_alloc(&im->cache_entry, buf->w, buf->h); else #endif evas_cache_image_surface_alloc(&im->cache_entry, buf->w, buf->h); im->extended_info = obr; if ((buf->rot == 0) || (buf->rot == 180)) { bw = buf->w; bh = buf->h; } else if ((buf->rot == 90) || (buf->rot == 270)) { bw = buf->h; bh = buf->w; } obr->xcbob = evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, buf->priv.x11.xcb.depth, bw, bh, use_shm, NULL); if (!obr->xcbob) { #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) evas_cache2_image_close(&im->cache_entry); else #endif evas_cache_image_drop(&im->cache_entry); free(obr); return NULL; } if (buf->priv.x11.xcb.mask) { obr->mask = evas_software_xcb_output_buffer_new(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, 1, bw, bh, use_shm, NULL); } } /* FIXME: We should be able to remove this memset. */ if ((alpha) && (im->image.data)) { /* FIXME: Faster memset */ // memset(im->image.data, 0, (w * h * sizeof(DATA32))); } buf->priv.onebuf = im; return im; } if (!(obr = calloc(1, sizeof(Outbuf_Region)))) return NULL; obr->x = x; obr->y = y; obr->w = w; obr->h = h; if (cx) *cx = 0; if (cy) *cy = 0; if (cw) *cw = w; if (ch) *ch = h; use_shm = buf->priv.x11.xcb.shm; alpha = ((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha)); if ((buf->rot == 0) && (buf->priv.x11.xcb.imdepth == 32) && (buf->priv.mask.r == 0xff0000) && (buf->priv.mask.g == 0x00ff00) && (buf->priv.mask.b == 0x0000ff)) { obr->xcbob = _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, buf->priv.x11.xcb.depth, w, h, use_shm, NULL); if (!obr->xcbob) { free(obr); return NULL; } #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) { im = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(), w, h, (DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl), alpha, EVAS_COLORSPACE_ARGB8888); } else #endif { im = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), w, h, (DATA32 *)evas_software_xcb_output_buffer_data(obr->xcbob, &bpl), alpha, EVAS_COLORSPACE_ARGB8888); } if (!im) { _unfind_xcbob(obr->xcbob, EINA_FALSE); free(obr); return NULL; } im->extended_info = obr; if (buf->priv.x11.xcb.mask) { obr->mask = _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, 1, w, h, use_shm, NULL); } } else { int bw = 0, bh = 0; #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) { im = (RGBA_Image *)evas_cache2_image_empty(evas_common_image_cache2_get()); } else #endif { im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get()); } if (!im) { free(obr); return NULL; } im->cache_entry.flags.alpha |= (alpha ? 1 : 0); #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) evas_cache2_image_surface_alloc(&im->cache_entry, w, h); else #endif evas_cache_image_surface_alloc(&im->cache_entry, w, h); im->extended_info = obr; if ((buf->rot == 0) || (buf->rot == 180)) { bw = w; bh = h; } else if ((buf->rot == 90) || (buf->rot == 270)) { bw = h; bh = w; } obr->xcbob = _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, buf->priv.x11.xcb.depth, bw, bh, use_shm, NULL); if (!obr->xcbob) { #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) evas_cache2_image_close(&im->cache_entry); else #endif evas_cache_image_drop(&im->cache_entry); free(obr); return NULL; } if (buf->priv.x11.xcb.mask) { obr->mask = _find_xcbob(buf->priv.x11.xcb.conn, buf->priv.x11.xcb.visual, 1, bw, bh, use_shm, NULL); } } /* FIXME: We should be able to remove this memset. */ if (((buf->priv.x11.xcb.mask) || (buf->priv.destination_alpha)) && (im->image.data)) { /* FIXME: Faster memset */ // memset(im->image.data, 0, (w * h * sizeof(DATA32))); } buf->priv.pending_writes = eina_list_append(buf->priv.pending_writes, im); return im; }