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_tiled_backing_store.h" 234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define _GNU_SOURCE 254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "ewk_tiled_private.h" 264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <Ecore.h> 274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <Eina.h> 284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <errno.h> 294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <math.h> 304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <stdio.h> // XXX REMOVE ME LATER 314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <stdlib.h> 324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <string.h> 334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define IDX(col, row, rowspan) (col + (row * rowspan)) 354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#if !defined(MIN) 374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang# define MIN(a, b) ((a < b) ? a : b) 384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#if !defined(MAX) 414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang# define MAX(a, b) ((a > b) ? a : b) 424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangtypedef enum _Ewk_Tiled_Backing_Store_Pre_Render_Priority Ewk_Tiled_Backing_Store_Pre_Render_Priority; 454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangtypedef struct _Ewk_Tiled_Backing_Store_Data Ewk_Tiled_Backing_Store_Data; 464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangtypedef struct _Ewk_Tiled_Backing_Store_Item Ewk_Tiled_Backing_Store_Item; 474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangtypedef struct _Ewk_Tiled_Backing_Store_Pre_Render_Request Ewk_Tiled_Backing_Store_Pre_Render_Request; 484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangenum _Ewk_Tiled_Backing_Store_Pre_Render_Priority { 504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRE_RENDER_PRIORITY_LOW = 0, /**< Append the request to the list */ 514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRE_RENDER_PRIORITY_HIGH /**< Prepend the request to the list */ 524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}; 534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstruct _Ewk_Tiled_Backing_Store_Item { 554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST; 564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile *tile; 574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord x, y, w, h; 594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } geometry; 604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_List *process; 624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned long row, col; 634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang float zoom; 644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } update; 654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool smooth_scale; 664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}; 674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstruct _Ewk_Tiled_Backing_Store_Pre_Render_Request { 694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST; 704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned long col, row; 714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang float zoom; 724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}; 734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstruct _Ewk_Tiled_Backing_Store_Data { 754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Object_Smart_Clipped_Data base; 764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Object *self; 774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Object *contents_clipper; 784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **items; 804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord x, y, w, h; 814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang long cols, rows; 824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord w, h; 844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang float zoom; 854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool zoom_weak_smooth_scale:1; 864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } tile; 874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord x, y; 904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } cur, old, base, zoom_center; 914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } offset; 924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } view; 934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Colorspace cspace; 944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Matrix *matrix; 964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned long col, row; 984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } base; 994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 1004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned long cols, rows; 1014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } cur, old; 1024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord width, height; 1034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } model; 1044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 1054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool (*cb)(void *data, Ewk_Tile *t, const Eina_Rectangle *area); 1064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang void *data; 1074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_List *queue; 1084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool process_entire_queue; 1094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist *pre_render_requests; 1104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ecore_Idler *idler; 1114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool disabled; 1124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool suspend:1; 1134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } render; 1144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 1154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang void *(*pre_cb)(void *data, Evas_Object *o); 1164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang void *pre_data; 1174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang void *(*post_cb)(void *data, void *pre_data, Evas_Object *o); 1184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang void *post_data; 1194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } process; 1204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang struct { 1214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool any:1; 1224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool pos:1; 1234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool size:1; 1244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool model:1; 1254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool offset:1; 1264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } changed; 1274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifdef DEBUG_MEM_LEAKS 1284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ecore_Event_Handler *sig_usr; 1294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 1304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}; 1314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Evas_Smart_Class _parent_sc = EVAS_SMART_CLASS_INIT_NULL; 1334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangint _ewk_tiled_log_dom = -1; 1344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define PRIV_DATA_GET_OR_RETURN(obj, ptr, ...) \ 1364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Data *ptr = evas_object_smart_data_get(obj); \ 1374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!ptr) { \ 1384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang CRITICAL("no private data in obj=%p", obj); \ 1394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return __VA_ARGS__; \ 1404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 1414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_item_request_del(Ewk_Tiled_Backing_Store_Data *priv, Ewk_Tiled_Backing_Store_Item *it); 1434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_item_request_add(Ewk_Tiled_Backing_Store_Data *priv, Ewk_Tiled_Backing_Store_Item *it, int m_col, int m_row, float zoom); 1444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_fill_renderers(Ewk_Tiled_Backing_Store_Data *priv); 1454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_view_dbg(const Ewk_Tiled_Backing_Store_Data *priv); 1464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_changed(Ewk_Tiled_Backing_Store_Data *priv); 1474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_updates_process(Ewk_Tiled_Backing_Store_Data *priv) 1494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 1504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang void *data = NULL; 1514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang /* Do not process updates. Note that we still want to get updates requests 1534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * in the queue in order to not miss any updates after the render is 1544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * resumed. 1554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 1564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->render.suspend || !evas_object_visible_get(priv->self)) 1574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 1584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->process.pre_cb) 1604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang data = priv->process.pre_cb(priv->process.pre_data, priv->self); 1614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_updates_process(priv->model.matrix); 1634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->process.post_cb) 1654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->process.post_cb(priv->process.post_data, data, priv->self); 1664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 1674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic int _ewk_tiled_backing_store_flush(void *data) 1694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 1704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Data *priv = data; 1714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Unused_Cache *tuc = ewk_tile_matrix_unused_cache_get(priv->model.matrix); 1724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (tuc) { 1744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("flush unused tile cache."); 1754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_unused_cache_auto_flush(tuc); 1764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } else 1774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ERR("no cache?!"); 1784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return 0; 1804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 1814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Ewk_Tile *_ewk_tiled_backing_store_tile_new(Ewk_Tiled_Backing_Store_Data *priv, unsigned long col, unsigned long row, float zoom) 1834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 1844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile *t; 1854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas *evas = evas_object_evas_get(priv->self); 1864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!evas) { 1874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang CRITICAL("evas_object_evas_get failed!"); 1884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return NULL; 1894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 1904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang t = ewk_tile_matrix_tile_new 1924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv->model.matrix, evas, col, row, zoom); 1934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!t) { 1954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang CRITICAL("ewk_tile_matrix_tile_new failed!"); 1964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return NULL; 1974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 1984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return t; 2004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_item_move(Ewk_Tiled_Backing_Store_Item *it, Evas_Coord x, Evas_Coord y) 2034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->geometry.x = x; 2054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->geometry.y = y; 2064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) 2084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move(it->tile->image, x, y); 2094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_item_resize(Ewk_Tiled_Backing_Store_Item *it, Evas_Coord w, Evas_Coord h) 2124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->geometry.w = w; 2144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->geometry.h = h; 2154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) { 2174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_resize(it->tile->image, w, h); 2184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_image_fill_set(it->tile->image, 0, 0, w, h); 2194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 2204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_tile_associate(Ewk_Tiled_Backing_Store_Data *priv, Ewk_Tile *t, Ewk_Tiled_Backing_Store_Item *it) 2234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) 2254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang CRITICAL("it->tile=%p, but it should be NULL!", it->tile); 2264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->tile = t; 2274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move(it->tile->image, it->geometry.x, it->geometry.y); 2284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_resize(it->tile->image, it->geometry.w, it->geometry.h); 2294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_image_fill_set 2304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (it->tile->image, 0, 0, it->geometry.w, it->geometry.h); 2314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_image_smooth_scale_set(it->tile->image, it->smooth_scale); 2324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!ewk_tile_visible_get(t)) 2344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_smart_member_add(t->image, priv->self); 2354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_show(t); 2374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_tile_dissociate(Ewk_Tiled_Backing_Store_Data *priv, Ewk_Tiled_Backing_Store_Item *it, double last_used) 2404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Unused_Cache *tuc; 2424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_hide(it->tile); 2434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!ewk_tile_visible_get(it->tile)) 2444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_smart_member_del(it->tile->image); 2454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_tile_put(priv->model.matrix, it->tile, last_used); 2464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tuc = ewk_tile_matrix_unused_cache_get(priv->model.matrix); 2474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_unused_cache_auto_flush(tuc); 2484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->tile = NULL; 2504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_tile_dissociate_all(Ewk_Tiled_Backing_Store_Data *priv) 2534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist *it; 2554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *item; 2564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang int i; 2574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang double last_used = ecore_loop_time_get(); 2584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (i = 0; i < priv->view.rows; i++) { 2604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it = priv->view.items[i]; 2614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(it, item) 2624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (item->tile) 2634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_dissociate(priv, item, last_used); 2644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 2654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 267f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic inline Eina_Bool _ewk_tiled_backing_store_pre_render_request_add(Ewk_Tiled_Backing_Store_Data *priv, unsigned long col, unsigned long row, float zoom, Ewk_Tiled_Backing_Store_Pre_Render_Priority priority) 2684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Pre_Render_Request *r; 2704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang MALLOC_OR_OOM_RET(r, sizeof(*r), EINA_FALSE); 2724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priority == PRE_RENDER_PRIORITY_HIGH) 2744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.pre_render_requests = eina_inlist_prepend 2754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv->render.pre_render_requests, EINA_INLIST_GET(r)); 2764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else 2774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.pre_render_requests = eina_inlist_append 2784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv->render.pre_render_requests, EINA_INLIST_GET(r)); 2794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r->col = col; 2814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r->row = row; 2824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r->zoom = zoom; 2834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 2854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_pre_render_request_del(Ewk_Tiled_Backing_Store_Data *priv, Ewk_Tiled_Backing_Store_Pre_Render_Request *r) 2884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.pre_render_requests = eina_inlist_remove 2904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv->render.pre_render_requests, EINA_INLIST_GET(r)); 2914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang free(r); 2924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 2944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline Ewk_Tiled_Backing_Store_Pre_Render_Request *_ewk_tiled_backing_store_pre_render_request_first(const Ewk_Tiled_Backing_Store_Data *priv) 2954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 2964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_INLIST_CONTAINER_GET( 2974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.pre_render_requests, 2984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Pre_Render_Request); 2994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 3004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_pre_render_request_flush(Ewk_Tiled_Backing_Store_Data *priv) 3024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 3034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **pl = &priv->render.pre_render_requests; 3044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang while (*pl) { 3054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Pre_Render_Request *r; 3064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r = _ewk_tiled_backing_store_pre_render_request_first(priv); 3074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *pl = eina_inlist_remove(*pl, *pl); 3084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang free(r); 3094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 3104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 3114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 312f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic void _ewk_tiled_backing_store_pre_render_request_clear(Ewk_Tiled_Backing_Store_Data *priv) 3134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 3144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **pl = &priv->render.pre_render_requests; 3154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist *iter = *pl, *tmp; 3164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang while (iter) { 3174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Pre_Render_Request *r = 3184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_CONTAINER_GET( 3194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang iter, Ewk_Tiled_Backing_Store_Pre_Render_Request); 320f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch tmp = iter->next; 321f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *pl = eina_inlist_remove(*pl, iter); 322f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch iter = tmp; 323f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch free(r); 3244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 3254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 3264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/* assumes priv->process.pre_cb was called if required! */ 3284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_pre_render_request_process_single(Ewk_Tiled_Backing_Store_Data *priv) 3294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 3304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Pre_Render_Request *req; 3314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Rectangle area; 3324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Matrix *tm = priv->model.matrix; 3334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile *t; 3344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Unused_Cache *tuc; 3354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned long col, row; 3364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang float zoom; 3374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang double last_used = ecore_loop_time_get(); 3384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang req = _ewk_tiled_backing_store_pre_render_request_first(priv); 3404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!req) 3414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 3424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang col = req->col; 3444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang row = req->row; 3454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang zoom = req->zoom; 3464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (ewk_tile_matrix_tile_exact_exists(tm, col, row, zoom)) { 3484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("no pre-render required for tile %lu,%lu @ %f.", col, row, zoom); 3494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang goto end; 3504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 3514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang t = _ewk_tiled_backing_store_tile_new(priv, col, row, zoom); 3534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!t) 3544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang goto end; 3554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang area.x = 0; 3574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang area.y = 0; 3584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang area.w = priv->view.tile.w; 3594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang area.h = priv->view.tile.h; 3604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.cb(priv->render.data, t, &area); 3624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_image_data_update_add( 3634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang t->image, 3644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang area.x, area.y, area.w, area.h); 3654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_tile_updates_clear(tm, t); 3664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 367f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch ewk_tile_matrix_tile_put(tm, t, last_used); 3684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangend: 3704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_pre_render_request_del(priv, req); 3714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tuc = ewk_tile_matrix_unused_cache_get(priv->model.matrix); 3724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_unused_cache_auto_flush(tuc); 3734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 3744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_tiled_backing_store_item_process_idler_cb(void *data) 3764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 3774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Data *priv = data; 3784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it = NULL; 3794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang while (priv->render.queue) { 3814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it = priv->render.queue->data; 3824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile->zoom == priv->view.tile.zoom) { 3834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_request_del(priv, it); 3844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it = NULL; 3854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } else { 3864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned long row, col; 3874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang float zoom; 3884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile *t; 3894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) { 3904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang double last_used = ecore_loop_time_get(); 3914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_dissociate(priv, it, last_used); 3924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 3934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 3944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang row = it->update.row; 3954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang col = it->update.col; 3964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang zoom = it->update.zoom; 3974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang t = _ewk_tiled_backing_store_tile_new(priv, col, row, zoom); 3984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!t) { 3994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.idler = NULL; 4004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_FALSE; 4014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 4024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_associate(priv, t, it); 4044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->update.process = NULL; 4054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.queue = eina_list_remove_list(priv->render.queue, 4064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.queue); 4074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->render.process_entire_queue) 4084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang break; 4094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 4104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 4114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->process.pre_cb) 4134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang data = priv->process.pre_cb(priv->process.pre_data, priv->self); 4144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_updates_process(priv->model.matrix); 4164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!it) 4184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_pre_render_request_process_single(priv); 4194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->process.post_cb) 4214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->process.post_cb(priv->process.post_data, data, priv->self); 4224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->render.queue && !priv->render.pre_render_requests) { 4244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.idler = NULL; 4254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_FALSE; 4264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 4274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 4294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 4304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_item_process_idler_stop(Ewk_Tiled_Backing_Store_Data *priv) 4324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 4334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->render.idler) 4344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 4354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ecore_idler_del(priv->render.idler); 4374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.idler = NULL; 4384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 4394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_item_process_idler_start(Ewk_Tiled_Backing_Store_Data *priv) 4414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 4424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->render.idler) 4434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 4444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.idler = ecore_idler_add( 4454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_process_idler_cb, priv); 4464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 4474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_item_request_del(Ewk_Tiled_Backing_Store_Data *priv, Ewk_Tiled_Backing_Store_Item *it) 4494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 4504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.queue = eina_list_remove_list(priv->render.queue, 4514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->update.process); 4524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->update.process = NULL; 4534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 4544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_item_request_add(Ewk_Tiled_Backing_Store_Data *priv, Ewk_Tiled_Backing_Store_Item *it, int m_col, int m_row, float zoom) 4564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 4574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->update.process) 4584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 4594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->update.col = m_col; 4614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->update.row = m_row; 4624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->update.zoom = zoom; 4634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.queue = eina_list_append(priv->render.queue, it); 4654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->update.process = eina_list_last(priv->render.queue); 4664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->render.suspend) 4684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_process_idler_start(priv); 4694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 4704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_tiled_backing_store_disable_render(Ewk_Tiled_Backing_Store_Data *priv) 4724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 4734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->render.suspend) 4744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 4754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.suspend = EINA_TRUE; 4774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_process_idler_stop(priv); 4784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 4794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 4804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_tiled_backing_store_enable_render(Ewk_Tiled_Backing_Store_Data *priv) 4824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 4834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->render.suspend) 4844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 4854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.suspend = EINA_FALSE; 4874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_fill_renderers(priv); 4894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_process_idler_start(priv); 4904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 4924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 4934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline Eina_Bool _ewk_tiled_backing_store_item_fill(Ewk_Tiled_Backing_Store_Data *priv, Ewk_Tiled_Backing_Store_Item *it, long col, int row) 4954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 496cad810f21b803229eb11403f9209855525a25d57Steve Block long m_col = priv->model.base.col + col; 497cad810f21b803229eb11403f9209855525a25d57Steve Block long m_row = priv->model.base.row + row; 4984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang double last_used = ecore_loop_time_get(); 4994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (m_col < 0 || m_row < 0 501cad810f21b803229eb11403f9209855525a25d57Steve Block || (unsigned long)(m_col) >= priv->model.cur.cols 502cad810f21b803229eb11403f9209855525a25d57Steve Block || (unsigned long)(m_row) >= priv->model.cur.rows) { 5034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) { 5054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_dissociate(priv, it, last_used); 5064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->update.process) 5074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_request_del(priv, it); 5084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 5094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } else { 5104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile *t; 5114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang const float zoom = priv->view.tile.zoom; 5124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->update.process) { 514cad810f21b803229eb11403f9209855525a25d57Steve Block if (it->update.row == (unsigned long)(m_row) 515cad810f21b803229eb11403f9209855525a25d57Steve Block && it->update.col == (unsigned long)(m_col) 5164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang && it->update.zoom == zoom) 5174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 5184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_request_del(priv, it); 5204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 5214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) { 5234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile *old = it->tile; 524cad810f21b803229eb11403f9209855525a25d57Steve Block if (old->row != (unsigned long)(m_row) 525cad810f21b803229eb11403f9209855525a25d57Steve Block || old->col != (unsigned long)(m_col) 526cad810f21b803229eb11403f9209855525a25d57Steve Block || old->zoom != zoom) { 5274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_dissociate(priv, it, 5284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang last_used); 5294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->update.process) 5304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_request_del(priv, it); 531cad810f21b803229eb11403f9209855525a25d57Steve Block } else if (old->row == (unsigned long)(m_row) 532cad810f21b803229eb11403f9209855525a25d57Steve Block && old->col == (unsigned long)(m_col) 5334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang && old->zoom == zoom) 5344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang goto end; 5354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 5364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang t = ewk_tile_matrix_tile_exact_get 5384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv->model.matrix, m_col, m_row, zoom); 5394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!t) { 5404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang /* NOTE: it never returns NULL if it->tile was set! */ 5414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) { 5424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang CRITICAL("it->tile=%p, but it should be NULL!", it->tile); 5434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_dissociate(priv, it, 5444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang last_used); 5454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 5464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang /* Do not add new requests to the render queue */ 5484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->render.suspend) { 5494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang t = _ewk_tiled_backing_store_tile_new(priv, m_col, m_row, zoom); 5504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!t) 5514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_FALSE; 5524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_associate(priv, t, it); 5534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 5544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } else if (t != it->tile) { 5554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!it->update.process) { 5564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) 5574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_dissociate(priv, 5584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it, last_used); 5594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_associate(priv, t, it); 5604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 5614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 5624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang end: 5644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 5664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 5674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 5694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 5704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Ewk_Tiled_Backing_Store_Item *_ewk_tiled_backing_store_item_add(Ewk_Tiled_Backing_Store_Data *priv, long col, int row) 5724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 5734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 5744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord x, y, tw, th; 5754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("o=%p", priv->self); 5774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang MALLOC_OR_OOM_RET(it, sizeof(*it), NULL); 5794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tw = priv->view.tile.w; 5814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang th = priv->view.tile.h; 5824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang x = priv->view.offset.base.x + priv->view.x + tw *col; 5834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang y = priv->view.offset.base.y + priv->view.y + th *row; 5844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->tile = NULL; 5864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->update.process = NULL; 5874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it->smooth_scale = priv->view.tile.zoom_weak_smooth_scale; 5884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_move(it, x, y); 5894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_resize(it, tw, th); 5904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!_ewk_tiled_backing_store_item_fill(priv, it, col, row)) { 5914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang free(it); 5924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return NULL; 5934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 5944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return it; 5964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 5974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 5984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_item_del(Ewk_Tiled_Backing_Store_Data *priv, Ewk_Tiled_Backing_Store_Item *it) 5994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 6004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) { 6014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang double last_used = ecore_loop_time_get(); 6024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_dissociate(priv, it, last_used); 6034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 6044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->update.process) 6054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_request_del(priv, it); 6064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang free(it); 6074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 6084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_item_smooth_scale_set(Ewk_Tiled_Backing_Store_Item *it, Eina_Bool smooth_scale) 6104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 6114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->smooth_scale == smooth_scale) 6124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 6134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) 6154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_image_smooth_scale_set(it->tile->image, smooth_scale); 6164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 6174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_changed(Ewk_Tiled_Backing_Store_Data *priv) 6194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 6204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->changed.any) 6214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 6224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_smart_changed(priv->self); 6234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.any = EINA_TRUE; 6244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 6254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_view_cols_end_del(Ewk_Tiled_Backing_Store_Data *priv, Eina_Inlist **p_row, unsigned int count) 6274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 6284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist *n; 6294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned int i; 6304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!count) 6324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 6334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang n = (*p_row)->last; 6354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (i = 0; i < count; i++) { 6374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 6384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it = EINA_INLIST_CONTAINER_GET(n, Ewk_Tiled_Backing_Store_Item); 6394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang n = n->prev; 6404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *p_row = eina_inlist_remove(*p_row, EINA_INLIST_GET(it)); 6414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_del(priv, it); 6424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 6434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 6444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_tiled_backing_store_view_cols_end_add(Ewk_Tiled_Backing_Store_Data *priv, Eina_Inlist **p_row, unsigned int base_col, unsigned int count) 6464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 6474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned int i, r = p_row - priv->view.items; 6484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (i = 0; i < count; i++, base_col++) { 6504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 6514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it = _ewk_tiled_backing_store_item_add(priv, base_col, r); 6534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!it) { 6544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang CRITICAL("failed to add column %u of %u in row %u.", i, count, r); 6554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_cols_end_del(priv, p_row, i); 6564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_FALSE; 6574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 6584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *p_row = eina_inlist_append(*p_row, EINA_INLIST_GET(it)); 6604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 6614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 6624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 6634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_view_row_del(Ewk_Tiled_Backing_Store_Data *priv, Eina_Inlist *row) 6654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 6664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang while (row) { 6674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 6684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it = EINA_INLIST_CONTAINER_GET(row, Ewk_Tiled_Backing_Store_Item); 6694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang row = row->next; 6704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_del(priv, it); 6714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 6724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 6734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_view_rows_range_del(Ewk_Tiled_Backing_Store_Data *priv, Eina_Inlist **start, Eina_Inlist **end) 6754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 6764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; start < end; start++) { 6774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_row_del(priv, *start); 6784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *start = NULL; 6794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 6804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 6814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_view_rows_all_del(Ewk_Tiled_Backing_Store_Data *priv) 6834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 6844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **start; 6854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **end; 6864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start = priv->view.items; 6884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang end = priv->view.items + priv->view.rows; 6894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_rows_range_del(priv, start, end); 6904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang free(priv->view.items); 6924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.items = NULL; 6934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.cols = 0; 6944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.rows = 0; 6954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 6964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 6974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_render(void *data, Ewk_Tile *t, const Eina_Rectangle *area) 6984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 6994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Data *priv = data; 7004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang INF("TODO %p (visible? %d) [%lu,%lu] %d,%d + %dx%d", 7024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang t, t->visible, t->col, t->row, area->x, area->y, area->w, area->h); 7034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!t->visible) 7054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 7064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->view.tile.w != t->w || priv->view.tile.h != t->h) 7084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; // todo: remove me later, don't even flag as dirty! 7094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_SAFETY_ON_NULL_RETURN(priv->render.cb); 7114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->render.cb(priv->render.data, t, area)) 7124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 7134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_image_data_update_add(t->image, area->x, area->y, area->w, area->h); 7154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 7164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_model_matrix_create(Ewk_Tiled_Backing_Store_Data *priv, Ewk_Tile_Unused_Cache *tuc) 7184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 7194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->model.matrix) { 7204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_rows_all_del(priv); 7214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.offset = EINA_FALSE; 7234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.size = EINA_TRUE; 7244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_free(priv->model.matrix); 7264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 7274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.matrix = ewk_tile_matrix_new 7294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (tuc, priv->model.cur.cols, priv->model.cur.rows, priv->cspace, 7304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_render, priv); 7314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 7324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_member_del(Evas_Object *o, Evas_Object *member) 7344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 7354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 7364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->contents_clipper) 7374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 7384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_clip_unset(member); 7394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!evas_object_clipees_get(priv->contents_clipper)) 7404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_hide(priv->contents_clipper); 7414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 7424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_member_add(Evas_Object *o, Evas_Object *member) 7444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 7454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 7464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->contents_clipper) 7474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 7484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_clip_set(member, priv->contents_clipper); 7494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (evas_object_visible_get(o)) 7504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_show(priv->contents_clipper); 7514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 7524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifdef DEBUG_MEM_LEAKS 7544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_mem_dbg(Ewk_Tiled_Backing_Store_Data *priv) 7554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 7564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang static int run = 0; 7574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang run++; 7594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf("\n--- BEGIN DEBUG TILED BACKING STORE MEMORY [%d] --\n" 7614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang "t=%0.2f, obj=%p, priv=%p, view.items=%p, matrix=%p\n", 7624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang run, ecore_loop_time_get(), 7634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->self, priv, priv->view.items, priv->model.matrix); 7644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_dbg(priv->model.matrix); 7664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_accounting_dbg(); 7674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf("--- END DEBUG TILED BACKING STORE MEMORY [%d] --\n\n", run); 7694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 7704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_tiled_backing_store_sig_usr(void *data, int type, void *event) 7724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 7734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ecore_Event_Signal_User *sig = (Ecore_Event_Signal_User*)event; 7744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Data *priv = (Ewk_Tiled_Backing_Store_Data*)data; 7754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (sig->number == 2) { 7774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Unused_Cache *tuc; 7784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tuc = ewk_tile_matrix_unused_cache_get(priv->model.matrix); 7794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_unused_cache_auto_flush(tuc); 7804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 7814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_dbg(priv); 7834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_mem_dbg(priv); 7844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 7854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 7864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 7874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_add(Evas_Object *o) 7894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 7904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Data *priv; 7914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("o=%p", o); 7934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang CALLOC_OR_OOM_RET(priv, sizeof(*priv)); 7954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 7964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->self = o; 7974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.tile.zoom = 1.0; 7984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.tile.w = TILE_W; 7994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.tile.h = TILE_H; 8004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.x = 0; 8014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.y = 0; 8024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.x = 0; 8034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.y = 0; 804f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->view.offset.base.x = 0; 805f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->view.offset.base.y = 0; 8064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 807f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->model.base.col = 0; 808f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->model.base.row = 0; 8094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.cur.cols = 1; 8104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.cur.rows = 1; 8114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.old.cols = 0; 8124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.old.rows = 0; 8134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.width = 0; 8144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.height = 0; 8154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.process_entire_queue = EINA_TRUE; 8164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.suspend = EINA_FALSE; 8174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->cspace = EVAS_COLORSPACE_ARGB8888; // TODO: detect it. 8184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_smart_data_set(o, priv); 8204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _parent_sc.add(o); 8214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->contents_clipper = evas_object_rectangle_add( 8234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_evas_get(o)); 8244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move(priv->contents_clipper, 0, 0); 8254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_resize(priv->contents_clipper, 8264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.width, priv->model.height); 8274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_color_set(priv->contents_clipper, 255, 255, 255, 255); 8284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_show(priv->contents_clipper); 8294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_smart_member_add(priv->contents_clipper, o); 8304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_model_matrix_create(priv, NULL); 8324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move(priv->base.clipper, 0, 0); 8334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_resize(priv->base.clipper, 0, 0); 8344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_clip_set(priv->contents_clipper, priv->base.clipper); 8354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifdef DEBUG_MEM_LEAKS 8374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->sig_usr = ecore_event_handler_add 8384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (ECORE_EVENT_SIGNAL_USER, _ewk_tiled_backing_store_sig_usr, priv); 8394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 8404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 8414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_del(Evas_Object *o) 8434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 8444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 8454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("o=%p", o); 8464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Unused_Cache *tuc; 8474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tuc = ewk_tile_matrix_unused_cache_get(priv->model.matrix); 8494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_unused_cache_unlock_area(tuc); 8504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_flush(priv); 8524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_pre_render_request_flush(priv); 8544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_process_idler_stop(priv); 8554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_rows_all_del(priv); 8564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifdef DEBUG_MEM_LEAKS 8584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_mem_dbg(priv); 8594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->sig_usr) 8604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->sig_usr = ecore_event_handler_del(priv->sig_usr); 8614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 8624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_free(priv->model.matrix); 8644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_smart_member_del(priv->contents_clipper); 8654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_del(priv->contents_clipper); 8664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _parent_sc.del(o); 8684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifdef DEBUG_MEM_LEAKS 8704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf("\nIMPORTANT: TILED BACKING STORE DELETED (may be real leaks)\n"); 8714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_accounting_dbg(); 8724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 8734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 8744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_move(Evas_Object *o, Evas_Coord x, Evas_Coord y) 8764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 8774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("o=%p, new pos: %dx%d", o, x, y); 8784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 8804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->changed.pos) 8824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 8834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->view.x == x && priv->view.y == y) 8854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 8864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.pos = EINA_TRUE; 8884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_changed(priv); 8894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 8904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_resize(Evas_Object *o, Evas_Coord w, Evas_Coord h) 8924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 8934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("o=%p, new size: %dx%d", o, w, h); 8944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 8964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 8974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->changed.size) 8984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 8994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->view.w == w && priv->view.h == h) 9014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 9024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.size = EINA_TRUE; 9044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_changed(priv); 9054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 9064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_recalc_renderers(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord w, Evas_Coord h, Evas_Coord tw, Evas_Coord th) 9084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 9094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang long cols, rows, old_rows, old_cols; 9104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang INF("o=%p, new size: %dx%d", priv->self, w, h); 9114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 912f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch cols = 1 + (int)ceil((float)w / (float)tw); 913f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch rows = 1 + (int)ceil((float)h / (float)th); 9144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang INF("o=%p new grid size cols: %ld, rows: %ld, was %ld, %ld", 9164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->self, cols, rows, priv->view.cols, priv->view.rows); 9174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->view.cols == cols && priv->view.rows == rows) 9194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 9204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang old_cols = priv->view.cols; 9224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang old_rows = priv->view.rows; 9234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (rows < old_rows) { 9254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **start, **end; 9264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start = priv->view.items + rows; 9274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang end = priv->view.items + old_rows; 9284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_rows_range_del(priv, start, end); 9294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 9304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang REALLOC_OR_OOM_RET(priv->view.items, sizeof(Eina_Inlist*) * (int)rows); 9314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.rows = rows; 9324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.cols = cols; 9334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (rows > old_rows) { 9344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **start, **end; 9354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start = priv->view.items + old_rows; 9364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang end = priv->view.items + rows; 9374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; start < end; start++) { 9384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool r; 9394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *start = NULL; 9404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r = _ewk_tiled_backing_store_view_cols_end_add 9414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv, start, 0, cols); 9424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!r) { 9434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang CRITICAL("failed to allocate %ld columns", cols); 9444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_rows_range_del 9454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv, priv->view.items + old_rows, start); 9464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.rows = old_rows; 9474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 9484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 9494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 9504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 9514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (cols != old_cols) { 9534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **start, **end; 9544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang int todo = cols - old_cols; 9554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start = priv->view.items; 9564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang end = start + MIN(old_rows, rows); 9574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (todo > 0) { 9584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; start < end; start++) { 9594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool r; 9604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r = _ewk_tiled_backing_store_view_cols_end_add 9614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv, start, old_cols, todo); 9624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!r) { 9634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang CRITICAL("failed to allocate %d columns!", todo); 9644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (start--; start >= priv->view.items; start--) 9664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_cols_end_del(priv, start, todo); 9674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (rows > old_rows) { 9684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start = priv->view.items + old_rows; 9694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang end = priv->view.items + rows; 9704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; start < end; start++) 9714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_cols_end_del(priv, start, todo); 9724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 9734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 9744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 9754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 9764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } else if (todo < 0) { 9774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang todo = -todo; 9784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; start < end; start++) 9794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_cols_end_del(priv, start, todo); 9804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 9814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 9824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_fill_renderers(priv); 9844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 9854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_calculate_size(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord w, Evas_Coord h) 9874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 9884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_resize(priv->base.clipper, w, h); 9894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.w = w; 9914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.h = h; 9924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_recalc_renderers( 9944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv, w, h, priv->view.tile.w, priv->view.tile.h); 9954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 9964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 9974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang// TODO: remove me later. 9984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline void _ewk_tiled_backing_store_view_dbg(const Ewk_Tiled_Backing_Store_Data *priv) 9994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 10004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **start, **end; 10014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf("tiles=%2ld,%2ld model=%2ld,%2ld [%dx%d] base=%+3ld,%+4ld offset=%+4d,%+4d old=%+4d,%+4d base=%+3d,%+3d\n", 10024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.cols, priv->view.rows, 10034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.cur.cols, priv->model.cur.rows, 10044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.width, priv->model.height, 10054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.col, priv->model.base.row, 10064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.x, priv->view.offset.cur.y, 10074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.x, priv->view.offset.old.y, 10084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.x, priv->view.offset.base.y); 10094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 10104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start = priv->view.items; 10114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang end = priv->view.items + priv->view.rows; 10124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; start < end; start++) { 10134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang const Ewk_Tiled_Backing_Store_Item *it; 10144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 10154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(*start, it) { 10164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf(" %+4d,%+4d ", it->geometry.x, it->geometry.y); 10174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 10184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!it->tile) 10194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf(" ;"); 10204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else 10214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf("%8p %lu,%lu;", it->tile, it->tile->col, it->tile->row); 10224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 10234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf("\n"); 10244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 10254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf("---\n"); 10264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 10274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 10284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/** 10294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @internal 10304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Move top row down as last. 10314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 10324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * The final result is visually the same, but logically the top that 10334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * went out of screen is now at bottom and filled with new model items. 10344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 10354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * This is worth just when @a count is smaller than @c 10364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * priv->view.rows, after that one is refilling the whole matrix so it 10374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * is better to trigger full refill. 10384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 10394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param count the number of times to repeat the process. 10404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 10414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_view_wrap_up(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord x, Evas_Coord y, unsigned int count) 10424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 10434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned int last_row = priv->view.rows - 1; 10444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord tw = priv->view.tile.w; 10454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord th = priv->view.tile.h; 1046f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Evas_Coord off_y = priv->view.offset.base.y + count * th; 10474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord oy = y + (last_row - count + 1) * th + off_y; 10484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr_start, **itr_end; 10494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 10504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_start = priv->view.items; 10514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_end = itr_start + last_row; 10524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 10534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; count > 0; count--) { 10544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr; 10554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist *tmp = *itr_start; 10564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 10574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord ox = x + priv->view.offset.base.x; 10584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang int c = 0; 10594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 10604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (itr = itr_start; itr < itr_end; itr++) 10614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *itr = *(itr + 1); 10624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *itr = tmp; 10634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 10644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.row++; 10654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(tmp, it) { 10664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_move(it, ox, oy); 10674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ox += tw; 10684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_fill(priv, it, c, last_row); 10694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang c++; 10704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 10714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy += th; 10724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 10734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.y = off_y; 10744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 10754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 10764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/** 10774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @internal 10784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Move bottom row up as first. 10794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 10804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * The final result is visually the same, but logically the bottom that 10814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * went out of screen is now at top and filled with new model items. 10824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 10834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * This is worth just when @a count is smaller than @c 10844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * priv->view.rows, after that one is refilling the whole matrix so it 10854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * is better to trigger full refill. 10864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 10874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param count the number of times to repeat the process. 10884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 10894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_view_wrap_down(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord x, Evas_Coord y, unsigned int count) 10904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 10914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord tw = priv->view.tile.w; 10924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord th = priv->view.tile.h; 1093f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Evas_Coord off_y = priv->view.offset.base.y - count * th; 10944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord oy = y + off_y + (count - 1) * th; 10954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr_start, **itr_end; 10964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 10974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_start = priv->view.items + priv->view.rows - 1; 10984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_end = priv->view.items; 10994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; count > 0; count--) { 11014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr; 11024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist *tmp = *itr_start; 11034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 11044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord ox = x + priv->view.offset.base.x; 11054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang int c = 0; 11064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (itr = itr_start; itr > itr_end; itr--) 11084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *itr = *(itr - 1); 11094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *itr = tmp; 11104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.row--; 11124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(tmp, it) { 11134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_move(it, ox, oy); 11144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ox += tw; 11154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_fill(priv, it, c, 0); 11164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang c++; 11174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 11184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy -= th; 11194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 11204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.y = off_y; 11214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 11224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/** 11244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @internal 11254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Move left-most (first) column right as last (right-most). 11264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 11274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * The final result is visually the same, but logically the first col that 11284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * went out of screen is now at last and filled with new model items. 11294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 11304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * This is worth just when @a count is smaller than @c 11314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * priv->view.cols, after that one is refilling the whole matrix so it 11324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * is better to trigger full refill. 11334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 11344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param count the number of times to repeat the process. 11354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 11364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_view_wrap_left(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord x, Evas_Coord y, unsigned int count) 11374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 11384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned int r, last_col = priv->view.cols - 1; 11394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord tw = priv->view.tile.w; 11404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord th = priv->view.tile.h; 1141f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Evas_Coord off_x = priv->view.offset.base.x + count * tw; 11424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord oy = y + priv->view.offset.base.y; 11434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr; 11444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr_end; 11454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr = priv->view.items; 11474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_end = itr + priv->view.rows; 11484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r = 0; 11494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.col += count; 11514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; itr < itr_end; itr++, r++) { 11534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord ox = x + (last_col - count + 1) * tw + off_x; 11544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned int i, c = last_col - count + 1; 11554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (i = 0; i < count; i++, c++, ox += tw) { 11574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 11584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it = EINA_INLIST_CONTAINER_GET(*itr, Ewk_Tiled_Backing_Store_Item); 11594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *itr = eina_inlist_demote(*itr, *itr); 11604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_move(it, ox, oy); 11624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_fill(priv, it, c, r); 11634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 11644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy += th; 11654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 11664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.x = off_x; 11684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 11694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/** 11714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @internal 11724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Move right-most (last) column left as first (left-most). 11734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 11744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * The final result is visually the same, but logically the last col that 11754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * went out of screen is now at first and filled with new model items. 11764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 11774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * This is worth just when @a count is smaller than @c 11784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * priv->view.cols, after that one is refilling the whole matrix so it 11794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * is better to trigger full refill. 11804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 11814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param count the number of times to repeat the process. 11824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 11834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_view_wrap_right(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord x, Evas_Coord y, unsigned int count) 11844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 11854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned int r; 11864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord tw = priv->view.tile.w; 11874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord th = priv->view.tile.h; 1188f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Evas_Coord off_x = priv->view.offset.base.x - count * tw; 11894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord oy = y + priv->view.offset.base.y; 11904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr, **itr_end; 11914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr = priv->view.items; 11934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_end = itr + priv->view.rows; 11944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r = 0; 11954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.col -= count; 11974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 11984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; itr < itr_end; itr++, r++) { 11994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord ox = x + (count - 1) * tw + off_x; 12004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned int i, c = count - 1; 12014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (i = 0; i < count; i++, c--, ox -= tw) { 12034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 12044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it = EINA_INLIST_CONTAINER_GET((*itr)->last, Ewk_Tiled_Backing_Store_Item); 12054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *itr = eina_inlist_promote(*itr, (*itr)->last); 12064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_move(it, ox, oy); 12084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_fill(priv, it, c, r); 12094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 12104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy += th; 12114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 12124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.x = off_x; 12144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 12154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_view_refill(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord x, Evas_Coord y, int step_x, int step_y) 12174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 12184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr, **itr_end; 12194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord base_ox, oy, tw, th; 12204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned int r; 12214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move(priv->base.clipper, x, y); 12234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tw = priv->view.tile.w; 12254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang th = priv->view.tile.h; 12264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang base_ox = x + priv->view.offset.base.x; 12284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy = y + priv->view.offset.base.y; 12294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr = priv->view.items; 12314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_end = itr + priv->view.rows; 12324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang r = 0; 12334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.col -= step_x; 12354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.row -= step_y; 12364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; itr < itr_end; itr++, r++) { 12384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 12394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord ox = base_ox; 12404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned int c = 0; 12414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(*itr, it) { 12424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_fill(priv, it, c, r); 12434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_move(it, ox, oy); 12444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang c++; 12454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ox += tw; 12464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 12474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy += th; 12484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 12494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 12504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_view_pos_apply(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord x, Evas_Coord y) 12524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 12534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr, **itr_end; 12544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord base_ox, oy, tw, th; 12554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move(priv->base.clipper, x, y); 12574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tw = priv->view.tile.w; 12594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang th = priv->view.tile.h; 12604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang base_ox = x + priv->view.offset.base.x; 12624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy = y + priv->view.offset.base.y; 12634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr = priv->view.items; 12654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_end = itr + priv->view.rows; 12664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; itr < itr_end; itr++) { 12674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 12684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord ox = base_ox; 12694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(*itr, it) { 12704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_move(it, ox, oy); 12714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ox += tw; 12724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 12734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy += th; 12744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 12754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 12764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_calculate_offset_force(Ewk_Tiled_Backing_Store_Data *priv) 12784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 12794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord dx = priv->view.offset.cur.x - priv->view.offset.old.x; 12804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord dy = priv->view.offset.cur.y - priv->view.offset.old.y; 12814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord tw, th; 12824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang int step_y, step_x; 12834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang INF("o=%p, offset: %+4d, %+4d (%+4d, %+4d)", 12854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->self, dx, dy, priv->view.offset.cur.x, priv->view.offset.cur.y); 12864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tw = priv->view.tile.w; 12884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang th = priv->view.tile.h; 12894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1290f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch long new_col = -priv->view.offset.cur.x / tw; 1291f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch step_x = priv->model.base.col - new_col; 1292f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch long new_row = -priv->view.offset.cur.y / th; 1293f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch step_y = priv->model.base.row - new_row; 12944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 12954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.x = priv->view.offset.cur.x; 12964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.y = priv->view.offset.cur.y; 12974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move( 12984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->contents_clipper, 12994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.x + priv->view.x, 13004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.y + priv->view.y); 13014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.x += dx - step_x * tw; 13034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.y += dy - step_y * th; 13044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_refill 13064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv, priv->view.x, priv->view.y, step_x, step_y); 13074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 13084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_calculate_offset(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord x, Evas_Coord y) 13104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 13114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord dx = priv->view.offset.cur.x - priv->view.offset.old.x; 13124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord dy = priv->view.offset.cur.y - priv->view.offset.old.y; 13134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord tw, th; 13144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang int step_y, step_x; 13154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang INF("o=%p, offset: %+4d, %+4d (%+4d, %+4d)", 13174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->self, dx, dy, priv->view.offset.cur.x, priv->view.offset.cur.y); 13184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!dx && !dy) 13204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 13214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tw = priv->view.tile.w; 13234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang th = priv->view.tile.h; 13244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1325f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch long new_col = -priv->view.offset.cur.x / tw; 1326f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch step_x = priv->model.base.col - new_col; 1327f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch long new_row = -priv->view.offset.cur.y / th; 1328f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch step_y = priv->model.base.row - new_row; 13294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.x = priv->view.offset.cur.x; 13314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.y = priv->view.offset.cur.y; 13324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move( 13334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->contents_clipper, 13344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.x + priv->view.x, 13354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.y + priv->view.y); 13364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if ((step_x < 0 && step_x <= -priv->view.cols) 13384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang || (step_x > 0 && step_x >= priv->view.cols) 13394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang || (step_y < 0 && step_y <= -priv->view.rows) 13404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang || (step_y > 0 && step_y >= priv->view.rows)) { 13414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.x += dx - step_x * tw; 13434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.y += dy - step_y * th; 13444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_refill 13464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv, priv->view.x, priv->view.y, step_x, step_y); 13474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 13484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 13494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.x += dx; 13514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.y += dy; 13524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (step_y < 0) 13544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_wrap_up(priv, x, y, -step_y); 13554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else if (step_y > 0) 13564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_wrap_down(priv, x, y, step_y); 13574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (step_x < 0) 13594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_wrap_left(priv, x, y, -step_x); 13604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else if (step_x > 0) 13614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_wrap_right(priv, x, y, step_x); 13624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_pos_apply(priv, x, y); 13644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 13654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_calculate_pos(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord x, Evas_Coord y) 13674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 13684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_view_pos_apply(priv, x, y); 13694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.x = x; 13704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.y = y; 13714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move( 13724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->contents_clipper, 13734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.x + priv->view.x, 13744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.y + priv->view.y); 13754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 13764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_fill_renderers(Ewk_Tiled_Backing_Store_Data *priv) 13784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 13794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist *it; 13804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *item; 13814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang int i, j; 13824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (i = 0; i < priv->view.rows; i++) { 13844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang it = priv->view.items[i]; 13854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang j = 0; 13864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(it, item) 13874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_fill(priv, item, j++, i); 13884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 13894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 13904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_tiled_backing_store_smart_calculate(Evas_Object *o) 13924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 13934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord x, y, w, h; 13944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_geometry_get(o, &x, &y, &w, &h); 13964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("o=%p at %d,%d + %dx%d", o, x, y, w, h); 13974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 13984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 13994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.any = EINA_FALSE; 14014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_freeze(priv->model.matrix); 14034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->render.suspend && priv->changed.model) { 1405cad810f21b803229eb11403f9209855525a25d57Steve Block unsigned long cols, rows; 14064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang cols = priv->model.width / priv->view.tile.w + 1; 14084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang rows = priv->model.height / priv->view.tile.h + 1; 14094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.old.cols = priv->model.cur.cols; 14114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.old.rows = priv->model.cur.rows; 14124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.cur.cols = cols; 14134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.cur.rows = rows; 14144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->model.old.cols > cols) 14154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang cols = priv->model.old.cols; 14164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->model.old.rows > rows) 14174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang rows = priv->model.old.rows; 14184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_resize(priv->model.matrix, cols, rows); 14194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 14204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->changed.pos && (priv->view.x != x || priv->view.y != y)) { 14224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_smart_calculate_pos(priv, x, y); 14234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.pos = EINA_FALSE; 14244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } else if (priv->changed.offset) { 14254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_smart_calculate_offset(priv, x, y); 14264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.offset = EINA_FALSE; 14274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 14284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->changed.size) { 14304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_smart_calculate_size(priv, w, h); 14314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.size = EINA_FALSE; 14324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 14334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->render.suspend && priv->changed.model) { 14354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Rectangle rect; 14364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang rect.x = 0; 14374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang rect.y = 0; 14384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang rect.w = priv->model.width; 14394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang rect.h = priv->model.height; 14404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_fill_renderers(priv); 14414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_resize(priv->model.matrix, 14424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.cur.cols, 14434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.cur.rows); 14444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.model = EINA_FALSE; 14454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_resize(priv->contents_clipper, 14464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.width, priv->model.height); 14474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_smart_calculate_offset_force(priv); 14484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang /* Make sure we do not miss any important repaint by 14504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * repainting the whole viewport */ 14514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang const Eina_Rectangle r = 14524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang { 0, 0, priv->model.width, priv->model.height }; 14534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_update(priv->model.matrix, &r, 14544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.tile.zoom); 14554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 14564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_thaw(priv->model.matrix); 14584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_updates_process(priv); 14604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1461f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (priv->view.offset.base.x > 0 1462f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch || priv->view.offset.base.x <= - priv->view.tile.w 1463f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch || priv->view.offset.base.y > 0 1464f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch || priv->view.offset.base.y <= - priv->view.tile.h) 14654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ERR("incorrect base offset %+4d,%+4d, tile=%dx%d, cur=%+4d,%+4d\n", 14664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.x, priv->view.offset.base.y, 14674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.tile.w, priv->view.tile.h, 14684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.x, priv->view.offset.cur.y); 14694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 14714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEvas_Object *ewk_tiled_backing_store_add(Evas *e) 14734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 14744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang static Evas_Smart *smart = NULL; 14754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (_ewk_tiled_log_dom < 0) 14774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_log_dom = eina_log_domain_register("Ewk_Tiled_Backing_Store", NULL); 14784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!smart) { 14804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang static Evas_Smart_Class sc = 14814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EVAS_SMART_CLASS_INIT_NAME_VERSION("Ewk_Tiled_Backing_Store"); 14824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_smart_clipped_smart_set(&sc); 14844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _parent_sc = sc; 14854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sc.add = _ewk_tiled_backing_store_smart_add; 14874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sc.del = _ewk_tiled_backing_store_smart_del; 14884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sc.resize = _ewk_tiled_backing_store_smart_resize; 14894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sc.move = _ewk_tiled_backing_store_smart_move; 14904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sc.calculate = _ewk_tiled_backing_store_smart_calculate; 14914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sc.member_add = _ewk_tiled_backing_store_smart_member_add; 14924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang sc.member_del = _ewk_tiled_backing_store_smart_member_del; 14934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang smart = evas_smart_class_new(&sc); 14954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 14964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 14974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return evas_object_smart_add(e, smart); 14984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 14994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_render_cb_set(Evas_Object *o, Eina_Bool (*cb)(void *data, Ewk_Tile *t, const Eina_Rectangle *area), const void *data) 15014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 15024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_SAFETY_ON_NULL_RETURN(cb); 15034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 15044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.cb = cb; 15054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.data = (void*)data; 15064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 15074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEwk_Tile_Unused_Cache *ewk_tiled_backing_store_tile_unused_cache_get(const Evas_Object *o) 15094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 15104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv, NULL); 15114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return ewk_tile_matrix_unused_cache_get(priv->model.matrix); 15124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 15134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_tile_unused_cache_set(Evas_Object *o, Ewk_Tile_Unused_Cache *tuc) 15154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 15164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 15174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (ewk_tile_matrix_unused_cache_get(priv->model.matrix) == tuc) 15194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 15204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_model_matrix_create(priv, tuc); 15224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 15234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_tiled_backing_store_scroll_full_offset_set_internal(Ewk_Tiled_Backing_Store_Data *priv, Evas_Coord x, Evas_Coord y) 15254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 15264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang /* TODO: check offset go out of bounds, clamp */ 15274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->render.disabled) 15284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_FALSE; 15294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.x = x; 15314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.y = y; 15324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.offset = EINA_TRUE; 15344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_changed(priv); 15354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 15374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 15384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_tiled_backing_store_scroll_full_offset_set(Evas_Object *o, Evas_Coord x, Evas_Coord y) 15404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 15414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("o=%p, x=%d, y=%d", o, x, y); 15424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv, EINA_FALSE); 15444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (x == priv->view.offset.cur.x && y == priv->view.offset.cur.y) 15454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 15464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return _ewk_tiled_backing_store_scroll_full_offset_set_internal(priv, x, y); 15484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 15494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_tiled_backing_store_scroll_full_offset_add(Evas_Object *o, Evas_Coord dx, Evas_Coord dy) 15514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 15524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("o=%p, dx=%d, dy=%d", o, dx, dy); 15534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv, EINA_FALSE); 15554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!dx && !dy) 15564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 15574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return _ewk_tiled_backing_store_scroll_full_offset_set_internal 15594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (priv, priv->view.offset.cur.x + dx, priv->view.offset.cur.y + dy); 15604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 15614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_tiled_backing_store_zoom_set_internal(Ewk_Tiled_Backing_Store_Data *priv, float *zoom, Evas_Coord cx, Evas_Coord cy, Evas_Coord *offx, Evas_Coord *offy) 15634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 15644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *offx = priv->view.offset.cur.x; 15654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *offy = priv->view.offset.cur.y; 15664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (fabsf(priv->view.tile.zoom - *zoom) < ZOOM_STEP_MIN) { 15684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("ignored as zoom difference is < %f: %f", 15694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (double)ZOOM_STEP_MIN, fabsf(priv->view.tile.zoom - *zoom)); 15704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 15714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 15724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_pre_render_request_flush(priv); 15744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord tw, th; 15754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tw = TILE_SIZE_AT_ZOOM(TILE_W, *zoom); 15764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tw = (tw >> 1) << 1; 15774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *zoom = TILE_W_ZOOM_AT_SIZE(tw); 15784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang /* WARNING: assume reverse zoom is the same for both axis */ 15794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang th = TILE_SIZE_AT_ZOOM(TILE_H, *zoom); 15804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang float scale = *zoom / priv->view.tile.zoom; 15824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.tile.zoom = *zoom; 15844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // todo: check cx [0, w]... 15854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.zoom_center.x = cx; 15864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.zoom_center.y = cy; 15874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.tile.w = tw; 15894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.tile.h = th; 15904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->view.w || !priv->view.h) { 1592f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->view.offset.base.x = 0; 1593f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->view.offset.base.y = 0; 15944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 15954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 15964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr, **itr_end; 15974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 15984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord new_x = cx + (priv->view.offset.cur.x - cx) * scale; 16004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord new_y = cy + (priv->view.offset.cur.y - cy) * scale; 16014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord bx = cx + (priv->view.offset.base.x - cx) * scale; 16024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord by = cy + (priv->view.offset.base.y - cy) * scale; 16034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord model_width = priv->model.width * scale; 16054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord model_height = priv->model.height * scale; 16064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (model_width < priv->view.w || new_x >= 0) 16084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_x = 0; 16094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else if (-new_x + priv->view.w >= model_width) 16104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_x = -model_width + priv->view.w; 16114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (model_height < priv->view.h || new_y >= 0) 16134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_y = 0; 16144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang else if (-new_y + priv->view.h >= model_height) 16154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_y = -model_height + priv->view.h; 16164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1617f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bx = new_x % tw; 1618f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->model.base.col = - new_x / tw; 1619f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch by = new_y % th; 1620f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->model.base.row = - new_y / th; 16214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.size = EINA_TRUE; 16234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_changed(priv); 16244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.x = new_x; 16264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.y = new_y; 16274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.x = bx; 16284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.y = by; 16294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.x = priv->view.offset.cur.x; 16314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.y = priv->view.offset.cur.y; 16324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *offx = priv->view.offset.cur.x; 16334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *offy = priv->view.offset.cur.y; 16344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move( 16364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->contents_clipper, 16374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_x + priv->view.x, 16384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_y + priv->view.y); 16394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_fill_renderers(priv); 16414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord oy = priv->view.offset.base.y + priv->view.y; 16434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord base_ox = priv->view.x + priv->view.offset.base.x; 16444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr = priv->view.items; 16464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_end = itr + priv->view.rows; 16474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; itr < itr_end; itr++) { 16494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord ox = base_ox; 16504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist *lst = *itr; 16514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(lst, it) { 16534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_move(it, ox, oy); 16544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_resize(it, tw, th); 16554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ox += tw; 16564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 16574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy += th; 16584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 16594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 16614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 16624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_tiled_backing_store_zoom_set(Evas_Object *o, float *zoom, Evas_Coord cx, Evas_Coord cy, Evas_Coord *offx, Evas_Coord *offy) 16644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 16654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("o=%p, zoom=%f", o, (double)*zoom); 16664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv, EINA_FALSE); 16684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return _ewk_tiled_backing_store_zoom_set_internal(priv, zoom, cx, cy, offx, offy); 16704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 16714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_tiled_backing_store_zoom_weak_set(Evas_Object *o, float zoom, Evas_Coord cx, Evas_Coord cy) 16734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 16744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("o=%p, zoom=%f", o, (double)zoom); 16754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv, EINA_FALSE); 16764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!priv->view.w || !priv->view.h) 16774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_FALSE; 16784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr, **itr_end; 16794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 16804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord tw, th; 16814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Bool recalc = EINA_FALSE; 16824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tw = TILE_SIZE_AT_ZOOM(TILE_W, zoom); 16844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang zoom = TILE_W_ZOOM_AT_SIZE(tw); 16854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang /* WARNING: assume reverse zoom is the same for both axis */ 16864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang th = TILE_SIZE_AT_ZOOM(TILE_H, zoom); 16874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang float scale = zoom / priv->view.tile.zoom; 16894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord model_width = priv->model.width * scale; 16914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord model_height = priv->model.height * scale; 16924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 16934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_resize(priv->contents_clipper, 16944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang model_width, model_height); 16954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1696f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch int vrows = ceil((float)priv->view.h / (float)th) + 1; 1697f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch int vcols = ceil((float)priv->view.w / (float)tw) + 1; 16984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord new_x = cx + (priv->view.offset.cur.x - cx) * scale; 16994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord new_y = cy + (priv->view.offset.cur.y - cy) * scale; 1700f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Evas_Coord bx = new_x % tw; 1701f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch Evas_Coord by = new_y % th; 1702f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch unsigned long base_row = -new_y / th; 1703f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch unsigned long base_col = -new_x / tw; 17044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (base_row != priv->model.base.row || base_col != priv->model.base.col) { 17064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.row = base_row; 17074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.col = base_col; 17084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang recalc = EINA_TRUE; 17094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 17104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (vrows > priv->view.rows || vcols > priv->view.cols) 17124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang recalc = EINA_TRUE; 17134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (recalc) { 17154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord w, h; 17164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_geometry_get(o, NULL, NULL, &w, &h); 17174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_recalc_renderers(priv, w, h, tw, th); 17184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_fill_renderers(priv); 17194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_updates_process(priv); 17204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 17214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord base_ox = bx + priv->view.x; 17234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord oy = by + priv->view.y; 17244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move(priv->contents_clipper, 17264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_x + priv->view.x, 17274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_y + priv->view.y); 17284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr = priv->view.items; 17304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_end = itr + priv->view.rows; 17314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; itr < itr_end; itr++) { 17334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord ox = base_ox; 17344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist *lst = *itr; 17354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(lst, it) { 17374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_move(it, ox, oy); 17384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_resize(it, tw, th); 17394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ox += tw; 17404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 17414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy += th; 17424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 17434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 17454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 17464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_fix_offsets(Evas_Object *o, Evas_Coord w, Evas_Coord h) 17484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 17494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 17504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr, **itr_end; 17514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 17524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord new_x = priv->view.offset.cur.x; 17534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord new_y = priv->view.offset.cur.y; 17544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord bx = priv->view.offset.base.x; 17554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord by = priv->view.offset.base.y; 17564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord tw = priv->view.tile.w; 17574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord th = priv->view.tile.h; 17584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (-new_x > w) { 17604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_x = -w; 1761f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bx = new_x % tw; 1762f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->model.base.col = -new_x / tw; 17634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 17644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (-new_y > h) { 17664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_y = -h; 1767f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch by = new_y % th; 1768f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->model.base.row = -new_y / th; 17694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 17704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (bx >= 0 || bx <= -2 * priv->view.tile.w) { 1772f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bx = new_x % tw; 1773f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->model.base.col = -new_x / tw; 17744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 17754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (by >= 0 || by <= -2 * priv->view.tile.h) { 1777f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch by = new_y % th; 1778f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->model.base.row = -new_y / th; 17794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 17804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.x = new_x; 17824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.y = new_y; 17834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.x = new_x; 17844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.y = new_y; 17854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.x = bx; 17864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.base.y = by; 17874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang evas_object_move(priv->contents_clipper, 17884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_x + priv->view.x, 17894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang new_y + priv->view.y); 17904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord oy = priv->view.offset.base.y + priv->view.y; 17924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord base_ox = priv->view.x + priv->view.offset.base.x; 17934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr = priv->view.items; 17954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_end = itr + priv->view.rows; 17964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 17974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; itr < itr_end; itr++) { 17984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord ox = base_ox; 17994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist *lst = *itr; 18004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(lst, it) { 18024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_move(it, ox, oy); 18034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_resize(it, tw, th); 18044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ox += tw; 18054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 18064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang oy += th; 18074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 18084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 18094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_zoom_weak_smooth_scale_set(Evas_Object *o, Eina_Bool smooth_scale) 18114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 18124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 18134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Inlist **itr, **itr_end; 18144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr = priv->view.items; 18164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang itr_end = itr + priv->view.rows; 18174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.tile.zoom_weak_smooth_scale = smooth_scale; 18184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (; itr< itr_end; itr++) { 18204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tiled_Backing_Store_Item *it; 18214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang EINA_INLIST_FOREACH(*itr, it) 18224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (it->tile) 18234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_smooth_scale_set 18244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang (it, smooth_scale); 18254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 18264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 18274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_tiled_backing_store_update(Evas_Object *o, const Eina_Rectangle *update) 18294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 18304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv, EINA_FALSE); 18314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->render.disabled) 18334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_FALSE; 18344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return ewk_tile_matrix_update(priv->model.matrix, update, 18364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.tile.zoom); 18374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 18384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_updates_process_pre_set(Evas_Object *o, void *(*cb)(void *data, Evas_Object *o), const void *data) 18404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 18414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 18424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->process.pre_cb = cb; 18434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->process.pre_data = (void*)data; 18444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 18454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_updates_process_post_set(Evas_Object *o, void *(*cb)(void *data, void *pre_data, Evas_Object *o), const void *data) 18474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 18484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 18494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->process.post_cb = cb; 18504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->process.post_data = (void*)data; 18514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 18524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_updates_process(Evas_Object *o) 18544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 18554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 18564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_updates_process(priv); 18574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 18584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_updates_clear(Evas_Object *o) 18604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 18614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 18624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_matrix_updates_clear(priv->model.matrix); 18644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 18654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_contents_resize(Evas_Object *o, Evas_Coord width, Evas_Coord height) 18674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 18684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 18694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (width == priv->model.width && height == priv->model.height) 18714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 18724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.width = width; 18744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.height = height; 18754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.model = EINA_TRUE; 18764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang DBG("width,height=%d, %d", width, height); 18784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_changed(priv); 18794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 18804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_disabled_update_set(Evas_Object *o, Eina_Bool value) 18824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 18834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 18844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (value != priv->render.disabled) 18864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.disabled = value; 18874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 18884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_flush(Evas_Object *o) 18904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 18914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 18924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Unused_Cache *tuc = NULL; 18934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 18944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.x = 0; 18954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.cur.y = 0; 18964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.x = 0; 18974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->view.offset.old.y = 0; 1898f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->view.offset.base.x = 0; 1899f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->view.offset.base.y = 0; 1900f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->model.base.col = 0; 1901f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch priv->model.base.row = 0; 19024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->changed.size = EINA_TRUE; 19034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifdef DEBUG_MEM_LEAKS 19054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf("\nFLUSHED BACKING STORE, STATUS BEFORE DELETING TILE MATRIX:\n"); 19064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_mem_dbg(priv); 19074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 19084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_pre_render_request_flush(priv); 19104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_tile_dissociate_all(priv); 19114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tuc = ewk_tile_matrix_unused_cache_get(priv->model.matrix); 19124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_unused_cache_clear(tuc); 19134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifdef DEBUG_MEM_LEAKS 19154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang printf("\nFLUSHED BACKING STORE, STATUS AFTER RECREATING TILE MATRIX:\n"); 19164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_mem_dbg(priv); 19174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif 19184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 19194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_tiled_backing_store_pre_render_region(Evas_Object *o, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, float zoom) 19214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 19224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv, EINA_FALSE); 19234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Eina_Tile_Grid_Slicer slicer; 19244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang const Eina_Tile_Grid_Info *info; 19254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Evas_Coord tw, th; 19264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Unused_Cache *tuc; 19274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tw = TILE_SIZE_AT_ZOOM(TILE_W, zoom); 19294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tw = (tw >> 1) << 1; 19304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang zoom = TILE_W_ZOOM_AT_SIZE(tw); 19314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang /* WARNING: assume reverse zoom is the same for both axis */ 19324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang th = TILE_SIZE_AT_ZOOM(TILE_H, zoom); 19334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!eina_tile_grid_slicer_setup(&slicer, x, y, w, h, tw, th)) { 19354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ERR("could not setup grid slicer for %d,%d+%dx%d tile=%dx%d", 19364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang x, y, w, h, tw, th); 19374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_FALSE; 19384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 19394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang while (eina_tile_grid_slicer_next(&slicer, &info)) { 19414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang const unsigned long c = info->col; 19424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang const unsigned long r = info->row; 1943f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!_ewk_tiled_backing_store_pre_render_request_add(priv, c, r, zoom, PRE_RENDER_PRIORITY_LOW)) 19444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang break; 19454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 19464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_process_idler_start(priv); 19484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tuc = ewk_tile_matrix_unused_cache_get(priv->model.matrix); 19504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_unused_cache_lock_area(tuc, x, y, w, h, zoom); 19514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 19524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 19534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_tiled_backing_store_pre_render_relative_radius(Evas_Object *o, unsigned int n, float zoom) 19554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 19564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv, EINA_FALSE); 19574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang unsigned long start_row, end_row, start_col, end_col, i, j, w, h; 19584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Unused_Cache *tuc; 19594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang INF("priv->model.base.row =%ld, n=%u priv->view.rows=%lu", 19614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.row, n, priv->view.rows); 19624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start_row = (long)priv->model.base.row - n; 19634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start_col = (long)priv->model.base.col - n; 19644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang end_row = MIN(priv->model.cur.rows - 1, 19654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.row + priv->view.rows + n - 1); 19664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang end_col = MIN(priv->model.cur.cols - 1, 19674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->model.base.col + priv->view.cols + n - 1); 19684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang INF("start_row=%lu, end_row=%lu, start_col=%lu, end_col=%lu", 19704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start_row, end_row, start_col, end_col); 19714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (i = start_row; i <= end_row; i++) 19734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang for (j = start_col; j <= end_col; j++) 1974f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!_ewk_tiled_backing_store_pre_render_request_add(priv, j, i, zoom, PRE_RENDER_PRIORITY_LOW)) 19754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang goto start_processing; 19764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstart_processing: 19784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_item_process_idler_start(priv); 19794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tuc = ewk_tile_matrix_unused_cache_get(priv->model.matrix); 19814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang h = (end_row - start_row + 1) * TILE_SIZE_AT_ZOOM(TILE_H, zoom); 19824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang w = (end_col - start_col + 1) * TILE_SIZE_AT_ZOOM(TILE_W, zoom); 19834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_unused_cache_lock_area(tuc, 19844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start_col * TILE_SIZE_AT_ZOOM(TILE_W, zoom), 19854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang start_row * TILE_SIZE_AT_ZOOM(TILE_H, zoom), w, h, zoom); 19864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return EINA_TRUE; 19884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 19894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_pre_render_cancel(Evas_Object *o) 19914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 19924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 19934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Ewk_Tile_Unused_Cache *tuc; 19944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1995f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch _ewk_tiled_backing_store_pre_render_request_clear(priv); 19964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 19974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang tuc = ewk_tile_matrix_unused_cache_get(priv->model.matrix); 19984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ewk_tile_unused_cache_unlock_area(tuc); 19994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 20004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 20014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_tiled_backing_store_disable_render(Evas_Object *o) 20024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 20034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv, EINA_FALSE); 20044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return _ewk_tiled_backing_store_disable_render(priv); 20054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 20064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 20074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_tiled_backing_store_enable_render(Evas_Object *o) 20084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 20094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv, EINA_FALSE); 20104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang _ewk_tiled_backing_store_changed(priv); 20114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return _ewk_tiled_backing_store_enable_render(priv); 20124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 20134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 20144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/** 20154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Set the process_entire_queue flag of the renderer idler. 20164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 20174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * 20184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param o the tiled backing store object 20194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param value EINA_TRUE if we want to process all the request of our queue. EINA_FALSE otherwise. 20204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */ 20214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_tiled_backing_store_process_entire_queue_set(Evas_Object *o, Eina_Bool value) 20224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{ 20234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang PRIV_DATA_GET_OR_RETURN(o, priv); 20244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (priv->render.process_entire_queue != value) 20254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang priv->render.process_entire_queue = value; 20264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang} 2027