summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.cpp')
-rw-r--r--Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.cpp b/Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.cpp
new file mode 100644
index 000000000..9480e8415
--- /dev/null
+++ b/Source/WebKit/blackberry/WebKitSupport/SelectionOverlay.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2012 Research In Motion Limited. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#include "SelectionOverlay.h"
+
+#include "GraphicsContext.h"
+#include "Path.h"
+#include "PlatformContextSkia.h"
+#include "RenderTheme.h"
+#include "WebPage_p.h"
+
+#include <BlackBerryPlatformMessageClient.h>
+
+using namespace WebCore;
+
+namespace BlackBerry {
+namespace WebKit {
+
+SelectionOverlay::SelectionOverlay(WebPagePrivate* page)
+ : m_page(page)
+{
+}
+
+SelectionOverlay::~SelectionOverlay()
+{
+}
+
+void SelectionOverlay::draw(const Platform::IntRectRegion& region)
+{
+ ASSERT(BlackBerry::Platform::webKitThreadMessageClient()->isCurrentThread());
+
+ m_region = region;
+ FloatRect rect = IntRect(m_region.extents());
+ if (rect.isEmpty()) {
+ hide();
+ return;
+ }
+
+ if (!m_overlay)
+ m_overlay = adoptPtr(new WebOverlay(this));
+
+ m_page->m_webPage->addOverlay(m_overlay.get());
+ m_overlay->resetOverrides();
+ m_overlay->setPosition(rect.location());
+ m_overlay->setSize(rect.size());
+ m_overlay->setDrawsContent(true);
+ m_overlay->setOpacity(1.0);
+ m_overlay->invalidate();
+}
+
+void SelectionOverlay::hide()
+{
+ if (!m_overlay)
+ return;
+
+ // Normally, this method is called on the WebKit thread, but it can also be
+ // called from the compositing thread.
+ if (BlackBerry::Platform::webKitThreadMessageClient()->isCurrentThread())
+ m_page->m_webPage->removeOverlay(m_overlay.get());
+ else if (BlackBerry::Platform::userInterfaceThreadMessageClient()->isCurrentThread())
+ m_overlay->override()->setOpacity(0);
+}
+
+void SelectionOverlay::notifySyncRequired(const GraphicsLayer*)
+{
+ m_page->scheduleRootLayerCommit();
+}
+
+void SelectionOverlay::paintContents(const GraphicsLayer*, GraphicsContext& c, GraphicsLayerPaintingPhase, const IntRect& inClip)
+{
+ std::vector<Platform::IntRect> rects = m_region.rects();
+ Platform::IntRect rect = m_region.extents();
+ SkRegion windowRegion;
+
+ unsigned rectCount = m_region.numRects();
+ if (!rectCount)
+ return;
+
+ IntRect clip(inClip);
+ clip.move(rect.x(), rect.y());
+ for (unsigned i = 0; i < rectCount; ++i) {
+ IntRect rectToPaint = rects[i];
+ rectToPaint.intersect(clip);
+ SkIRect r = SkIRect::MakeXYWH(rectToPaint.x(), rectToPaint.y(), rectToPaint.width(), rectToPaint.height());
+ windowRegion.op(r, SkRegion::kUnion_Op);
+ }
+
+ SkPath pathToPaint;
+ windowRegion.getBoundaryPath(&pathToPaint);
+
+ Path path(pathToPaint);
+ c.save();
+ c.translate(-rect.x(), -rect.y());
+
+ // Draw selection overlay
+ Color color = RenderTheme::defaultTheme()->activeSelectionBackgroundColor();
+ c.setFillColor(color, ColorSpaceDeviceRGB);
+ c.fillPath(path);
+
+ c.restore();
+}
+
+} // namespace WebKit
+} // namespace BlackBerry
+
+#endif // USE(ACCELERATED_COMPOSITING)