SelectionOverlay.cpp [plain text]
#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 <BlackBerryPlatformMessageClient.h>
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<size_t>(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<WebCore::FloatQuad>& 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();
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();
}
} }
#endif // USE(ACCELERATED_COMPOSITING)