1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Copyright (C) 2009-2010 ProFUSION embedded systems
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Copyright (C) 2009-2010 Samsung Electronics
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This library is free software; you can redistribute it and/or
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    modify it under the terms of the GNU Library General Public
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    License as published by the Free Software Foundation; either
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    version 2 of the License, or (at your option) any later version.
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    This library is distributed in the hope that it will be useful,
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    but WITHOUT ANY WARRANTY; without even the implied warranty of
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Library General Public License for more details.
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    You should have received a copy of the GNU Library General Public License
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    along with this library; see the file COPYING.LIB.  If not, write to
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Boston, MA 02110-1301, USA.
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h"
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ewk_view.h"
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ewk_frame.h"
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "ewk_logging.h"
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <Evas.h>
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <eina_safety_checks.h>
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <string.h>
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Ewk_View_Smart_Class _parent_sc = EWK_VIEW_SMART_CLASS_INIT_NULL;
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_view_single_on_del(void *data, Evas *e, Evas_Object *o, void *event_info)
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object *clip = (Evas_Object*)data;
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_del(clip);
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic void _ewk_view_single_smart_add(Evas_Object *o)
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
415af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    Ewk_View_Smart_Data *sd;
425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    _parent_sc.sc.add(o);
445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
455af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    sd = (Ewk_View_Smart_Data *)evas_object_smart_data_get(o);
465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object *clip = evas_object_rectangle_add(sd->base.evas);
485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    evas_object_clip_set(sd->backing_store, clip);
495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    evas_object_smart_member_add(clip, o);
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_show(clip);
51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_event_callback_add
535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        (sd->backing_store, EVAS_CALLBACK_DEL, _ewk_view_single_on_del, clip);
545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkestatic Evas_Object *_ewk_view_single_smart_backing_store_add(Ewk_View_Smart_Data *sd)
575af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    Evas_Object *bs = evas_object_image_add(sd->base.evas);
595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    evas_object_image_alpha_set(bs, EINA_FALSE);
605af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    evas_object_image_smooth_scale_set(bs, sd->zoom_weak_smooth_scale);
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return bs;
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_view_single_smart_resize(Evas_Object *o, Evas_Coord w, Evas_Coord h)
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Ewk_View_Smart_Data *sd = (Ewk_View_Smart_Data*)evas_object_smart_data_get(o);
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _parent_sc.sc.resize(o, w, h);
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // these should be queued and processed in calculate as well!
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_image_size_set(sd->backing_store, w, h);
72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->animated_zoom.zoom.current < 0.00001) {
73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Evas_Object *clip = evas_object_clip_get(sd->backing_store);
74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Evas_Coord x, y, cw, ch;
75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_image_fill_set(sd->backing_store, 0, 0, w, h);
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_geometry_get(sd->backing_store, &x, &y, 0, 0);
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_move(clip, x, y);
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_frame_contents_size_get(sd->main_frame, &cw, &ch);
79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (w > cw)
80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            w = cw;
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (h > ch)
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            h = ch;
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_resize(clip, w, h);
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_region_up(uint32_t *image, size_t rows, size_t x, size_t y, size_t w, size_t h, size_t rowsize)
88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *src;
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *dst;
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    dst = image + x + y * rowsize;
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    src = dst + rows * rowsize;
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    h -= rows;
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; h > 0; h--, dst += rowsize, src += rowsize)
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        memcpy(dst, src, w * 4);
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_region_down(uint32_t *image, size_t rows, size_t x, size_t y, size_t w, size_t h, size_t rowsize)
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *src;
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *dst;
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    h -= rows;
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    src = image + x + (y + h - 1) * rowsize;
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    dst = src + rows * rowsize;
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; h > 0; h--, dst -= rowsize, src -= rowsize)
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        memcpy(dst, src, w * 4);
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_line_left(uint32_t *dst, const uint32_t *src, size_t count)
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *dst_end = dst + count;
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    /* no memcpy() as it does not allow overlapping regions */
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    /* no memmove() as it will copy to a temporary buffer */
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    /* TODO: loop unrolling, copying up to quad-words would help */
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; dst < dst_end; dst++, src++)
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *dst = *src;
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_line_right(uint32_t *dst, uint32_t *src, size_t count)
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *dst_end = dst - count;
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    /* no memcpy() as it does not allow overlapping regions */
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    /* no memmove() as it will copy to a temporary buffer */
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    /* TODO: loop unrolling, copying up to quad-words would help */
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; dst > dst_end; dst--, src--)
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *dst = *src;
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_region_left(uint32_t *image, size_t cols, size_t x, size_t y, size_t w, size_t h, size_t rowsize)
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
135dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *src;
136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *dst;
137dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
138dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    dst = image + x + y * rowsize;
139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    src = dst + cols;
140dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    w -= cols;
141dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
142dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; h > 0; h--, dst += rowsize, src += rowsize)
143dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _ewk_view_4b_move_line_left(dst, src, w);
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
145dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_region_right(uint32_t *image, size_t cols, size_t x, size_t y, size_t w, size_t h, size_t rowsize)
147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *src;
149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *dst;
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
151dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    w -= cols;
152dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    src = image + (x + w - 1) + y * rowsize;
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    dst = src + cols;
154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; h > 0; h--, dst += rowsize, src += rowsize)
156dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _ewk_view_4b_move_line_right(dst, src, w);
157dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
158dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* catch-all function, not as optimized as the others, but does the work. */
160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_4b_move_region(uint32_t *image, int dx, int dy, size_t x, size_t y, size_t w, size_t h, size_t rowsize)
161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *src;
163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t *dst;
164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (dy < 0) {
166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        h += dy;
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dst = image + x + y * rowsize;
168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        src = dst - dy * rowsize;
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (dx <= 0) {
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            w += dx;
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            src -= dx;
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            for (; h > 0; h--, dst += rowsize, src += rowsize)
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                _ewk_view_4b_move_line_left(dst, src, w);
174dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
175dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            w -= dx;
176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            src += w - 1;
177dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            dst += w + dx -1;
178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            for (; h > 0; h--, dst += rowsize, src += rowsize)
179dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                _ewk_view_4b_move_line_right(dst, src, w);
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        h -= dy;
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        src = image + x + (y + h - 1) * rowsize;
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dst = src + dy * rowsize;
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (dx <= 0) {
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            w += dx;
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            src -= dx;
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            for (; h > 0; h--, dst -= rowsize, src -= rowsize)
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                _ewk_view_4b_move_line_left(dst, src, w);
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
191dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            w -= dx;
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            src += w - 1;
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            dst += w + dx - 1;
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            for (; h > 0; h--, dst -= rowsize, src -= rowsize)
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                _ewk_view_4b_move_line_right(dst, src, w);
196dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline void _ewk_view_single_scroll_process_single(Ewk_View_Smart_Data *sd, void *pixels, Evas_Coord ow, Evas_Coord oh, const Ewk_Scroll_Request *sr)
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord sx, sy, sw, sh;
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DBG("%d,%d + %d,%d %+03d,%+03d, store: %p %dx%d",
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sr->x, sr->y, sr->w, sr->h, sr->dx, sr->dy, pixels, ow, oh);
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sx = sr->x;
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sy = sr->y;
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sw = sr->w;
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sh = sr->h;
211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (abs(sr->dx) >= sw || abs(sr->dy) >= sh) {
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        /* doubt webkit would be so stupid... */
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        DBG("full page scroll %+03d,%+03d. convert to repaint %d,%d + %dx%d",
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            sr->dx, sr->dy, sx, sy, sw, sh);
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_repaint_add(sd->_priv, sx, sy, sw, sh);
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
218dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
219dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sx < 0) {
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sw += sx;
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sx = 0;
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sy < 0) {
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sh += sy;
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sy = 0;
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sx + sw > ow)
230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sw = ow - sx;
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sy + sh > oh)
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sh = oh - sy;
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sw < 0)
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sw = 0;
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sh < 0)
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        sh = 0;
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_SAFETY_ON_TRUE_RETURN(!sw || !sh);
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!sr->dx) {
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (sr->dy < 0) {
242dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            DBG("scroll up: %+03d,%+03d update=%d,%d+%dx%d, "
243dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                "repaint=%d,%d+%dx%d",
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                sr->dx, sr->dy, sx, sy, sw, sh + sr->dy,
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                sx, sy + sh + sr->dy, sw, -sr->dy);
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            _ewk_view_4b_move_region_up
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ((uint32_t*)pixels, -sr->dy, sx, sy, sw, sh, ow);
249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            evas_object_image_data_update_add
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                (sd->backing_store, sx, sy, sw, sh + sr->dy);
251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ewk_view_repaint_add(sd->_priv, sx, sy + sh + sr->dy, sw, -sr->dy);
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else if (sr->dy > 0) {
254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            DBG("scroll down: %+03d,%+03d update=%d,%d+%dx%d, "
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                "repaint=%d,%d+%dx%d",
256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                sr->dx, sr->dy, sx, sy + sr->dy, sw, sh - sr->dy,
257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                sx, sy, sw, sr->dy);
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            _ewk_view_4b_move_region_down
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ((uint32_t*)pixels, sr->dy, sx, sy, sw, sh, ow);
261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            evas_object_image_data_update_add
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                (sd->backing_store, sx, sy + sr->dy, sw, sh - sr->dy);
263dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
264dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ewk_view_repaint_add(sd->_priv, sx, sy, sw, sr->dy);
265dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
266dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else if (!sr->dy) {
267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (sr->dx < 0) {
268dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            DBG("scroll left: %+03d,%+03d update=%d,%d+%dx%d, "
269dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                "repaint=%d,%d+%dx%d",
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                sr->dx, sr->dy, sx, sy, sw + sr->dx, sh,
271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                sx + sw + sr->dx, sy, -sr->dx, sh);
272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            _ewk_view_4b_move_region_left
274dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ((uint32_t*)pixels, -sr->dx, sx, sy, sw, sh, ow);
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            evas_object_image_data_update_add
276dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                (sd->backing_store, sx, sy, sw + sr->dx, sh);
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ewk_view_repaint_add(sd->_priv, sx + sw + sr->dx, sy, -sr->dx, sh);
279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else if (sr->dx > 0) {
280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            DBG("scroll up: %+03d,%+03d update=%d,%d+%dx%d, "
281dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                "repaint=%d,%d+%dx%d",
282dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                sr->dx, sr->dy, sx + sr->dx, sy, sw - sr->dx, sh,
283dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                sx, sy, sr->dx, sh);
284dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
285dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            _ewk_view_4b_move_region_right
286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ((uint32_t*)pixels, sr->dx, sx, sy, sw, sh, ow);
287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            evas_object_image_data_update_add
288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                (sd->backing_store, sx + sr->dx, sy, sw - sr->dx, sh);
289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ewk_view_repaint_add(sd->_priv, sx, sy, sr->dx, sh);
291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Evas_Coord mx, my, mw, mh, ax, ay, aw, ah, bx, by, bw, bh;
294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (sr->dx < 0) {
296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            mx = sx;
297dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            mw = sw + sr->dx;
298dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ax = mx + mw;
299dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            aw = -sr->dx;
300dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
301dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ax = sx;
302dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            aw = sr->dx;
303dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            mx = ax + aw;
304dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            mw = sw - sr->dx;
305dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
306dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
307dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (sr->dy < 0) {
308dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            my = sy;
309dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            mh = sh + sr->dy;
310dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            by = my + mh;
311dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            bh = -sr->dy;
312dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        } else {
313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            by = sy;
314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            bh = sr->dy;
315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            my = by + bh;
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            mh = sh - sr->dy;
317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ay = my;
320dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ah = mh;
321dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bx = sx;
322dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bw = sw;
323dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        DBG("scroll diagonal: %+03d,%+03d update=%d,%d+%dx%d, "
325dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            "repaints: h=%d,%d+%dx%d v=%d,%d+%dx%d",
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            sr->dx, sr->dy, mx, my, mw, mh, ax, ay, aw, ah, bx, by, bw, bh);
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _ewk_view_4b_move_region
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ((uint32_t*)pixels, sr->dx, sr->dy, sx, sy, sw, sh, ow);
330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_image_data_update_add(sd->backing_store, mx, my, mw, mh);
332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_repaint_add(sd->_priv, ax, ay, aw, ah);
333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_repaint_add(sd->_priv, bx, by, bw, bh);
334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Eina_Bool _ewk_view_single_smart_scrolls_process(Ewk_View_Smart_Data *sd)
338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const Ewk_Scroll_Request *sr;
340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const Ewk_Scroll_Request *sr_end;
341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord ow, oh;
342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    size_t count;
343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void *pixels = evas_object_image_data_get(sd->backing_store, 1);
344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_image_size_get(sd->backing_store, &ow, &oh);
345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sr = ewk_view_scroll_requests_get(sd->_priv, &count);
347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    sr_end = sr + count;
348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; sr < sr_end; sr++)
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        _ewk_view_single_scroll_process_single(sd, pixels, ow, oh, sr);
350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
351a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    evas_object_image_data_set(sd->backing_store, pixels);
352a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Eina_Bool _ewk_view_single_smart_repaints_process(Ewk_View_Smart_Data *sd)
357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Ewk_View_Paint_Context *ctxt;
359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord ow, oh;
360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void *pixels;
3616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    Eina_Rectangle *r;
362dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const Eina_Rectangle *pr;
363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const Eina_Rectangle *pr_end;
364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Tiler *tiler;
365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Iterator *itr;
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    cairo_status_t status;
367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    cairo_surface_t *surface;
368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    cairo_format_t format;
369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    cairo_t *cairo;
370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    size_t count;
371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Eina_Bool ret = EINA_TRUE;
372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->animated_zoom.zoom.current < 0.00001) {
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Evas_Object *clip = evas_object_clip_get(sd->backing_store);
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Evas_Coord w, h, cw, ch;
376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // reset effects of zoom_weak_set()
377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_image_fill_set
378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            (sd->backing_store, 0, 0, sd->view.w, sd->view.h);
379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_move(clip, sd->view.x, sd->view.y);
380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        w = sd->view.w;
382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        h = sd->view.h;
383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_frame_contents_size_get(sd->main_frame, &cw, &ch);
385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (w > cw)
386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            w = cw;
387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (h > ch)
388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            h = ch;
389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_resize(clip, w, h);
390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    pixels = evas_object_image_data_get(sd->backing_store, 1);
393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_image_size_get(sd->backing_store, &ow, &oh);
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->bg_color.a < 255)
396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        format = CAIRO_FORMAT_ARGB32;
397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        format = CAIRO_FORMAT_RGB24;
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    surface = cairo_image_surface_create_for_data
401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ((unsigned char*)pixels, format, ow, oh, ow * 4);
402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    status = cairo_surface_status(surface);
403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (status != CAIRO_STATUS_SUCCESS) {
404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ERR("could not create surface from data %dx%d: %s",
405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ow, oh, cairo_status_to_string(status));
406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ret = EINA_FALSE;
407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        goto error_cairo_surface;
408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    cairo = cairo_create(surface);
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    status = cairo_status(cairo);
411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (status != CAIRO_STATUS_SUCCESS) {
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ERR("could not create cairo from surface %dx%d: %s",
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ow, oh, cairo_status_to_string(status));
414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ret = EINA_FALSE;
415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        goto error_cairo;
416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ctxt = ewk_view_paint_context_new(sd->_priv, cairo);
419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!ctxt) {
420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ERR("could not create paint context");
421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ret = EINA_FALSE;
422dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        goto error_paint_context;
423dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
424dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
425dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    tiler = eina_tiler_new(ow, oh);
426dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!tiler) {
427dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ERR("could not create tiler %dx%d", ow, oh);
428dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ret = EINA_FALSE;
429dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        goto error_tiler;
430dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
431dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
432dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    pr = ewk_view_repaints_get(sd->_priv, &count);
433dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    pr_end = pr + count;
434dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (; pr < pr_end; pr++)
435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        eina_tiler_rect_add(tiler, pr);
436dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    itr = eina_tiler_iterator_new(tiler);
438dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!itr) {
439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ERR("could not get iterator for tiler");
440dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ret = EINA_FALSE;
441dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        goto error_iterator;
442dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
443dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
444dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int sx, sy;
445dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_frame_scroll_pos_get(sd->main_frame, &sx, &sy);
446dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
447dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    EINA_ITERATOR_FOREACH(itr, r) {
448dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Eina_Rectangle scrolled_rect = {
4496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            r->x + sx, r->y + sy,
4506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            r->w, r->h
451dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        };
452dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
453dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_paint_context_save(ctxt);
454dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
455dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if ((sx) || (sy))
456dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ewk_view_paint_context_translate(ctxt, -sx, -sy);
457dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
458dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_paint_context_clip(ctxt, &scrolled_rect);
459dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_paint_context_paint_contents(ctxt, &scrolled_rect);
460dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
461dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_paint_context_restore(ctxt);
462dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        evas_object_image_data_update_add
4636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            (sd->backing_store, r->x, r->y, r->w, r->h);
464dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
465dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    eina_iterator_free(itr);
466dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
467dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockerror_iterator:
468dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    eina_tiler_free(tiler);
469dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockerror_tiler:
470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_view_paint_context_free(ctxt);
471dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockerror_paint_context:
472dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    cairo_destroy(cairo);
473dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockerror_cairo:
474dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    cairo_surface_destroy(surface);
475dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockerror_cairo_surface:
476dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_image_data_set(sd->backing_store, pixels); /* dec refcount */
477dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
478dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return ret;
479dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
480dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
481dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic Eina_Bool _ewk_view_single_smart_zoom_weak_set(Ewk_View_Smart_Data *sd, float zoom, Evas_Coord cx, Evas_Coord cy)
482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
483dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // TODO: review
484dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    float scale = zoom / sd->animated_zoom.zoom.start;
485dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord w = sd->view.w * scale;
486dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord h = sd->view.h * scale;
487dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Coord dx, dy, cw, ch;
488dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Evas_Object *clip = evas_object_clip_get(sd->backing_store);
489dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
490dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ewk_frame_contents_size_get(sd->main_frame, &cw, &ch);
491dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->view.w > 0 && sd->view.h > 0) {
492dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dx = (w * (sd->view.w - cx)) / sd->view.w;
493dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dy = (h * (sd->view.h - cy)) / sd->view.h;
494dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
495dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dx = 0;
496dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dy = 0;
497dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
498dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
499dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_image_fill_set(sd->backing_store, cx + dx, cy + dy, w, h);
500dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
501dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (sd->view.w > 0 && sd->view.h > 0) {
502dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dx = ((sd->view.w - w) * cx) / sd->view.w;
503dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dy = ((sd->view.h - h) * cy) / sd->view.h;
504dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else {
505dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dx = 0;
506dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        dy = 0;
507dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
508dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_move(clip, sd->view.x + dx, sd->view.y + dy);
509dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
510dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (cw < sd->view.w)
511dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        w = cw * scale;
512dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (ch < sd->view.h)
513dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        h = ch * scale;
514dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_resize(clip, w, h);
515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_view_single_smart_zoom_weak_smooth_scale_set(Ewk_View_Smart_Data *sd, Eina_Bool smooth_scale)
519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_image_smooth_scale_set(sd->backing_store, smooth_scale);
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void _ewk_view_single_smart_bg_color_set(Ewk_View_Smart_Data *sd, unsigned char r, unsigned char g, unsigned char b, unsigned char a)
524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    evas_object_image_alpha_set(sd->backing_store, a < 255);
526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Sets the smart class api using single backing store, enabling view
530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * to be inherited.
531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param api class definition to be set, all members with the
533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        exception of Evas_Smart_Class->data may be overridden. Must
534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *        @b not be @c NULL.
535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @note Evas_Smart_Class->data is used to implement type checking and
537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *       is not supposed to be changed/overridden. If you need extra
538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *       data for your smart class to work, just extend
539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *       Ewk_View_Smart_Class instead.
540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return @c EINA_TRUE on success, @c EINA_FALSE on failure (probably
542dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *         version mismatch).
543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @see ewk_view_base_smart_set()
545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
546dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEina_Bool ewk_view_single_smart_set(Ewk_View_Smart_Class *api)
547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
548dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!ewk_view_base_smart_set(api))
549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return EINA_FALSE;
550dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
551dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (EINA_UNLIKELY(!_parent_sc.sc.add))
552dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_base_smart_set(&_parent_sc);
553dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    api->sc.add = _ewk_view_single_smart_add;
555dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    api->sc.resize = _ewk_view_single_smart_resize;
556dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
557dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    api->backing_store_add = _ewk_view_single_smart_backing_store_add;
558dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    api->scrolls_process = _ewk_view_single_smart_scrolls_process;
559dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    api->repaints_process = _ewk_view_single_smart_repaints_process;
560dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    api->zoom_weak_set = _ewk_view_single_smart_zoom_weak_set;
561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    api->zoom_weak_smooth_scale_set = _ewk_view_single_smart_zoom_weak_smooth_scale_set;
562dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    api->bg_color_set = _ewk_view_single_smart_bg_color_set;
563dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
564dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return EINA_TRUE;
565dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline Evas_Smart *_ewk_view_single_smart_class_new(void)
568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("Ewk_View_Single");
570dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static Evas_Smart *smart = 0;
571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (EINA_UNLIKELY(!smart)) {
573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ewk_view_single_smart_set(&api);
574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        smart = evas_smart_class_new(&api.sc);
575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return smart;
578dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
579dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
580dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/**
581dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Creates a new EFL WebKit View object.
582dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
583dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * View objects are the recommended way to deal with EFL WebKit as it
584dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * abstracts the complex pieces of the process.
585dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Each view is composed by a set of frames. The set has at least one
587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * frame, called 'main_frame'. See ewk_view_frame_main_get() and
588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * ewk_view_frame_focused_get().
589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
590dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @param e canvas where to create the view object.
591dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
592dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @return view object or @c NULL if errors.
593dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * @see ewk_view_uri_set()
595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockEvas_Object *ewk_view_single_add(Evas *e)
597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return evas_object_smart_add(e, _ewk_view_single_smart_class_new());
599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
600