Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
[LBSE] Begin stub implementation of RenderSVGViewportContainer
https://bugs.webkit.org/show_bug.cgi?id=242701 Reviewed by Rob Buis. Rename LegacyRenderSVGViewportContainer -> RenderSVGViewportContainer and adapt all call sites. Introduce layer-aware RenderSVGViewportContainer at the same time as stub implementation. Follow-up patches will bring support for inner <svg> elements. * Source/WebCore/Sources.txt: * Source/WebCore/WebCore.xcodeproj/project.pbxproj: * Source/WebCore/rendering/RenderObject.h: (WebCore::RenderObject::isLegacySVGViewportContainer const): * Source/WebCore/rendering/svg/LegacyRenderSVGContainer.cpp: (WebCore::LegacyRenderSVGContainer::layout): (WebCore::LegacyRenderSVGContainer::paint): (WebCore::LegacyRenderSVGContainer::nodeAtFloatPoint): * Source/WebCore/rendering/svg/LegacyRenderSVGViewportContainer.cpp: Copied from Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp. (WebCore::LegacyRenderSVGViewportContainer::LegacyRenderSVGViewportContainer): (WebCore::LegacyRenderSVGViewportContainer::svgSVGElement const): (WebCore::LegacyRenderSVGViewportContainer::determineIfLayoutSizeChanged): (WebCore::LegacyRenderSVGViewportContainer::applyViewportClip): (WebCore::LegacyRenderSVGViewportContainer::calcViewport): (WebCore::LegacyRenderSVGViewportContainer::calculateLocalTransform): (WebCore::LegacyRenderSVGViewportContainer::viewportTransform const): (WebCore::LegacyRenderSVGViewportContainer::pointIsInsideViewportClip): (WebCore::LegacyRenderSVGViewportContainer::paint): * Source/WebCore/rendering/svg/LegacyRenderSVGViewportContainer.h: Copied from Source/WebCore/rendering/svg/RenderSVGViewportContainer.h. * Source/WebCore/rendering/svg/RenderSVGViewportContainer.cpp: (WebCore::RenderSVGViewportContainer::RenderSVGViewportContainer): (WebCore::RenderSVGViewportContainer::svgSVGElement const): (WebCore::RenderSVGViewportContainer::computeViewport const): (WebCore::RenderSVGViewportContainer::updateLayerTransform): (WebCore::RenderSVGViewportContainer::applyTransform const): (WebCore::RenderSVGViewportContainer::determineIfLayoutSizeChanged): Deleted. (WebCore::RenderSVGViewportContainer::applyViewportClip): Deleted. (WebCore::RenderSVGViewportContainer::calcViewport): Deleted. (WebCore::RenderSVGViewportContainer::calculateLocalTransform): Deleted. (WebCore::RenderSVGViewportContainer::viewportTransform const): Deleted. (WebCore::RenderSVGViewportContainer::pointIsInsideViewportClip): Deleted. (WebCore::RenderSVGViewportContainer::paint): Deleted. * Source/WebCore/rendering/svg/RenderSVGViewportContainer.h: * Source/WebCore/rendering/svg/SVGRenderSupport.cpp: (WebCore::layoutSizeOfNearestViewportChanged): (WebCore::SVGRenderSupport::transformToRootChanged): * Source/WebCore/svg/SVGLengthContext.cpp: * Source/WebCore/svg/SVGSVGElement.cpp: (WebCore::SVGSVGElement::createElementRenderer): (WebCore::SVGSVGElement::currentViewportSize const): Canonical link: https://commits.webkit.org/252500@main
- Loading branch information
1 parent
d6d6a06
commit 273d610500568994a594191403c869ffe26098e2
Showing
11 changed files
with
241 additions
and
104 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
/* | ||
* Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org> | ||
* Copyright (C) 2004, 2005, 2007 Rob Buis <buis@kde.org> | ||
* Copyright (C) 2007 Eric Seidel <eric@webkit.org> | ||
* Copyright (C) 2009 Google, Inc. | ||
* | ||
* This library is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU Library General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 2 of the License, or (at your option) any later version. | ||
* | ||
* This library is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* Library General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Library General Public License | ||
* along with this library; see the file COPYING.LIB. If not, write to | ||
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
* Boston, MA 02110-1301, USA. | ||
*/ | ||
|
||
#include "config.h" | ||
#include "LegacyRenderSVGViewportContainer.h" | ||
|
||
#include "GraphicsContext.h" | ||
#include "RenderView.h" | ||
#include "SVGElementTypeHelpers.h" | ||
#include "SVGSVGElement.h" | ||
#include <wtf/IsoMallocInlines.h> | ||
|
||
namespace WebCore { | ||
|
||
WTF_MAKE_ISO_ALLOCATED_IMPL(LegacyRenderSVGViewportContainer); | ||
|
||
LegacyRenderSVGViewportContainer::LegacyRenderSVGViewportContainer(SVGSVGElement& element, RenderStyle&& style) | ||
: LegacyRenderSVGContainer(element, WTFMove(style)) | ||
, m_didTransformToRootUpdate(false) | ||
, m_isLayoutSizeChanged(false) | ||
, m_needsTransformUpdate(true) | ||
{ | ||
} | ||
|
||
SVGSVGElement& LegacyRenderSVGViewportContainer::svgSVGElement() const | ||
{ | ||
return downcast<SVGSVGElement>(LegacyRenderSVGContainer::element()); | ||
} | ||
|
||
void LegacyRenderSVGViewportContainer::determineIfLayoutSizeChanged() | ||
{ | ||
m_isLayoutSizeChanged = svgSVGElement().hasRelativeLengths() && selfNeedsLayout(); | ||
} | ||
|
||
void LegacyRenderSVGViewportContainer::applyViewportClip(PaintInfo& paintInfo) | ||
{ | ||
if (SVGRenderSupport::isOverflowHidden(*this)) | ||
paintInfo.context().clip(m_viewport); | ||
} | ||
|
||
void LegacyRenderSVGViewportContainer::calcViewport() | ||
{ | ||
SVGSVGElement& element = svgSVGElement(); | ||
SVGLengthContext lengthContext(&element); | ||
FloatRect newViewport(element.x().value(lengthContext), element.y().value(lengthContext), element.width().value(lengthContext), element.height().value(lengthContext)); | ||
|
||
if (m_viewport == newViewport) | ||
return; | ||
|
||
m_viewport = newViewport; | ||
|
||
setNeedsBoundariesUpdate(); | ||
setNeedsTransformUpdate(); | ||
} | ||
|
||
bool LegacyRenderSVGViewportContainer::calculateLocalTransform() | ||
{ | ||
m_didTransformToRootUpdate = m_needsTransformUpdate || SVGRenderSupport::transformToRootChanged(parent()); | ||
if (!m_needsTransformUpdate) | ||
return false; | ||
|
||
m_localToParentTransform = AffineTransform::makeTranslation(toFloatSize(m_viewport.location())) * viewportTransform(); | ||
m_needsTransformUpdate = false; | ||
return true; | ||
} | ||
|
||
AffineTransform LegacyRenderSVGViewportContainer::viewportTransform() const | ||
{ | ||
return svgSVGElement().viewBoxToViewTransform(m_viewport.width(), m_viewport.height()); | ||
} | ||
|
||
bool LegacyRenderSVGViewportContainer::pointIsInsideViewportClip(const FloatPoint& pointInParent) | ||
{ | ||
// Respect the viewport clip (which is in parent coords) | ||
if (!SVGRenderSupport::isOverflowHidden(*this)) | ||
return true; | ||
|
||
return m_viewport.contains(pointInParent); | ||
} | ||
|
||
void LegacyRenderSVGViewportContainer::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) | ||
{ | ||
// An empty viewBox disables rendering. | ||
if (svgSVGElement().hasEmptyViewBox()) | ||
return; | ||
|
||
LegacyRenderSVGContainer::paint(paintInfo, paintOffset); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
/* | ||
* Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org> | ||
* Copyright (C) 2004, 2005, 2007 Rob Buis <buis@kde.org> | ||
* Copyright (C) 2009 Google, Inc. | ||
* Copyright (C) 2009 Apple Inc. All rights reserved. | ||
* | ||
* This library is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU Library General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 2 of the License, or (at your option) any later version. | ||
* | ||
* This library is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* Library General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Library General Public License | ||
* along with this library; see the file COPYING.LIB. If not, write to | ||
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
* Boston, MA 02110-1301, USA. | ||
*/ | ||
|
||
#pragma once | ||
|
||
#include "LegacyRenderSVGContainer.h" | ||
|
||
namespace WebCore { | ||
|
||
// This is used for non-root <svg> elements and <marker> elements, neither of which are SVGTransformable | ||
// thus we inherit from LegacyRenderSVGContainer instead of LegacyRenderSVGTransformableContainer | ||
class LegacyRenderSVGViewportContainer final : public LegacyRenderSVGContainer { | ||
WTF_MAKE_ISO_ALLOCATED(LegacyRenderSVGViewportContainer); | ||
public: | ||
LegacyRenderSVGViewportContainer(SVGSVGElement&, RenderStyle&&); | ||
|
||
SVGSVGElement& svgSVGElement() const; | ||
|
||
FloatRect viewport() const { return m_viewport; } | ||
|
||
bool isLayoutSizeChanged() const { return m_isLayoutSizeChanged; } | ||
bool didTransformToRootUpdate() override { return m_didTransformToRootUpdate; } | ||
|
||
void determineIfLayoutSizeChanged() override; | ||
void setNeedsTransformUpdate() override { m_needsTransformUpdate = true; } | ||
|
||
void paint(PaintInfo&, const LayoutPoint&) override; | ||
|
||
private: | ||
void element() const = delete; | ||
|
||
bool isLegacySVGViewportContainer() const override { return true; } | ||
ASCIILiteral renderName() const override { return "RenderSVGViewportContainer"_s; } | ||
|
||
AffineTransform viewportTransform() const; | ||
const AffineTransform& localToParentTransform() const override { return m_localToParentTransform; } | ||
|
||
void calcViewport() override; | ||
bool calculateLocalTransform() override; | ||
|
||
void applyViewportClip(PaintInfo&) override; | ||
bool pointIsInsideViewportClip(const FloatPoint& pointInParent) override; | ||
|
||
bool m_didTransformToRootUpdate : 1; | ||
bool m_isLayoutSizeChanged : 1; | ||
bool m_needsTransformUpdate : 1; | ||
|
||
FloatRect m_viewport; | ||
mutable AffineTransform m_localToParentTransform; | ||
}; | ||
|
||
} // namespace WebCore | ||
|
||
SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(LegacyRenderSVGViewportContainer, isLegacySVGViewportContainer()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.