#include "config.h"
#include "PageOverlay.h"
#include "GraphicsLayer.h"
#include "GraphicsLayerClient.h"
#include "Page.h"
#include "PlatformContextSkia.h"
#include "Settings.h"
#include "WebPageOverlay.h"
#include "WebViewClient.h"
#include "WebViewImpl.h"
using namespace WebCore;
namespace WebKit {
namespace {
WebCanvas* ToWebCanvas(GraphicsContext* gc)
{
#if WEBKIT_USING_SKIA
return gc->platformContext()->canvas();
#elif WEBKIT_USING_CG
return gc->platformContext();
#endif
}
}
PassOwnPtr<PageOverlay> PageOverlay::create(WebViewImpl* viewImpl, WebPageOverlay* overlay)
{
return adoptPtr(new PageOverlay(viewImpl, overlay));
}
PageOverlay::PageOverlay(WebViewImpl* viewImpl, WebPageOverlay* overlay)
: m_viewImpl(viewImpl)
, m_overlay(overlay)
, m_zOrder(0)
{
}
#if USE(ACCELERATED_COMPOSITING)
class OverlayGraphicsLayerClientImpl : public WebCore::GraphicsLayerClient {
public:
static PassOwnPtr<OverlayGraphicsLayerClientImpl*> create(WebViewImpl* webViewImpl, WebPageOverlay* overlay)
{
return adoptPtr(new OverlayGraphicsLayerClientImpl(webViewImpl, overlay));
}
virtual ~OverlayGraphicsLayerClientImpl() { }
virtual void notifyAnimationStarted(const GraphicsLayer*, double time) { }
virtual void notifySyncRequired(const GraphicsLayer*) { }
virtual void paintContents(const GraphicsLayer*, GraphicsContext& gc, GraphicsLayerPaintingPhase, const IntRect& inClip)
{
gc.save();
m_overlay->paintPageOverlay(ToWebCanvas(&gc));
gc.restore();
}
virtual float deviceScaleFactor() const
{
return m_webViewImpl->deviceScaleFactor();
}
virtual float pageScaleFactor() const
{
return m_webViewImpl->pageScaleFactor();
}
virtual bool showDebugBorders(const GraphicsLayer*) const
{
return m_webViewImpl->page()->settings()->showDebugBorders();
}
virtual bool showRepaintCounter(const GraphicsLayer*) const
{
return m_webViewImpl->page()->settings()->showRepaintCounter();
}
private:
OverlayGraphicsLayerClientImpl(WebViewImpl* webViewImpl, WebPageOverlay* overlay)
: m_overlay(overlay)
, m_webViewImpl(webViewImpl)
{
}
WebPageOverlay* m_overlay;
WebViewImpl* m_webViewImpl;
};
#endif
void PageOverlay::clear()
{
invalidateWebFrame();
#if USE(ACCELERATED_COMPOSITING)
if (m_layer) {
m_layer->removeFromParent();
m_layer = nullptr;
m_layerClient = nullptr;
}
#endif
}
void PageOverlay::update()
{
invalidateWebFrame();
#if USE(ACCELERATED_COMPOSITING)
if (!m_layer) {
m_layerClient = OverlayGraphicsLayerClientImpl::create(m_viewImpl, m_overlay);
m_layer = GraphicsLayer::create(m_layerClient.get());
m_layer->setName("WebViewImpl page overlay content");
m_layer->setDrawsContent(true);
}
FloatSize size(m_viewImpl->size());
if (size != m_layer->size()) {
m_layer->removeFromParent();
m_layer->setSize(size);
}
m_viewImpl->setOverlayLayer(m_layer.get());
m_layer->setNeedsDisplay();
#endif
}
void PageOverlay::paintWebFrame(GraphicsContext& gc)
{
if (!m_viewImpl->isAcceleratedCompositingActive()) {
gc.save();
m_overlay->paintPageOverlay(ToWebCanvas(&gc));
gc.restore();
}
}
void PageOverlay::invalidateWebFrame()
{
if (!m_viewImpl->isAcceleratedCompositingActive()) {
const WebSize& size = m_viewImpl->size();
WebRect damagedRect(0, 0, size.width, size.height);
if (m_viewImpl->client())
m_viewImpl->client()->didInvalidateRect(damagedRect);
}
}
}