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