static Eina_Bool _ewk_view_single_smart_repaints_process(Ewk_View_Smart_Data *sd) { Ewk_View_Paint_Context *ctxt; Evas_Coord ow, oh; void *pixels; Eina_Rectangle r = {0, 0, 0, 0}; const Eina_Rectangle *pr; const Eina_Rectangle *pr_end; Eina_Tiler *tiler; Eina_Iterator *itr; cairo_status_t status; cairo_surface_t *surface; cairo_format_t format; cairo_t *cairo; size_t count; Eina_Bool ret = EINA_TRUE; if (sd->animated_zoom.zoom.current < 0.00001) { Evas_Object *clip = evas_object_clip_get(sd->backing_store); Evas_Coord w, h, cw, ch; // reset effects of zoom_weak_set() evas_object_image_fill_set (sd->backing_store, 0, 0, sd->view.w, sd->view.h); evas_object_move(clip, sd->view.x, sd->view.y); w = sd->view.w; h = sd->view.h; ewk_frame_contents_size_get(sd->main_frame, &cw, &ch); if (w > cw) w = cw; if (h > ch) h = ch; evas_object_resize(clip, w, h); } pixels = evas_object_image_data_get(sd->backing_store, 1); evas_object_image_size_get(sd->backing_store, &ow, &oh); if (sd->bg_color.a < 255) format = CAIRO_FORMAT_ARGB32; else format = CAIRO_FORMAT_RGB24; surface = cairo_image_surface_create_for_data ((unsigned char*)pixels, format, ow, oh, ow * 4); status = cairo_surface_status(surface); if (status != CAIRO_STATUS_SUCCESS) { ERR("could not create surface from data %dx%d: %s", ow, oh, cairo_status_to_string(status)); ret = EINA_FALSE; goto error_cairo_surface; } cairo = cairo_create(surface); status = cairo_status(cairo); if (status != CAIRO_STATUS_SUCCESS) { ERR("could not create cairo from surface %dx%d: %s", ow, oh, cairo_status_to_string(status)); ret = EINA_FALSE; goto error_cairo; } ctxt = ewk_view_paint_context_new(sd->_priv, cairo); if (!ctxt) { ERR("could not create paint context"); ret = EINA_FALSE; goto error_paint_context; } tiler = eina_tiler_new(ow, oh); if (!tiler) { ERR("could not create tiler %dx%d", ow, oh); ret = EINA_FALSE; goto error_tiler; } pr = ewk_view_repaints_get(sd->_priv, &count); pr_end = pr + count; for (; pr < pr_end; pr++) eina_tiler_rect_add(tiler, pr); itr = eina_tiler_iterator_new(tiler); if (!itr) { ERR("could not get iterator for tiler"); ret = EINA_FALSE; goto error_iterator; } int sx, sy; ewk_frame_scroll_pos_get(sd->main_frame, &sx, &sy); EINA_ITERATOR_FOREACH(itr, r) { Eina_Rectangle scrolled_rect = { r.x + sx, r.y + sy, r.w, r.h }; ewk_view_paint_context_save(ctxt); if ((sx) || (sy)) ewk_view_paint_context_translate(ctxt, -sx, -sy); ewk_view_paint_context_clip(ctxt, &scrolled_rect); ewk_view_paint_context_paint_contents(ctxt, &scrolled_rect); ewk_view_paint_context_restore(ctxt); evas_object_image_data_update_add (sd->backing_store, r.x, r.y, r.w, r.h); }
static Eina_Bool _ewk_view_single_smart_repaints_process(Ewk_View_Smart_Data* smartData) { Ewk_View_Paint_Context* context; Evas_Coord ow, oh; void* pixels; Eina_Rectangle* rect; const Eina_Rectangle* pr; const Eina_Rectangle* pr_end; Eina_Tiler* tiler; Eina_Iterator* iterator; cairo_status_t status; cairo_surface_t* surface; cairo_format_t format; cairo_t* cairo; size_t count; Eina_Bool result = true; if (smartData->animated_zoom.zoom.current < 0.00001) { Evas_Object* clip = evas_object_clip_get(smartData->backing_store); Evas_Coord width, height, centerWidth, centerHeight; // reset effects of zoom_weak_set() evas_object_image_fill_set (smartData->backing_store, 0, 0, smartData->view.w, smartData->view.h); evas_object_move(clip, smartData->view.x, smartData->view.y); width = smartData->view.w; height = smartData->view.h; ewk_frame_contents_size_get(smartData->main_frame, ¢erWidth, ¢erHeight); if (width > centerWidth) width = centerWidth; if (height > centerHeight) height = centerHeight; evas_object_resize(clip, width, height); } pixels = evas_object_image_data_get(smartData->backing_store, 1); evas_object_image_size_get(smartData->backing_store, &ow, &oh); format = CAIRO_FORMAT_ARGB32; surface = cairo_image_surface_create_for_data (static_cast<unsigned char*>(pixels), format, ow, oh, ow * 4); status = cairo_surface_status(surface); if (status != CAIRO_STATUS_SUCCESS) { ERR("could not create surface from data %dx%d: %s", ow, oh, cairo_status_to_string(status)); result = false; goto error_cairo_surface; } cairo = cairo_create(surface); status = cairo_status(cairo); if (status != CAIRO_STATUS_SUCCESS) { ERR("could not create cairo from surface %dx%d: %s", ow, oh, cairo_status_to_string(status)); result = false; goto error_cairo; } context = ewk_view_paint_context_new(smartData->_priv, cairo); if (!context) { ERR("could not create paint context"); result = false; goto error_paint_context; } tiler = eina_tiler_new(ow, oh); if (!tiler) { ERR("could not create tiler %dx%d", ow, oh); result = false; goto error_tiler; } ewk_view_layout_if_needed_recursive(smartData->_priv); pr = ewk_view_repaints_pop(smartData->_priv, &count); pr_end = pr + count; for (; pr < pr_end; pr++) eina_tiler_rect_add(tiler, pr); iterator = eina_tiler_iterator_new(tiler); if (!iterator) { ERR("could not get iterator for tiler"); result = false; goto error_iterator; } int scrollX, scrollY; ewk_frame_scroll_pos_get(smartData->main_frame, &scrollX, &scrollY); EINA_ITERATOR_FOREACH(iterator, rect) { Eina_Rectangle scrolled_rect = { rect->x + scrollX, rect->y + scrollY, rect->w, rect->h }; ewk_view_paint_context_save(context); if ((scrollX) || (scrollY)) ewk_view_paint_context_translate(context, -scrollX, -scrollY); ewk_view_paint_context_clip(context, &scrolled_rect); ewk_view_paint_context_paint_contents(context, &scrolled_rect); ewk_view_paint_context_restore(context); evas_object_image_data_update_add (smartData->backing_store, rect->x, rect->y, rect->w, rect->h); }