15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/RenderStyle.h"
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include <algorithm>
2781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/StyleResolver.h"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
29c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/rendering/TextAutosizer.h"
30d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/rendering/style/AppliedTextDecoration.h"
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/rendering/style/BorderEdge.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/ContentData.h"
339e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/rendering/style/DataEquivalency.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/QuotesData.h"
35f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/rendering/style/ShadowList.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/StyleImage.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/StyleInheritedData.h"
3809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/LengthFunctions.h"
395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
40a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/Font.h"
41f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/fonts/FontSelector.h"
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/geometry/FloatRoundedRect.h"
4302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/MathExtras.h"
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct SameSizeAsBorderValue {
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RGBA32 m_color;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned m_width;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT(sizeof(BorderValue) == sizeof(SameSizeAsBorderValue), BorderValue_should_not_grow);
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct SameSizeAsRenderStyle : public RefCounted<SameSizeAsRenderStyle> {
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void* dataRefs[7];
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void* ownPtrs[1];
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void* dataRefSvgStyle;
5893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct InheritedFlags {
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned m_bitfields[2];
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } inherited_flags;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct NonInheritedFlags {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned m_bitfields[2];
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } noninherited_flags;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)COMPILE_ASSERT(sizeof(RenderStyle) == sizeof(SameSizeAsRenderStyle), RenderStyle_should_stay_small);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline RenderStyle* defaultStyle()
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    DEFINE_STATIC_REF(RenderStyle, s_defaultStyle, (RenderStyle::createDefaultStyle()));
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return s_defaultStyle;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<RenderStyle> RenderStyle::create()
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return adoptRef(new RenderStyle());
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<RenderStyle> RenderStyle::createDefaultStyle()
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return adoptRef(new RenderStyle(DefaultStyle));
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<RenderStyle> RenderStyle::createAnonymousStyleWithDisplay(const RenderStyle* parentStyle, EDisplay display)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<RenderStyle> newStyle = RenderStyle::create();
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newStyle->inheritFrom(parentStyle);
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newStyle->inheritUnicodeBidiFrom(parentStyle);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    newStyle->setDisplay(display);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return newStyle;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<RenderStyle> RenderStyle::clone(const RenderStyle* other)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return adoptRef(new RenderStyle(*other));
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ALWAYS_INLINE RenderStyle::RenderStyle()
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_box(defaultStyle()->m_box)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , visual(defaultStyle()->visual)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_background(defaultStyle()->m_background)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , surround(defaultStyle()->surround)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , rareNonInheritedData(defaultStyle()->rareNonInheritedData)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , rareInheritedData(defaultStyle()->rareInheritedData)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , inherited(defaultStyle()->inherited)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_svgStyle(defaultStyle()->m_svgStyle)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setBitDefaults(); // Would it be faster to copy this from the default style?
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    COMPILE_ASSERT((sizeof(InheritedFlags) <= 8), InheritedFlags_does_not_grow);
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    COMPILE_ASSERT((sizeof(NonInheritedFlags) <= 8), NonInheritedFlags_does_not_grow);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)ALWAYS_INLINE RenderStyle::RenderStyle(DefaultStyleTag)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setBitDefaults();
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_box.init();
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    visual.init();
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_background.init();
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    surround.init();
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.init();
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_deprecatedFlexibleBox.init();
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_flexibleBox.init();
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_marquee.init();
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_multiCol.init();
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_transform.init();
129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    rareNonInheritedData.access()->m_willChange.init();
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_filter.init();
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_grid.init();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_gridItem.init();
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareInheritedData.init();
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inherited.init();
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_svgStyle.init();
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ALWAYS_INLINE RenderStyle::RenderStyle(const RenderStyle& o)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : RefCounted<RenderStyle>()
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_box(o.m_box)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , visual(o.visual)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_background(o.m_background)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , surround(o.surround)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , rareNonInheritedData(o.rareNonInheritedData)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , rareInheritedData(o.rareInheritedData)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , inherited(o.inherited)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_svgStyle(o.m_svgStyle)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , inherited_flags(o.inherited_flags)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , noninherited_flags(o.noninherited_flags)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochstatic StyleRecalcChange diffPseudoStyles(const RenderStyle* oldStyle, const RenderStyle* newStyle)
1548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
1558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // If the pseudoStyles have changed, we want any StyleRecalcChange that is not NoChange
1568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // because setStyle will do the right thing with anything else.
1578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!oldStyle->hasAnyPublicPseudoStyles())
1588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return NoChange;
1598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    for (PseudoId pseudoId = FIRST_PUBLIC_PSEUDOID; pseudoId < FIRST_INTERNAL_PSEUDOID; pseudoId = static_cast<PseudoId>(pseudoId + 1)) {
1608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!oldStyle->hasPseudoStyle(pseudoId))
1618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            continue;
1628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        RenderStyle* newPseudoStyle = newStyle->getCachedPseudoStyle(pseudoId);
1638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!newPseudoStyle)
1648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            return NoInherit;
1658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        RenderStyle* oldPseudoStyle = oldStyle->getCachedPseudoStyle(pseudoId);
1668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (oldPseudoStyle && *oldPseudoStyle != *newPseudoStyle)
1678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            return NoInherit;
1688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    }
1698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return NoChange;
1708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
1718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
17207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochStyleRecalcChange RenderStyle::stylePropagationDiff(const RenderStyle* oldStyle, const RenderStyle* newStyle)
1738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
1748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if ((!oldStyle && newStyle) || (oldStyle && !newStyle))
1758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return Reattach;
1768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!oldStyle && !newStyle)
1788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return NoChange;
1798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (oldStyle->display() != newStyle->display()
1818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        || oldStyle->hasPseudoStyle(FIRST_LETTER) != newStyle->hasPseudoStyle(FIRST_LETTER)
1828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        || oldStyle->columnSpan() != newStyle->columnSpan()
1838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        || !oldStyle->contentDataEquivalent(newStyle)
184c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || oldStyle->hasTextCombine() != newStyle->hasTextCombine()
185c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || oldStyle->justifyItems() != newStyle->justifyItems()
186c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        || oldStyle->alignItems() != newStyle->alignItems())
1878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return Reattach;
1888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (*oldStyle == *newStyle)
19007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return diffPseudoStyles(oldStyle, newStyle);
1918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (oldStyle->inheritedNotEqual(newStyle)
1938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        || oldStyle->hasExplicitlyInheritedProperties()
1948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        || newStyle->hasExplicitlyInheritedProperties())
1958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return Inherit;
1968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return NoInherit;
1988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
1998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::inheritFrom(const RenderStyle* inheritParent, IsAtShadowBoundary isAtShadowBoundary)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isAtShadowBoundary == AtShadowBoundary) {
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Even if surrounding content is user-editable, shadow DOM should act as a single unit, and not necessarily be editable
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        EUserModify currentUserModify = userModify();
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rareInheritedData = inheritParent->rareInheritedData;
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setUserModify(currentUserModify);
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rareInheritedData = inheritParent->rareInheritedData;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inherited = inheritParent->inherited;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inherited_flags = inheritParent->inherited_flags;
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_svgStyle != inheritParent->m_svgStyle)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_svgStyle.access()->inheritFrom(inheritParent->m_svgStyle.get());
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::copyNonInheritedFrom(const RenderStyle* other)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_box = other->m_box;
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    visual = other->visual;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_background = other->m_background;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    surround = other->surround;
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData = other->rareNonInheritedData;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The flags are copied one-by-one because noninherited_flags contains a bunch of stuff other than real style data.
223197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.effectiveDisplay = other->noninherited_flags.effectiveDisplay;
224197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.originalDisplay = other->noninherited_flags.originalDisplay;
225197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.overflowX = other->noninherited_flags.overflowX;
226197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.overflowY = other->noninherited_flags.overflowY;
227197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.verticalAlign = other->noninherited_flags.verticalAlign;
228197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.clear = other->noninherited_flags.clear;
229197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.position = other->noninherited_flags.position;
230197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.floating = other->noninherited_flags.floating;
231197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.tableLayout = other->noninherited_flags.tableLayout;
232197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.unicodeBidi = other->noninherited_flags.unicodeBidi;
233197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.pageBreakBefore = other->noninherited_flags.pageBreakBefore;
234197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.pageBreakAfter = other->noninherited_flags.pageBreakAfter;
235197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    noninherited_flags.pageBreakInside = other->noninherited_flags.pageBreakInside;
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    noninherited_flags.explicitInheritance = other->noninherited_flags.explicitInheritance;
23709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    noninherited_flags.hasViewportUnits = other->noninherited_flags.hasViewportUnits;
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_svgStyle != other->m_svgStyle)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_svgStyle.access()->copyNonInheritedFrom(other->m_svgStyle.get());
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(zoom() == initialZoom());
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderStyle::operator==(const RenderStyle& o) const
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // compare everything except the pseudoStyle pointer
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return inherited_flags == o.inherited_flags
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && noninherited_flags == o.noninherited_flags
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && m_box == o.m_box
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && visual == o.visual
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && m_background == o.m_background
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && surround == o.surround
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && rareNonInheritedData == o.rareNonInheritedData
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && rareInheritedData == o.rareInheritedData
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && inherited == o.inherited
25593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        && m_svgStyle == o.m_svgStyle;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderStyle::isStyleAvailable() const
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this != StyleResolver::styleNotYetAvailable();
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderStyle::hasUniquePseudoStyle() const
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_cachedPseudoStyles || styleType() != NOPSEUDO)
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (size_t i = 0; i < m_cachedPseudoStyles->size(); ++i) {
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        RenderStyle* pseudoStyle = m_cachedPseudoStyles->at(i).get();
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (pseudoStyle->unique())
271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return true;
272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderStyle* RenderStyle::getCachedPseudoStyle(PseudoId pid) const
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_cachedPseudoStyles || !m_cachedPseudoStyles->size())
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    if (styleType() != NOPSEUDO)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < m_cachedPseudoStyles->size(); ++i) {
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderStyle* pseudoStyle = m_cachedPseudoStyles->at(i).get();
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (pseudoStyle->styleType() == pid)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return pseudoStyle;
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderStyle* RenderStyle::addCachedPseudoStyle(PassRefPtr<RenderStyle> pseudo)
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!pseudo)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(pseudo->styleType() > NOPSEUDO);
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderStyle* result = pseudo.get();
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_cachedPseudoStyles)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_cachedPseudoStyles = adoptPtr(new PseudoStyleCache);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_cachedPseudoStyles->append(pseudo);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::removeCachedPseudoStyle(PseudoId pid)
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_cachedPseudoStyles)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < m_cachedPseudoStyles->size(); ++i) {
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderStyle* pseudoStyle = m_cachedPseudoStyles->at(i).get();
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (pseudoStyle->styleType() == pid) {
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_cachedPseudoStyles->remove(i);
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderStyle::inheritedNotEqual(const RenderStyle* other) const
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return inherited_flags != other->inherited_flags
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           || inherited != other->inherited
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           || m_svgStyle->inheritedNotEqual(other->m_svgStyle.get())
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           || rareInheritedData != other->rareInheritedData;
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderStyle::inheritedDataShared(const RenderStyle* other) const
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is a fast check that only looks if the data structures are shared.
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return inherited_flags == other->inherited_flags
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && inherited.get() == other->inherited.get()
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && m_svgStyle.get() == other->m_svgStyle.get()
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && rareInheritedData.get() == other->rareInheritedData.get();
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static bool positionedObjectMovedOnly(const LengthBox& a, const LengthBox& b, const Length& width)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If any unit types are different, then we can't guarantee
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // that this was just a movement.
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (a.left().type() != b.left().type()
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || a.right().type() != b.right().type()
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || a.top().type() != b.top().type()
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || a.bottom().type() != b.bottom().type())
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Only one unit can be non-auto in the horizontal direction and
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // in the vertical direction.  Otherwise the adjustment of values
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is changing the size of the box.
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!a.left().isIntrinsicOrAuto() && !a.right().isIntrinsicOrAuto())
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!a.top().isIntrinsicOrAuto() && !a.bottom().isIntrinsicOrAuto())
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
35809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // If our width is auto and left or right is specified and changed then this
359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // is not just a movement - we need to resize to our container.
36009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (width.isIntrinsicOrAuto()
36109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        && ((!a.left().isIntrinsicOrAuto() && a.left() != b.left())
36209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            || (!a.right().isIntrinsicOrAuto() && a.right() != b.right())))
363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // One of the units is fixed or percent in both directions and stayed
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // that way in the new style.  Therefore all we are doing is moving.
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
370197021e6b966cfb06891637935ef33fff06433d1Ben MurdochStyleDifference RenderStyle::visualInvalidationDiff(const RenderStyle& other) const
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
37209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Note, we use .get() on each DataRef below because DataRef::operator== will do a deep
37309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // compare, which is duplicate work when we're going to compare each property inside
37409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // this function anyway.
37509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
376f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    StyleDifference diff;
377f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (m_svgStyle.get() != other.m_svgStyle.get())
378f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        diff = m_svgStyle->diff(other.m_svgStyle.get());
379f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
380e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if ((!diff.needsFullLayout() || !diff.needsPaintInvalidation()) && diffNeedsFullLayoutAndPaintInvalidation(other)) {
381d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        diff.setNeedsFullLayout();
382e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        diff.setNeedsPaintInvalidationObject();
383d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
384d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
385f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (!diff.needsFullLayout() && diffNeedsFullLayout(other))
386f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        diff.setNeedsFullLayout();
387f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
388f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (!diff.needsFullLayout() && position() != StaticPosition && surround->offset != other.surround->offset) {
389f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        // Optimize for the case where a positioned layer is moving but not changing size.
3907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (positionedObjectMovedOnly(surround->offset, other.surround->offset, m_box->width()))
391f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            diff.setNeedsPositionedMovementLayout();
3927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        else
393f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            diff.setNeedsFullLayout();
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
396e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (diffNeedsPaintInvalidationLayer(other))
397e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        diff.setNeedsPaintInvalidationLayer();
398e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    else if (diffNeedsPaintInvalidationObject(other))
399e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        diff.setNeedsPaintInvalidationObject();
400f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
401197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    updatePropertySpecificDifferences(other, diff);
402f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
403f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // Cursors are not checked, since they will be set appropriately in response to mouse events,
404e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // so they don't need to cause any paint invalidation or layout.
405f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
406f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // Animations don't need to be checked either. We always set the new style on the RenderObject, so we will get a chance to fire off
407f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // the resulting transition properly.
408f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
409f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return diff;
410f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
411f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
412e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool RenderStyle::diffNeedsFullLayoutAndPaintInvalidation(const RenderStyle& other) const
413f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
414e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // FIXME: Not all cases in this method need both full layout and paint invalidation.
415d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Should move cases into diffNeedsFullLayout() if
416e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // - don't need paint invalidation at all;
417e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // - or the renderer knows how to exactly invalidate paints caused by the layout change
418e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    //   instead of forced full paint invalidation.
419d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
420aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (surround.get() != other.surround.get()) {
421e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        // If our border widths change, then we need to layout. Other changes to borders only necessitate a paint invalidation.
422aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (borderLeftWidth() != other.borderLeftWidth()
423aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || borderTopWidth() != other.borderTopWidth()
424aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || borderBottomWidth() != other.borderBottomWidth()
425aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || borderRightWidth() != other.borderRightWidth())
426f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
42709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
429aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (rareNonInheritedData.get() != other.rareNonInheritedData.get()) {
430aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (rareNonInheritedData->m_appearance != other.rareNonInheritedData->m_appearance
431aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->marginBeforeCollapse != other.rareNonInheritedData->marginBeforeCollapse
432aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->marginAfterCollapse != other.rareNonInheritedData->marginAfterCollapse
433aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->lineClamp != other.rareNonInheritedData->lineClamp
434aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->textOverflow != other.rareNonInheritedData->textOverflow
435aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->m_wrapFlow != other.rareNonInheritedData->m_wrapFlow
436aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->m_wrapThrough != other.rareNonInheritedData->m_wrapThrough
437aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->m_shapeMargin != other.rareNonInheritedData->m_shapeMargin
438aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->m_order != other.rareNonInheritedData->m_order
439aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->m_justifyContent != other.rareNonInheritedData->m_justifyContent
440aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->m_grid.get() != other.rareNonInheritedData->m_grid.get()
441aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->m_gridItem.get() != other.rareNonInheritedData->m_gridItem.get()
442aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->m_textCombine != other.rareNonInheritedData->m_textCombine
443aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareNonInheritedData->hasFilters() != other.rareNonInheritedData->hasFilters())
444f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
446aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (rareNonInheritedData->m_deprecatedFlexibleBox.get() != other.rareNonInheritedData->m_deprecatedFlexibleBox.get()
447aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            && *rareNonInheritedData->m_deprecatedFlexibleBox.get() != *other.rareNonInheritedData->m_deprecatedFlexibleBox.get())
448f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
450aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (rareNonInheritedData->m_flexibleBox.get() != other.rareNonInheritedData->m_flexibleBox.get()
451aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            && *rareNonInheritedData->m_flexibleBox.get() != *other.rareNonInheritedData->m_flexibleBox.get())
452f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: We should add an optimized form of layout that just recomputes visual overflow.
455aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (!rareNonInheritedData->shadowDataEquivalent(*other.rareNonInheritedData.get()))
456f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
458aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (!rareNonInheritedData->reflectionDataEquivalent(*other.rareNonInheritedData.get()))
459f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
461aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (rareNonInheritedData->m_multiCol.get() != other.rareNonInheritedData->m_multiCol.get()
462aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            && *rareNonInheritedData->m_multiCol.get() != *other.rareNonInheritedData->m_multiCol.get())
463f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // If the counter directives change, trigger a relayout to re-calculate counter values and rebuild the counter node tree.
46609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        const CounterDirectiveMap* mapA = rareNonInheritedData->m_counterDirectives.get();
467aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        const CounterDirectiveMap* mapB = other.rareNonInheritedData->m_counterDirectives.get();
46809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!(mapA == mapB || (mapA && mapB && *mapA == *mapB)))
469f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // We only need do layout for opacity changes if adding or losing opacity could trigger a change
47209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // in us being a stacking context.
473aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (hasAutoZIndex() != other.hasAutoZIndex() && rareNonInheritedData->hasOpacity() != other.rareNonInheritedData->hasOpacity()) {
47409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // FIXME: We would like to use SimplifiedLayout here, but we can't quite do that yet.
47509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // We need to make sure SimplifiedLayout can operate correctly on RenderInlines (we will need
47609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // to add a selfNeedsSimplifiedLayout bit in order to not get confused and taint every line).
47709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // In addition we need to solve the floating object issue when layers come and go. Right now
47809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // a full layout is necessary to keep floating object lists sane.
479f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
48009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
483aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (rareInheritedData.get() != other.rareInheritedData.get()) {
484aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (rareInheritedData->highlight != other.rareInheritedData->highlight
485aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->indent != other.rareInheritedData->indent
486aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->m_textAlignLast != other.rareInheritedData->m_textAlignLast
487aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->m_textIndentLine != other.rareInheritedData->m_textIndentLine
488aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->m_effectiveZoom != other.rareInheritedData->m_effectiveZoom
489aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->wordBreak != other.rareInheritedData->wordBreak
490aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->overflowWrap != other.rareInheritedData->overflowWrap
491aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->lineBreak != other.rareInheritedData->lineBreak
492aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->textSecurity != other.rareInheritedData->textSecurity
493aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->hyphens != other.rareInheritedData->hyphens
494aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->hyphenationLimitBefore != other.rareInheritedData->hyphenationLimitBefore
495aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->hyphenationLimitAfter != other.rareInheritedData->hyphenationLimitAfter
496aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->hyphenationString != other.rareInheritedData->hyphenationString
497aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->locale != other.rareInheritedData->locale
498aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->m_rubyPosition != other.rareInheritedData->m_rubyPosition
499aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->textEmphasisMark != other.rareInheritedData->textEmphasisMark
500aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->textEmphasisPosition != other.rareInheritedData->textEmphasisPosition
501aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->textEmphasisCustomMark != other.rareInheritedData->textEmphasisCustomMark
502aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->m_textJustify != other.rareInheritedData->m_textJustify
503aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->m_textOrientation != other.rareInheritedData->m_textOrientation
504aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->m_tabSize != other.rareInheritedData->m_tabSize
505aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->m_lineBoxContain != other.rareInheritedData->m_lineBoxContain
506aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->listStyleImage != other.rareInheritedData->listStyleImage
507aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || rareInheritedData->textStrokeWidth != other.rareInheritedData->textStrokeWidth)
508f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
510aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (!rareInheritedData->shadowDataEquivalent(*other.rareInheritedData.get()))
511f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
513323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (!rareInheritedData->quotesDataEquivalent(*other.rareInheritedData.get()))
514f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (inherited->textAutosizingMultiplier != other.inherited->textAutosizingMultiplier)
518f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
520aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (inherited.get() != other.inherited.get()) {
521aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (inherited->line_height != other.inherited->line_height
522323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || inherited->font != other.inherited->font
523323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || inherited->horizontal_border_spacing != other.inherited->horizontal_border_spacing
524323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || inherited->vertical_border_spacing != other.inherited->vertical_border_spacing)
525323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            return true;
52609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
52709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
528aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (inherited_flags._box_direction != other.inherited_flags._box_direction
529aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        || inherited_flags.m_rtlOrdering != other.inherited_flags.m_rtlOrdering
530aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        || inherited_flags._text_align != other.inherited_flags._text_align
531aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        || inherited_flags._text_transform != other.inherited_flags._text_transform
532aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        || inherited_flags._direction != other.inherited_flags._direction
533aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        || inherited_flags._white_space != other.inherited_flags._white_space
534aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        || inherited_flags.m_writingMode != other.inherited_flags.m_writingMode)
535f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
53609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
537197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (noninherited_flags.overflowX != other.noninherited_flags.overflowX
538197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        || noninherited_flags.overflowY != other.noninherited_flags.overflowY
539197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        || noninherited_flags.clear != other.noninherited_flags.clear
540197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        || noninherited_flags.unicodeBidi != other.noninherited_flags.unicodeBidi
541197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        || noninherited_flags.floating != other.noninherited_flags.floating
542197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        || noninherited_flags.originalDisplay != other.noninherited_flags.originalDisplay)
543f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (noninherited_flags.effectiveDisplay >= FIRST_TABLE_DISPLAY && noninherited_flags.effectiveDisplay <= LAST_TABLE_DISPLAY) {
546aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (inherited_flags._border_collapse != other.inherited_flags._border_collapse
547aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || inherited_flags._empty_cells != other.inherited_flags._empty_cells
548aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || inherited_flags._caption_side != other.inherited_flags._caption_side
549197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            || noninherited_flags.tableLayout != other.noninherited_flags.tableLayout)
550f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // In the collapsing border model, 'hidden' suppresses other borders, while 'none'
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // does not, so these style differences can be width differences.
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (inherited_flags._border_collapse
555aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            && ((borderTopStyle() == BHIDDEN && other.borderTopStyle() == BNONE)
556aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                || (borderTopStyle() == BNONE && other.borderTopStyle() == BHIDDEN)
557aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                || (borderBottomStyle() == BHIDDEN && other.borderBottomStyle() == BNONE)
558aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                || (borderBottomStyle() == BNONE && other.borderBottomStyle() == BHIDDEN)
559aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                || (borderLeftStyle() == BHIDDEN && other.borderLeftStyle() == BNONE)
560aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                || (borderLeftStyle() == BNONE && other.borderLeftStyle() == BHIDDEN)
561aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                || (borderRightStyle() == BHIDDEN && other.borderRightStyle() == BNONE)
562aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch                || (borderRightStyle() == BNONE && other.borderRightStyle() == BHIDDEN)))
563f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
564197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    } else if (noninherited_flags.effectiveDisplay == LIST_ITEM) {
565aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        if (inherited_flags._list_style_type != other.inherited_flags._list_style_type
566aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch            || inherited_flags._list_style_position != other.inherited_flags._list_style_position)
567f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            return true;
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
570aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if ((visibility() == COLLAPSE) != (other.visibility() == COLLAPSE))
571f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
573a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (!m_background->outline().visuallyEqual(other.m_background->outline())) {
574a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // FIXME: We only really need to recompute the overflow but we don't have an optimized layout for it.
575f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
576a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
577a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
578f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // Movement of non-static-positioned object is special cased in RenderStyle::visualInvalidationDiff().
579926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
580f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return false;
58109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
583d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)bool RenderStyle::diffNeedsFullLayout(const RenderStyle& other) const
584d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
585197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (m_box.get() != other.m_box.get()) {
586197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (m_box->width() != other.m_box->width()
587197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            || m_box->minWidth() != other.m_box->minWidth()
588197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            || m_box->maxWidth() != other.m_box->maxWidth()
589197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            || m_box->height() != other.m_box->height()
590197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            || m_box->minHeight() != other.m_box->minHeight()
591197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            || m_box->maxHeight() != other.m_box->maxHeight())
592197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return true;
593197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
594197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (m_box->verticalAlign() != other.m_box->verticalAlign())
595197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return true;
596197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
597197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (m_box->boxSizing() != other.m_box->boxSizing())
598197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return true;
599197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
600197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
6017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (noninherited_flags.verticalAlign != other.noninherited_flags.verticalAlign
6027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        || noninherited_flags.position != other.noninherited_flags.position)
603197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return true;
604197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
605197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (surround.get() != other.surround.get()) {
606197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (surround->margin != other.surround->margin)
607197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return true;
608197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
609197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (surround->padding != other.surround->padding)
610197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return true;
611197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
612197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
6137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (rareNonInheritedData.get() != other.rareNonInheritedData.get()) {
6147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (rareNonInheritedData->m_alignContent != other.rareNonInheritedData->m_alignContent
6157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            || rareNonInheritedData->m_alignItems != other.rareNonInheritedData->m_alignItems
6167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            || rareNonInheritedData->m_alignSelf != other.rareNonInheritedData->m_alignSelf)
6177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return true;
6187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
6197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
620d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return false;
621d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
622d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
623e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool RenderStyle::diffNeedsPaintInvalidationLayer(const RenderStyle& other) const
62409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
6259e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (position() != StaticPosition && (visual->clip != other.visual->clip || visual->hasAutoClip != other.visual->hasAutoClip))
626f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
62702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
628323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (rareNonInheritedData.get() != other.rareNonInheritedData.get()) {
629323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (RuntimeEnabledFeatures::cssCompositingEnabled()
630323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            && (rareNonInheritedData->m_effectiveBlendMode != other.rareNonInheritedData->m_effectiveBlendMode
631323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)                || rareNonInheritedData->m_isolation != other.rareNonInheritedData->m_isolation))
632323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            return true;
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
634323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (rareNonInheritedData->m_mask != other.rareNonInheritedData->m_mask
635323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || rareNonInheritedData->m_maskBoxImage != other.rareNonInheritedData->m_maskBoxImage)
636323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            return true;
637323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
639f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return false;
640f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
641f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
642e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool RenderStyle::diffNeedsPaintInvalidationObject(const RenderStyle& other) const
643f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
644aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (inherited_flags._visibility != other.inherited_flags._visibility
645aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        || inherited_flags.m_printColorAdjust != other.inherited_flags.m_printColorAdjust
646aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        || inherited_flags._insideLink != other.inherited_flags._insideLink
647a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        || !surround->border.visuallyEqual(other.surround->border)
648323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        || !m_background->visuallyEqual(*other.m_background))
649f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return true;
65002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
651323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (rareInheritedData.get() != other.rareInheritedData.get()) {
652323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (rareInheritedData->userModify != other.rareInheritedData->userModify
653323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || rareInheritedData->userSelect != other.rareInheritedData->userSelect
654323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || rareInheritedData->m_imageRendering != other.rareInheritedData->m_imageRendering)
655323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            return true;
656323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
658323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (rareNonInheritedData.get() != other.rareNonInheritedData.get()) {
659323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (rareNonInheritedData->userDrag != other.rareNonInheritedData->userDrag
660323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || rareNonInheritedData->m_borderFit != other.rareNonInheritedData->m_borderFit
661323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || rareNonInheritedData->m_objectFit != other.rareNonInheritedData->m_objectFit
662323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || rareNonInheritedData->m_objectPosition != other.rareNonInheritedData->m_objectPosition
6639e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            || !dataEquivalent(rareNonInheritedData->m_shapeOutside, other.rareNonInheritedData->m_shapeOutside)
6649e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            || !dataEquivalent(rareNonInheritedData->m_clipPath, other.rareNonInheritedData->m_clipPath))
665323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            return true;
666323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
668f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return false;
669f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
670f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
671197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid RenderStyle::updatePropertySpecificDifferences(const RenderStyle& other, StyleDifference& diff) const
672f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
673f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // StyleAdjuster has ensured that zIndex is non-auto only if it's applicable.
674f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (m_box->zIndex() != other.m_box->zIndex() || m_box->hasAutoZIndex() != other.m_box->hasAutoZIndex())
675197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        diff.setZIndexChanged();
676f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
677f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (rareNonInheritedData.get() != other.rareNonInheritedData.get()) {
678f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (!transformDataEquivalent(other))
679197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            diff.setTransformChanged();
680f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
681f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (rareNonInheritedData->opacity != other.rareNonInheritedData->opacity)
682197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            diff.setOpacityChanged();
683f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
684323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (rareNonInheritedData->m_filter != other.rareNonInheritedData->m_filter)
685197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            diff.setFilterChanged();
686f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
687f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
688e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!diff.needsPaintInvalidation()) {
689f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (inherited->color != other.inherited->color
690d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            || inherited_flags.m_textUnderline != other.inherited_flags.m_textUnderline
691323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            || visual->textDecoration != other.visual->textDecoration) {
692197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            diff.setTextOrColorChanged();
693323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        } else if (rareNonInheritedData.get() != other.rareNonInheritedData.get()) {
694323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            if (rareNonInheritedData->m_textDecorationStyle != other.rareNonInheritedData->m_textDecorationStyle
695323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)                || rareNonInheritedData->m_textDecorationColor != other.rareNonInheritedData->m_textDecorationColor)
696197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                diff.setTextOrColorChanged();
697323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        } else if (rareInheritedData.get() != other.rareInheritedData.get()) {
698323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            if (rareInheritedData->textFillColor() != other.rareInheritedData->textFillColor()
699323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)                || rareInheritedData->textStrokeColor() != other.rareInheritedData->textStrokeColor()
700323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)                || rareInheritedData->textEmphasisColor() != other.rareInheritedData->textEmphasisColor()
701d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                || rareInheritedData->textEmphasisFill != other.rareInheritedData->textEmphasisFill
702d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                || rareInheritedData->appliedTextDecorations != other.rareInheritedData->appliedTextDecorations)
703197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                diff.setTextOrColorChanged();
704323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        }
705f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::addCursor(PassRefPtr<StyleImage> image, const IntPoint& hotSpot)
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!rareInheritedData.access()->cursorData)
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rareInheritedData.access()->cursorData = CursorList::create();
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareInheritedData.access()->cursorData->append(CursorData(image, hotSpot));
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::setCursorList(PassRefPtr<CursorList> other)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareInheritedData.access()->cursorData = other;
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::setQuotes(PassRefPtr<QuotesData> q)
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareInheritedData.access()->quotes = q;
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::clearCursorList()
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (rareInheritedData->cursorData)
728d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        rareInheritedData.access()->cursorData = nullptr;
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void RenderStyle::addCallbackSelector(const String& selector)
7321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
7331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!rareNonInheritedData->m_callbackSelectors.contains(selector))
7341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        rareNonInheritedData.access()->m_callbackSelectors.append(selector);
7351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
7361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::clearContent()
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (rareNonInheritedData->m_content)
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rareNonInheritedData.access()->m_content = nullptr;
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::appendContent(PassOwnPtr<ContentData> contentData)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<ContentData>& content = rareNonInheritedData.access()->m_content;
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ContentData* lastContent = content.get();
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (lastContent && lastContent->next())
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        lastContent = lastContent->next();
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (lastContent)
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        lastContent->setNext(contentData);
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        content = contentData;
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::setContent(PassRefPtr<StyleImage> image, bool add)
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!image)
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
76002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (add) {
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        appendContent(ContentData::create(image));
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_content = ContentData::create(image);
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::setContent(const String& string, bool add)
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<ContentData>& content = rareNonInheritedData.access()->m_content;
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (add) {
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ContentData* lastContent = content.get();
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (lastContent && lastContent->next())
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lastContent = lastContent->next();
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lastContent) {
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // We attempt to merge with the last ContentData if possible.
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (lastContent->isText()) {
780c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                TextContentData* textContent = toTextContentData(lastContent);
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                textContent->setText(textContent->text() + string);
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                lastContent->setNext(ContentData::create(string));
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    content = ContentData::create(string);
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::setContent(PassOwnPtr<CounterContent> counter, bool add)
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!counter)
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (add) {
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        appendContent(ContentData::create(counter));
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_content = ContentData::create(counter);
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::setContent(QuoteType quote, bool add)
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (add) {
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        appendContent(ContentData::create(quote));
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rareNonInheritedData.access()->m_content = ContentData::create(quote);
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
81481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
815e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebBlendMode RenderStyle::blendMode() const
81681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
81781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (RuntimeEnabledFeatures::cssCompositingEnabled())
818e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return static_cast<WebBlendMode>(rareNonInheritedData->m_effectiveBlendMode);
819e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return WebBlendModeNormal;
82081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
82181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
822e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void RenderStyle::setBlendMode(WebBlendMode v)
82381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
82481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (RuntimeEnabledFeatures::cssCompositingEnabled())
82581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        rareNonInheritedData.access()->m_effectiveBlendMode = v;
82681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
82781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
82881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)bool RenderStyle::hasBlendMode() const
82981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
83081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (RuntimeEnabledFeatures::cssCompositingEnabled())
831e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return static_cast<WebBlendMode>(rareNonInheritedData->m_effectiveBlendMode) != WebBlendModeNormal;
83281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    return false;
83381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
83481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
83506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)EIsolation RenderStyle::isolation() const
83606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){
83706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (RuntimeEnabledFeatures::cssCompositingEnabled())
83806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return static_cast<EIsolation>(rareNonInheritedData->m_isolation);
83906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return IsolationAuto;
84006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)}
84106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
84206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)void RenderStyle::setIsolation(EIsolation v)
84306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){
84406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (RuntimeEnabledFeatures::cssCompositingEnabled())
84506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        rareNonInheritedData.access()->m_isolation = v;
84606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)}
84706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
84851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool RenderStyle::hasIsolation() const
84951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
85051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (RuntimeEnabledFeatures::cssCompositingEnabled())
85151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return rareNonInheritedData->m_isolation != IsolationAuto;
85251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return false;
85351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
85451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
855d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool RenderStyle::hasWillChangeCompositingHint() const
856d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
857d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (size_t i = 0; i < rareNonInheritedData->m_willChange->m_properties.size(); ++i) {
858d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        switch (rareNonInheritedData->m_willChange->m_properties[i]) {
859d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyOpacity:
860aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        case CSSPropertyTransform:
861d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        case CSSPropertyWebkitTransform:
862d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        case CSSPropertyTop:
863d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        case CSSPropertyLeft:
864d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        case CSSPropertyBottom:
865d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        case CSSPropertyRight:
866d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return true;
867d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        default:
868d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            break;
869d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
870d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
871d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return false;
872d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
873d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool requireTransformOrigin(const Vector<RefPtr<TransformOperation> >& transformOperations, RenderStyle::ApplyTransformOrigin applyOrigin)
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // transform-origin brackets the transform with translate operations.
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Optimize for the case where the only transform is a translation, since the transform-origin is irrelevant
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // in that case.
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (applyOrigin != RenderStyle::IncludeTransformOrigin)
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned size = transformOperations.size();
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < size; ++i) {
88451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        TransformOperation::OperationType type = transformOperations[i]->type();
8851fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        if (type != TransformOperation::TranslateX
8861fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch            && type != TransformOperation::TranslateY
8871fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch            && type != TransformOperation::Translate
8881fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch            && type != TransformOperation::TranslateZ
8891fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch            && type != TransformOperation::Translate3D)
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
89202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::applyTransform(TransformationMatrix& transform, const LayoutSize& borderBoxSize, ApplyTransformOrigin applyOrigin) const
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
89853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    applyTransform(transform, FloatRect(FloatPoint(), borderBoxSize), applyOrigin);
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::applyTransform(TransformationMatrix& transform, const FloatRect& boundingBox, ApplyTransformOrigin applyOrigin) const
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Vector<RefPtr<TransformOperation> >& transformOperations = rareNonInheritedData->m_transform->m_operations.operations();
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool applyTransformOrigin = requireTransformOrigin(transformOperations, applyOrigin);
90502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float offsetX = transformOriginX().type() == Percent ? boundingBox.x() : 0;
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float offsetY = transformOriginY().type() == Percent ? boundingBox.y() : 0;
90802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (applyTransformOrigin) {
91009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        transform.translate3d(floatValueForLength(transformOriginX(), boundingBox.width()) + offsetX,
91109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            floatValueForLength(transformOriginY(), boundingBox.height()) + offsetY,
912bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            transformOriginZ());
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
91402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned size = transformOperations.size();
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < size; ++i)
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        transformOperations[i]->apply(transform, boundingBox.size());
91802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (applyTransformOrigin) {
92009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        transform.translate3d(-floatValueForLength(transformOriginX(), boundingBox.width()) - offsetX,
92109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            -floatValueForLength(transformOriginY(), boundingBox.height()) - offsetY,
922bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            -transformOriginZ());
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
926f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void RenderStyle::setTextShadow(PassRefPtr<ShadowList> s)
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
928f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    rareInheritedData.access()->textShadow = s;
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
931f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void RenderStyle::setBoxShadow(PassRefPtr<ShadowList> s)
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
933f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    rareNonInheritedData.access()->m_boxShadow = s;
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static RoundedRect::Radii calcRadiiFor(const BorderData& border, IntSize size)
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return RoundedRect::Radii(
93909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        IntSize(valueForLength(border.topLeft().width(), size.width()),
94009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            valueForLength(border.topLeft().height(), size.height())),
94109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        IntSize(valueForLength(border.topRight().width(), size.width()),
94209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            valueForLength(border.topRight().height(), size.height())),
94309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        IntSize(valueForLength(border.bottomLeft().width(), size.width()),
94409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            valueForLength(border.bottomLeft().height(), size.height())),
94509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        IntSize(valueForLength(border.bottomRight().width(), size.width()),
94609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            valueForLength(border.bottomRight().height(), size.height())));
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
949926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)StyleImage* RenderStyle::listStyleImage() const { return rareInheritedData->listStyleImage.get(); }
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::setListStyleImage(PassRefPtr<StyleImage> v)
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
952926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (rareInheritedData->listStyleImage != v)
953926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        rareInheritedData.access()->listStyleImage = v;
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)Color RenderStyle::color() const { return inherited->color; }
9578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)Color RenderStyle::visitedLinkColor() const { return inherited->visitedLinkColor; }
9588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void RenderStyle::setColor(const Color& v) { SET_VAR(inherited, color, v); }
9598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void RenderStyle::setVisitedLinkColor(const Color& v) { SET_VAR(inherited, visitedLinkColor, v); }
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)short RenderStyle::horizontalBorderSpacing() const { return inherited->horizontal_border_spacing; }
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)short RenderStyle::verticalBorderSpacing() const { return inherited->vertical_border_spacing; }
963926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderStyle::setHorizontalBorderSpacing(short v) { SET_VAR(inherited, horizontal_border_spacing, v); }
964926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderStyle::setVerticalBorderSpacing(short v) { SET_VAR(inherited, vertical_border_spacing, v); }
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)RoundedRect RenderStyle::getRoundedBorderFor(const LayoutRect& borderRect, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect snappedBorderRect(pixelSnappedIntRect(borderRect));
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RoundedRect roundedRect(snappedBorderRect);
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasBorderRadius()) {
97109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        RoundedRect::Radii radii = calcRadiiFor(surround->border, snappedBorderRect.size());
972d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        radii.scale(calcBorderRadiiConstraintScaleFor(borderRect, radii));
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        roundedRect.includeLogicalEdges(radii, isHorizontalWritingMode(), includeLogicalLeftEdge, includeLogicalRightEdge);
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return roundedRect;
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RoundedRect RenderStyle::getRoundedInnerBorderFor(const LayoutRect& borderRect, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool horizontal = isHorizontalWritingMode();
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
982926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int leftWidth = (!horizontal || includeLogicalLeftEdge) ? borderLeftWidth() : 0;
983926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int rightWidth = (!horizontal || includeLogicalRightEdge) ? borderRightWidth() : 0;
984926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int topWidth = (horizontal || includeLogicalLeftEdge) ? borderTopWidth() : 0;
985926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int bottomWidth = (horizontal || includeLogicalRightEdge) ? borderBottomWidth() : 0;
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return getRoundedInnerBorderFor(borderRect, topWidth, bottomWidth, leftWidth, rightWidth, includeLogicalLeftEdge, includeLogicalRightEdge);
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RoundedRect RenderStyle::getRoundedInnerBorderFor(const LayoutRect& borderRect,
991926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int topWidth, int bottomWidth, int leftWidth, int rightWidth, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
99302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    LayoutRect innerRect(borderRect.x() + leftWidth,
99402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch               borderRect.y() + topWidth,
99502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch               borderRect.width() - leftWidth - rightWidth,
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               borderRect.height() - topWidth - bottomWidth);
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RoundedRect roundedRect(pixelSnappedIntRect(innerRect));
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasBorderRadius()) {
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RoundedRect::Radii radii = getRoundedBorderFor(borderRect).radii();
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        radii.shrink(topWidth, bottomWidth, leftWidth, rightWidth);
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        roundedRect.includeLogicalEdges(radii, isHorizontalWritingMode(), includeLogicalLeftEdge, includeLogicalRightEdge);
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return roundedRect;
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1008197021e6b966cfb06891637935ef33fff06433d1Ben Murdochstatic bool allLayersAreFixed(const FillLayer& layer)
1009926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1010197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    for (const FillLayer* currLayer = &layer; currLayer; currLayer = currLayer->next()) {
1011197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!currLayer->image() || currLayer->attachment() != FixedBackgroundAttachment)
1012197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return false;
1013197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
1014926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1015197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return true;
1016926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1017926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1018926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderStyle::hasEntirelyFixedBackground() const
1019926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1020926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return allLayersAreFixed(backgroundLayers());
1021926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1022926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const CounterDirectiveMap* RenderStyle::counterDirectives() const
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rareNonInheritedData->m_counterDirectives.get();
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CounterDirectiveMap& RenderStyle::accessCounterDirectives()
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<CounterDirectiveMap>& map = rareNonInheritedData.access()->m_counterDirectives;
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!map)
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        map = adoptPtr(new CounterDirectiveMap);
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *map;
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const CounterDirectives RenderStyle::getCounterDirectives(const AtomicString& identifier) const
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (const CounterDirectiveMap* directives = counterDirectives())
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return directives->get(identifier);
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return CounterDirectives();
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& RenderStyle::hyphenString() const
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const AtomicString& hyphenationString = rareInheritedData.get()->hyphenationString;
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!hyphenationString.isNull())
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return hyphenationString;
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: This should depend on locale.
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, hyphenMinusString, (&hyphenMinus, 1));
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, hyphenString, (&hyphen, 1));
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return font().primaryFontHasGlyphForCharacter(hyphen) ? hyphenString : hyphenMinusString;
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& RenderStyle::textEmphasisMarkString() const
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (textEmphasisMark()) {
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextEmphasisMarkNone:
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return nullAtom;
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextEmphasisMarkCustom:
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return textEmphasisCustomMark();
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextEmphasisMarkDot: {
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DEFINE_STATIC_LOCAL(AtomicString, filledDotString, (&bullet, 1));
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DEFINE_STATIC_LOCAL(AtomicString, openDotString, (&whiteBullet, 1));
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return textEmphasisFill() == TextEmphasisFillFilled ? filledDotString : openDotString;
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextEmphasisMarkCircle: {
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DEFINE_STATIC_LOCAL(AtomicString, filledCircleString, (&blackCircle, 1));
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DEFINE_STATIC_LOCAL(AtomicString, openCircleString, (&whiteCircle, 1));
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return textEmphasisFill() == TextEmphasisFillFilled ? filledCircleString : openCircleString;
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextEmphasisMarkDoubleCircle: {
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DEFINE_STATIC_LOCAL(AtomicString, filledDoubleCircleString, (&fisheye, 1));
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DEFINE_STATIC_LOCAL(AtomicString, openDoubleCircleString, (&bullseye, 1));
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return textEmphasisFill() == TextEmphasisFillFilled ? filledDoubleCircleString : openDoubleCircleString;
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextEmphasisMarkTriangle: {
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DEFINE_STATIC_LOCAL(AtomicString, filledTriangleString, (&blackUpPointingTriangle, 1));
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DEFINE_STATIC_LOCAL(AtomicString, openTriangleString, (&whiteUpPointingTriangle, 1));
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return textEmphasisFill() == TextEmphasisFillFilled ? filledTriangleString : openTriangleString;
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextEmphasisMarkSesame: {
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DEFINE_STATIC_LOCAL(AtomicString, filledSesameString, (&sesameDot, 1));
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DEFINE_STATIC_LOCAL(AtomicString, openSesameString, (&whiteSesameDot, 1));
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return textEmphasisFill() == TextEmphasisFillFilled ? filledSesameString : openSesameString;
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextEmphasisMarkAuto:
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return nullAtom;
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return nullAtom;
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1096d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CSSAnimationData& RenderStyle::accessAnimations()
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!rareNonInheritedData.access()->m_animations)
1099d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        rareNonInheritedData.access()->m_animations = CSSAnimationData::create();
1100d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return *rareNonInheritedData->m_animations;
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1103d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)CSSTransitionData& RenderStyle::accessTransitions()
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!rareNonInheritedData.access()->m_transitions)
1106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        rareNonInheritedData.access()->m_transitions = CSSTransitionData::create();
1107d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return *rareNonInheritedData->m_transitions;
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const Font& RenderStyle::font() const { return inherited->font; }
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const FontMetrics& RenderStyle::fontMetrics() const { return inherited->font.fontMetrics(); }
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const FontDescription& RenderStyle::fontDescription() const { return inherited->font.fontDescription(); }
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float RenderStyle::specifiedFontSize() const { return fontDescription().specifiedSize(); }
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float RenderStyle::computedFontSize() const { return fontDescription().computedSize(); }
111509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)int RenderStyle::fontSize() const { return fontDescription().computedPixelSize(); }
1116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)FontWeight RenderStyle::fontWeight() const { return fontDescription().weight(); }
1117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)FontStretch RenderStyle::fontStretch() const { return fontDescription().stretch(); }
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1119d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)TextDecoration RenderStyle::textDecorationsInEffect() const
1120d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1121d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    int decorations = 0;
1122d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1123d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    const Vector<AppliedTextDecoration>& applied = appliedTextDecorations();
1124d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1125d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    for (size_t i = 0; i < applied.size(); ++i)
1126d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        decorations |= applied[i].line();
1127d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1128d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return static_cast<TextDecoration>(decorations);
1129d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1130d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1131d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)const Vector<AppliedTextDecoration>& RenderStyle::appliedTextDecorations() const
1132d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1133d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!inherited_flags.m_textUnderline && !rareInheritedData->appliedTextDecorations) {
1134d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        DEFINE_STATIC_LOCAL(Vector<AppliedTextDecoration>, empty, ());
1135d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return empty;
1136d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
1137d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (inherited_flags.m_textUnderline) {
1138d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        DEFINE_STATIC_LOCAL(Vector<AppliedTextDecoration>, underline, (1, AppliedTextDecoration(TextDecorationUnderline)));
1139d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return underline;
1140d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
1141d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1142d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return rareInheritedData->appliedTextDecorations->vector();
1143d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1144d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
114509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)float RenderStyle::wordSpacing() const { return fontDescription().wordSpacing(); }
114609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)float RenderStyle::letterSpacing() const { return fontDescription().letterSpacing(); }
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderStyle::setFontDescription(const FontDescription& v)
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (inherited->font.fontDescription() != v) {
115109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        inherited.access()->font = Font(v);
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)const Length& RenderStyle::specifiedLineHeight() const { return inherited->line_height; }
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Length RenderStyle::lineHeight() const
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Length& lh = inherited->line_height;
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Unlike fontDescription().computedSize() and hence fontSize(), this is
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // recalculated on demand as we only store the specified line height.
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Should consider scaling the fixed part of any calc expressions
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // too, though this involves messily poking into CalcExpressionLength.
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float multiplier = textAutosizingMultiplier();
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (multiplier > 1 && lh.isFixed())
1167c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return Length(TextAutosizer::computeAutosizedFontSize(lh.value(), multiplier), Fixed);
116853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return lh;
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1171f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
1172f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void RenderStyle::setLineHeight(const Length& specifiedLineHeight) { SET_VAR(inherited, line_height, specifiedLineHeight); }
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
117409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)int RenderStyle::computedLineHeight() const
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Length& lh = lineHeight();
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Negative value means the line height is not set. Use the font's built-in spacing.
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (lh.isNegative())
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return fontMetrics().lineSpacing();
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (lh.isPercent())
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return minimumValueForLength(lh, fontSize());
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return lh.value();
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
118807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid RenderStyle::setWordSpacing(float wordSpacing)
118907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
119007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FontSelector* currentFontSelector = font().fontSelector();
119107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FontDescription desc(fontDescription());
119207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    desc.setWordSpacing(wordSpacing);
119307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setFontDescription(desc);
119407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    font().update(currentFontSelector);
119507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
119607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
119707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid RenderStyle::setLetterSpacing(float letterSpacing)
119807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
119907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FontSelector* currentFontSelector = font().fontSelector();
120007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FontDescription desc(fontDescription());
120107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    desc.setLetterSpacing(letterSpacing);
120207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setFontDescription(desc);
120307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    font().update(currentFontSelector);
120407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderStyle::setFontSize(float size)
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // size must be specifiedSize if Text Autosizing is enabled, but computedSize if text
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // zoom is enabled (if neither is enabled it's irrelevant as they're probably the same).
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(std::isfinite(size));
1212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!std::isfinite(size) || size < 0)
1213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        size = 0;
1214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
1215197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        size = std::min(maximumAllowedFontSize, size);
1216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontSelector* currentFontSelector = font().fontSelector();
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontDescription desc(fontDescription());
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    desc.setSpecifiedSize(size);
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    desc.setComputedSize(size);
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float multiplier = textAutosizingMultiplier();
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (multiplier > 1) {
1224c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        float autosizedFontSize = TextAutosizer::computeAutosizedFontSize(size, multiplier);
1225197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        desc.setComputedSize(std::min(maximumAllowedFontSize, autosizedFontSize));
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setFontDescription(desc);
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    font().update(currentFontSelector);
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void RenderStyle::setFontWeight(FontWeight weight)
1233d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1234d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    FontSelector* currentFontSelector = font().fontSelector();
1235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    FontDescription desc(fontDescription());
1236d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    desc.setWeight(weight);
1237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setFontDescription(desc);
1238d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    font().update(currentFontSelector);
1239d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1240d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1241d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void RenderStyle::addAppliedTextDecoration(const AppliedTextDecoration& decoration)
1242d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1243d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtr<AppliedTextDecorationList>& list = rareInheritedData.access()->appliedTextDecorations;
1244d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1245d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!list)
1246d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        list = AppliedTextDecorationList::create();
1247d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    else if (!list->hasOneRef())
1248d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        list = list->copy();
1249d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1250d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (inherited_flags.m_textUnderline) {
1251d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        inherited_flags.m_textUnderline = false;
1252d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        list->append(AppliedTextDecoration(TextDecorationUnderline));
1253d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
1254d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1255d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    list->append(decoration);
1256d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1257d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1258d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void RenderStyle::applyTextDecorations()
1259d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1260d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (textDecoration() == TextDecorationNone)
1261d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return;
1262d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1263d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    TextDecorationStyle style = textDecorationStyle();
1264d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    StyleColor styleColor = visitedDependentDecorationStyleColor();
1265d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1266d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    int decorations = textDecoration();
1267d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1268d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (decorations & TextDecorationUnderline) {
1269d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // To save memory, we don't use AppliedTextDecoration objects in the
1270d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // common case of a single simple underline.
1271d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        AppliedTextDecoration underline(TextDecorationUnderline, style, styleColor);
1272d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1273d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (!rareInheritedData->appliedTextDecorations && underline.isSimpleUnderline())
1274d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            inherited_flags.m_textUnderline = true;
1275d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        else
1276d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            addAppliedTextDecoration(underline);
1277d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
1278d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (decorations & TextDecorationOverline)
1279d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        addAppliedTextDecoration(AppliedTextDecoration(TextDecorationOverline, style, styleColor));
1280d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (decorations & TextDecorationLineThrough)
1281d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        addAppliedTextDecoration(AppliedTextDecoration(TextDecorationLineThrough, style, styleColor));
1282d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1283d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1284d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void RenderStyle::clearAppliedTextDecorations()
1285d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1286d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    inherited_flags.m_textUnderline = false;
1287d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1288d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (rareInheritedData->appliedTextDecorations)
1289d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        rareInheritedData.access()->appliedTextDecorations = nullptr;
1290d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1291d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1292c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void RenderStyle::setFontStretch(FontStretch stretch)
1293c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1294c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FontSelector* currentFontSelector = font().fontSelector();
1295c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    FontDescription desc(fontDescription());
1296c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    desc.setStretch(stretch);
1297c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    setFontDescription(desc);
1298c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    font().update(currentFontSelector);
1299c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1300c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1301f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void RenderStyle::getShadowExtent(const ShadowList* shadowList, LayoutUnit &top, LayoutUnit &right, LayoutUnit &bottom, LayoutUnit &left) const
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    top = 0;
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    right = 0;
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bottom = 0;
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    left = 0;
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1308f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    size_t shadowCount = shadowList ? shadowList->shadows().size() : 0;
1309f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    for (size_t i = 0; i < shadowCount; ++i) {
1310f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        const ShadowData& shadow = shadowList->shadows()[i];
1311f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (shadow.style() == Inset)
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
131309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        float blurAndSpread = shadow.blur() + shadow.spread();
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1315197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        top = std::min<LayoutUnit>(top, shadow.y() - blurAndSpread);
1316197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        right = std::max<LayoutUnit>(right, shadow.x() + blurAndSpread);
1317197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        bottom = std::max<LayoutUnit>(bottom, shadow.y() + blurAndSpread);
1318197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        left = std::min<LayoutUnit>(left, shadow.x() - blurAndSpread);
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1322f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)LayoutBoxExtent RenderStyle::getShadowInsetExtent(const ShadowList* shadowList) const
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit top = 0;
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit right = 0;
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit bottom = 0;
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit left = 0;
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1329f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    size_t shadowCount = shadowList ? shadowList->shadows().size() : 0;
1330f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    for (size_t i = 0; i < shadowCount; ++i) {
1331f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        const ShadowData& shadow = shadowList->shadows()[i];
1332f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (shadow.style() == Normal)
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
133409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        float blurAndSpread = shadow.blur() + shadow.spread();
1335197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        top = std::max<LayoutUnit>(top, shadow.y() + blurAndSpread);
1336197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        right = std::min<LayoutUnit>(right, shadow.x() - blurAndSpread);
1337197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        bottom = std::min<LayoutUnit>(bottom, shadow.y() - blurAndSpread);
1338197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        left = std::max<LayoutUnit>(left, shadow.x() + blurAndSpread);
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutBoxExtent(top, right, bottom, left);
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1344f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void RenderStyle::getShadowHorizontalExtent(const ShadowList* shadowList, LayoutUnit &left, LayoutUnit &right) const
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    left = 0;
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    right = 0;
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1349f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    size_t shadowCount = shadowList ? shadowList->shadows().size() : 0;
1350f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    for (size_t i = 0; i < shadowCount; ++i) {
1351f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        const ShadowData& shadow = shadowList->shadows()[i];
1352f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (shadow.style() == Inset)
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
135409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        float blurAndSpread = shadow.blur() + shadow.spread();
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1356197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        left = std::min<LayoutUnit>(left, shadow.x() - blurAndSpread);
1357197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        right = std::max<LayoutUnit>(right, shadow.x() + blurAndSpread);
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1361f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void RenderStyle::getShadowVerticalExtent(const ShadowList* shadowList, LayoutUnit &top, LayoutUnit &bottom) const
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    top = 0;
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bottom = 0;
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1366f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    size_t shadowCount = shadowList ? shadowList->shadows().size() : 0;
1367f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    for (size_t i = 0; i < shadowCount; ++i) {
1368f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        const ShadowData& shadow = shadowList->shadows()[i];
1369f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        if (shadow.style() == Inset)
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
137109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        float blurAndSpread = shadow.blur() + shadow.spread();
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1373197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        top = std::min<LayoutUnit>(top, shadow.y() - blurAndSpread);
1374197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        bottom = std::max<LayoutUnit>(bottom, shadow.y() + blurAndSpread);
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1378d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)StyleColor RenderStyle::visitedDependentDecorationStyleColor() const
1379d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
1380d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool isVisited = insideLink() == InsideVisitedLink;
1381d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1382d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    StyleColor styleColor = isVisited ? visitedLinkTextDecorationColor() : textDecorationColor();
1383d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1384d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!styleColor.isCurrentColor())
1385d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return styleColor;
1386d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1387d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (textStrokeWidth()) {
1388d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        // Prefer stroke color if possible, but not if it's fully transparent.
1389d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        StyleColor textStrokeStyleColor = isVisited ? visitedLinkTextStrokeColor() : textStrokeColor();
1390d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (!textStrokeStyleColor.isCurrentColor() && textStrokeStyleColor.color().alpha())
1391d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            return textStrokeStyleColor;
1392d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
1393d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1394d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return isVisited ? visitedLinkTextFillColor() : textFillColor();
1395d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
1396d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1397d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)Color RenderStyle::visitedDependentDecorationColor() const
139809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
1399d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool isVisited = insideLink() == InsideVisitedLink;
1400d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return visitedDependentDecorationStyleColor().resolve(isVisited ? visitedLinkColor() : color());
140109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
140209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
14038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)Color RenderStyle::colorIncludingFallback(int colorProperty, bool visitedLink) const
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
140509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    StyleColor result(StyleColor::currentColor());
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EBorderStyle borderStyle = BNONE;
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (colorProperty) {
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBackgroundColor:
140909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        result = visitedLink ? visitedLinkBackgroundColor() : backgroundColor();
141009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        break;
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderLeftColor:
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = visitedLink ? visitedLinkBorderLeftColor() : borderLeftColor();
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        borderStyle = borderLeftStyle();
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderRightColor:
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = visitedLink ? visitedLinkBorderRightColor() : borderRightColor();
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        borderStyle = borderRightStyle();
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderTopColor:
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = visitedLink ? visitedLinkBorderTopColor() : borderTopColor();
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        borderStyle = borderTopStyle();
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyBorderBottomColor:
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = visitedLink ? visitedLinkBorderBottomColor() : borderBottomColor();
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        borderStyle = borderBottomStyle();
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyColor:
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = visitedLink ? visitedLinkColor() : color();
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyOutlineColor:
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = visitedLink ? visitedLinkOutlineColor() : outlineColor();
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitColumnRuleColor:
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = visitedLink ? visitedLinkColumnRuleColor() : columnRuleColor();
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextEmphasisColor:
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = visitedLink ? visitedLinkTextEmphasisColor() : textEmphasisColor();
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextFillColor:
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = visitedLink ? visitedLinkTextFillColor() : textFillColor();
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPropertyWebkitTextStrokeColor:
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = visitedLink ? visitedLinkTextStrokeColor() : textStrokeColor();
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
144583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    case CSSPropertyFloodColor:
144683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        result = floodColor();
144783750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        break;
144883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    case CSSPropertyLightingColor:
144983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        result = lightingColor();
145083750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        break;
145183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    case CSSPropertyStopColor:
145283750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        result = stopColor();
145383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        break;
145483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    case CSSPropertyWebkitTapHighlightColor:
145583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        result = tapHighlightColor();
145683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        break;
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
146209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!result.isCurrentColor())
146309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return result.color();
146409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
146509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: Treating styled borders with initial color differently causes problems
146609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // See crbug.com/316559, crbug.com/276231
146709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!visitedLink && (borderStyle == INSET || borderStyle == OUTSET || borderStyle == RIDGE || borderStyle == GROOVE))
146809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return Color(238, 238, 238);
146909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return visitedLink ? visitedLinkColor() : color();
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)Color RenderStyle::visitedDependentColor(int colorProperty) const
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Color unvisitedColor = colorIncludingFallback(colorProperty, false);
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (insideLink() != InsideVisitedLink)
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return unvisitedColor;
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Color visitedColor = colorIncludingFallback(colorProperty, true);
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Technically someone could explicitly specify the color transparent, but for now we'll just
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // assume that if the background color is transparent that it wasn't set. Note that it's weird that
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // we're returning unvisited info for a visited link, but given our restriction that the alpha values
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // have to match, it makes more sense to return the unvisited background color if specified than it
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // does to return black. This behavior matches what Firefox 4 does as well.
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (colorProperty == CSSPropertyBackgroundColor && visitedColor == Color::transparent)
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return unvisitedColor;
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // Take the alpha from the unvisited color, but get the RGB values from the visited color.
14898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return Color(visitedColor.red(), visitedColor.green(), visitedColor.blue(), unvisitedColor.alpha());
14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const BorderValue& RenderStyle::borderBefore() const
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (writingMode()) {
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TopToBottomWritingMode:
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderTop();
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case BottomToTopWritingMode:
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderBottom();
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LeftToRightWritingMode:
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderLeft();
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RightToLeftWritingMode:
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderRight();
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return borderTop();
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const BorderValue& RenderStyle::borderAfter() const
15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (writingMode()) {
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TopToBottomWritingMode:
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderBottom();
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case BottomToTopWritingMode:
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderTop();
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LeftToRightWritingMode:
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderRight();
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RightToLeftWritingMode:
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderLeft();
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return borderBottom();
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const BorderValue& RenderStyle::borderStart() const
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isHorizontalWritingMode())
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isLeftToRightDirection() ? borderLeft() : borderRight();
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return isLeftToRightDirection() ? borderTop() : borderBottom();
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const BorderValue& RenderStyle::borderEnd() const
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isHorizontalWritingMode())
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isLeftToRightDirection() ? borderRight() : borderLeft();
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return isLeftToRightDirection() ? borderBottom() : borderTop();
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned short RenderStyle::borderBeforeWidth() const
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (writingMode()) {
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TopToBottomWritingMode:
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderTopWidth();
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case BottomToTopWritingMode:
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderBottomWidth();
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LeftToRightWritingMode:
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderLeftWidth();
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RightToLeftWritingMode:
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderRightWidth();
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return borderTopWidth();
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned short RenderStyle::borderAfterWidth() const
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (writingMode()) {
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TopToBottomWritingMode:
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderBottomWidth();
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case BottomToTopWritingMode:
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderTopWidth();
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LeftToRightWritingMode:
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderRightWidth();
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RightToLeftWritingMode:
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return borderLeftWidth();
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return borderBottomWidth();
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned short RenderStyle::borderStartWidth() const
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isHorizontalWritingMode())
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isLeftToRightDirection() ? borderLeftWidth() : borderRightWidth();
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return isLeftToRightDirection() ? borderTopWidth() : borderBottomWidth();
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned short RenderStyle::borderEndWidth() const
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isHorizontalWritingMode())
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return isLeftToRightDirection() ? borderRightWidth() : borderLeftWidth();
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return isLeftToRightDirection() ? borderBottomWidth() : borderTopWidth();
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1584f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void RenderStyle::setMarginStart(const Length& margin)
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isHorizontalWritingMode()) {
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isLeftToRightDirection())
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginLeft(margin);
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginRight(margin);
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isLeftToRightDirection())
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginTop(margin);
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginBottom(margin);
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1599f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void RenderStyle::setMarginEnd(const Length& margin)
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isHorizontalWritingMode()) {
16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isLeftToRightDirection())
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginRight(margin);
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginLeft(margin);
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isLeftToRightDirection())
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginBottom(margin);
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setMarginTop(margin);
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TextEmphasisMark RenderStyle::textEmphasisMark() const
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextEmphasisMark mark = static_cast<TextEmphasisMark>(rareInheritedData->textEmphasisMark);
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (mark != TextEmphasisMarkAuto)
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return mark;
16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isHorizontalWritingMode())
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return TextEmphasisMarkDot;
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return TextEmphasisMarkSesame;
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color RenderStyle::initialTapHighlightColor()
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return RenderTheme::tapHighlightColor();
16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutBoxExtent RenderStyle::imageOutsets(const NinePieceImage& image) const
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutBoxExtent(NinePieceImage::computeOutset(image.outset().top(), borderTopWidth()),
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           NinePieceImage::computeOutset(image.outset().right(), borderRightWidth()),
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           NinePieceImage::computeOutset(image.outset().bottom(), borderBottomWidth()),
16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           NinePieceImage::computeOutset(image.outset().left(), borderLeftWidth()));
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1639926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderStyle::setBorderImageSource(PassRefPtr<StyleImage> image)
1640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1641926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (surround->border.m_image.image() == image.get())
1642926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1643926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    surround.access()->border.m_image.setImage(image);
1644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1645926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1646f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void RenderStyle::setBorderImageSlices(const LengthBox& slices)
1647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (surround->border.m_image.imageSlices() == slices)
1649926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1650926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    surround.access()->border.m_image.setImageSlices(slices);
1651926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
165351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void RenderStyle::setBorderImageWidth(const BorderImageLengthBox& slices)
1654926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (surround->border.m_image.borderSlices() == slices)
1656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    surround.access()->border.m_image.setBorderSlices(slices);
1658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1659926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
166051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void RenderStyle::setBorderImageOutset(const BorderImageLengthBox& outset)
1661926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1662926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (surround->border.m_image.outset() == outset)
1663926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    surround.access()->border.m_image.setOutset(outset);
1665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1667d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)float calcBorderRadiiConstraintScaleFor(const FloatRect& rect, const FloatRoundedRect::Radii& radii)
1668d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1669d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Constrain corner radii using CSS3 rules:
1670d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // http://www.w3.org/TR/css3-background/#the-border-radius
1671d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1672d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    float factor = 1;
1673d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    float radiiSum;
1674d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1675d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // top
1676d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    radiiSum = radii.topLeft().width() + radii.topRight().width(); // Casts to avoid integer overflow.
1677d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (radiiSum > rect.width())
1678d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        factor = std::min(rect.width() / radiiSum, factor);
1679d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1680d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // bottom
1681d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    radiiSum = radii.bottomLeft().width() + radii.bottomRight().width();
1682d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (radiiSum > rect.width())
1683d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        factor = std::min(rect.width() / radiiSum, factor);
1684d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1685d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // left
1686d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    radiiSum = radii.topLeft().height() + radii.bottomLeft().height();
1687d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (radiiSum > rect.height())
1688d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        factor = std::min(rect.height() / radiiSum, factor);
1689d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1690d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // right
1691d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    radiiSum = radii.topRight().height() + radii.bottomRight().height();
1692d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (radiiSum > rect.height())
1693d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        factor = std::min(rect.height() / radiiSum, factor);
1694d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1695d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(factor <= 1);
1696d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return factor;
1697d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1698d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
16997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool RenderStyle::borderObscuresBackground() const
17007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
17017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!hasBorder())
17027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
17037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
17047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Bail if we have any border-image for now. We could look at the image alpha to improve this.
17057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (borderImage().image())
17067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
17077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
17087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    BorderEdge edges[4];
17097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    getBorderEdgeInfo(edges);
17107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
17117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (int i = BSTop; i <= BSLeft; ++i) {
17127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        const BorderEdge& currEdge = edges[i];
17137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!currEdge.obscuresBackground())
17147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return false;
17157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
17167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
17177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return true;
17187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
17197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
17207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid RenderStyle::getBorderEdgeInfo(BorderEdge edges[], bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const
17217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
17227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool horizontal = isHorizontalWritingMode();
17237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
17247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    edges[BSTop] = BorderEdge(borderTopWidth(),
17257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        visitedDependentColor(CSSPropertyBorderTopColor),
17267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        borderTopStyle(),
17277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        borderTopIsTransparent(),
17287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        horizontal || includeLogicalLeftEdge);
17297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
17307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    edges[BSRight] = BorderEdge(borderRightWidth(),
17317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        visitedDependentColor(CSSPropertyBorderRightColor),
17327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        borderRightStyle(),
17337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        borderRightIsTransparent(),
17347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        !horizontal || includeLogicalRightEdge);
17357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
17367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    edges[BSBottom] = BorderEdge(borderBottomWidth(),
17377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        visitedDependentColor(CSSPropertyBorderBottomColor),
17387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        borderBottomStyle(),
17397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        borderBottomIsTransparent(),
17407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        horizontal || includeLogicalRightEdge);
17417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
17427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    edges[BSLeft] = BorderEdge(borderLeftWidth(),
17437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        visitedDependentColor(CSSPropertyBorderLeftColor),
17447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        borderLeftStyle(),
17457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        borderLeftIsTransparent(),
17467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        !horizontal || includeLogicalLeftEdge);
17477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
17487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1749c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1750