15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  2004, 2005, 2010 Rob Buis <buis@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) Research In Motion Limited 2010. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Based on khtml code by:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org)
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2002-2003 Dirk Mueller (mueller@kde.org)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2002 Apple Computer, Inc.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is free software; you can redistribute it and/or
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modify it under the terms of the GNU Library General Public
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    License as published by the Free Software Foundation; either
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    version 2 of the License, or (at your option) any later version.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is distributed in the hope that it will be useful,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    but WITHOUT ANY WARRANTY; without even the implied warranty of
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Library General Public License for more details.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    You should have received a copy of the GNU Library General Public License
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    along with this library; see the file COPYING.LIB.  If not, write to
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Boston, MA 02110-1301, USA.
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/SVGRenderStyle.h"
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGRenderStyle::SVGRenderStyle()
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static SVGRenderStyle* defaultStyle = new SVGRenderStyle(CreateDefault);
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fill = defaultStyle->fill;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stroke = defaultStyle->stroke;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stops = defaultStyle->stops;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    misc = defaultStyle->misc;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inheritedResources = defaultStyle->inheritedResources;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resources = defaultStyle->resources;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setBitDefaults();
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGRenderStyle::SVGRenderStyle(CreateDefaultType)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setBitDefaults();
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fill.init();
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stroke.init();
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stops.init();
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    misc.init();
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inheritedResources.init();
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resources.init();
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGRenderStyle::SVGRenderStyle(const SVGRenderStyle& other)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : RefCounted<SVGRenderStyle>()
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fill = other.fill;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stroke = other.stroke;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stops = other.stops;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    misc = other.misc;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inheritedResources = other.inheritedResources;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resources = other.resources;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    svg_inherited_flags = other.svg_inherited_flags;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    svg_noninherited_flags = other.svg_noninherited_flags;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGRenderStyle::~SVGRenderStyle()
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGRenderStyle::operator==(const SVGRenderStyle& other) const
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fill == other.fill
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && stroke == other.stroke
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && stops == other.stops
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && misc == other.misc
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && inheritedResources == other.inheritedResources
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && resources == other.resources
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && svg_inherited_flags == other.svg_inherited_flags
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && svg_noninherited_flags == other.svg_noninherited_flags;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGRenderStyle::inheritedNotEqual(const SVGRenderStyle* other) const
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fill != other->fill
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || stroke != other->stroke
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || inheritedResources != other->inheritedResources
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_inherited_flags != other->svg_inherited_flags;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGRenderStyle::inheritFrom(const SVGRenderStyle* svgInheritParent)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!svgInheritParent)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    fill = svgInheritParent->fill;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stroke = svgInheritParent->stroke;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inheritedResources = svgInheritParent->inheritedResources;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    svg_inherited_flags = svgInheritParent->svg_inherited_flags;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SVGRenderStyle::copyNonInheritedFrom(const SVGRenderStyle* other)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    svg_noninherited_flags = other->svg_noninherited_flags;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stops = other->stops;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    misc = other->misc;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resources = other->resources;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
118f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuStyleDifference SVGRenderStyle::diff(const SVGRenderStyle* other) const
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
120f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    StyleDifference styleDifference;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
122e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (diffNeedsLayoutAndPaintInvalidation(other)) {
123f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        styleDifference.setNeedsFullLayout();
124e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        styleDifference.setNeedsPaintInvalidationObject();
125e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    } else if (diffNeedsPaintInvalidation(other)) {
126e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        styleDifference.setNeedsPaintInvalidationObject();
127d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
128f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
129f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return styleDifference;
130f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
131f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
132e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool SVGRenderStyle::diffNeedsLayoutAndPaintInvalidation(const SVGRenderStyle* other) const
133f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
134e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // If resources change, we need a relayout, as the presence of resources influences the paint invalidation rect.
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resources != other->resources)
136f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If markers change, we need a relayout, as marker boundaries are cached in RenderSVGPath.
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (inheritedResources != other->inheritedResources)
140f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // All text related properties influence layout.
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (svg_inherited_flags._textAnchor != other->svg_inherited_flags._textAnchor
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_inherited_flags._writingMode != other->svg_inherited_flags._writingMode
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_inherited_flags._glyphOrientationHorizontal != other->svg_inherited_flags._glyphOrientationHorizontal
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_inherited_flags._glyphOrientationVertical != other->svg_inherited_flags._glyphOrientationVertical
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_noninherited_flags.f._alignmentBaseline != other->svg_noninherited_flags.f._alignmentBaseline
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_noninherited_flags.f._dominantBaseline != other->svg_noninherited_flags.f._dominantBaseline
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_noninherited_flags.f._baselineShift != other->svg_noninherited_flags.f._baselineShift)
150f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Text related properties influence layout.
153323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (misc->baselineShiftValue != other->misc->baselineShiftValue)
154f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // These properties affect the cached stroke bounding box rects.
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (svg_inherited_flags._capStyle != other->svg_inherited_flags._capStyle
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_inherited_flags._joinStyle != other->svg_inherited_flags._joinStyle)
159f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
160f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
161f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // vector-effect changes require a re-layout.
162f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (svg_noninherited_flags.f._vectorEffect != other->svg_noninherited_flags.f._vectorEffect)
163f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Some stroke properties, requires relayouts, as the cached stroke boundaries need to be recalculated.
166323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (stroke.get() != other->stroke.get()) {
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (stroke->width != other->stroke->width
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || stroke->paintType != other->stroke->paintType
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || stroke->paintColor != other->stroke->paintColor
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || stroke->paintUri != other->stroke->paintUri
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || stroke->miterLimit != other->stroke->miterLimit
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || stroke->dashArray != other->stroke->dashArray
173e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            || stroke->dashOffset != other->stroke->dashOffset
174e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            || stroke->visitedLinkPaintColor != other->stroke->visitedLinkPaintColor
175e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            || stroke->visitedLinkPaintUri != other->stroke->visitedLinkPaintUri
176e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            || stroke->visitedLinkPaintType != other->stroke->visitedLinkPaintType)
177f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
180f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return false;
181f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
182521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
183e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool SVGRenderStyle::diffNeedsPaintInvalidation(const SVGRenderStyle* other) const
184f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
185f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (stroke->opacity != other->stroke->opacity)
186f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
188e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // Painting related properties only need paint invalidation.
189323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (misc.get() != other->misc.get()) {
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (misc->floodColor != other->misc->floodColor
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || misc->floodOpacity != other->misc->floodOpacity
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || misc->lightingColor != other->misc->lightingColor)
193f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
196e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // If fill changes, we just need to issue paint invalidations. Fill boundaries are not influenced by this, only by the Path, that RenderSVGPath contains.
197323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (fill.get() != other->fill.get()) {
198323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (fill->paintType != other->fill->paintType
199323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || fill->paintColor != other->fill->paintColor
200323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || fill->paintUri != other->fill->paintUri
201323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || fill->opacity != other->fill->opacity)
202323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            return true;
203323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
205e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // If gradient stops change, we just need to issue paint invalidations. Style updates are already handled through RenderSVGGradientSTop.
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (stops != other->stops)
207f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
209e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // Changes of these flags only cause paint invalidations.
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (svg_inherited_flags._colorRendering != other->svg_inherited_flags._colorRendering
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_inherited_flags._shapeRendering != other->svg_inherited_flags._shapeRendering
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_inherited_flags._clipRule != other->svg_inherited_flags._clipRule
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_inherited_flags._fillRule != other->svg_inherited_flags._fillRule
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || svg_inherited_flags._colorInterpolation != other->svg_inherited_flags._colorInterpolation
21551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        || svg_inherited_flags._colorInterpolationFilters != other->svg_inherited_flags._colorInterpolationFilters
21651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        || svg_inherited_flags._paintOrder != other->svg_inherited_flags._paintOrder)
217f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (svg_noninherited_flags.f.bufferedRendering != other->svg_noninherited_flags.f.bufferedRendering)
220f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
22153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (svg_noninherited_flags.f.maskType != other->svg_noninherited_flags.f.maskType)
223f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return false;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
228e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)EPaintOrderType SVGRenderStyle::paintOrderType(unsigned index) const
229e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
230e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ASSERT(index < ((1 << kPaintOrderBitwidth)-1));
231e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    unsigned pt = (paintOrder() >> (kPaintOrderBitwidth*index)) & ((1u << kPaintOrderBitwidth) - 1);
232e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return (EPaintOrderType)pt;
233e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
234e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
236