1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Copyright (C) 2009-2010 ProFUSION embedded systems 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Copyright (C) 2009-2010 Samsung Electronics 4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block This library is free software; you can redistribute it and/or 6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block modify it under the terms of the GNU Library General Public 7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block License as published by the Free Software Foundation; either 8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block version 2 of the License, or (at your option) any later version. 9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block This library is distributed in the hope that it will be useful, 11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block but WITHOUT ANY WARRANTY; without even the implied warranty of 12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Library General Public License for more details. 14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block You should have received a copy of the GNU Library General Public License 16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block along with this library; see the file COPYING.LIB. If not, write to 17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Boston, MA 02110-1301, USA. 19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/ 20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h" 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ewk_view.h" 23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ewk_frame.h" 25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ewk_logging.h" 26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Evas.h> 28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <eina_safety_checks.h> 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <string.h> 30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Ewk_View_Smart_Class _parent_sc = EWK_VIEW_SMART_CLASS_INIT_NULL; 32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_view_single_on_del(void *data, Evas *e, Evas_Object *o, void *event_info) 34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Object *clip = (Evas_Object*)data; 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_del(clip); 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic void _ewk_view_single_smart_add(Evas_Object *o) 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 415af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke Ewk_View_Smart_Data *sd; 425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke _parent_sc.sc.add(o); 445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 455af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke sd = (Ewk_View_Smart_Data *)evas_object_smart_data_get(o); 465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Object *clip = evas_object_rectangle_add(sd->base.evas); 485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke evas_object_clip_set(sd->backing_store, clip); 495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke evas_object_smart_member_add(clip, o); 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_show(clip); 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_event_callback_add 535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke (sd->backing_store, EVAS_CALLBACK_DEL, _ewk_view_single_on_del, clip); 545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic Evas_Object *_ewk_view_single_smart_backing_store_add(Ewk_View_Smart_Data *sd) 575af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke Evas_Object *bs = evas_object_image_add(sd->base.evas); 595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke evas_object_image_alpha_set(bs, EINA_FALSE); 605af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke evas_object_image_smooth_scale_set(bs, sd->zoom_weak_smooth_scale); 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return bs; 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_view_single_smart_resize(Evas_Object *o, Evas_Coord w, Evas_Coord h) 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Ewk_View_Smart_Data *sd = (Ewk_View_Smart_Data*)evas_object_smart_data_get(o); 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _parent_sc.sc.resize(o, w, h); 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // these should be queued and processed in calculate as well! 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_size_set(sd->backing_store, w, h); 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sd->animated_zoom.zoom.current < 0.00001) { 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Object *clip = evas_object_clip_get(sd->backing_store); 74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Coord x, y, cw, ch; 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_fill_set(sd->backing_store, 0, 0, w, h); 76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_geometry_get(sd->backing_store, &x, &y, 0, 0); 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_move(clip, x, y); 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_frame_contents_size_get(sd->main_frame, &cw, &ch); 79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (w > cw) 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block w = cw; 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (h > ch) 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block h = ch; 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_resize(clip, w, h); 84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_region_up(uint32_t *image, size_t rows, size_t x, size_t y, size_t w, size_t h, size_t rowsize) 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *src; 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *dst; 91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dst = image + x + y * rowsize; 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block src = dst + rows * rowsize; 94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block h -= rows; 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; h > 0; h--, dst += rowsize, src += rowsize) 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block memcpy(dst, src, w * 4); 98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_region_down(uint32_t *image, size_t rows, size_t x, size_t y, size_t w, size_t h, size_t rowsize) 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *src; 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *dst; 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block h -= rows; 106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block src = image + x + (y + h - 1) * rowsize; 107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dst = src + rows * rowsize; 108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; h > 0; h--, dst -= rowsize, src -= rowsize) 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block memcpy(dst, src, w * 4); 111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_line_left(uint32_t *dst, const uint32_t *src, size_t count) 114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *dst_end = dst + count; 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* no memcpy() as it does not allow overlapping regions */ 117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* no memmove() as it will copy to a temporary buffer */ 118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* TODO: loop unrolling, copying up to quad-words would help */ 119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; dst < dst_end; dst++, src++) 120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *dst = *src; 121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_line_right(uint32_t *dst, uint32_t *src, size_t count) 124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *dst_end = dst - count; 126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* no memcpy() as it does not allow overlapping regions */ 127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* no memmove() as it will copy to a temporary buffer */ 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* TODO: loop unrolling, copying up to quad-words would help */ 129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; dst > dst_end; dst--, src--) 130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *dst = *src; 131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_region_left(uint32_t *image, size_t cols, size_t x, size_t y, size_t w, size_t h, size_t rowsize) 134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *src; 136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *dst; 137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dst = image + x + y * rowsize; 139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block src = dst + cols; 140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block w -= cols; 141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; h > 0; h--, dst += rowsize, src += rowsize) 143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_line_left(dst, src, w); 144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_region_right(uint32_t *image, size_t cols, size_t x, size_t y, size_t w, size_t h, size_t rowsize) 147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *src; 149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *dst; 150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block w -= cols; 152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block src = image + (x + w - 1) + y * rowsize; 153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dst = src + cols; 154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; h > 0; h--, dst += rowsize, src += rowsize) 156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_line_right(dst, src, w); 157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* catch-all function, not as optimized as the others, but does the work. */ 160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_region(uint32_t *image, int dx, int dy, size_t x, size_t y, size_t w, size_t h, size_t rowsize) 161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *src; 163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t *dst; 164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (dy < 0) { 166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block h += dy; 167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dst = image + x + y * rowsize; 168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block src = dst - dy * rowsize; 169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (dx <= 0) { 170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block w += dx; 171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block src -= dx; 172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; h > 0; h--, dst += rowsize, src += rowsize) 173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_line_left(dst, src, w); 174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block w -= dx; 176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block src += w - 1; 177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dst += w + dx -1; 178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; h > 0; h--, dst += rowsize, src += rowsize) 179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_line_right(dst, src, w); 180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block h -= dy; 183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block src = image + x + (y + h - 1) * rowsize; 184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dst = src + dy * rowsize; 185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (dx <= 0) { 186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block w += dx; 187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block src -= dx; 188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; h > 0; h--, dst -= rowsize, src -= rowsize) 189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_line_left(dst, src, w); 190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block w -= dx; 192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block src += w - 1; 193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dst += w + dx - 1; 194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; h > 0; h--, dst -= rowsize, src -= rowsize) 195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_line_right(dst, src, w); 196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_single_scroll_process_single(Ewk_View_Smart_Data *sd, void *pixels, Evas_Coord ow, Evas_Coord oh, const Ewk_Scroll_Request *sr) 201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Coord sx, sy, sw, sh; 203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block DBG("%d,%d + %d,%d %+03d,%+03d, store: %p %dx%d", 205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sr->x, sr->y, sr->w, sr->h, sr->dx, sr->dy, pixels, ow, oh); 206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sx = sr->x; 208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sy = sr->y; 209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sw = sr->w; 210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sh = sr->h; 211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (abs(sr->dx) >= sw || abs(sr->dy) >= sh) { 213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block /* doubt webkit would be so stupid... */ 214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block DBG("full page scroll %+03d,%+03d. convert to repaint %d,%d + %dx%d", 215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sr->dx, sr->dy, sx, sy, sw, sh); 216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_repaint_add(sd->_priv, sx, sy, sw, sh); 217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sx < 0) { 221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sw += sx; 222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sx = 0; 223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sy < 0) { 225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sh += sy; 226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sy = 0; 227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sx + sw > ow) 230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sw = ow - sx; 231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sy + sh > oh) 232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sh = oh - sy; 233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sw < 0) 235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sw = 0; 236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sh < 0) 237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sh = 0; 238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block EINA_SAFETY_ON_TRUE_RETURN(!sw || !sh); 240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!sr->dx) { 241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sr->dy < 0) { 242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block DBG("scroll up: %+03d,%+03d update=%d,%d+%dx%d, " 243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block "repaint=%d,%d+%dx%d", 244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sr->dx, sr->dy, sx, sy, sw, sh + sr->dy, 245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sx, sy + sh + sr->dy, sw, -sr->dy); 246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_region_up 248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ((uint32_t*)pixels, -sr->dy, sx, sy, sw, sh, ow); 249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_data_update_add 250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block (sd->backing_store, sx, sy, sw, sh + sr->dy); 251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_repaint_add(sd->_priv, sx, sy + sh + sr->dy, sw, -sr->dy); 253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else if (sr->dy > 0) { 254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block DBG("scroll down: %+03d,%+03d update=%d,%d+%dx%d, " 255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block "repaint=%d,%d+%dx%d", 256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sr->dx, sr->dy, sx, sy + sr->dy, sw, sh - sr->dy, 257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sx, sy, sw, sr->dy); 258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_region_down 260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ((uint32_t*)pixels, sr->dy, sx, sy, sw, sh, ow); 261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_data_update_add 262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block (sd->backing_store, sx, sy + sr->dy, sw, sh - sr->dy); 263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_repaint_add(sd->_priv, sx, sy, sw, sr->dy); 265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else if (!sr->dy) { 267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sr->dx < 0) { 268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block DBG("scroll left: %+03d,%+03d update=%d,%d+%dx%d, " 269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block "repaint=%d,%d+%dx%d", 270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sr->dx, sr->dy, sx, sy, sw + sr->dx, sh, 271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sx + sw + sr->dx, sy, -sr->dx, sh); 272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_region_left 274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ((uint32_t*)pixels, -sr->dx, sx, sy, sw, sh, ow); 275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_data_update_add 276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block (sd->backing_store, sx, sy, sw + sr->dx, sh); 277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_repaint_add(sd->_priv, sx + sw + sr->dx, sy, -sr->dx, sh); 279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else if (sr->dx > 0) { 280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block DBG("scroll up: %+03d,%+03d update=%d,%d+%dx%d, " 281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block "repaint=%d,%d+%dx%d", 282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sr->dx, sr->dy, sx + sr->dx, sy, sw - sr->dx, sh, 283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sx, sy, sr->dx, sh); 284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_region_right 286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ((uint32_t*)pixels, sr->dx, sx, sy, sw, sh, ow); 287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_data_update_add 288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block (sd->backing_store, sx + sr->dx, sy, sw - sr->dx, sh); 289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_repaint_add(sd->_priv, sx, sy, sr->dx, sh); 291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Coord mx, my, mw, mh, ax, ay, aw, ah, bx, by, bw, bh; 294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sr->dx < 0) { 296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block mx = sx; 297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block mw = sw + sr->dx; 298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ax = mx + mw; 299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block aw = -sr->dx; 300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ax = sx; 302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block aw = sr->dx; 303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block mx = ax + aw; 304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block mw = sw - sr->dx; 305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sr->dy < 0) { 308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block my = sy; 309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block mh = sh + sr->dy; 310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block by = my + mh; 311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bh = -sr->dy; 312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block by = sy; 314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bh = sr->dy; 315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block my = by + bh; 316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block mh = sh - sr->dy; 317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ay = my; 320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ah = mh; 321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bx = sx; 322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bw = sw; 323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block DBG("scroll diagonal: %+03d,%+03d update=%d,%d+%dx%d, " 325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block "repaints: h=%d,%d+%dx%d v=%d,%d+%dx%d", 326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sr->dx, sr->dy, mx, my, mw, mh, ax, ay, aw, ah, bx, by, bw, bh); 327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_4b_move_region 329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ((uint32_t*)pixels, sr->dx, sr->dy, sx, sy, sw, sh, ow); 330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_data_update_add(sd->backing_store, mx, my, mw, mh); 332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_repaint_add(sd->_priv, ax, ay, aw, ah); 333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_repaint_add(sd->_priv, bx, by, bw, bh); 334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Eina_Bool _ewk_view_single_smart_scrolls_process(Ewk_View_Smart_Data *sd) 338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const Ewk_Scroll_Request *sr; 340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const Ewk_Scroll_Request *sr_end; 341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Coord ow, oh; 342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block size_t count; 343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void *pixels = evas_object_image_data_get(sd->backing_store, 1); 344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_size_get(sd->backing_store, &ow, &oh); 345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sr = ewk_view_scroll_requests_get(sd->_priv, &count); 347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block sr_end = sr + count; 348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; sr < sr_end; sr++) 349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _ewk_view_single_scroll_process_single(sd, pixels, ow, oh, sr); 350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 351a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch evas_object_image_data_set(sd->backing_store, pixels); 352a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return EINA_TRUE; 354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Eina_Bool _ewk_view_single_smart_repaints_process(Ewk_View_Smart_Data *sd) 357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Ewk_View_Paint_Context *ctxt; 359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Coord ow, oh; 360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void *pixels; 3616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner Eina_Rectangle *r; 362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const Eina_Rectangle *pr; 363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const Eina_Rectangle *pr_end; 364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Eina_Tiler *tiler; 365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Eina_Iterator *itr; 366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block cairo_status_t status; 367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block cairo_surface_t *surface; 368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block cairo_format_t format; 369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block cairo_t *cairo; 370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block size_t count; 371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Eina_Bool ret = EINA_TRUE; 372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sd->animated_zoom.zoom.current < 0.00001) { 374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Object *clip = evas_object_clip_get(sd->backing_store); 375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Coord w, h, cw, ch; 376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // reset effects of zoom_weak_set() 377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_fill_set 378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block (sd->backing_store, 0, 0, sd->view.w, sd->view.h); 379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_move(clip, sd->view.x, sd->view.y); 380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block w = sd->view.w; 382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block h = sd->view.h; 383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_frame_contents_size_get(sd->main_frame, &cw, &ch); 385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (w > cw) 386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block w = cw; 387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (h > ch) 388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block h = ch; 389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_resize(clip, w, h); 390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block pixels = evas_object_image_data_get(sd->backing_store, 1); 393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_size_get(sd->backing_store, &ow, &oh); 394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sd->bg_color.a < 255) 396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block format = CAIRO_FORMAT_ARGB32; 397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block else 398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block format = CAIRO_FORMAT_RGB24; 399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block surface = cairo_image_surface_create_for_data 401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ((unsigned char*)pixels, format, ow, oh, ow * 4); 402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block status = cairo_surface_status(surface); 403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (status != CAIRO_STATUS_SUCCESS) { 404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ERR("could not create surface from data %dx%d: %s", 405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ow, oh, cairo_status_to_string(status)); 406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ret = EINA_FALSE; 407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block goto error_cairo_surface; 408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block cairo = cairo_create(surface); 410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block status = cairo_status(cairo); 411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (status != CAIRO_STATUS_SUCCESS) { 412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ERR("could not create cairo from surface %dx%d: %s", 413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ow, oh, cairo_status_to_string(status)); 414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ret = EINA_FALSE; 415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block goto error_cairo; 416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ctxt = ewk_view_paint_context_new(sd->_priv, cairo); 419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!ctxt) { 420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ERR("could not create paint context"); 421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ret = EINA_FALSE; 422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block goto error_paint_context; 423dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 424dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block tiler = eina_tiler_new(ow, oh); 426dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!tiler) { 427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ERR("could not create tiler %dx%d", ow, oh); 428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ret = EINA_FALSE; 429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block goto error_tiler; 430dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block pr = ewk_view_repaints_get(sd->_priv, &count); 433dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block pr_end = pr + count; 434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (; pr < pr_end; pr++) 435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block eina_tiler_rect_add(tiler, pr); 436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block itr = eina_tiler_iterator_new(tiler); 438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!itr) { 439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ERR("could not get iterator for tiler"); 440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ret = EINA_FALSE; 441dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block goto error_iterator; 442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int sx, sy; 445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_frame_scroll_pos_get(sd->main_frame, &sx, &sy); 446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block EINA_ITERATOR_FOREACH(itr, r) { 448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Eina_Rectangle scrolled_rect = { 4496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner r->x + sx, r->y + sy, 4506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner r->w, r->h 451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block }; 452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_paint_context_save(ctxt); 454dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if ((sx) || (sy)) 456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_paint_context_translate(ctxt, -sx, -sy); 457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_paint_context_clip(ctxt, &scrolled_rect); 459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_paint_context_paint_contents(ctxt, &scrolled_rect); 460dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_paint_context_restore(ctxt); 462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_data_update_add 4636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner (sd->backing_store, r->x, r->y, r->w, r->h); 464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block eina_iterator_free(itr); 466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockerror_iterator: 468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block eina_tiler_free(tiler); 469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockerror_tiler: 470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_paint_context_free(ctxt); 471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockerror_paint_context: 472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block cairo_destroy(cairo); 473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockerror_cairo: 474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block cairo_surface_destroy(surface); 475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockerror_cairo_surface: 476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_data_set(sd->backing_store, pixels); /* dec refcount */ 477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return ret; 479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Eina_Bool _ewk_view_single_smart_zoom_weak_set(Ewk_View_Smart_Data *sd, float zoom, Evas_Coord cx, Evas_Coord cy) 482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // TODO: review 484dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block float scale = zoom / sd->animated_zoom.zoom.start; 485dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Coord w = sd->view.w * scale; 486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Coord h = sd->view.h * scale; 487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Coord dx, dy, cw, ch; 488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Evas_Object *clip = evas_object_clip_get(sd->backing_store); 489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_frame_contents_size_get(sd->main_frame, &cw, &ch); 491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sd->view.w > 0 && sd->view.h > 0) { 492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dx = (w * (sd->view.w - cx)) / sd->view.w; 493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dy = (h * (sd->view.h - cy)) / sd->view.h; 494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dx = 0; 496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dy = 0; 497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_fill_set(sd->backing_store, cx + dx, cy + dy, w, h); 500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (sd->view.w > 0 && sd->view.h > 0) { 502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dx = ((sd->view.w - w) * cx) / sd->view.w; 503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dy = ((sd->view.h - h) * cy) / sd->view.h; 504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } else { 505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dx = 0; 506dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block dy = 0; 507dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_move(clip, sd->view.x + dx, sd->view.y + dy); 509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (cw < sd->view.w) 511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block w = cw * scale; 512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (ch < sd->view.h) 513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block h = ch * scale; 514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_resize(clip, w, h); 515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return EINA_TRUE; 516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_view_single_smart_zoom_weak_smooth_scale_set(Ewk_View_Smart_Data *sd, Eina_Bool smooth_scale) 519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_smooth_scale_set(sd->backing_store, smooth_scale); 521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_view_single_smart_bg_color_set(Ewk_View_Smart_Data *sd, unsigned char r, unsigned char g, unsigned char b, unsigned char a) 524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block evas_object_image_alpha_set(sd->backing_store, a < 255); 526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/** 529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Sets the smart class api using single backing store, enabling view 530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * to be inherited. 531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param api class definition to be set, all members with the 533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * exception of Evas_Smart_Class->data may be overridden. Must 534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @b not be @c NULL. 535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @note Evas_Smart_Class->data is used to implement type checking and 537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * is not supposed to be changed/overridden. If you need extra 538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * data for your smart class to work, just extend 539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Ewk_View_Smart_Class instead. 540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE on failure (probably 542dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * version mismatch). 543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @see ewk_view_base_smart_set() 545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */ 546dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_view_single_smart_set(Ewk_View_Smart_Class *api) 547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 548dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!ewk_view_base_smart_set(api)) 549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return EINA_FALSE; 550dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 551dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (EINA_UNLIKELY(!_parent_sc.sc.add)) 552dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_base_smart_set(&_parent_sc); 553dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 5545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke api->sc.add = _ewk_view_single_smart_add; 555dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block api->sc.resize = _ewk_view_single_smart_resize; 556dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 557dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block api->backing_store_add = _ewk_view_single_smart_backing_store_add; 558dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block api->scrolls_process = _ewk_view_single_smart_scrolls_process; 559dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block api->repaints_process = _ewk_view_single_smart_repaints_process; 560dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block api->zoom_weak_set = _ewk_view_single_smart_zoom_weak_set; 561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block api->zoom_weak_smooth_scale_set = _ewk_view_single_smart_zoom_weak_smooth_scale_set; 562dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block api->bg_color_set = _ewk_view_single_smart_bg_color_set; 563dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 564dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return EINA_TRUE; 565dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline Evas_Smart *_ewk_view_single_smart_class_new(void) 568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("Ewk_View_Single"); 570dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static Evas_Smart *smart = 0; 571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (EINA_UNLIKELY(!smart)) { 573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ewk_view_single_smart_set(&api); 574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block smart = evas_smart_class_new(&api.sc); 575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return smart; 578dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 579dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 580dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/** 581dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Creates a new EFL WebKit View object. 582dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 583dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * View objects are the recommended way to deal with EFL WebKit as it 584dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * abstracts the complex pieces of the process. 585dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Each view is composed by a set of frames. The set has at least one 587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * frame, called 'main_frame'. See ewk_view_frame_main_get() and 588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * ewk_view_frame_focused_get(). 589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 590dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param e canvas where to create the view object. 591dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 592dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return view object or @c NULL if errors. 593dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @see ewk_view_uri_set() 595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */ 596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEvas_Object *ewk_view_single_add(Evas *e) 597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return evas_object_smart_add(e, _ewk_view_single_smart_class_new()); 599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 600