Index: WebCore/platform/graphics/skia/LayerSkia.cpp |
=================================================================== |
--- WebCore/platform/graphics/skia/LayerSkia.cpp (revision 0) |
+++ WebCore/platform/graphics/skia/LayerSkia.cpp (revision 0) |
@@ -0,0 +1,297 @@ |
+/* |
+ * 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. |
+ */ |
+ |
+ |
+#include "config.h" |
+ |
+#if USE(ACCELERATED_COMPOSITING) |
+ |
+#include "LayerSkia.h" |
+#include "PlatformContextSkia.h" |
+#include "RenderLayerBacking.h" |
+ |
+#include "skia/ext/platform_canvas.h" |
+ |
+namespace WebCore { |
+ |
+using namespace std; |
+ |
+ |
+PassRefPtr<LayerSkia> LayerSkia::create(LayerType type, GraphicsLayerSkia* owner) |
+{ |
+ return adoptRef(new LayerSkia(type, owner)); |
+} |
+ |
+LayerSkia::LayerSkia(LayerType type, GraphicsLayerSkia* owner) |
+ : m_needsDisplayOnBoundsChange(false) |
+ , m_owner(owner) |
+ , m_layerType(type) |
+ , m_superlayer(0) |
+ , m_borderWidth(0) |
+ , m_borderColor(0, 0, 0, 0) |
+ , m_backgroundColor(0, 0, 0, 0) |
+ , m_anchorPointZ(0) |
+ , m_clearsContext(false) |
+ , m_doubleSided(false) |
+ , m_edgeAntialiasingMask(0) |
+ , m_hidden(false) |
+ , m_masksToBounds(false) |
+ , m_contentsGravity(Bottom) |
+ , m_opacity(1.0) |
+ , m_opaque(true) |
+ , m_zPosition(0.0) |
+ , m_canvas(0) |
+ , m_skiaContext(0) |
+ , m_graphicsContext(0) |
+ , m_geometryFlipped(false) |
+{ |
+ m_bounds.setEmpty(); |
+ m_backingStoreRect.setEmpty(); |
+ m_frame.setEmpty(); |
+ m_position.set(0, 0); |
+ m_anchorPoint.set(0, 0); |
+ m_transform.reset(); |
+ m_sublayerTransform.reset(); |
+ |
+ updateGraphicsContext(m_backingStoreRect); |
+} |
+ |
+LayerSkia::~LayerSkia() |
+{ |
+ // Our superlayer should be holding a reference to us, so there should be no way for us to be destroyed while we still have a superlayer. |
+ ASSERT(!superlayer()); |
+ |
+ delete m_graphicsContext; |
+ delete m_skiaContext; |
+ delete m_canvas; |
+} |
+ |
+void LayerSkia::updateGraphicsContext(const SkIRect& rect) |
+{ |
+ if (m_graphicsContext) |
+ delete m_graphicsContext; |
+ if (m_skiaContext) |
+ delete m_skiaContext; |
+ if (m_canvas) |
+ delete m_canvas; |
+ |
+ m_canvas = new skia::PlatformCanvas(rect.width(), rect.height(), false); |
+ m_skiaContext = new PlatformContextSkia(m_canvas); |
+ |
+ // This is needed to get text to show up correctly. Without it, |
+ // GDI renders with zero alpha and the text becomes invisible. |
+ // Unfortunately, setting this to true disables cleartype. |
+ m_skiaContext->setDrawingToImageBuffer(true); |
+ |
+ m_graphicsContext = new GraphicsContext(reinterpret_cast<PlatformGraphicsContext*>(m_skiaContext)); |
+ |
+ // Backing store a layer could be different than then layer's bounds. |
+ // This is mostly true for the root layer that's sized based on the view |
+ // size rather than the actual layer size. |
+ m_backingStoreRect = rect; |
+} |
+ |
+void LayerSkia::updateContents() |
+{ |
+ RenderLayerBacking* backing = static_cast<RenderLayerBacking*>(m_owner->client()); |
+ |
+ if (backing && !backing->paintingGoesToWindow()) { |
+ m_owner->paintGraphicsLayerContents(*m_graphicsContext, IntRect(0, 0, m_bounds.width(), m_bounds.height())); |
+ } |
+ |
+ // Paint the debug border. |
+ // TODO(vangelis): Add a flag to check if debug borders are used. |
+ m_graphicsContext->setStrokeColor(m_borderColor, DeviceColorSpace); |
+ m_graphicsContext->setStrokeThickness(m_borderWidth); |
+ m_graphicsContext->drawLine(IntPoint(0, 0), IntPoint(m_bounds.width(), 0)); |
+ m_graphicsContext->drawLine(IntPoint(0, 0), IntPoint(0, m_bounds.height())); |
+ m_graphicsContext->drawLine(IntPoint(m_bounds.width(), 0), IntPoint(m_bounds.width(), m_bounds.height())); |
+ m_graphicsContext->drawLine(IntPoint(0, m_bounds.height()), IntPoint(m_bounds.width(), m_bounds.height())); |
+} |
+ |
+ |
+void LayerSkia::setNeedsCommit() |
+{ |
+ // Call notifySyncRequired(), which in this implementation plumbs through to |
+ // call setRootLayerNeedsDisplay() on the WebView, which causes the CACFRenderer |
+ // to render a frame. |
+ if (m_owner) |
+ m_owner->notifySyncRequired(); |
+} |
+ |
+void LayerSkia::addSublayer(PassRefPtr<LayerSkia> sublayer) |
+{ |
+ insertSublayer(sublayer, numSublayers()); |
+} |
+ |
+void LayerSkia::insertSublayer(PassRefPtr<LayerSkia> sublayer, size_t index) |
+{ |
+ index = min(index, m_sublayers.size()); |
+ m_sublayers.insert(index, sublayer); |
+ sublayer->setSuperlayer(this); |
+ setNeedsCommit(); |
+} |
+ |
+void LayerSkia::replaceSublayer(LayerSkia* reference, PassRefPtr<LayerSkia> newLayer) |
+{ |
+ ASSERT_ARG(reference, reference); |
+ ASSERT_ARG(reference, reference->superlayer() == this); |
+ |
+ if (reference == newLayer) |
+ return; |
+ |
+ if (!newLayer) { |
+ removeSublayer(reference); |
+ return; |
+ } |
+ |
+ newLayer->removeFromSuperlayer(); |
+ |
+ int referenceIndex = indexOfSublayer(reference); |
+ ASSERT(referenceIndex != -1); |
+ if (referenceIndex == -1) |
+ return; |
+ |
+ reference->removeFromSuperlayer(); |
+ insertSublayer(newLayer, referenceIndex); |
+} |
+ |
+void LayerSkia::removeFromSuperlayer() |
+{ |
+ LayerSkia* superlayer = this->superlayer(); |
+ if (!superlayer) |
+ return; |
+ |
+ superlayer->removeSublayer(this); |
+ superlayer->setNeedsCommit(); |
+} |
+ |
+void LayerSkia::removeSublayer(LayerSkia* sublayer) |
+{ |
+ int foundIndex = indexOfSublayer(sublayer); |
+ if (foundIndex == -1) |
+ return; |
+ |
+ m_sublayers.remove(foundIndex); |
+ sublayer->setSuperlayer(0); |
+ setNeedsCommit(); |
+} |
+ |
+int LayerSkia::indexOfSublayer(const LayerSkia* reference) |
+{ |
+ for (size_t i = 0; i < m_sublayers.size(); i++) { |
+ if (m_sublayers[i] == reference) |
+ return i; |
+ } |
+ return -1; |
+} |
+ |
+LayerSkia* LayerSkia::ancestorOrSelfWithSuperlayer(LayerSkia* superlayer) const |
+{ |
+ LayerSkia* layer = const_cast<LayerSkia*>(this); |
+ for (LayerSkia* ancestor = this->superlayer(); ancestor; layer = ancestor, ancestor = ancestor->superlayer()) { |
+ if (ancestor == superlayer) |
+ return layer; |
+ } |
+ return 0; |
+} |
+ |
+void LayerSkia::setBackingStoreRect(const SkIRect& rect) |
+{ |
+ if (m_backingStoreRect == rect) |
+ return; |
+ |
+ updateGraphicsContext(rect); |
+} |
+ |
+ |
+void LayerSkia::setBounds(const SkIRect& rect) |
+{ |
+ if (rect == m_bounds) |
+ return; |
+ |
+ m_bounds = rect; |
+ |
+ // Re-create the canvas and associated contexts. |
+ updateGraphicsContext(m_bounds); |
+ |
+ setNeedsCommit(); |
+} |
+ |
+void LayerSkia::setFrame(const SkRect& rect) |
+{ |
+ m_frame = rect; |
+ setNeedsCommit(); |
+} |
+ |
+ |
+LayerSkia* LayerSkia::rootLayer() const |
+{ |
+ LayerSkia* layer = const_cast<LayerSkia*>(this); |
+ for (LayerSkia* superlayer = layer->superlayer(); superlayer; layer = superlayer, superlayer = superlayer->superlayer()) { } |
+ return layer; |
+} |
+ |
+void LayerSkia::removeAllSublayers() |
+{ |
+ m_sublayers.clear(); |
+ setNeedsCommit(); |
+} |
+ |
+void LayerSkia::setSublayers(const Vector<RefPtr<LayerSkia> >& sublayers) |
+{ |
+ m_sublayers = sublayers; |
+} |
+ |
+void LayerSkia::setSuperlayer(LayerSkia* superlayer) |
+{ |
+ m_superlayer = superlayer; |
+} |
+ |
+LayerSkia* LayerSkia::superlayer() const |
+{ |
+ return m_superlayer; |
+} |
+ |
+void LayerSkia::setNeedsDisplay(const SkRect& dirtyRect) |
+{ |
+ // TODO(vangelis): implement |
+ setNeedsCommit(); |
+} |
+ |
+void LayerSkia::setNeedsDisplay() |
+{ |
+ // TODO(vangelis): implement |
+} |
+ |
+ |
+} |
+ |
+#endif // USE(ACCELERATED_COMPOSITING) |
Property changes on: WebCore\platform\graphics\skia\LayerSkia.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |