blob: d5816b40f813c2922cc55c8103eee9384ad43c54 [file] [log] [blame]
/*
* Copyright (C) 2010 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef GraphicsLayerChromium_h
#define GraphicsLayerChromium_h
#if USE(ACCELERATED_COMPOSITING)
#include "GraphicsContext.h"
#include "GraphicsLayer.h"
#include "OpaqueRectTrackingContentLayerDelegate.h"
#include <public/WebAnimationDelegate.h>
#include <public/WebContentLayer.h>
#include <public/WebImageLayer.h>
#include <public/WebLayer.h>
#include <public/WebLayerScrollClient.h>
#include <wtf/HashMap.h>
namespace WebCore {
class Path;
class ScrollableArea;
class LinkHighlightClient {
public:
virtual void invalidate() = 0;
virtual void clearCurrentGraphicsLayer() = 0;
virtual WebKit::WebLayer* layer() = 0;
protected:
virtual ~LinkHighlightClient() { }
};
class GraphicsLayerChromium : public GraphicsLayer, public GraphicsContextPainter, public WebKit::WebAnimationDelegate, public WebKit::WebLayerScrollClient {
public:
GraphicsLayerChromium(GraphicsLayerClient*);
virtual ~GraphicsLayerChromium();
virtual void willBeDestroyed() OVERRIDE;
virtual void setName(const String&);
virtual bool setChildren(const Vector<GraphicsLayer*>&);
virtual void addChild(GraphicsLayer*);
virtual void addChildAtIndex(GraphicsLayer*, int index);
virtual void addChildAbove(GraphicsLayer*, GraphicsLayer* sibling);
virtual void addChildBelow(GraphicsLayer*, GraphicsLayer* sibling);
virtual bool replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild);
virtual void removeFromParent();
virtual void setPosition(const FloatPoint&);
virtual void setAnchorPoint(const FloatPoint3D&);
virtual void setSize(const FloatSize&);
virtual void setTransform(const TransformationMatrix&);
virtual void setChildrenTransform(const TransformationMatrix&);
virtual void setPreserves3D(bool);
virtual void setMasksToBounds(bool);
virtual void setDrawsContent(bool);
virtual void setContentsVisible(bool);
virtual void setMaskLayer(GraphicsLayer*);
virtual void setBackgroundColor(const Color&);
virtual void clearBackgroundColor();
virtual void setContentsOpaque(bool);
virtual void setBackfaceVisibility(bool);
virtual void setReplicatedByLayer(GraphicsLayer*);
virtual void setOpacity(float);
// Returns true if filter can be rendered by the compositor
virtual bool setFilters(const FilterOperations&);
void setBackgroundFilters(const FilterOperations&);
virtual void setNeedsDisplay();
virtual void setNeedsDisplayInRect(const FloatRect&);
virtual void setContentsNeedsDisplay();
virtual void setContentsRect(const IntRect&);
static void registerContentsLayer(WebKit::WebLayer*);
static void unregisterContentsLayer(WebKit::WebLayer*);
virtual void setContentsToImage(Image*);
virtual void setContentsToMedia(PlatformLayer*);
virtual void setContentsToCanvas(PlatformLayer*);
virtual bool hasContentsLayer() const { return m_contentsLayer; }
virtual bool addAnimation(const KeyframeValueList&, const IntSize& boxSize, const Animation*, const String&, double timeOffset);
virtual void pauseAnimation(const String& animationName, double timeOffset);
virtual void removeAnimation(const String& animationName);
virtual void suspendAnimations(double wallClockTime);
virtual void resumeAnimations();
void setLinkHighlight(LinkHighlightClient*);
// Next function for testing purposes.
LinkHighlightClient* linkHighlight() { return m_linkHighlight; }
virtual WebKit::WebLayer* platformLayer() const;
virtual void setDebugBackgroundColor(const Color&);
virtual void setDebugBorder(const Color&, float borderWidth);
virtual void setAppliesPageScale(bool appliesScale) OVERRIDE;
virtual bool appliesPageScale() const OVERRIDE;
void setScrollableArea(ScrollableArea* scrollableArea) { m_scrollableArea = scrollableArea; }
ScrollableArea* scrollableArea() const { return m_scrollableArea; }
// GraphicsContextPainter implementation.
virtual void paint(GraphicsContext&, const IntRect& clip) OVERRIDE;
// WebAnimationDelegate implementation.
virtual void notifyAnimationStarted(double startTime) OVERRIDE;
virtual void notifyAnimationFinished(double finishTime) OVERRIDE;
// WebLayerScrollClient implementation.
virtual void didScroll() OVERRIDE;
WebKit::WebContentLayer* contentLayer() const { return m_layer.get(); }
// Exposed for tests.
WebKit::WebLayer* contentsLayer() const { return m_contentsLayer; }
private:
void updateNames();
void updateChildList();
void updateLayerPosition();
void updateLayerSize();
void updateAnchorPoint();
void updateTransform();
void updateChildrenTransform();
void updateMasksToBounds();
void updateLayerPreserves3D();
void updateLayerIsDrawable();
void updateLayerBackgroundColor();
void updateContentsImage();
void updateContentsVideo();
void updateContentsRect();
enum ContentsLayerPurpose {
NoContentsLayer = 0,
ContentsLayerForImage,
ContentsLayerForVideo,
ContentsLayerForCanvas,
};
void setContentsTo(ContentsLayerPurpose, WebKit::WebLayer*);
void setupContentsLayer(WebKit::WebLayer*);
void clearContentsLayerIfUnregistered();
WebKit::WebLayer* contentsLayerIfRegistered();
String m_nameBase;
OwnPtr<WebKit::WebContentLayer> m_layer;
OwnPtr<WebKit::WebLayer> m_transformLayer;
OwnPtr<WebKit::WebImageLayer> m_imageLayer;
WebKit::WebLayer* m_contentsLayer;
// We don't have ownership of m_contentsLayer, but we do want to know if a given layer is the
// same as our current layer in setContentsTo(). Since m_contentsLayer may be deleted at this point,
// we stash an ID away when we know m_contentsLayer is alive and use that for comparisons from that point
// on.
int m_contentsLayerId;
LinkHighlightClient* m_linkHighlight;
OwnPtr<OpaqueRectTrackingContentLayerDelegate> m_opaqueRectTrackingContentLayerDelegate;
ContentsLayerPurpose m_contentsLayerPurpose;
bool m_contentsLayerHasBackgroundColor : 1;
bool m_inSetChildren;
typedef HashMap<String, int> AnimationIdMap;
AnimationIdMap m_animationIdMap;
ScrollableArea* m_scrollableArea;
};
} // namespace WebCore
#endif // USE(ACCELERATED_COMPOSITING)
#endif