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_view.h"
234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "ewk_logging.h"
254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <Evas.h>
274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <eina_safety_checks.h>
284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <ewk_tiled_backing_store.h>
294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Ewk_View_Smart_Class _parent_sc = EWK_VIEW_SMART_CLASS_INIT_NULL;
314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_render_cb(void *data, Ewk_Tile *t, const Eina_Rectangle *area)
334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Ewk_View_Private_Data *priv = (Ewk_View_Private_Data*)data;
354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Eina_Rectangle r = {area->x + t->x, area->y + t->y, area->w, area->h};
364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return ewk_view_paint_contents(priv, t->cairo, &r);
384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void *_ewk_view_tiled_updates_process_pre(void *data, Evas_Object *o)
414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Ewk_View_Private_Data *priv = (Ewk_View_Private_Data*)data;
434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_view_layout_if_needed_recursive(priv);
444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return 0;
454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Evas_Object *_ewk_view_tiled_smart_backing_store_add(Ewk_View_Smart_Data *sd)
484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Evas_Object *bs = ewk_tiled_backing_store_add(sd->base.evas);
504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_render_cb_set
514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (bs, _ewk_view_tiled_render_cb, sd->_priv);
524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_updates_process_pre_set
534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (bs, _ewk_view_tiled_updates_process_pre, sd->_priv);
544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return bs;
554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void
584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang_ewk_view_tiled_contents_size_changed_cb(void *data, Evas_Object *o, void *event_info)
594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Evas_Coord *size = (Evas_Coord*)event_info;
614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Ewk_View_Smart_Data *sd = (Ewk_View_Smart_Data*)data;
624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_contents_resize
644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (sd->backing_store, size[0], size[1]);
654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_view_tiled_smart_add(Evas_Object *o)
684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Ewk_View_Smart_Data *sd;
704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    _parent_sc.sc.add(o);
724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    sd = (Ewk_View_Smart_Data*)evas_object_smart_data_get(o);
744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    evas_object_smart_callback_add(
754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        sd->main_frame, "contents,size,changed",
764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        _ewk_view_tiled_contents_size_changed_cb, sd);
774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_frame_paint_full_set(sd->main_frame, EINA_TRUE);
784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_scrolls_process(Ewk_View_Smart_Data *sd)
814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const Ewk_Scroll_Request *sr;
834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const Ewk_Scroll_Request *sr_end;
844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    size_t count;
854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Evas_Coord vw, vh;
864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_frame_contents_size_get(sd->main_frame, &vw, &vh);
884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    sr = ewk_view_scroll_requests_get(sd->_priv, &count);
904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    sr_end = sr + count;
914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    for (; sr < sr_end; sr++) {
924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (sr->main_scroll)
934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            ewk_tiled_backing_store_scroll_full_offset_add
944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                (sd->backing_store, sr->dx, sr->dy);
954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        else {
964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            Evas_Coord sx, sy, sw, sh;
974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            sx = sr->x;
994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            sy = sr->y;
1004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            sw = sr->w;
1014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            sh = sr->h;
1024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (abs(sr->dx) >= sw || abs(sr->dy) >= sh) {
1044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                /* doubt webkit would be so     stupid... */
1054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                DBG("full page scroll %+03d,%+03d. convert to repaint %d,%d + %dx%d",
1064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    sr->dx, sr->dy, sx, sy, sw, sh);
1074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                ewk_view_repaint_add(sd->_priv, sx, sy, sw, sh);
1084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                continue;
1094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            }
1104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (sx + sw > vw)
1124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                sw = vw - sx;
1134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (sy + sh > vh)
1144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                sh = vh - sy;
1154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (sw < 0)
1174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                sw = 0;
1184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (sh < 0)
1194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                sh = 0;
1204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (!sw || !sh)
1224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                continue;
1234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            sx -= abs(sr->dx);
1254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            sy -= abs(sr->dy);
1264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            sw += abs(sr->dx);
1274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            sh += abs(sr->dy);
1284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            ewk_view_repaint_add(sd->_priv, sx, sy, sw, sh);
1294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            INF("using repaint for inner frame scolling!");
1304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
1314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
1324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return EINA_TRUE;
1344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
1354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_repaints_process(Ewk_View_Smart_Data *sd)
1374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
1384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    const Eina_Rectangle *pr, *pr_end;
1394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    size_t count;
1404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    int sx, sy;
1414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_frame_scroll_pos_get(sd->main_frame, &sx, &sy);
1434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    pr = ewk_view_repaints_get(sd->_priv, &count);
1454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    pr_end = pr + count;
1464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    for (; pr < pr_end; pr++) {
1474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        Eina_Rectangle r;
1484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        r.x = pr->x + sx;
1494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        r.y = pr->y + sy;
1504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        r.w = pr->w;
1514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        r.h = pr->h;
1524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ewk_tiled_backing_store_update(sd->backing_store, &r);
1534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
1544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_updates_process(sd->backing_store);
1554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return EINA_TRUE;
1574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
1584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_contents_resize(Ewk_View_Smart_Data *sd, int w, int h)
1604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
1614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_contents_resize(sd->backing_store, w, h);
1624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return EINA_TRUE;
1634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
1644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_zoom_set(Ewk_View_Smart_Data *sd, float zoom, Evas_Coord cx, Evas_Coord cy)
1664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
1674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Evas_Coord x, y, w, h;
1684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Eina_Bool r;
1694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    r = ewk_tiled_backing_store_zoom_set(sd->backing_store,
1704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                                         &zoom, cx, cy, &x, &y);
1714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!r)
1724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return r;
1734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_disabled_update_set(sd->backing_store, EINA_TRUE);
1744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    r = _parent_sc.zoom_set(sd, zoom, cx, cy);
1754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_frame_scroll_set(sd->main_frame, -x, -y);
1764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_frame_scroll_size_get(sd->main_frame, &w, &h);
1774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_fix_offsets(sd->backing_store, w, h);
1784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_view_scrolls_process(sd);
1794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    evas_object_smart_calculate(sd->backing_store);
1804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    evas_object_smart_calculate(sd->self);
1814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_disabled_update_set(sd->backing_store, EINA_FALSE);
1824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return r;
1834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
1844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_zoom_weak_set(Ewk_View_Smart_Data *sd, float zoom, Evas_Coord cx, Evas_Coord cy)
1864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
1874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return ewk_tiled_backing_store_zoom_weak_set(sd->backing_store, zoom, cx, cy);
1884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
1894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_view_tiled_smart_zoom_weak_smooth_scale_set(Ewk_View_Smart_Data *sd, Eina_Bool smooth_scale)
1914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
1924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_zoom_weak_smooth_scale_set(sd->backing_store, smooth_scale);
1934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
1944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
1954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_view_tiled_smart_flush(Ewk_View_Smart_Data *sd)
1964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
1974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_flush(sd->backing_store);
1984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    _parent_sc.flush(sd);
1994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
2004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_pre_render_region(Ewk_View_Smart_Data *sd, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, float zoom)
2024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
2034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return ewk_tiled_backing_store_pre_render_region
2044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (sd->backing_store, x, y, w, h, zoom);
2054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
2064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_pre_render_relative_radius(Ewk_View_Smart_Data *sd, unsigned int n, float zoom)
2084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
2094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return ewk_tiled_backing_store_pre_render_relative_radius
2104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (sd->backing_store, n, zoom);
2114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
2124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic void _ewk_view_tiled_smart_pre_render_cancel(Ewk_View_Smart_Data *sd)
2144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
2154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_pre_render_cancel(sd->backing_store);
2164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
2174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_disable_render(Ewk_View_Smart_Data *sd)
2194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
2204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return ewk_tiled_backing_store_disable_render(sd->backing_store);
2214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
2224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic Eina_Bool _ewk_view_tiled_smart_enable_render(Ewk_View_Smart_Data *sd)
2244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
2254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return ewk_tiled_backing_store_enable_render(sd->backing_store);
2264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
2274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/**
2294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Sets the smart class api using tiled backing store, enabling view
2304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * to be inherited.
2314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
2324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param api class definition to be set, all members with the
2334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *        exception of Evas_Smart_Class->data may be overridden. Must
2344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *        @b not be @c NULL.
2354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
2364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @note Evas_Smart_Class->data is used to implement type checking and
2374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *       is not supposed to be changed/overridden. If you need extra
2384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *       data for your smart class to work, just extend
2394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *       Ewk_View_Smart_Class instead.
2404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
2414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @return @c EINA_TRUE on success, @c EINA_FALSE on failure (probably
2424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *         version mismatch).
2434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
2444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @see ewk_view_base_smart_set()
2454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */
2464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEina_Bool ewk_view_tiled_smart_set(Ewk_View_Smart_Class *api)
2474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
2484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!ewk_view_base_smart_set(api))
2494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return EINA_FALSE;
2504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (EINA_UNLIKELY(!_parent_sc.sc.add))
2524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ewk_view_base_smart_set(&_parent_sc);
2534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->sc.add = _ewk_view_tiled_smart_add;
2554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->backing_store_add = _ewk_view_tiled_smart_backing_store_add;
2574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->scrolls_process = _ewk_view_tiled_smart_scrolls_process;
2584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->repaints_process = _ewk_view_tiled_smart_repaints_process;
2594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->contents_resize = _ewk_view_tiled_smart_contents_resize;
2604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->zoom_set = _ewk_view_tiled_smart_zoom_set;
2614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->zoom_weak_set = _ewk_view_tiled_smart_zoom_weak_set;
2624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->zoom_weak_smooth_scale_set = _ewk_view_tiled_smart_zoom_weak_smooth_scale_set;
2634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->flush = _ewk_view_tiled_smart_flush;
2644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->pre_render_region = _ewk_view_tiled_smart_pre_render_region;
2654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->pre_render_relative_radius = _ewk_view_tiled_smart_pre_render_relative_radius;
2664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->pre_render_cancel = _ewk_view_tiled_smart_pre_render_cancel;
2674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->disable_render = _ewk_view_tiled_smart_disable_render;
2684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    api->enable_render = _ewk_view_tiled_smart_enable_render;
2694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return EINA_TRUE;
2704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
2714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic inline Evas_Smart *_ewk_view_tiled_smart_class_new(void)
2734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
2744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Tiled");
2754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    static Evas_Smart *smart = 0;
2764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (EINA_UNLIKELY(!smart)) {
2784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ewk_view_tiled_smart_set(&api);
2794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        smart = evas_smart_class_new(&api.sc);
2804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
2814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return smart;
2834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
2844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
2854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/**
2864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Creates a new EFL WebKit View object using tiled backing store.
2874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
2884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * View objects are the recommended way to deal with EFL WebKit as it
2894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * abstracts the complex pieces of the process.
2904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
2914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * This object is almost the same as the one returned by the ewk_view_add()
2924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * function, but it uses the tiled backing store instead of the default
2934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * backing store.
2944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
2954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param e canvas where to create the view object.
2964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
2974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @return view object or @c NULL if errors.
2984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
2994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @see ewk_view_uri_set()
3004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */
3014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEvas_Object *ewk_view_tiled_add(Evas *e)
3024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
3034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return evas_object_smart_add(e, _ewk_view_tiled_smart_class_new());
3044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
3054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
3064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/**
3074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Get the cache of unused tiles used by this view.
3084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
3094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param o view object to get cache.
3104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @return instance of "cache of unused tiles" or @c NULL on errors.
3114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */
3124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangEwk_Tile_Unused_Cache *ewk_view_tiled_unused_cache_get(const Evas_Object *o)
3134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
3144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Ewk_View_Smart_Data *sd = ewk_view_smart_data_get(o);
3154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    EINA_SAFETY_ON_NULL_RETURN_VAL(sd, 0);
3164576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return ewk_tiled_backing_store_tile_unused_cache_get(sd->backing_store);
3174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
3184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
3194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/**
3204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Set the cache of unused tiles used by this view.
3214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *
3224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param o view object to get cache.
3234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param cache instance of "cache of unused tiles". This can be used
3244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *        to share a single cache amongst different views. The tiles
3254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *        from one view will not be used by the other! This is just to
3264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *        limit the group with amount of unused memory.
3274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang *        If @c NULL is provided, then a new cache is created.
3284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */
3294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_view_tiled_unused_cache_set(Evas_Object *o, Ewk_Tile_Unused_Cache *cache)
3304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
3314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Ewk_View_Smart_Data *sd = ewk_view_smart_data_get(o);
3324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    EINA_SAFETY_ON_NULL_RETURN(sd);
3334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_tile_unused_cache_set(sd->backing_store, cache);
3344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
3354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
3364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang/**
3374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * Set the function with the same name of the tiled backing store.
3384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param o the tiled backing store object.
3394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang * @param flag value of the tiled backing store flag to set.
3404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang */
3414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid ewk_view_tiled_process_entire_queue_set(Evas_Object *o, Eina_Bool flag)
3424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
3434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    Ewk_View_Smart_Data *sd = ewk_view_smart_data_get(o);
3444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    EINA_SAFETY_ON_NULL_RETURN(sd);
3454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    ewk_tiled_backing_store_process_entire_queue_set(sd->backing_store, flag);
3464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
347