Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1169)

Unified Diff: ui/cc/LayerChromium.h

Issue 10701016: Initial import attempt, just to play with. Many things disabled/removed (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/cc/ImageLayerChromium.cpp ('k') | ui/cc/LayerChromium.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/cc/LayerChromium.h
diff --git a/ui/cc/LayerChromium.h b/ui/cc/LayerChromium.h
new file mode 100644
index 0000000000000000000000000000000000000000..0c0cfb0dfa1adae6bbbdc398258b2cb59c5b6c47
--- /dev/null
+++ b/ui/cc/LayerChromium.h
@@ -0,0 +1,416 @@
+/*
+ * 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 LayerChromium_h
+#define LayerChromium_h
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#include "FloatPoint.h"
+#include "Region.h"
+#include "RenderSurfaceChromium.h"
+#include "SkColor.h"
+#include "cc/CCLayerAnimationController.h"
+#include "cc/CCOcclusionTracker.h"
+
+#include <public/WebFilterOperations.h>
+#include <public/WebTransformationMatrix.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
+#include <wtf/Vector.h>
+#include <wtf/text/StringHash.h>
+#include <wtf/text/WTFString.h>
+
+
+namespace WebCore {
+
+class CCActiveAnimation;
+struct CCAnimationEvent;
+class CCLayerAnimationDelegate;
+class CCLayerImpl;
+class CCLayerTreeHost;
+class CCTextureUpdater;
+class ScrollbarLayerChromium;
+
+// Delegate for handling scroll input for a LayerChromium.
+class LayerChromiumScrollDelegate {
+public:
+ virtual void didScroll(const IntSize&) = 0;
+
+protected:
+ virtual ~LayerChromiumScrollDelegate() { }
+};
+
+// Base class for composited layers. Special layer types are derived from
+// this class.
+class LayerChromium : public RefCounted<LayerChromium>, public CCLayerAnimationControllerClient {
+public:
+ static PassRefPtr<LayerChromium> create();
+
+ virtual ~LayerChromium();
+
+ // CCLayerAnimationControllerClient implementation
+ virtual int id() const OVERRIDE { return m_layerId; }
+ virtual void setOpacityFromAnimation(float) OVERRIDE;
+ virtual float opacity() const OVERRIDE { return m_opacity; }
+ virtual void setTransformFromAnimation(const WebKit::WebTransformationMatrix&) OVERRIDE;
+ // A layer's transform operates layer space. That is, entirely in logical,
+ // non-page-scaled pixels (that is, they have page zoom baked in, but not page scale).
+ // The root layer is a special case -- it operates in physical pixels.
+ virtual const WebKit::WebTransformationMatrix& transform() const OVERRIDE { return m_transform; }
+
+ const LayerChromium* rootLayer() const;
+ LayerChromium* parent() const;
+ void addChild(PassRefPtr<LayerChromium>);
+ void insertChild(PassRefPtr<LayerChromium>, size_t index);
+ void replaceChild(LayerChromium* reference, PassRefPtr<LayerChromium> newLayer);
+ void removeFromParent();
+ void removeAllChildren();
+ void setChildren(const Vector<RefPtr<LayerChromium> >&);
+ const Vector<RefPtr<LayerChromium> >& children() const { return m_children; }
+
+ void setAnchorPoint(const FloatPoint&);
+ FloatPoint anchorPoint() const { return m_anchorPoint; }
+
+ void setAnchorPointZ(float);
+ float anchorPointZ() const { return m_anchorPointZ; }
+
+ void setBackgroundColor(SkColor);
+ SkColor backgroundColor() const { return m_backgroundColor; }
+
+ // A layer's bounds are in logical, non-page-scaled pixels (however, the
+ // root layer's bounds are in physical pixels).
+ void setBounds(const IntSize&);
+ const IntSize& bounds() const { return m_bounds; }
+ virtual IntSize contentBounds() const { return bounds(); }
+
+ void setMasksToBounds(bool);
+ bool masksToBounds() const { return m_masksToBounds; }
+
+ void setMaskLayer(LayerChromium*);
+ LayerChromium* maskLayer() const { return m_maskLayer.get(); }
+
+ virtual void setNeedsDisplayRect(const FloatRect& dirtyRect);
+ void setNeedsDisplay() { setNeedsDisplayRect(FloatRect(FloatPoint(), bounds())); }
+ virtual bool needsDisplay() const { return m_needsDisplay; }
+
+ void setOpacity(float);
+ bool opacityIsAnimating() const;
+
+ void setFilters(const WebKit::WebFilterOperations&);
+ const WebKit::WebFilterOperations& filters() { return m_filters; }
+
+ // Background filters are filters applied to what is behind this layer, when they are viewed through non-opaque
+ // regions in this layer. They are used through the WebLayer interface, and are not exposed to HTML.
+ void setBackgroundFilters(const WebKit::WebFilterOperations&);
+ const WebKit::WebFilterOperations& backgroundFilters() { return m_backgroundFilters; }
+
+ virtual void setOpaque(bool);
+ bool opaque() const { return m_opaque; }
+
+ void setPosition(const FloatPoint&);
+ FloatPoint position() const { return m_position; }
+
+ void setIsContainerForFixedPositionLayers(bool);
+ bool isContainerForFixedPositionLayers() const { return m_isContainerForFixedPositionLayers; }
+
+ void setFixedToContainerLayer(bool);
+ bool fixedToContainerLayer() const { return m_fixedToContainerLayer; }
+
+ void setSublayerTransform(const WebKit::WebTransformationMatrix&);
+ const WebKit::WebTransformationMatrix& sublayerTransform() const { return m_sublayerTransform; }
+
+ void setTransform(const WebKit::WebTransformationMatrix&);
+ bool transformIsAnimating() const;
+
+ const IntRect& visibleLayerRect() const { return m_visibleLayerRect; }
+ void setVisibleLayerRect(const IntRect& visibleLayerRect) { m_visibleLayerRect = visibleLayerRect; }
+
+ const IntRect& scissorRect() const { return m_scissorRect; }
+ void setScissorRect(const IntRect& scissorRect) { m_scissorRect = scissorRect; }
+
+ void setScrollPosition(const IntPoint&);
+ const IntPoint& scrollPosition() const { return m_scrollPosition; }
+
+ void setMaxScrollPosition(const IntSize&);
+ const IntSize& maxScrollPosition() const { return m_maxScrollPosition; }
+
+ void setScrollable(bool);
+ bool scrollable() const { return m_scrollable; }
+ void setShouldScrollOnMainThread(bool);
+ void setHaveWheelEventHandlers(bool);
+ const Region& nonFastScrollableRegion() { return m_nonFastScrollableRegion; }
+ void setNonFastScrollableRegion(const Region&);
+ void setNonFastScrollableRegionChanged() { m_nonFastScrollableRegionChanged = true; }
+ void setLayerScrollDelegate(LayerChromiumScrollDelegate* layerScrollDelegate) { m_layerScrollDelegate = layerScrollDelegate; }
+ void scrollBy(const IntSize&);
+
+ void setDrawCheckerboardForMissingTiles(bool);
+ bool drawCheckerboardForMissingTiles() const { return m_drawCheckerboardForMissingTiles; }
+
+ bool forceRenderSurface() const { return m_forceRenderSurface; }
+ void setForceRenderSurface(bool);
+
+ IntSize scrollDelta() const { return IntSize(); }
+
+ float pageScaleDelta() const { return 1; }
+
+ void setDoubleSided(bool);
+ bool doubleSided() const { return m_doubleSided; }
+
+ void setPreserves3D(bool preserve3D) { m_preserves3D = preserve3D; }
+ bool preserves3D() const { return m_preserves3D; }
+
+ void setUseParentBackfaceVisibility(bool useParentBackfaceVisibility) { m_useParentBackfaceVisibility = useParentBackfaceVisibility; }
+ bool useParentBackfaceVisibility() const { return m_useParentBackfaceVisibility; }
+
+ void setUsesLayerClipping(bool usesLayerClipping) { m_usesLayerClipping = usesLayerClipping; }
+ bool usesLayerClipping() const { return m_usesLayerClipping; }
+
+ virtual void setIsNonCompositedContent(bool);
+ bool isNonCompositedContent() const { return m_isNonCompositedContent; }
+
+ virtual void setLayerTreeHost(CCLayerTreeHost*);
+
+ void setIsDrawable(bool);
+
+ void setReplicaLayer(LayerChromium*);
+ LayerChromium* replicaLayer() const { return m_replicaLayer.get(); }
+
+ // These methods typically need to be overwritten by derived classes.
+ virtual bool drawsContent() const { return m_isDrawable; }
+ virtual void update(CCTextureUpdater&, const CCOcclusionTracker*) { }
+ virtual void idleUpdate(CCTextureUpdater&, const CCOcclusionTracker*) { }
+ virtual void setIsMask(bool) { }
+ virtual void bindContentsTexture() { }
+ virtual bool needsContentsScale() const { return false; }
+
+ void setDebugBorderColor(SkColor);
+ void setDebugBorderWidth(float);
+ void setDebugName(const String&);
+
+ virtual void pushPropertiesTo(CCLayerImpl*);
+
+ void clearRenderSurface() { m_renderSurface.clear(); }
+ RenderSurfaceChromium* renderSurface() const { return m_renderSurface.get(); }
+ void createRenderSurface();
+
+ float drawOpacity() const { return m_drawOpacity; }
+ void setDrawOpacity(float opacity) { m_drawOpacity = opacity; }
+
+ bool drawOpacityIsAnimating() const { return m_drawOpacityIsAnimating; }
+ void setDrawOpacityIsAnimating(bool drawOpacityIsAnimating) { m_drawOpacityIsAnimating = drawOpacityIsAnimating; }
+
+ const IntRect& clipRect() const { return m_clipRect; }
+ void setClipRect(const IntRect& clipRect) { m_clipRect = clipRect; }
+ RenderSurfaceChromium* targetRenderSurface() const { return m_targetRenderSurface; }
+ void setTargetRenderSurface(RenderSurfaceChromium* surface) { m_targetRenderSurface = surface; }
+
+ bool drawTransformIsAnimating() const { return m_drawTransformIsAnimating; }
+ void setDrawTransformIsAnimating(bool animating) { m_drawTransformIsAnimating = animating; }
+ bool screenSpaceTransformIsAnimating() const { return m_screenSpaceTransformIsAnimating; }
+ void setScreenSpaceTransformIsAnimating(bool animating) { m_screenSpaceTransformIsAnimating = animating; }
+
+ // This moves from layer space, with origin in the center to target space with origin in the top left.
+ // That is, it converts from logical, non-page-scaled, to target pixels (and if the target is the
+ // root render surface, then this converts to physical pixels).
+ const WebKit::WebTransformationMatrix& drawTransform() const { return m_drawTransform; }
+ void setDrawTransform(const WebKit::WebTransformationMatrix& matrix) { m_drawTransform = matrix; }
+ // This moves from layer space, with origin the top left to screen space with origin in the top left.
+ // It converts logical, non-page-scaled pixels to physical pixels.
+ const WebKit::WebTransformationMatrix& screenSpaceTransform() const { return m_screenSpaceTransform; }
+ void setScreenSpaceTransform(const WebKit::WebTransformationMatrix& matrix) { m_screenSpaceTransform = matrix; }
+ const IntRect& drawableContentRect() const { return m_drawableContentRect; }
+ void setDrawableContentRect(const IntRect& rect) { m_drawableContentRect = rect; }
+ // The contentsScale converts from logical, non-page-scaled pixels to target pixels.
+ // The contentsScale is 1 for the root layer as it is already in physical pixels.
+ float contentsScale() const { return m_contentsScale; }
+ void setContentsScale(float);
+
+ // Returns true if any of the layer's descendants has content to draw.
+ bool descendantDrawsContent();
+
+ CCLayerTreeHost* layerTreeHost() const { return m_layerTreeHost; }
+
+ // Reserve any textures needed for this layer.
+ virtual void reserveTextures() { }
+
+ void setAlwaysReserveTextures(bool alwaysReserveTextures) { m_alwaysReserveTextures = alwaysReserveTextures; }
+ bool alwaysReserveTextures() const { return m_alwaysReserveTextures; }
+
+ bool addAnimation(PassOwnPtr<CCActiveAnimation>);
+ void pauseAnimation(int animationId, double timeOffset);
+ void removeAnimation(int animationId);
+
+ void suspendAnimations(double monotonicTime);
+ void resumeAnimations(double monotonicTime);
+
+ CCLayerAnimationController* layerAnimationController() { return m_layerAnimationController.get(); }
+ void setLayerAnimationController(PassOwnPtr<CCLayerAnimationController>);
+ PassOwnPtr<CCLayerAnimationController> releaseLayerAnimationController();
+
+ void setLayerAnimationDelegate(CCLayerAnimationDelegate* layerAnimationDelegate) { m_layerAnimationDelegate = layerAnimationDelegate; }
+
+ bool hasActiveAnimation() const;
+
+ virtual void notifyAnimationStarted(const CCAnimationEvent&, double wallClockTime);
+ virtual void notifyAnimationFinished(double wallClockTime);
+
+ virtual Region visibleContentOpaqueRegion() const;
+
+ virtual ScrollbarLayerChromium* toScrollbarLayerChromium() { return 0; }
+
+protected:
+ friend class CCLayerImpl;
+ friend class TreeSynchronizer;
+
+ LayerChromium();
+
+ void setNeedsCommit();
+
+ // This flag is set when layer need repainting/updating.
+ bool m_needsDisplay;
+
+ // Tracks whether this layer may have changed stacking order with its siblings.
+ bool m_stackingOrderChanged;
+
+ // The update rect is the region of the compositor resource that was actually updated by the compositor.
+ // For layers that may do updating outside the compositor's control (i.e. plugin layers), this information
+ // is not available and the update rect will remain empty.
+ // Note this rect is in layer space (not content space).
+ FloatRect m_updateRect;
+
+ RefPtr<LayerChromium> m_maskLayer;
+
+ // Constructs a CCLayerImpl of the correct runtime type for this LayerChromium type.
+ virtual PassOwnPtr<CCLayerImpl> createCCLayerImpl();
+ int m_layerId;
+
+private:
+ void setParent(LayerChromium*);
+ bool hasAncestor(LayerChromium*) const;
+ bool descendantIsFixedToContainerLayer() const;
+
+ size_t numChildren() const { return m_children.size(); }
+
+ // Returns the index of the child or -1 if not found.
+ int indexOfChild(const LayerChromium*);
+
+ // This should only be called from removeFromParent.
+ void removeChild(LayerChromium*);
+
+ Vector<RefPtr<LayerChromium> > m_children;
+ LayerChromium* m_parent;
+
+ // LayerChromium instances have a weak pointer to their CCLayerTreeHost.
+ // This pointer value is nil when a LayerChromium is not in a tree and is
+ // updated via setLayerTreeHost() if a layer moves between trees.
+ CCLayerTreeHost* m_layerTreeHost;
+
+ OwnPtr<CCLayerAnimationController> m_layerAnimationController;
+
+ // Layer properties.
+ IntSize m_bounds;
+
+ // Uses layer's content space.
+ IntRect m_visibleLayerRect;
+
+ // During drawing, identifies the region outside of which nothing should be drawn.
+ // Currently this is set to layer's clipRect if usesLayerClipping is true, otherwise
+ // it's targetRenderSurface's contentRect.
+ // Uses target surface's space.
+ IntRect m_scissorRect;
+ IntPoint m_scrollPosition;
+ IntSize m_maxScrollPosition;
+ bool m_scrollable;
+ bool m_shouldScrollOnMainThread;
+ bool m_haveWheelEventHandlers;
+ Region m_nonFastScrollableRegion;
+ bool m_nonFastScrollableRegionChanged;
+ FloatPoint m_position;
+ FloatPoint m_anchorPoint;
+ SkColor m_backgroundColor;
+ SkColor m_debugBorderColor;
+ float m_debugBorderWidth;
+ String m_debugName;
+ float m_opacity;
+ WebKit::WebFilterOperations m_filters;
+ WebKit::WebFilterOperations m_backgroundFilters;
+ float m_anchorPointZ;
+ bool m_isContainerForFixedPositionLayers;
+ bool m_fixedToContainerLayer;
+ bool m_isDrawable;
+ bool m_masksToBounds;
+ bool m_opaque;
+ bool m_doubleSided;
+ bool m_usesLayerClipping;
+ bool m_isNonCompositedContent;
+ bool m_preserves3D;
+ bool m_useParentBackfaceVisibility;
+ bool m_alwaysReserveTextures;
+ bool m_drawCheckerboardForMissingTiles;
+ bool m_forceRenderSurface;
+
+ WebKit::WebTransformationMatrix m_transform;
+ WebKit::WebTransformationMatrix m_sublayerTransform;
+
+ // Replica layer used for reflections.
+ RefPtr<LayerChromium> m_replicaLayer;
+
+ // Transient properties.
+ OwnPtr<RenderSurfaceChromium> m_renderSurface;
+ float m_drawOpacity;
+ bool m_drawOpacityIsAnimating;
+
+ // Uses target surface space.
+ IntRect m_clipRect;
+ RenderSurfaceChromium* m_targetRenderSurface;
+ WebKit::WebTransformationMatrix m_drawTransform;
+ WebKit::WebTransformationMatrix m_screenSpaceTransform;
+ bool m_drawTransformIsAnimating;
+ bool m_screenSpaceTransformIsAnimating;
+
+ // Uses target surface space.
+ IntRect m_drawableContentRect;
+ float m_contentsScale;
+
+ CCLayerAnimationDelegate* m_layerAnimationDelegate;
+ LayerChromiumScrollDelegate* m_layerScrollDelegate;
+};
+
+void sortLayers(Vector<RefPtr<LayerChromium> >::iterator, Vector<RefPtr<LayerChromium> >::iterator, void*);
+
+}
+#endif // USE(ACCELERATED_COMPOSITING)
+
+#endif
« no previous file with comments | « ui/cc/ImageLayerChromium.cpp ('k') | ui/cc/LayerChromium.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698