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#ifndef ewk_tiled_backing_store_h
224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define ewk_tiled_backing_store_h
234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "EWebKit.h"
254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/* Enable accounting of render time in tile statistics */
274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang// #define TILE_STATS_ACCOUNT_RENDER_TIME
284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/* If define ewk will do more accounting to check for memory leaks
314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * try "kill -USR1 $PID" to get instantaneous debug
324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * try "kill -USR2 $PID" to get instantaneous debug and force flush of cache
334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */
344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define DEBUG_MEM_LEAKS 1
354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define TILE_W (256)
374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define TILE_H (256)
384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define ZOOM_STEP_MIN (0.01)
404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define TILE_SIZE_AT_ZOOM(SIZE, ZOOM) ((int)roundf((SIZE) * (ZOOM)))
424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define TILE_W_ZOOM_AT_SIZE(SIZE) ((float)SIZE / (float)TILE_W)
434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#define TILE_H_ZOOM_AT_SIZE(SIZE) ((float)SIZE / (float)TILE_H)
444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifdef __cplusplus
464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangextern "C" {
474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif
484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <Evas.h>
504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <cairo.h>
514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangtypedef struct _Ewk_Tile                     Ewk_Tile;
534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangtypedef struct _Ewk_Tile_Stats               Ewk_Tile_Stats;
544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangtypedef struct _Ewk_Tile_Matrix              Ewk_Tile_Matrix;
554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstruct _Ewk_Tile_Stats {
574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    double last_used;        /**< time of last use */
584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifdef TILE_STATS_ACCOUNT_RENDER_TIME
594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    double render_time;      /**< amount of time this tile took to render */
604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif
614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    unsigned int area;       /**< cache for (w * h) */
624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    unsigned int misses;     /**< number of times it became dirty but not
634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                              * repainted at all since it was not visible.
644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                              */
654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Eina_Bool full_update:1; /**< tile requires full size update */
664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang};
674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstruct _Ewk_Tile {
694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    EINA_INLIST;            /**< sibling tiles at same (i, j) but other zoom */
704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Eina_Tiler *updates;    /**< updated/dirty areas */
714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Ewk_Tile_Stats stats;       /**< tile usage statistics */
724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    unsigned long col, row; /**< tile tile position */
734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Evas_Coord x, y;        /**< tile coordinate position */
744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    /* TODO: does it worth to keep those or create on demand? */
764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    cairo_surface_t *surface;
774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    cairo_t *cairo;
784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    /** Never ever change those after tile is created (respect const!) */
804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const Evas_Coord w, h;        /**< tile size (see TILE_SIZE_AT_ZOOM()) */
814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const Evas_Colorspace cspace; /**< colorspace */
824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const float zoom;             /**< zoom level contents were rendered at */
834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const size_t bytes;           /**< bytes used in pixels. keep
844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                                   * before pixels to guarantee
854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                                   * alignement!
864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                                   */
874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    int visible;                  /**< visibility counter of this tile */
884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Evas_Object *image;           /**< Evas Image, the tile to be rendered */
894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    uint8_t *pixels;
904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang};
914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "ewk_tiled_matrix.h"
934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "ewk_tiled_model.h"
944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/* view */
964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Evas_Object *ewk_tiled_backing_store_add(Evas *e);
974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void 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);
994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Eina_Bool    ewk_tiled_backing_store_scroll_full_offset_set(Evas_Object *o, Evas_Coord x, Evas_Coord y);
1014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Eina_Bool    ewk_tiled_backing_store_scroll_full_offset_add(Evas_Object *o, Evas_Coord dx, Evas_Coord dy);
1024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Eina_Bool    ewk_tiled_backing_store_scroll_inner_offset_add(Evas_Object *o, Evas_Coord dx, Evas_Coord dy, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
1034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Eina_Bool    ewk_tiled_backing_store_zoom_set(Evas_Object *o, float *zoom, Evas_Coord cx, Evas_Coord cy, Evas_Coord *offx, Evas_Coord *offy);
1054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Eina_Bool    ewk_tiled_backing_store_zoom_weak_set(Evas_Object *o, float zoom, Evas_Coord cx, Evas_Coord cy);
1064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_fix_offsets(Evas_Object *o, Evas_Coord w, Evas_Coord h);
107f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochEAPI void ewk_tiled_backing_store_zoom_weak_smooth_scale_set(Evas_Object *o, Eina_Bool smooth_scale);
1084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Eina_Bool    ewk_tiled_backing_store_update(Evas_Object *o, const Eina_Rectangle *update);
1094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_updates_process_pre_set(Evas_Object *o, void *(*cb)(void *data, Evas_Object *o), const void *data);
1104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_updates_process_post_set(Evas_Object *o, void *(*cb)(void *data, void *pre_data, Evas_Object *o), const void *data);
1114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_process_entire_queue_set(Evas_Object *o, Eina_Bool value);
1124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_updates_process(Evas_Object *o);
1134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_updates_clear(Evas_Object *o);
1144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_contents_resize(Evas_Object *o, Evas_Coord width, Evas_Coord height);
1154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_disabled_update_set(Evas_Object *o, Eina_Bool value);
1164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_flush(Evas_Object *o);
1174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_enable_scale_set(Evas_Object *o, Eina_Bool value);
1184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Ewk_Tile_Unused_Cache *ewk_tiled_backing_store_tile_unused_cache_get(const Evas_Object *o);
1204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void                   ewk_tiled_backing_store_tile_unused_cache_set(Evas_Object *o, Ewk_Tile_Unused_Cache *tuc);
1214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Eina_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);
1234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Eina_Bool ewk_tiled_backing_store_pre_render_relative_radius(Evas_Object *o, unsigned int n, float zoom);
1244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI void ewk_tiled_backing_store_pre_render_cancel(Evas_Object *o);
1254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Eina_Bool ewk_tiled_backing_store_disable_render(Evas_Object *o);
1274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEAPI Eina_Bool ewk_tiled_backing_store_enable_render(Evas_Object *o);
1284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#ifdef __cplusplus
1294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
1304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif
1314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif // ewk_tiled_backing_store_h
132