Change background image of magnifier
[framework/web/webkit-efl.git] / Source / WebKit2 / UIProcess / API / efl / tizen / TextSelectionMagnifier.cpp
1 /*
2  * Copyright (C) 2012 Samsung Electronics
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27
28 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
29 #include "TextSelectionMagnifier.h"
30
31 #include "WebImage.h"
32 #include "ewk_util.h"
33 #include <Elementary.h>
34 #include <WebCore/IntRect.h>
35 #include <cairo.h>
36
37 using namespace WebCore;
38
39 namespace WebKit {
40
41 TextSelectionMagnifier::TextSelectionMagnifier(EwkViewImpl* viewImpl)
42     : m_viewImpl(viewImpl)
43     , m_image(0)
44     , m_magnifier(0)
45     , m_width(320)
46     , m_height(120)
47 {
48 }
49
50 TextSelectionMagnifier::~TextSelectionMagnifier()
51 {
52     if (m_image)
53         evas_object_del(m_image);
54     evas_object_del(m_magnifier);
55 }
56
57 void TextSelectionMagnifier::update(const IntPoint& point)
58 {
59     if (!m_magnifier) {
60         Evas_Object* topWidget = elm_object_top_widget_get(elm_object_parent_widget_get(m_viewImpl->view()));
61         if (!topWidget)
62             topWidget = m_viewImpl->view();
63
64         m_magnifier = elm_layout_add(topWidget);
65         elm_layout_file_set(m_magnifier, EDJE_DIR"/Magnifier.edj", "magnifier");
66     }
67
68     int viewX, viewY, viewWidth, viewHeight;
69     evas_object_geometry_get(m_viewImpl->view(), &viewX, &viewY, &viewWidth, &viewHeight);
70
71     float zoomLevel = 1.5f;
72     IntRect rect(point.x() - viewX - (ceil(m_width/zoomLevel)/2), point.y() - viewY - (ceil(m_height/zoomLevel)/2), ceil(m_width/zoomLevel), ceil(m_height/zoomLevel));
73
74     if (rect.x() < 0)
75         rect.setX(0);
76     if (rect.y() < 0)
77         rect.setY(0);
78
79     int overSize = rect.maxX() - (viewX + viewWidth);
80     if (overSize > 0)
81         rect.setX(rect.x() - overSize);
82     overSize = rect.maxY() - (viewY + viewHeight);
83     if (overSize > 0)
84         rect.setY(rect.y() - overSize);
85
86     RefPtr<WebImage> webImage = m_viewImpl->page()->createSnapshot(rect, zoomLevel);
87     if (!webImage || !webImage->bitmap())
88         return;
89     RefPtr<cairo_surface_t> cairoSurface = webImage->bitmap()->createCairoSurface();
90     if (!cairoSurface)
91         return;
92
93     if (m_image)
94         evas_object_del(m_image);
95
96     m_image = ewk_util_image_from_cairo_surface_add(evas_object_evas_get(m_viewImpl->view()), cairoSurface.get());
97     evas_object_size_hint_min_set(m_image, m_width, m_height);
98     evas_object_resize(m_image, m_width, m_height);
99     evas_object_image_filled_set(m_image, true);
100     evas_object_show(m_image);
101
102     elm_object_part_content_set(m_magnifier, "swallow", m_image);
103     evas_object_pass_events_set(m_image, EINA_TRUE);
104     evas_object_clip_set(m_image, m_magnifier);
105
106     evas_object_layer_set(m_magnifier, EVAS_LAYER_MAX);
107     evas_object_layer_set(m_image, EVAS_LAYER_MAX);
108 }
109
110 void TextSelectionMagnifier::show()
111 {
112     if (isVisible())
113         return;
114
115     evas_object_show(m_magnifier);
116 }
117
118 void TextSelectionMagnifier::hide()
119 {
120     if (!isVisible())
121         return;
122
123     evas_object_hide(m_magnifier);
124 }
125
126 void TextSelectionMagnifier::move(const IntPoint& point)
127 {
128     int viewX, viewY, viewWidth, viewHeight;
129     evas_object_geometry_get(m_viewImpl->view(), &viewX, &viewY, &viewWidth, &viewHeight);
130
131     int magnfierX, magnfierY, magnfierWidth, magnfierHeight;
132     evas_object_geometry_get(m_magnifier, &magnfierX, &magnfierY, &magnfierWidth, &magnfierHeight);
133
134     int xPosition = point.x();
135     if (xPosition < (magnfierWidth / 2))
136         xPosition = magnfierWidth / 2;
137     if (xPosition > viewWidth - (magnfierWidth / 2))
138         xPosition = viewWidth - (magnfierWidth / 2);
139
140     int yPosition = point.y() - 230;
141     if (yPosition < (magnfierHeight / 2))
142         yPosition = magnfierHeight / 2;
143     if (yPosition > viewHeight - (magnfierHeight / 2))
144         yPosition = viewHeight - (magnfierHeight / 2);
145
146     evas_object_move(m_magnifier, xPosition, yPosition);
147 }
148
149 bool TextSelectionMagnifier::isVisible()
150 {
151     return evas_object_visible_get(m_magnifier);
152 }
153
154 } // namespace WebKit
155
156 #endif // TIZEN_WEBKIT2_TEXT_SELECTION