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