summaryrefslogtreecommitdiffstats
path: root/WebKit/efl/ewk/ewk_tiled_backing_store.c
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/efl/ewk/ewk_tiled_backing_store.c')
-rw-r--r--WebKit/efl/ewk/ewk_tiled_backing_store.c175
1 files changed, 56 insertions, 119 deletions
diff --git a/WebKit/efl/ewk/ewk_tiled_backing_store.c b/WebKit/efl/ewk/ewk_tiled_backing_store.c
index 0e8898b..a998c5c 100644
--- a/WebKit/efl/ewk/ewk_tiled_backing_store.c
+++ b/WebKit/efl/ewk/ewk_tiled_backing_store.c
@@ -62,7 +62,6 @@ struct _Ewk_Tiled_Backing_Store_Item {
unsigned long row, col;
float zoom;
} update;
- Ewk_Tiled_Backing_Store_Pre_Render_Request *pre_render;
Eina_Bool smooth_scale;
};
@@ -70,7 +69,6 @@ struct _Ewk_Tiled_Backing_Store_Pre_Render_Request {
EINA_INLIST;
unsigned long col, row;
float zoom;
- struct _Ewk_Tiled_Backing_Store_Item *it;
};
struct _Ewk_Tiled_Backing_Store_Data {
@@ -266,7 +264,7 @@ static void _ewk_tiled_backing_store_tile_dissociate_all(Ewk_Tiled_Backing_Store
}
}
-static 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_Item *it, Ewk_Tiled_Backing_Store_Pre_Render_Priority priority)
+static 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)
{
Ewk_Tiled_Backing_Store_Pre_Render_Request *r;
@@ -282,10 +280,7 @@ static inline Eina_Bool _ewk_tiled_backing_store_pre_render_request_add(Ewk_Tile
r->col = col;
r->row = row;
r->zoom = zoom;
- r->it = it;
- if (it)
- it->pre_render = r;
return EINA_TRUE;
}
@@ -309,14 +304,12 @@ static void _ewk_tiled_backing_store_pre_render_request_flush(Ewk_Tiled_Backing_
while (*pl) {
Ewk_Tiled_Backing_Store_Pre_Render_Request *r;
r = _ewk_tiled_backing_store_pre_render_request_first(priv);
- if (r->it && r->it->pre_render)
- r->it->pre_render = NULL;
*pl = eina_inlist_remove(*pl, *pl);
free(r);
}
}
-static void _ewk_tiled_backing_store_pre_render_request_remove_unassociated(Ewk_Tiled_Backing_Store_Data *priv)
+static void _ewk_tiled_backing_store_pre_render_request_clear(Ewk_Tiled_Backing_Store_Data *priv)
{
Eina_Inlist **pl = &priv->render.pre_render_requests;
Eina_Inlist *iter = *pl, *tmp;
@@ -324,33 +317,10 @@ static void _ewk_tiled_backing_store_pre_render_request_remove_unassociated(Ewk_
Ewk_Tiled_Backing_Store_Pre_Render_Request *r =
EINA_INLIST_CONTAINER_GET(
iter, Ewk_Tiled_Backing_Store_Pre_Render_Request);
- if (!r->it) {
- tmp = iter->next;
- *pl = eina_inlist_remove(*pl, iter);
- iter = tmp;
- free(r);
- } else
- iter = iter->next;
- }
-}
-
-static void _ewk_tiled_backing_store_pre_render_request_remove_associated(Ewk_Tiled_Backing_Store_Data *priv)
-{
- Eina_Inlist **pl = &priv->render.pre_render_requests;
- Eina_Inlist *iter = *pl, *tmp;
- while (iter) {
- Ewk_Tiled_Backing_Store_Pre_Render_Request *r =
- EINA_INLIST_CONTAINER_GET(
- iter, Ewk_Tiled_Backing_Store_Pre_Render_Request);
- if (r->it) {
- if (r->it->pre_render)
- r->it->pre_render = NULL;
- tmp = iter->next;
- *pl = eina_inlist_remove(*pl, iter);
- iter = tmp;
- free(r);
- } else
- iter = iter->next;
+ tmp = iter->next;
+ *pl = eina_inlist_remove(*pl, iter);
+ iter = tmp;
+ free(r);
}
}
@@ -379,11 +349,6 @@ static void _ewk_tiled_backing_store_pre_render_request_process_single(Ewk_Tiled
goto end;
}
- if (req->it && req->it->tile) {
- CRITICAL("it->tile = %p (%lu, %lu), but should be NULL", req->it->tile, req->it->tile->row, req->it->tile->col);
- goto end;
- }
-
t = _ewk_tiled_backing_store_tile_new(priv, col, row, zoom);
if (!t)
goto end;
@@ -399,12 +364,7 @@ static void _ewk_tiled_backing_store_pre_render_request_process_single(Ewk_Tiled
area.x, area.y, area.w, area.h);
ewk_tile_matrix_tile_updates_clear(tm, t);
- if (req->it) {
- _ewk_tiled_backing_store_tile_associate(priv, t, req->it);
- if (req->it->pre_render)
- req->it->pre_render = NULL;
- } else
- ewk_tile_matrix_tile_put(tm, t, last_used);
+ ewk_tile_matrix_tile_put(tm, t, last_used);
end:
_ewk_tiled_backing_store_pre_render_request_del(priv, req);
@@ -610,12 +570,6 @@ static inline Eina_Bool _ewk_tiled_backing_store_item_fill(Ewk_Tiled_Backing_Sto
_ewk_tiled_backing_store_item_request_del(priv, it);
}
- if (it->pre_render) {
- _ewk_tiled_backing_store_pre_render_request_del(
- priv, it->pre_render);
- it->pre_render = NULL;
- }
-
if (it->tile) {
Ewk_Tile *old = it->tile;
if (old->row != m_row || old->col != m_col || old->zoom != zoom) {
@@ -640,19 +594,6 @@ static inline Eina_Bool _ewk_tiled_backing_store_item_fill(Ewk_Tiled_Backing_Sto
/* Do not add new requests to the render queue */
if (!priv->render.suspend) {
- if (!_ewk_tiled_backing_store_tile_is_inside_viewport(
- priv, m_col, m_row)) {
- DBG("%d,%d is not inside the viewport", m_col, m_row);
- if (_ewk_tiled_backing_store_tile_is_adjacent_to_viewport(
- priv, m_col, m_row))
- _ewk_tiled_backing_store_pre_render_request_add(
- priv, m_col, m_row, zoom, it,
- PRE_RENDER_PRIORITY_HIGH);
- _ewk_tiled_backing_store_item_process_idler_start(priv);
-
- goto end;
- }
-
t = _ewk_tiled_backing_store_tile_new(priv, m_col, m_row, zoom);
if (!t)
return EINA_FALSE;
@@ -692,7 +633,6 @@ static Ewk_Tiled_Backing_Store_Item *_ewk_tiled_backing_store_item_add(Ewk_Tiled
it->tile = NULL;
it->update.process = NULL;
it->smooth_scale = priv->view.tile.zoom_weak_smooth_scale;
- it->pre_render = NULL;
_ewk_tiled_backing_store_item_move(it, x, y);
_ewk_tiled_backing_store_item_resize(it, tw, th);
if (!_ewk_tiled_backing_store_item_fill(priv, it, col, row)) {
@@ -711,11 +651,6 @@ static void _ewk_tiled_backing_store_item_del(Ewk_Tiled_Backing_Store_Data *priv
}
if (it->update.process)
_ewk_tiled_backing_store_item_request_del(priv, it);
- if (it->pre_render) {
- _ewk_tiled_backing_store_pre_render_request_del(
- priv, it->pre_render);
- it->pre_render = NULL;
- }
free(it);
}
@@ -914,11 +849,11 @@ static void _ewk_tiled_backing_store_smart_add(Evas_Object *o)
priv->view.offset.cur.y = 0;
priv->view.offset.old.x = 0;
priv->view.offset.old.y = 0;
- priv->view.offset.base.x = -TILE_W;
- priv->view.offset.base.y = -TILE_H;
+ priv->view.offset.base.x = 0;
+ priv->view.offset.base.y = 0;
- priv->model.base.col = -1;
- priv->model.base.row = -1;
+ priv->model.base.col = 0;
+ priv->model.base.row = 0;
priv->model.cur.cols = 1;
priv->model.cur.rows = 1;
priv->model.old.cols = 0;
@@ -1022,8 +957,8 @@ static void _ewk_tiled_backing_store_recalc_renderers(Ewk_Tiled_Backing_Store_Da
long cols, rows, old_rows, old_cols;
INF("o=%p, new size: %dx%d", priv->self, w, h);
- cols = 2 + (int)ceil((float)w / (float)tw);
- rows = 2 + (int)ceil((float)h / (float)th);
+ cols = 1 + (int)ceil((float)w / (float)tw);
+ rows = 1 + (int)ceil((float)h / (float)th);
INF("o=%p new grid size cols: %ld, rows: %ld, was %ld, %ld",
priv->self, cols, rows, priv->view.cols, priv->view.rows);
@@ -1031,8 +966,6 @@ static void _ewk_tiled_backing_store_recalc_renderers(Ewk_Tiled_Backing_Store_Da
if (priv->view.cols == cols && priv->view.rows == rows)
return;
- _ewk_tiled_backing_store_pre_render_request_remove_associated(priv);
-
old_cols = priv->view.cols;
old_rows = priv->view.rows;
@@ -1158,7 +1091,7 @@ static void _ewk_tiled_backing_store_view_wrap_up(Ewk_Tiled_Backing_Store_Data *
unsigned int last_row = priv->view.rows - 1;
Evas_Coord tw = priv->view.tile.w;
Evas_Coord th = priv->view.tile.h;
- Evas_Coord off_y = (priv->view.offset.base.y % th) - th;
+ Evas_Coord off_y = priv->view.offset.base.y + count * th;
Evas_Coord oy = y + (last_row - count + 1) * th + off_y;
Eina_Inlist **itr_start, **itr_end;
@@ -1205,7 +1138,7 @@ static void _ewk_tiled_backing_store_view_wrap_down(Ewk_Tiled_Backing_Store_Data
{
Evas_Coord tw = priv->view.tile.w;
Evas_Coord th = priv->view.tile.h;
- Evas_Coord off_y = (priv->view.offset.base.y % th) - th;
+ Evas_Coord off_y = priv->view.offset.base.y - count * th;
Evas_Coord oy = y + off_y + (count - 1) * th;
Eina_Inlist **itr_start, **itr_end;
@@ -1253,7 +1186,7 @@ static void _ewk_tiled_backing_store_view_wrap_left(Ewk_Tiled_Backing_Store_Data
unsigned int r, last_col = priv->view.cols - 1;
Evas_Coord tw = priv->view.tile.w;
Evas_Coord th = priv->view.tile.h;
- Evas_Coord off_x = (priv->view.offset.base.x % tw) - tw;
+ Evas_Coord off_x = priv->view.offset.base.x + count * tw;
Evas_Coord oy = y + priv->view.offset.base.y;
Eina_Inlist **itr;
Eina_Inlist **itr_end;
@@ -1300,7 +1233,7 @@ static void _ewk_tiled_backing_store_view_wrap_right(Ewk_Tiled_Backing_Store_Dat
unsigned int r;
Evas_Coord tw = priv->view.tile.w;
Evas_Coord th = priv->view.tile.h;
- Evas_Coord off_x = (priv->view.offset.base.x % tw) - tw;
+ Evas_Coord off_x = priv->view.offset.base.x - count * tw;
Evas_Coord oy = y + priv->view.offset.base.y;
Eina_Inlist **itr, **itr_end;
@@ -1402,8 +1335,10 @@ static void _ewk_tiled_backing_store_smart_calculate_offset_force(Ewk_Tiled_Back
tw = priv->view.tile.w;
th = priv->view.tile.h;
- step_x = (dx + priv->view.offset.base.x + tw) / tw;
- step_y = (dy + priv->view.offset.base.y + th) / th;
+ long new_col = -priv->view.offset.cur.x / tw;
+ step_x = priv->model.base.col - new_col;
+ long new_row = -priv->view.offset.cur.y / th;
+ step_y = priv->model.base.row - new_row;
priv->view.offset.old.x = priv->view.offset.cur.x;
priv->view.offset.old.y = priv->view.offset.cur.y;
@@ -1435,8 +1370,10 @@ static void _ewk_tiled_backing_store_smart_calculate_offset(Ewk_Tiled_Backing_St
tw = priv->view.tile.w;
th = priv->view.tile.h;
- step_x = (dx + priv->view.offset.base.x + tw) / tw;
- step_y = (dy + priv->view.offset.base.y + th) / th;
+ long new_col = -priv->view.offset.cur.x / tw;
+ step_x = priv->model.base.col - new_col;
+ long new_row = -priv->view.offset.cur.y / th;
+ step_y = priv->model.base.row - new_row;
priv->view.offset.old.x = priv->view.offset.cur.x;
priv->view.offset.old.y = priv->view.offset.cur.y;
@@ -1569,10 +1506,10 @@ static void _ewk_tiled_backing_store_smart_calculate(Evas_Object *o)
_ewk_tiled_backing_store_updates_process(priv);
- if (priv->view.offset.base.x >= 0
- || priv->view.offset.base.x <= -2 * priv->view.tile.w
- || priv->view.offset.base.y >= 0
- || priv->view.offset.base.y <= -2 * priv->view.tile.h)
+ if (priv->view.offset.base.x > 0
+ || priv->view.offset.base.x <= - priv->view.tile.w
+ || priv->view.offset.base.y > 0
+ || priv->view.offset.base.y <= - priv->view.tile.h)
ERR("incorrect base offset %+4d,%+4d, tile=%dx%d, cur=%+4d,%+4d\n",
priv->view.offset.base.x, priv->view.offset.base.y,
priv->view.tile.w, priv->view.tile.h,
@@ -1700,8 +1637,8 @@ static Eina_Bool _ewk_tiled_backing_store_zoom_set_internal(Ewk_Tiled_Backing_St
priv->view.tile.h = th;
if (!priv->view.w || !priv->view.h) {
- priv->view.offset.base.x = -tw;
- priv->view.offset.base.y = -th;
+ priv->view.offset.base.x = 0;
+ priv->view.offset.base.y = 0;
return EINA_TRUE;
}
Eina_Inlist **itr, **itr_end;
@@ -1725,10 +1662,10 @@ static Eina_Bool _ewk_tiled_backing_store_zoom_set_internal(Ewk_Tiled_Backing_St
else if (-new_y + priv->view.h >= model_height)
new_y = -model_height + priv->view.h;
- bx = new_x % tw - tw;
- priv->model.base.col = - new_x / tw - 1;
- by = new_y % th - th;
- priv->model.base.row = - new_y / th - 1;
+ bx = new_x % tw;
+ priv->model.base.col = - new_x / tw;
+ by = new_y % th;
+ priv->model.base.row = - new_y / th;
priv->changed.size = EINA_TRUE;
_ewk_tiled_backing_store_changed(priv);
@@ -1804,14 +1741,14 @@ Eina_Bool ewk_tiled_backing_store_zoom_weak_set(Evas_Object *o, float zoom, Evas
evas_object_resize(priv->contents_clipper,
model_width, model_height);
- int vrows = ceil((float)priv->view.h / (float)th) + 2;
- int vcols = ceil((float)priv->view.w / (float)tw) + 2;
+ int vrows = ceil((float)priv->view.h / (float)th) + 1;
+ int vcols = ceil((float)priv->view.w / (float)tw) + 1;
Evas_Coord new_x = cx + (priv->view.offset.cur.x - cx) * scale;
Evas_Coord new_y = cy + (priv->view.offset.cur.y - cy) * scale;
- Evas_Coord bx = new_x % tw - tw;
- Evas_Coord by = new_y % th - th;
- unsigned long base_row = -new_y / th - 1;
- unsigned long base_col = -new_x / tw - 1;
+ Evas_Coord bx = new_x % tw;
+ Evas_Coord by = new_y % th;
+ unsigned long base_row = -new_y / th;
+ unsigned long base_col = -new_x / tw;
if (base_row != priv->model.base.row || base_col != priv->model.base.col) {
priv->model.base.row = base_row;
@@ -1869,24 +1806,24 @@ void ewk_tiled_backing_store_fix_offsets(Evas_Object *o, Evas_Coord w, Evas_Coor
if (-new_x > w) {
new_x = -w;
- bx = new_x % tw - tw;
- priv->model.base.col = -new_x / tw - 1;
+ bx = new_x % tw;
+ priv->model.base.col = -new_x / tw;
}
if (-new_y > h) {
new_y = -h;
- by = new_y % th - th;
- priv->model.base.row = -new_y / th - 1;
+ by = new_y % th;
+ priv->model.base.row = -new_y / th;
}
if (bx >= 0 || bx <= -2 * priv->view.tile.w) {
- bx = new_x % tw - tw;
- priv->model.base.col = -new_x / tw - 1;
+ bx = new_x % tw;
+ priv->model.base.col = -new_x / tw;
}
if (by >= 0 || by <= -2 * priv->view.tile.h) {
- by = new_y % th - th;
- priv->model.base.row = -new_y / th - 1;
+ by = new_y % th;
+ priv->model.base.row = -new_y / th;
}
priv->view.offset.cur.x = new_x;
@@ -2006,10 +1943,10 @@ void ewk_tiled_backing_store_flush(Evas_Object *o)
priv->view.offset.cur.y = 0;
priv->view.offset.old.x = 0;
priv->view.offset.old.y = 0;
- priv->view.offset.base.x = -priv->view.tile.w;
- priv->view.offset.base.y = -priv->view.tile.h;
- priv->model.base.col = -1;
- priv->model.base.row = -1;
+ priv->view.offset.base.x = 0;
+ priv->view.offset.base.y = 0;
+ priv->model.base.col = 0;
+ priv->model.base.row = 0;
priv->changed.size = EINA_TRUE;
#ifdef DEBUG_MEM_LEAKS
@@ -2051,7 +1988,7 @@ Eina_Bool ewk_tiled_backing_store_pre_render_region(Evas_Object *o, Evas_Coord x
while (eina_tile_grid_slicer_next(&slicer, &info)) {
const unsigned long c = info->col;
const unsigned long r = info->row;
- if (!_ewk_tiled_backing_store_pre_render_request_add(priv, c, r, zoom, NULL, PRE_RENDER_PRIORITY_LOW))
+ if (!_ewk_tiled_backing_store_pre_render_request_add(priv, c, r, zoom, PRE_RENDER_PRIORITY_LOW))
break;
}
@@ -2082,7 +2019,7 @@ Eina_Bool ewk_tiled_backing_store_pre_render_relative_radius(Evas_Object *o, uns
for (i = start_row; i <= end_row; i++)
for (j = start_col; j <= end_col; j++)
- if (!_ewk_tiled_backing_store_pre_render_request_add(priv, j, i, zoom, NULL, PRE_RENDER_PRIORITY_LOW))
+ if (!_ewk_tiled_backing_store_pre_render_request_add(priv, j, i, zoom, PRE_RENDER_PRIORITY_LOW))
goto start_processing;
start_processing:
@@ -2103,7 +2040,7 @@ void ewk_tiled_backing_store_pre_render_cancel(Evas_Object *o)
PRIV_DATA_GET_OR_RETURN(o, priv);
Ewk_Tile_Unused_Cache *tuc;
- _ewk_tiled_backing_store_pre_render_request_remove_unassociated(priv);
+ _ewk_tiled_backing_store_pre_render_request_clear(priv);
tuc = ewk_tile_matrix_unused_cache_get(priv->model.matrix);
ewk_tile_unused_cache_unlock_area(tuc);