/* * Copyright (C) 2012, 2013 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 "Frame.h" #include "GraphicsContext.h" #include "LayerMessage.h" #include "LayerWebKitThread.h" #include "Path.h" #include "RenderTheme.h" #include "RenderView.h" #include "WebPage_p.h" #include using namespace WebCore; namespace BlackBerry { namespace WebKit { SelectionOverlay::SelectionOverlay(WebPagePrivate* page) : m_page(page) { } SelectionOverlay::~SelectionOverlay() { } void SelectionOverlay::draw(const Selection& selection) { ASSERT(BlackBerry::Platform::webKitThreadMessageClient()->isCurrentThread()); m_selection = selection; while (m_layers.size() < static_cast(m_selection.size())) m_layers.append(GraphicsLayer::create(this)); m_layers.resize(m_selection.size()); size_t i = 0; for (Selection::iterator it = m_selection.begin(); it != m_selection.end(); ++it, ++i) { GraphicsLayer* parent = it->key; GraphicsLayer* overlay = m_layers[i].get(); parent->platformLayer()->addOverlay(overlay->platformLayer()); overlay->setPosition(FloatPoint::zero()); if (parent == m_page->m_overlayLayer) overlay->setSize(m_page->contentsSize()); else overlay->setSize(parent->size()); overlay->setAnchorPoint(FloatPoint3D(0, 0, 0)); overlay->setDrawsContent(true); overlay->setNeedsDisplay(); } } void SelectionOverlay::hide() { ASSERT(BlackBerry::Platform::webKitThreadMessageClient()->isCurrentThread()); for (size_t i = 0; i < m_layers.size(); ++i) m_layers[i]->platformLayer()->removeFromSuperlayer(); m_selection.clear(); } void SelectionOverlay::notifyFlushRequired(const GraphicsLayer* layer) { m_page->notifyFlushRequired(layer); } void SelectionOverlay::paintContents(const GraphicsLayer* layer, GraphicsContext& c, GraphicsLayerPaintingPhase, const IntRect& inClip) { if (!layer->platformLayer()->superlayer()) return; Selection::iterator it = m_selection.find(layer->platformLayer()->superlayer()->owner()); if (it == m_selection.end()) return; const Vector& quads = it->value; GraphicsLayer* parent = it->key; IntRect clip(inClip); clip.move(parent->offsetFromRenderer().width(), parent->offsetFromRenderer().height()); c.save(); c.translate(-parent->offsetFromRenderer().width(), -parent->offsetFromRenderer().height()); Color color = RenderTheme::defaultTheme()->activeSelectionBackgroundColor(); c.setFillColor(color, ColorSpaceDeviceRGB); for (unsigned i = 0; i < quads.size(); ++i) { FloatRect rectToPaint = quads[i].boundingBox(); // Selection on non-composited sub-frames need to be adjusted. if (!m_page->focusedOrMainFrame()->contentRenderer()->isComposited()) { WebCore::IntPoint framePosition = m_page->frameOffset(m_page->focusedOrMainFrame()); rectToPaint.move(framePosition.x(), framePosition.y()); } rectToPaint.intersect(clip); if (rectToPaint.isEmpty()) continue; c.fillRect(rectToPaint); } c.restore(); } } // namespace WebKit } // namespace BlackBerry #endif // USE(ACCELERATED_COMPOSITING)