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

Unified Diff: sky/engine/web/LinkHighlight.cpp

Issue 762993003: Remove GraphicsLayer family of classes. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 1 month 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
Index: sky/engine/web/LinkHighlight.cpp
diff --git a/sky/engine/web/LinkHighlight.cpp b/sky/engine/web/LinkHighlight.cpp
deleted file mode 100644
index dcf96670f938e0743e12c0393603be7d7fd17c6f..0000000000000000000000000000000000000000
--- a/sky/engine/web/LinkHighlight.cpp
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (C) 2012 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:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. 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.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS 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 APPLE OR ITS 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 "sky/engine/config.h"
-
-#include "sky/engine/web/LinkHighlight.h"
-
-#include "sky/engine/core/dom/Node.h"
-#include "sky/engine/core/frame/FrameView.h"
-#include "sky/engine/core/frame/LocalFrame.h"
-#include "sky/engine/core/rendering/RenderLayer.h"
-#include "sky/engine/core/rendering/RenderLayerModelObject.h"
-#include "sky/engine/core/rendering/RenderObject.h"
-#include "sky/engine/core/rendering/RenderView.h"
-#include "sky/engine/core/rendering/style/ShadowData.h"
-#include "sky/engine/platform/graphics/Color.h"
-#include "sky/engine/public/platform/Platform.h"
-#include "sky/engine/public/platform/WebCompositorAnimationCurve.h"
-#include "sky/engine/public/platform/WebCompositorSupport.h"
-#include "sky/engine/public/platform/WebFloatAnimationCurve.h"
-#include "sky/engine/public/platform/WebFloatPoint.h"
-#include "sky/engine/public/platform/WebRect.h"
-#include "sky/engine/public/platform/WebSize.h"
-#include "sky/engine/public/web/Sky.h"
-#include "sky/engine/web/WebLocalFrameImpl.h"
-#include "sky/engine/web/WebSettingsImpl.h"
-#include "sky/engine/web/WebViewImpl.h"
-#include "sky/engine/wtf/CurrentTime.h"
-#include "third_party/skia/include/utils/SkMatrix44.h"
-
-namespace blink {
-
-class WebViewImpl;
-
-PassOwnPtr<LinkHighlight> LinkHighlight::create(Node* node, WebViewImpl* owningWebViewImpl)
-{
- return adoptPtr(new LinkHighlight(node, owningWebViewImpl));
-}
-
-LinkHighlight::LinkHighlight(Node* node, WebViewImpl* owningWebViewImpl)
- : m_node(node)
- , m_owningWebViewImpl(owningWebViewImpl)
- , m_currentGraphicsLayer(0)
- , m_geometryNeedsUpdate(false)
- , m_isAnimating(false)
- , m_startTime(monotonicallyIncreasingTime())
-{
- ASSERT(m_node);
- ASSERT(owningWebViewImpl);
- WebCompositorSupport* compositorSupport = Platform::current()->compositorSupport();
- m_contentLayer = adoptPtr(compositorSupport->createContentLayer(this));
- m_clipLayer = adoptPtr(compositorSupport->createLayer());
- m_clipLayer->setTransformOrigin(WebFloatPoint3D());
- m_clipLayer->addChild(m_contentLayer->layer());
- m_contentLayer->layer()->setAnimationDelegate(this);
- m_contentLayer->layer()->setDrawsContent(true);
- m_contentLayer->layer()->setOpacity(1);
- m_geometryNeedsUpdate = true;
- updateGeometry();
-}
-
-LinkHighlight::~LinkHighlight()
-{
- clearGraphicsLayerLinkHighlightPointer();
- releaseResources();
-}
-
-WebContentLayer* LinkHighlight::contentLayer()
-{
- return m_contentLayer.get();
-}
-
-WebLayer* LinkHighlight::clipLayer()
-{
- return m_clipLayer.get();
-}
-
-void LinkHighlight::releaseResources()
-{
- m_node.clear();
-}
-
-RenderLayer* LinkHighlight::computeEnclosingCompositingLayer()
-{
- return 0;
-}
-
-static void convertTargetSpaceQuadToCompositedLayer(const FloatQuad& targetSpaceQuad, RenderObject* targetRenderer, RenderObject* compositedRenderer, FloatQuad& compositedSpaceQuad)
-{
- ASSERT(targetRenderer);
- ASSERT(compositedRenderer);
-
- for (unsigned i = 0; i < 4; ++i) {
- IntPoint point;
- switch (i) {
- case 0: point = roundedIntPoint(targetSpaceQuad.p1()); break;
- case 1: point = roundedIntPoint(targetSpaceQuad.p2()); break;
- case 2: point = roundedIntPoint(targetSpaceQuad.p3()); break;
- case 3: point = roundedIntPoint(targetSpaceQuad.p4()); break;
- }
-
- point = targetRenderer->frame()->view()->contentsToWindow(point);
- point = compositedRenderer->frame()->view()->windowToContents(point);
- FloatPoint floatPoint = compositedRenderer->absoluteToLocal(point, UseTransforms);
-
- switch (i) {
- case 0: compositedSpaceQuad.setP1(floatPoint); break;
- case 1: compositedSpaceQuad.setP2(floatPoint); break;
- case 2: compositedSpaceQuad.setP3(floatPoint); break;
- case 3: compositedSpaceQuad.setP4(floatPoint); break;
- }
- }
-}
-
-static void addQuadToPath(const FloatQuad& quad, Path& path)
-{
- // FIXME: Make this create rounded quad-paths, just like the axis-aligned case.
- path.moveTo(quad.p1());
- path.addLineTo(quad.p2());
- path.addLineTo(quad.p3());
- path.addLineTo(quad.p4());
- path.closeSubpath();
-}
-
-void LinkHighlight::computeQuads(RenderObject& renderer, Vector<FloatQuad>& outQuads) const
-{
- // For inline elements, absoluteQuads will return a line box based on the line-height
- // and font metrics, which is technically incorrect as replaced elements like images
- // should use their intristic height and expand the linebox as needed. To get an
- // appropriately sized highlight we descend into the children and have them add their
- // boxes.
- if (renderer.isRenderInline()) {
- for (RenderObject* child = renderer.slowFirstChild(); child; child = child->nextSibling())
- computeQuads(*child, outQuads);
- } else {
- renderer.absoluteQuads(outQuads);
- }
-}
-
-bool LinkHighlight::computeHighlightLayerPathAndPosition(RenderLayer* compositingLayer)
-{
- if (!m_node || !m_node->renderer() || !m_currentGraphicsLayer)
- return false;
-
- ASSERT(compositingLayer);
-
- // Get quads for node in absolute coordinates.
- Vector<FloatQuad> quads;
- computeQuads(*m_node->renderer(), quads);
- ASSERT(quads.size());
-
- // Adjust for offset between target graphics layer and the node's renderer.
- FloatPoint positionAdjust = IntPoint(m_currentGraphicsLayer->offsetFromRenderer());
-
- Path newPath;
- for (size_t quadIndex = 0; quadIndex < quads.size(); ++quadIndex) {
- FloatQuad absoluteQuad = quads[quadIndex];
- absoluteQuad.move(-positionAdjust.x(), -positionAdjust.y());
-
- // Transform node quads in target absolute coords to local coordinates in the compositor layer.
- FloatQuad transformedQuad;
- convertTargetSpaceQuadToCompositedLayer(absoluteQuad, m_node->renderer(), compositingLayer->renderer(), transformedQuad);
-
- // FIXME: for now, we'll only use rounded paths if we have a single node quad. The reason for this is that
- // we may sometimes get a chain of adjacent boxes (e.g. for text nodes) which end up looking like sausage
- // links: these should ideally be merged into a single rect before creating the path, but that's
- // another CL.
- if (quads.size() == 1 && transformedQuad.isRectilinear()
- && !m_owningWebViewImpl->settingsImpl()->mockGestureTapHighlightsEnabled()) {
- FloatSize rectRoundingRadii(3, 3);
- newPath.addRoundedRect(transformedQuad.boundingBox(), rectRoundingRadii);
- } else
- addQuadToPath(transformedQuad, newPath);
- }
-
- FloatRect boundingRect = newPath.boundingRect();
- newPath.translate(-toFloatSize(boundingRect.location()));
-
- bool pathHasChanged = !(newPath == m_path);
- if (pathHasChanged) {
- m_path = newPath;
- m_contentLayer->layer()->setBounds(enclosingIntRect(boundingRect).size());
- }
-
- m_contentLayer->layer()->setPosition(boundingRect.location());
-
- return pathHasChanged;
-}
-
-void LinkHighlight::paintContents(WebCanvas* canvas, const WebRect& webClipRect, bool, WebFloatRect&,
- WebContentLayerClient::GraphicsContextStatus contextStatus)
-{
- if (!m_node || !m_node->renderer())
- return;
-
- GraphicsContext gc(canvas,
- contextStatus == WebContentLayerClient::GraphicsContextEnabled ? GraphicsContext::NothingDisabled : GraphicsContext::FullyDisabled);
- IntRect clipRect(IntPoint(webClipRect.x, webClipRect.y), IntSize(webClipRect.width, webClipRect.height));
- gc.clip(clipRect);
- gc.setFillColor(m_node->renderer()->style()->tapHighlightColor());
- gc.fillPath(m_path);
-}
-
-void LinkHighlight::startHighlightAnimationIfNeeded()
-{
- if (m_isAnimating)
- return;
-
- m_isAnimating = true;
- const float startOpacity = 1;
- // FIXME: Should duration be configurable?
- const float fadeDuration = 0.1f;
- const float minPreFadeDuration = 0.1f;
-
- m_contentLayer->layer()->setOpacity(startOpacity);
-
- WebCompositorSupport* compositorSupport = Platform::current()->compositorSupport();
-
- OwnPtr<WebFloatAnimationCurve> curve = adoptPtr(compositorSupport->createFloatAnimationCurve());
-
- curve->add(WebFloatKeyframe(0, startOpacity));
- // Make sure we have displayed for at least minPreFadeDuration before starting to fade out.
- float extraDurationRequired = std::max(0.f, minPreFadeDuration - static_cast<float>(monotonicallyIncreasingTime() - m_startTime));
- if (extraDurationRequired)
- curve->add(WebFloatKeyframe(extraDurationRequired, startOpacity));
- // For layout tests we don't fade out.
- curve->add(WebFloatKeyframe(fadeDuration + extraDurationRequired, layoutTestMode() ? startOpacity : 0));
-
- OwnPtr<WebCompositorAnimation> animation = adoptPtr(compositorSupport->createAnimation(*curve, WebCompositorAnimation::TargetPropertyOpacity));
-
- m_contentLayer->layer()->setDrawsContent(true);
- m_contentLayer->layer()->addAnimation(animation.leakPtr());
-
- invalidate();
- m_owningWebViewImpl->scheduleAnimation();
-}
-
-void LinkHighlight::clearGraphicsLayerLinkHighlightPointer()
-{
- if (m_currentGraphicsLayer) {
- m_currentGraphicsLayer->removeLinkHighlight(this);
- m_currentGraphicsLayer = 0;
- }
-}
-
-void LinkHighlight::notifyAnimationStarted(double, WebCompositorAnimation::TargetProperty)
-{
-}
-
-void LinkHighlight::notifyAnimationFinished(double, WebCompositorAnimation::TargetProperty)
-{
- // Since WebViewImpl may hang on to us for a while, make sure we
- // release resources as soon as possible.
- clearGraphicsLayerLinkHighlightPointer();
- releaseResources();
-}
-
-void LinkHighlight::updateGeometry()
-{
- // To avoid unnecessary updates (e.g. other entities have requested animations from our WebViewImpl),
- // only proceed if we actually requested an update.
- if (!m_geometryNeedsUpdate)
- return;
-
- m_geometryNeedsUpdate = false;
-
- RenderLayer* compositingLayer = computeEnclosingCompositingLayer();
- if (compositingLayer && computeHighlightLayerPathAndPosition(compositingLayer)) {
- // We only need to invalidate the layer if the highlight size has changed, otherwise
- // we can just re-position the layer without needing to repaint.
- m_contentLayer->layer()->invalidate();
-
- if (m_currentGraphicsLayer)
- m_currentGraphicsLayer->addRepaintRect(FloatRect(layer()->position().x, layer()->position().y, layer()->bounds().width, layer()->bounds().height));
- } else if (!m_node || !m_node->renderer()) {
- clearGraphicsLayerLinkHighlightPointer();
- releaseResources();
- }
-}
-
-void LinkHighlight::clearCurrentGraphicsLayer()
-{
- m_currentGraphicsLayer = 0;
- m_geometryNeedsUpdate = true;
-}
-
-void LinkHighlight::invalidate()
-{
- // Make sure we update geometry on the next callback from WebViewImpl::layout().
- m_geometryNeedsUpdate = true;
-}
-
-WebLayer* LinkHighlight::layer()
-{
- return clipLayer();
-}
-
-} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698