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