14576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/* 24576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Copyright (C) 2009-2010 Samsung Electronics 34576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Copyright (C) 2009-2010 ProFUSION embedded systems 44576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 54576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang This library is free software; you can redistribute it and/or 64576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang modify it under the terms of the GNU Library General Public 74576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang License as published by the Free Software Foundation; either 84576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang version 2 of the License, or (at your option) any later version. 94576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang This library is distributed in the hope that it will be useful, 114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang but WITHOUT ANY WARRANTY; without even the implied warranty of 124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Library General Public License for more details. 144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang You should have received a copy of the GNU Library General Public License 164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang along with this library; see the file COPYING.LIB. If not, write to 174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Boston, MA 02110-1301, USA. 194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang*/ 204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "config.h" 224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "ewk_view.h" 234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "ewk_logging.h" 254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <Evas.h> 274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <eina_safety_checks.h> 284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <ewk_tiled_backing_store.h> 294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Ewk_View_Smart_Class _parent_sc = EWK_VIEW_SMART_CLASS_INIT_NULL; 314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_render_cb(void *data, Ewk_Tile *t, const Eina_Rectangle *area) 334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_View_Private_Data *priv = (Ewk_View_Private_Data*)data; 354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Rectangle r = {area->x + t->x, area->y + t->y, area->w, area->h}; 364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return ewk_view_paint_contents(priv, t->cairo, &r); 384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void *_ewk_view_tiled_updates_process_pre(void *data, Evas_Object *o) 414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_View_Private_Data *priv = (Ewk_View_Private_Data*)data; 434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_view_layout_if_needed_recursive(priv); 444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return 0; 454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Evas_Object *_ewk_view_tiled_smart_backing_store_add(Ewk_View_Smart_Data *sd) 484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Object *bs = ewk_tiled_backing_store_add(sd->base.evas); 504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_render_cb_set 514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (bs, _ewk_view_tiled_render_cb, sd->_priv); 524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_updates_process_pre_set 534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (bs, _ewk_view_tiled_updates_process_pre, sd->_priv); 544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return bs; 554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void 584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang_ewk_view_tiled_contents_size_changed_cb(void *data, Evas_Object *o, void *event_info) 594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord *size = (Evas_Coord*)event_info; 614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_View_Smart_Data *sd = (Ewk_View_Smart_Data*)data; 624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_contents_resize 644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (sd->backing_store, size[0], size[1]); 654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_view_tiled_smart_add(Evas_Object *o) 684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_View_Smart_Data *sd; 704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _parent_sc.sc.add(o); 724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sd = (Ewk_View_Smart_Data*)evas_object_smart_data_get(o); 744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_smart_callback_add( 754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sd->main_frame, "contents,size,changed", 764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_view_tiled_contents_size_changed_cb, sd); 774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_frame_paint_full_set(sd->main_frame, EINA_TRUE); 784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_scrolls_process(Ewk_View_Smart_Data *sd) 814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang const Ewk_Scroll_Request *sr; 834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang const Ewk_Scroll_Request *sr_end; 844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang size_t count; 854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord vw, vh; 864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_frame_contents_size_get(sd->main_frame, &vw, &vh); 884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sr = ewk_view_scroll_requests_get(sd->_priv, &count); 904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sr_end = sr + count; 914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; sr < sr_end; sr++) { 924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (sr->main_scroll) 934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_scroll_full_offset_add 944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (sd->backing_store, sr->dx, sr->dy); 954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else { 964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord sx, sy, sw, sh; 974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sx = sr->x; 994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sy = sr->y; 1004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sw = sr->w; 1014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sh = sr->h; 1024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (abs(sr->dx) >= sw || abs(sr->dy) >= sh) { 1044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang /* doubt webkit would be so stupid... */ 1054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("full page scroll %+03d,%+03d. convert to repaint %d,%d + %dx%d", 1064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sr->dx, sr->dy, sx, sy, sw, sh); 1074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_view_repaint_add(sd->_priv, sx, sy, sw, sh); 1084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang continue; 1094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 1104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (sx + sw > vw) 1124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sw = vw - sx; 1134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (sy + sh > vh) 1144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sh = vh - sy; 1154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (sw < 0) 1174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sw = 0; 1184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (sh < 0) 1194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sh = 0; 1204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!sw || !sh) 1224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang continue; 1234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sx -= abs(sr->dx); 1254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sy -= abs(sr->dy); 1264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sw += abs(sr->dx); 1274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sh += abs(sr->dy); 1284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_view_repaint_add(sd->_priv, sx, sy, sw, sh); 1294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang INF("using repaint for inner frame scolling!"); 1304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 1314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 1324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 1344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 1354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_repaints_process(Ewk_View_Smart_Data *sd) 1374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 1384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang const Eina_Rectangle *pr, *pr_end; 1394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang size_t count; 1404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang int sx, sy; 1414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_frame_scroll_pos_get(sd->main_frame, &sx, &sy); 1434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang pr = ewk_view_repaints_get(sd->_priv, &count); 1454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang pr_end = pr + count; 1464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; pr < pr_end; pr++) { 1474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Rectangle r; 1484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r.x = pr->x + sx; 1494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r.y = pr->y + sy; 1504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r.w = pr->w; 1514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r.h = pr->h; 1524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_update(sd->backing_store, &r); 1534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 1544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_updates_process(sd->backing_store); 1554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 1574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 1584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_contents_resize(Ewk_View_Smart_Data *sd, int w, int h) 1604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 1614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_contents_resize(sd->backing_store, w, h); 1624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 1634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 1644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_zoom_set(Ewk_View_Smart_Data *sd, float zoom, Evas_Coord cx, Evas_Coord cy) 1664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 1674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord x, y, w, h; 1684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool r; 1694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r = ewk_tiled_backing_store_zoom_set(sd->backing_store, 1704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang &zoom, cx, cy, &x, &y); 1714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!r) 1724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return r; 1734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_disabled_update_set(sd->backing_store, EINA_TRUE); 1744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r = _parent_sc.zoom_set(sd, zoom, cx, cy); 1754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_frame_scroll_set(sd->main_frame, -x, -y); 1764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_frame_scroll_size_get(sd->main_frame, &w, &h); 1774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_fix_offsets(sd->backing_store, w, h); 1784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_view_scrolls_process(sd); 1794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_smart_calculate(sd->backing_store); 1804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_smart_calculate(sd->self); 1814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_disabled_update_set(sd->backing_store, EINA_FALSE); 1824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return r; 1834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 1844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_zoom_weak_set(Ewk_View_Smart_Data *sd, float zoom, Evas_Coord cx, Evas_Coord cy) 1864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 1874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return ewk_tiled_backing_store_zoom_weak_set(sd->backing_store, zoom, cx, cy); 1884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 1894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_view_tiled_smart_zoom_weak_smooth_scale_set(Ewk_View_Smart_Data *sd, Eina_Bool smooth_scale) 1914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 1924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_zoom_weak_smooth_scale_set(sd->backing_store, smooth_scale); 1934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 1944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_view_tiled_smart_flush(Ewk_View_Smart_Data *sd) 1964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 1974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_flush(sd->backing_store); 1984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _parent_sc.flush(sd); 1994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_pre_render_region(Ewk_View_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, float zoom) 2024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return ewk_tiled_backing_store_pre_render_region 2044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (sd->backing_store, x, y, w, h, zoom); 2054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_pre_render_relative_radius(Ewk_View_Smart_Data *sd, unsigned int n, float zoom) 2084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return ewk_tiled_backing_store_pre_render_relative_radius 2104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (sd->backing_store, n, zoom); 2114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_view_tiled_smart_pre_render_cancel(Ewk_View_Smart_Data *sd) 2144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_pre_render_cancel(sd->backing_store); 2164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_disable_render(Ewk_View_Smart_Data *sd) 2194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return ewk_tiled_backing_store_disable_render(sd->backing_store); 2214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_enable_render(Ewk_View_Smart_Data *sd) 2244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return ewk_tiled_backing_store_enable_render(sd->backing_store); 2264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/** 2294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Sets the smart class api using tiled backing store, enabling view 2304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * to be inherited. 2314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 2324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param api class definition to be set, all members with the 2334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * exception of Evas_Smart_Class->data may be overridden. Must 2344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @b not be @c NULL. 2354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 2364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @note Evas_Smart_Class->data is used to implement type checking and 2374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * is not supposed to be changed/overridden. If you need extra 2384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * data for your smart class to work, just extend 2394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Ewk_View_Smart_Class instead. 2404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 2414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @return @c EINA_TRUE on success, @c EINA_FALSE on failure (probably 2424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * version mismatch). 2434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 2444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @see ewk_view_base_smart_set() 2454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 2464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_view_tiled_smart_set(Ewk_View_Smart_Class *api) 2474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!ewk_view_base_smart_set(api)) 2494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_FALSE; 2504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (EINA_UNLIKELY(!_parent_sc.sc.add)) 2524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_view_base_smart_set(&_parent_sc); 2534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->sc.add = _ewk_view_tiled_smart_add; 2554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->backing_store_add = _ewk_view_tiled_smart_backing_store_add; 2574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->scrolls_process = _ewk_view_tiled_smart_scrolls_process; 2584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->repaints_process = _ewk_view_tiled_smart_repaints_process; 2594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->contents_resize = _ewk_view_tiled_smart_contents_resize; 2604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->zoom_set = _ewk_view_tiled_smart_zoom_set; 2614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->zoom_weak_set = _ewk_view_tiled_smart_zoom_weak_set; 2624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->zoom_weak_smooth_scale_set = _ewk_view_tiled_smart_zoom_weak_smooth_scale_set; 2634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->flush = _ewk_view_tiled_smart_flush; 2644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->pre_render_region = _ewk_view_tiled_smart_pre_render_region; 2654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->pre_render_relative_radius = _ewk_view_tiled_smart_pre_render_relative_radius; 2664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->pre_render_cancel = _ewk_view_tiled_smart_pre_render_cancel; 2674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->disable_render = _ewk_view_tiled_smart_disable_render; 2684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang api->enable_render = _ewk_view_tiled_smart_enable_render; 2694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 2704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline Evas_Smart *_ewk_view_tiled_smart_class_new(void) 2734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Tiled"); 2754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang static Evas_Smart *smart = 0; 2764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (EINA_UNLIKELY(!smart)) { 2784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_view_tiled_smart_set(&api); 2794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang smart = evas_smart_class_new(&api.sc); 2804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 2814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return smart; 2834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/** 2864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Creates a new EFL WebKit View object using tiled backing store. 2874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 2884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * View objects are the recommended way to deal with EFL WebKit as it 2894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * abstracts the complex pieces of the process. 2904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 2914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * This object is almost the same as the one returned by the ewk_view_add() 2924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * function, but it uses the tiled backing store instead of the default 2934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * backing store. 2944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 2954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param e canvas where to create the view object. 2964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 2974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @return view object or @c NULL if errors. 2984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 2994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @see ewk_view_uri_set() 3004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 3014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEvas_Object *ewk_view_tiled_add(Evas *e) 3024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 3034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return evas_object_smart_add(e, _ewk_view_tiled_smart_class_new()); 3044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 3054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/** 3074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Get the cache of unused tiles used by this view. 3084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 3094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param o view object to get cache. 3104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @return instance of "cache of unused tiles" or @c NULL on errors. 3114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 3124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEwk_Tile_Unused_Cache *ewk_view_tiled_unused_cache_get(const Evas_Object *o) 3134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 3144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_View_Smart_Data *sd = ewk_view_smart_data_get(o); 3154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_SAFETY_ON_NULL_RETURN_VAL(sd, 0); 3164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return ewk_tiled_backing_store_tile_unused_cache_get(sd->backing_store); 3174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 3184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/** 3204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Set the cache of unused tiles used by this view. 3214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 3224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param o view object to get cache. 3234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param cache instance of "cache of unused tiles". This can be used 3244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * to share a single cache amongst different views. The tiles 3254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * from one view will not be used by the other! This is just to 3264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * limit the group with amount of unused memory. 3274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * If @c NULL is provided, then a new cache is created. 3284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 3294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_view_tiled_unused_cache_set(Evas_Object *o, Ewk_Tile_Unused_Cache *cache) 3304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 3314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_View_Smart_Data *sd = ewk_view_smart_data_get(o); 3324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_SAFETY_ON_NULL_RETURN(sd); 3334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_tile_unused_cache_set(sd->backing_store, cache); 3344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 3354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/** 3374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Set the function with the same name of the tiled backing store. 3384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param o the tiled backing store object. 3394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param flag value of the tiled backing store flag to set. 3404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 3414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_view_tiled_process_entire_queue_set(Evas_Object *o, Eina_Bool flag) 3424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 3434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_View_Smart_Data *sd = ewk_view_smart_data_get(o); 3444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_SAFETY_ON_NULL_RETURN(sd); 3454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tiled_backing_store_process_entire_queue_set(sd->backing_store, flag); 3464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 347