diff options
Diffstat (limited to 'WebKit/efl/ewk/ewk_tiled_backing_store.c')
-rw-r--r-- | WebKit/efl/ewk/ewk_tiled_backing_store.c | 175 |
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); |