From 2d4a8d79591b1d50cd84792f9dd3c6b08121adff Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Tue, 16 Jul 2024 21:14:14 +0800 Subject: [PATCH 01/25] constants.py: fix powerpc arch detection --- python/mozbuild/mozbuild/configure/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/mozbuild/mozbuild/configure/constants.py b/python/mozbuild/mozbuild/configure/constants.py index 00d9ff9bbf..4045a80d2b 100644 --- a/python/mozbuild/mozbuild/configure/constants.py +++ b/python/mozbuild/mozbuild/configure/constants.py @@ -79,8 +79,8 @@ CPU_preprocessor_checks = OrderedDict(( ('ia64', '__ia64__'), ('s390x', '__s390x__'), ('s390', '__s390__'), - ('ppc64', '__powerpc64__'), - ('ppc', '__powerpc__'), + ('ppc64', '__powerpc64__ || __ppc64__'), + ('ppc', '__powerpc__ || __ppc__'), ('Alpha', '__alpha__'), ('hppa', '__hppa__'), ('sparc64', '__sparc__ && __arch64__'), From 7e3f0d53a2783196c29a24f15b01de472a20f5d5 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 25 Jul 2024 15:33:07 +0200 Subject: [PATCH 02/25] Issue #2515 - Remove mForceContentDispatch and mNoContentDispatch --- dom/base/nsDocument.cpp | 5 ----- dom/base/nsGlobalWindow.cpp | 6 ------ dom/base/nsInProcessTabChildGlobal.cpp | 1 - dom/base/nsWindowRoot.cpp | 1 - dom/events/EventDispatcher.cpp | 24 +++--------------------- dom/events/EventDispatcher.h | 9 --------- dom/events/EventStateManager.cpp | 1 - dom/ipc/TabChild.h | 1 - dom/xul/nsXULElement.cpp | 13 ------------- widget/BasicEvents.h | 10 ---------- 10 files changed, 3 insertions(+), 68 deletions(-) diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index 3edcb39020..26c1025646 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -7270,11 +7270,6 @@ nsDocument::GetEventTargetParent(EventChainPreVisitor& aVisitor) aVisitor.mCanHandle = true; // Middle/right click shouldn't dispatch click event, use auxclick to instead. Element* docElement = GetRootElement(); - if (docElement && docElement->IsXULElement()) { - // FIXME! This is a hack to make middle mouse paste working also in Editor. - // Bug 329119 - aVisitor.mForceContentDispatch = true; - } // Load events must not propagate to |window| object, see bug 335251. if (aVisitor.mEvent->mMessage != eLoad) { diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index a9a387e15c..943b501ef7 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -3544,12 +3544,6 @@ nsGlobalWindow::GetEventTargetParent(EventChainPreVisitor& aVisitor) EventMessage msg = aVisitor.mEvent->mMessage; aVisitor.mCanHandle = true; - // Middle/right click shouldn't dispatch click event, use auxclick to instead. - // Note: mDoc should always exist here, but check just in case someone yanked - // it out from under us. - if (mDoc && mDoc->IsXULDocument()) { - aVisitor.mForceContentDispatch = true; //FIXME! Bug 329119 - } if (msg == eResize && aVisitor.mEvent->IsTrusted()) { // QIing to window so that we can keep the old behavior also in case // a child window is handling resize. diff --git a/dom/base/nsInProcessTabChildGlobal.cpp b/dom/base/nsInProcessTabChildGlobal.cpp index 8d94e4ead4..8e2b56feca 100644 --- a/dom/base/nsInProcessTabChildGlobal.cpp +++ b/dom/base/nsInProcessTabChildGlobal.cpp @@ -252,7 +252,6 @@ nsInProcessTabChildGlobal::GetOwnerContent() nsresult nsInProcessTabChildGlobal::GetEventTargetParent(EventChainPreVisitor& aVisitor) { - aVisitor.mForceContentDispatch = true; aVisitor.mCanHandle = true; #ifdef DEBUG diff --git a/dom/base/nsWindowRoot.cpp b/dom/base/nsWindowRoot.cpp index 8175877148..773fff560c 100644 --- a/dom/base/nsWindowRoot.cpp +++ b/dom/base/nsWindowRoot.cpp @@ -182,7 +182,6 @@ nsresult nsWindowRoot::GetEventTargetParent(EventChainPreVisitor& aVisitor) { aVisitor.mCanHandle = true; - aVisitor.mForceContentDispatch = true; //FIXME! Bug 329119 // To keep mWindow alive aVisitor.mItemData = static_cast(mWindow); aVisitor.SetParentTarget(mParent, false); diff --git a/dom/events/EventDispatcher.cpp b/dom/events/EventDispatcher.cpp index df3080dd47..7b4cc1cecf 100644 --- a/dom/events/EventDispatcher.cpp +++ b/dom/events/EventDispatcher.cpp @@ -214,16 +214,6 @@ public: mRetargetedRelatedTarget = aTarget; } - void SetForceContentDispatch(bool aForce) - { - mFlags.mForceContentDispatch = aForce; - } - - bool ForceContentDispatch() - { - return mFlags.mForceContentDispatch; - } - void SetWantsWillHandleEvent(bool aWants) { mFlags.mWantsWillHandleEvent = aWants; @@ -387,7 +377,6 @@ private: // Cached flags for each EventTargetChainItem which are set when calling // GetEventTargetParent to create event target chain. They are used to // manage or speedup event dispatching. - bool mForceContentDispatch : 1; bool mWantsWillHandleEvent : 1; bool mMayHaveManager : 1; bool mChechedIfChrome : 1; @@ -439,7 +428,6 @@ EventTargetChainItem::GetEventTargetParent(EventChainPreVisitor& aVisitor) { aVisitor.Reset(); Unused << mTarget->GetEventTargetParent(aVisitor); - SetForceContentDispatch(aVisitor.mForceContentDispatch); SetWantsWillHandleEvent(aVisitor.mWantsWillHandleEvent); SetMayHaveListenerManager(aVisitor.mMayHaveListenerManager); SetWantsPreHandleEvent(aVisitor.mWantsPreHandleEvent); @@ -492,9 +480,7 @@ EventTargetChainItem::HandleEventTargetChain( if (item.PreHandleEventOnly()) { continue; } - if ((!aVisitor.mEvent->mFlags.mNoContentDispatch || - item.ForceContentDispatch()) && - !aVisitor.mEvent->PropagationStopped()) { + if (!aVisitor.mEvent->PropagationStopped()) { item.HandleEvent(aVisitor, aCd); } @@ -538,9 +524,7 @@ EventTargetChainItem::HandleEventTargetChain( // Target aVisitor.mEvent->mFlags.mInBubblingPhase = true; EventTargetChainItem& targetItem = aChain[firstCanHandleEventTargetIdx]; - if (!aVisitor.mEvent->PropagationStopped() && - (!aVisitor.mEvent->mFlags.mNoContentDispatch || - targetItem.ForceContentDispatch())) { + if (!aVisitor.mEvent->PropagationStopped()) { targetItem.HandleEvent(aVisitor, aCd); } if (aVisitor.mEvent->mFlags.mInSystemGroup) { @@ -570,9 +554,7 @@ EventTargetChainItem::HandleEventTargetChain( } if (aVisitor.mEvent->mFlags.mBubbles || newTarget) { - if ((!aVisitor.mEvent->mFlags.mNoContentDispatch || - item.ForceContentDispatch()) && - !aVisitor.mEvent->PropagationStopped()) { + if (!aVisitor.mEvent->PropagationStopped()) { item.HandleEvent(aVisitor, aCd); } if (aVisitor.mEvent->mFlags.mInSystemGroup) { diff --git a/dom/events/EventDispatcher.h b/dom/events/EventDispatcher.h index 9eaa124137..eb1b5c3a31 100644 --- a/dom/events/EventDispatcher.h +++ b/dom/events/EventDispatcher.h @@ -118,7 +118,6 @@ public: : EventChainVisitor(aPresContext, aEvent, aDOMEvent, aEventStatus) , mCanHandle(true) , mAutomaticChromeDispatch(true) - , mForceContentDispatch(false) , mRelatedTargetIsInAnon(false) , mOriginalTargetIsInAnon(aIsInAnon) , mWantsWillHandleEvent(false) @@ -143,7 +142,6 @@ public: mItemData = nullptr; mCanHandle = true; mAutomaticChromeDispatch = true; - mForceContentDispatch = false; mWantsWillHandleEvent = false; mMayHaveListenerManager = true; mWantsPreHandleEvent = false; @@ -195,13 +193,6 @@ public: */ bool mAutomaticChromeDispatch; - /** - * If mForceContentDispatch is set to true, - * content dispatching is not disabled for this event target. - * FIXME! This is here for backward compatibility. Bug 329119 - */ - bool mForceContentDispatch; - /** * true if it is known that related target is or is a descendant of an * element which is anonymous for events. diff --git a/dom/events/EventStateManager.cpp b/dom/events/EventStateManager.cpp index 371f66af42..e32655e77e 100644 --- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp @@ -4683,7 +4683,6 @@ EventStateManager::InitAndDispatchClickEvent(WidgetMouseEvent* aMouseUpEvent, event.mTime = aMouseUpEvent->mTime; event.mTimeStamp = aMouseUpEvent->mTimeStamp; event.mFlags.mOnlyChromeDispatch = aNoContentDispatch; - event.mFlags.mNoContentDispatch = aNoContentDispatch; event.button = aMouseUpEvent->button; event.inputSource = aMouseUpEvent->inputSource; diff --git a/dom/ipc/TabChild.h b/dom/ipc/TabChild.h index 845387e92a..a812b8213a 100644 --- a/dom/ipc/TabChild.h +++ b/dom/ipc/TabChild.h @@ -136,7 +136,6 @@ public: nsresult GetEventTargetParent(EventChainPreVisitor& aVisitor) override { - aVisitor.mForceContentDispatch = true; return NS_OK; } diff --git a/dom/xul/nsXULElement.cpp b/dom/xul/nsXULElement.cpp index ee3a50cb88..96e6cc516f 100644 --- a/dom/xul/nsXULElement.cpp +++ b/dom/xul/nsXULElement.cpp @@ -2,18 +2,6 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This Original Code has been modified by IBM Corporation. - * Modifications made by IBM described herein are - * Copyright (c) International Business Machines - * Corporation, 2000 - * - * Modifications to Mozilla code or documentation - * identified per MPL Section 3.3 - * - * Date Modified by Description of modification - * 03/27/2000 IBM Corp. Added PR_CALLBACK for Optlink - * use in OS2 */ #include "nsCOMPtr.h" @@ -1299,7 +1287,6 @@ nsXULElement::DispatchXULCommand(const EventChainVisitor& aVisitor, nsresult nsXULElement::GetEventTargetParent(EventChainPreVisitor& aVisitor) { - aVisitor.mForceContentDispatch = true; //FIXME! Bug 329119 if (IsEventStoppedFromAnonymousScrollbar(aVisitor.mEvent->mMessage)) { // Don't propagate these events from native anonymous scrollbar. aVisitor.mCanHandle = true; diff --git a/widget/BasicEvents.h b/widget/BasicEvents.h index 14977bdc24..95a51ff4ca 100644 --- a/widget/BasicEvents.h +++ b/widget/BasicEvents.h @@ -100,16 +100,6 @@ public: // If mNoCrossProcessBoundaryForwarding is true, the event is not allowed to // cross process boundary. bool mNoCrossProcessBoundaryForwarding : 1; - // If mNoContentDispatch is true, the event is never dispatched to the - // event handlers which are added to the contents, onfoo attributes and - // properties. Note that this flag is ignored when - // EventChainPreVisitor::mForceContentDispatch is set true. For exapmle, - // window and document object sets it true. Therefore, web applications - // can handle the event if they add event listeners to the window or the - // document. - // XXX This is an ancient and broken feature, don't use this for new bug - // as far as possible. - bool mNoContentDispatch : 1; // If mOnlyChromeDispatch is true, the event is dispatched to only chrome. bool mOnlyChromeDispatch : 1; // If mOnlySystemGroupDispatchInContent is true, event listeners added to From bd439689e1929361bfabe5e7c3f3d55307eda7d7 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 25 Jul 2024 15:42:08 +0200 Subject: [PATCH 03/25] Issue #2515 - Clarify only dispatching in chrome. --- dom/events/EventStateManager.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/dom/events/EventStateManager.cpp b/dom/events/EventStateManager.cpp index e32655e77e..c6089d5d1c 100644 --- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp @@ -4668,7 +4668,7 @@ EventStateManager::InitAndDispatchClickEvent(WidgetMouseEvent* aMouseUpEvent, nsIPresShell* aPresShell, nsIContent* aMouseUpContent, nsWeakFrame aCurrentTarget, - bool aNoContentDispatch) + bool aOnlyChromeDispatch) { MOZ_ASSERT(aMouseUpEvent); MOZ_ASSERT(EventCausesClickEvents(*aMouseUpEvent)); @@ -4682,7 +4682,7 @@ EventStateManager::InitAndDispatchClickEvent(WidgetMouseEvent* aMouseUpEvent, event.buttons = aMouseUpEvent->buttons; event.mTime = aMouseUpEvent->mTime; event.mTimeStamp = aMouseUpEvent->mTimeStamp; - event.mFlags.mOnlyChromeDispatch = aNoContentDispatch; + event.mFlags.mOnlyChromeDispatch = aOnlyChromeDispatch; event.button = aMouseUpEvent->button; event.inputSource = aMouseUpEvent->inputSource; @@ -4749,41 +4749,41 @@ EventStateManager::DispatchClickEvents(nsIPresShell* aPresShell, MOZ_ASSERT(aStatus); MOZ_ASSERT(aClickTarget); - bool notDispatchToContents = + bool onlyDispatchInChrome = (aMouseUpEvent->button == WidgetMouseEvent::eMiddleButton || aMouseUpEvent->button == WidgetMouseEvent::eRightButton); - bool fireAuxClick = notDispatchToContents; + bool fireAuxClick = onlyDispatchInChrome; nsWeakFrame currentTarget = aClickTarget->GetPrimaryFrame(); - nsresult ret = + nsresult rv = InitAndDispatchClickEvent(aMouseUpEvent, aStatus, eMouseClick, aPresShell, aClickTarget, currentTarget, - notDispatchToContents); - if (NS_WARN_IF(NS_FAILED(ret))) { - return ret; + onlyDispatchInChrome); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; } // Fire auxclick even if necessary. if (fireAuxClick && aClickTarget && aClickTarget->IsInComposedDoc()) { - ret = InitAndDispatchClickEvent(aMouseUpEvent, aStatus, eMouseAuxClick, + rv = InitAndDispatchClickEvent(aMouseUpEvent, aStatus, eMouseAuxClick, aPresShell, aClickTarget, currentTarget, false); - NS_WARNING_ASSERTION(NS_SUCCEEDED(ret), "Failed to dispatch eMouseAuxClick"); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to dispatch eMouseAuxClick"); } // Fire double click event if click count is 2. if (aMouseUpEvent->mClickCount == 2 && !fireAuxClick && aClickTarget && aClickTarget->IsInComposedDoc()) { - ret = InitAndDispatchClickEvent(aMouseUpEvent, aStatus, eMouseDoubleClick, + rv = InitAndDispatchClickEvent(aMouseUpEvent, aStatus, eMouseDoubleClick, aPresShell, aClickTarget, currentTarget, - notDispatchToContents); - if (NS_WARN_IF(NS_FAILED(ret))) { - return ret; + onlyDispatchInChrome); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; } } - return ret; + return rv; } nsIFrame* From 9b5686790161c9bbe736d50a59f5991040a6d53f Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 25 Jul 2024 15:50:31 +0200 Subject: [PATCH 04/25] Issue #2515 - Guard devtools click handlers against non-primary clicks. We only want clicks on HTML elements to respond to the primary button. --- devtools/client/shared/SplitView.jsm | 3 +++ devtools/client/shared/autocomplete-popup.js | 3 +++ devtools/client/shared/widgets/Spectrum.js | 3 +++ devtools/client/shared/widgets/TableWidget.js | 3 +++ devtools/client/styleeditor/StyleEditorUI.jsm | 5 ++++- 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/devtools/client/shared/SplitView.jsm b/devtools/client/shared/SplitView.jsm index b3313193e9..588e1f79d5 100644 --- a/devtools/client/shared/SplitView.jsm +++ b/devtools/client/shared/SplitView.jsm @@ -209,6 +209,9 @@ SplitView.prototype = { this._nav.appendChild(aSummary); aSummary.addEventListener("click", (aEvent) => { + if (aEvent.button != 0) { + return; + } aEvent.stopPropagation(); this.activeSummary = aSummary; }, false); diff --git a/devtools/client/shared/autocomplete-popup.js b/devtools/client/shared/autocomplete-popup.js index e848f6c1fd..e07494c03c 100644 --- a/devtools/client/shared/autocomplete-popup.js +++ b/devtools/client/shared/autocomplete-popup.js @@ -97,6 +97,9 @@ AutocompletePopup.prototype = { }, onClick: function (e) { + if (e.button != 0) { + return; + } let item = e.target.closest(".autocomplete-item"); if (item && typeof item.dataset.index !== "undefined") { this.selectedIndex = parseInt(item.dataset.index, 10); diff --git a/devtools/client/shared/widgets/Spectrum.js b/devtools/client/shared/widgets/Spectrum.js index 00110f13e6..2baf3f722f 100644 --- a/devtools/client/shared/widgets/Spectrum.js +++ b/devtools/client/shared/widgets/Spectrum.js @@ -240,6 +240,9 @@ Spectrum.prototype = { }, onElementClick: function (e) { + if (e.button != 0) { + return; + } e.stopPropagation(); }, diff --git a/devtools/client/shared/widgets/TableWidget.js b/devtools/client/shared/widgets/TableWidget.js index 57d2914d5a..f54ee8a485 100644 --- a/devtools/client/shared/widgets/TableWidget.js +++ b/devtools/client/shared/widgets/TableWidget.js @@ -1480,6 +1480,9 @@ Column.prototype = { * for sorting. */ onClick: function (event) { + if (event.button != 0) { + return; + } let target = event.originalTarget; if (target.nodeType !== target.ELEMENT_NODE || target == this.column) { diff --git a/devtools/client/styleeditor/StyleEditorUI.jsm b/devtools/client/styleeditor/StyleEditorUI.jsm index d0f9f8d1b8..3f8042131a 100644 --- a/devtools/client/styleeditor/StyleEditorUI.jsm +++ b/devtools/client/styleeditor/StyleEditorUI.jsm @@ -174,7 +174,10 @@ StyleEditorUI.prototype = { this._view = new SplitView(viewRoot); - wire(this._view.rootElement, ".style-editor-newButton", () =>{ + wire(this._view.rootElement, ".style-editor-newButton", (e) =>{ + if (e.button != 0) { + return; + } this._debuggee.addStyleSheet(null); }); From 1fe474cf7b317b12949b884ec636e8501a712222 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Mon, 29 Jul 2024 23:17:42 +0200 Subject: [PATCH 05/25] No issue - Update Twemoji Mozilla to 15.1.1 This updates Lime and Watermelon emoji to slightly larger versions. --- toolkit/fonts/README.txt | 8 +++++++- toolkit/fonts/TwemojiMozilla.ttf | Bin 1623176 -> 1619304 bytes 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/toolkit/fonts/README.txt b/toolkit/fonts/README.txt index bf5cb7e6ed..531d276615 100644 --- a/toolkit/fonts/README.txt +++ b/toolkit/fonts/README.txt @@ -1,9 +1,15 @@ Twemoji Mozilla ================ +This is a COLR compiled version of the Twemoji font in TTF format. + The upstream repository of Twemoji Mozilla can be found at https://github.com/mozilla/twemoji-colr -Please refer commit history for the current version of the font. +Please refer to the commit history for the current version of the font. This file purposely omits the version, so there is no need to update it here. + +Note: this version slightly deviates from upstream to account for slow uptake +of changes by upstream. + diff --git a/toolkit/fonts/TwemojiMozilla.ttf b/toolkit/fonts/TwemojiMozilla.ttf index fa91f6b1a46dd570f7bbc2c84d20c703391a5b29..016fc4f05a4fe0fef1325797eac09760cc4d9c1d 100644 GIT binary patch delta 379972 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≦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%0A)K!!QVGUqAFobod#XdL;y6w#u( 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%0AxVfZ7^ zvM9_i%BO*&%C-Q$|AAvv<`4%DKEgSlACviU3S^lj@Ei1m@>$@dQV=*r_%szdLqY5T z2%MvEX2O9BROll7C3q~Pfh%%I;CJQoz%_LKpfMa|9JnrO1#S?&N!nW=%Hnh2Dz&~% zi|;7)19uf%Kom#1O4*(+l`qm2!fL`Sv7}d1zD%zr%F@}al&(<<)3vfqx=twR9IKz6 zAgZP7MNE2iWU(SUy#}ZW3`$YDQ7KNpPuY>qODmn1R(d@sFRkx9es`KIXSoj*Uq(Mz+Em7Ejk5(WnyyA)X9>}csV5#>t`kdm`wHp zXZ%IF+p>Me9ie30Rep$OVx!N@RDR410vw0xVj|6K1|A{tqhy3rS!N5uEy;jA+_hO) z%49h{la1+_!;rs%9uKfgE>R|zD08ZinXki7gr5W^tI9LC6W#y{m9I13Q%W;8EBiCI zK#OEFKeLz&cF3H}ohW=k0zBI@Ibb65CWYTZ_80ND3A3n>c~=w$g@_Gu{e!ZyGGl@d z$edtPQ51Ygj0xr_2ZIlb>|ic@Gob_@LHAKnGuRNFM)HYZW6(s}gAWRIu(=!+Y!Q`f zgKP*3wgxQ41z#jF+bx29L{6|B;g)2;=|(|X9qcPggD(jg>?gYgnV<#-unDz;&;(yr z4h07iKS(YN4hBQy;^0tGBgl$+a5xkPhu}!)D0D`XFVFqpSn}kt9*mBomK+=r%lV%Hd$XawIrIDGSa7v%qYb8+?=2y@k%( zfc1mmTzZW6L2y3&0xHcx_Q6GRcaU=9QNxPn^o+z+l2c|o50 zK~6FWt|iPqu;6;JBe;RYtd0jiM9!H(!HzNI1zK7#v^9U$%?dEvw!{8_dR zGOZ6XNC~q4t1$Qr*M`wakW-0*$Ka1ce}(=AJpnyQqEjS34Lw6e&XVvPI8XS3Tob$~ z+XgQYzAU!~uTU_b;tF1+*RG+9<53XDqacn)!5dtjn<6H73;adix9O4S9lGYOh{d(9 zW=I93P(lh&15UaQVTKQ3u?WRNYly-S*3XauFq#P^l8#mJ5EjnReX@Nh30hYv5Alc% zF_8&za8ZbfOo)k0C>}783F(Qihm4i>5Jrt?C{?IKCJHiBxP=HSu%TR^%g3|4>I7{ zTN-M_{;yDDQ50%ICHPN`d<(>PoA-(F@&`6QO66lc8tj+|YAWst2?u89Xl+hF*}1LmVm-dXWnEmhD1) zsC-|c3cbW->4$EAAwxVLLRdjVctM3YQzkSR458qmqFQJey@oL(6y+fhVs;W5514#} zCX&GT<8D)lL9$nDfE|eHFR6K7P_PS5xOgL!$P(Xv%5VkRpns?s6}=- zM$`ybQ~nHB7qQ_QfagS*=RlaDR#=0s7RqxV98daKcs93(_5A-WQxVh_>Tn(CeF)h= z9&`^8_`+@py4Ly@w^B(g+3(DhI7d9VZ{>8Rj!Ad!9N1{B1X8mawFUVv{Y_}A5(6H znXZM|YaY%MG2zx!uuW7b;U`4R@RMZDN%-M*A};(CXpg*uYE!r)2|CfePg7`T<*#rT z<#xC$6=szr+#Rq=5`LCSJg3|V_W(V~oK=$W3(DPaFSQ82D3^zOgTD00OT_g9{ow~7 zdzlJG2g-@zK}ySTAGtd`7{L%~H53J0Z^Aqv!u;i%vnw0S+Z>ySIIE0lHs@bHp$z3uwaf_7oG>^g9TtASOgZU zSu_Mee`C(4U4}Su`6`oV_!`tAoaD;Ip2!9T?(_3Fa z`C3M}5LyH{AuWuBBfL{xJN!NTVe&W$&Vlpb0=USba^Xv$1ndG|fv+imC6(}Q@Gba` z@E))i`~ZFg`@m12l#1*J2jCAv`BFysXK;jY8TbYMs5l%hmp#MBpvS?l;5TprS@aY? zr@)ePp2=iPB-y+N)BFxA*d%!Mlr$my~sS&5z6!8H+2!M3ZKpizl z?uW?$DIgV?)aHm8Y5`VY1NDI&xdZ9~Zjc5%z>7RnZHWXyNO>|6rgaf$7Bm|?pteRD zs%?=*>iUt!po!WZc~I?$G*vqz4@HU0q1&)}MzD597-U2kWJFp(8DvBlWJFr2U6IGt z?no|Z2J(=#Ca#T;ktd)}3MJB3)Qq%)@~N!|&yEPLdy$UxY$x19o|YvM>_?F160Dgr|ti$g5mtzL*o4roKNiU7ZnmL!A+g2ZmACc8GW|Pc~Fh+>H3+2m*k1PTb{H_Tq8ZRC4(R^$hDcH~E7`{bF( zPwEFErRs)}{pv=M1Mmmo55fNoe;EDOj9*hP+la<2I?@;MIwD|!B=ZX7wGZW1}E zelT)MJ|8))ZW=iUjh=_O0CN#~33?fN1^PSm41b-o@a$xWT;u=x2lP+6@4E7A>YS`N z5^3b(EG^KfAI^%G2eK0Q_^@8NUNQ8_GN^O2jOu1tiJ&&9qkbgoKJ}wnNzl47KdYYH zmc<#5S$I5UHHJ2UJ_v0F9)W)p+8o*f+7im%fvi^WPcr|{Y75g2!Bf!oP|keJ>Im%w z?GAkg`U13*p zt&R(G%&)={a{`ejN*EM2#6vof*0Zmf_Mvfi+JC+SYBw-p(nbo=Xz^INd&y_3ueH3z3+2%b-mVI zclWo8tMdDFx|4J|olIs#{i9Od)%D)1dR5h__wA}zD@gDW{9>>tAclE@Vz{SCj93L# zc?O6LJp*~xEJk`bM!^#zZY6FbZYK_ljhuz|M8w9Ps2Js0l{h9g@x;Yw&uU^*PY3)v z#b%z>#pWKql6eLZugUqJp5KWrsPR}b4f3od#(CBjTXI13IM2Go>xr#AgT>Z7ALtn( zw($%j&v3D=X9QtG3NTWP_iQA#^K2|8ct#O({E}xVX&X=ggWo1%`+P-4Q(K3YJ)4Rh zJex@fHWxd3#!#9q#7>^ET#pkwL%a*6pXk|==UWltVv=V!v8xA6(6hUkLV#X|A4+@}@k|H~7t=kn#Eg8VBgFomqr?H8qs4)qW5hw8W4S+09PBw> z9O5~F!ktKbq&SqCuIV|6nx7#K^PEZgS=^s3W_o6e!#(GSSsp2l@SMx@lL@DYBR!{z zS<-VF8BeDM4)q}TD9?G+=6p(dfjHW8Az_X*5cdH^k+hH@SaHT;X{e;&(`Um;3j*|A6}sq4^%o{STo(h+`@Em7X6__fO&~&kAv+ zSBR^%D$)gEt^<^ajOE-X@02H{xb` z_aN^8af>m8yu1gTeZ<==ZuPbxv_oXP{9kxm#cj~d^R|iGDa0M#b}`=@7E`@7f4jN8ImSm;3d^1Kz>nLGKWltuG$(4yBM^i-)}%h)2A`$TwU(>K!2-A#ISC zujyWv+;}$<1H2oH$GxLS1A~3SyNh_zJ5fBv7#*C?IEmU$6^p&BaPhJ-&dbU;?_Pwx z39R|{?n~H}Fc}6@M7MW0(Nm$BQDUigKe5ca33;X=Y`S>bJ0oA~XT1B9c99twJC1NX_a}%yc~2yqBwq5K%rmxpc~2EDdruQDOYa$EI+Jh~ z;e7Fm_X3z+C|>o>5wD_+*SuZgb#Gd{;k`t>>Ae)ezZZ>OR>gSng2VH-yqAl&z1N9% zyw?+M;QB_=ZW8Z$Zx-))ZxKH4t>S&}72E?xd#~d8)jYpOeBfoLo%dSyf1~=rsQyE5 zCa<2s`LP+JFt>@1yz?l`?ZkHw&nM2Jshs%Odnfk`#Gkzj35&!h-n+!7-n+$Ly!VLD zdMh;iKj-Cj53lsUdR~^|3-7(+bMJkG`w0&a9wb9VeCd5ieC6#H7kGORwp4u0DEP*^ z4As3r$zNpDFp2QKB>v`oS$yk#Mf~0SD&aN4)8ZfAXNaFAFZ;l}&x^l1`$v96y)M4< z%6G*-z3+*CdEX~yV&MHy{M*aYJMYKh|Ga-Degh_NivM`uBD^jB>wQNocQT`}-+MnH z@23>>FXDgR&&2lL&xvir4GrJIAJ7l{0S)thO9%hESkwCt&VTTJ$Dc$*jPU+b{OJ7` z5C6^e{}KO(z{JA4Tuk?VPvGU^{ek#L@ssx_vBJAT5zr0t2{GNLC<+2@^QmHruR+Z7 zHHuNbRTS0d;rT$~WTEWz`&a@|JUP6#Vf^?6C~apNZhlm=gr`zGQ6gox6}3uKTl zN?28C^u&}^yt^nKUyS>>;^k#Bf|toK?*PTO%GZkDx0)F2>kwD^I>id^16E)9#J7$T z^sNj3^+eFek!`*q#Oo6eWytte=VA@wLBwkk|4wQ0t)&d`t*s37ZJ;#!m~{At6OW*S z@+S0csI>UDP(nWD2EMJ7R^Qf2n{OMgx8-`g((c<%3HwGW5#L6nZLCCnqm)(oVig19 zALYY1^=+oaeVZ$*`Nk+6J~>wD^o>(GoNelxpsa4ZCVjgoYxpKAgM5>eHGR7(zw=Gz zdJ17T?xzxOPudQ|J1T4Wb|UZ2%G!(o)wjE{j&BotA0ci9Rq z-@(fIzCD!nrEgCz_9E;}*oUw$CEO3fL&PxOp<-_z6B6G{{$wItAI`H`q#uErkIc_t z?(i8JJeR;r$9KNC!_bh&ZMwzF%5#r0)OUfhf$u^pHb)u8FqFsoE)vK3E`~Uv4D%(G z;k4TbZ&=yT*F{=d8R@%(>r0gpzTYbw`7R^;fx!I0r;(N-o=dDNBk9?LJkynpeOD;P zbnGko#-LTcRW|Y6qKx+4s%+}Zp#IyG&3yBe&3(6%eh1-t$W8cN5>EY~#CE+17WT zGTwK;vYqb%;s=!pzK4|U$Un&I_P-+g`p2>hZ%bol8>5LHR<`#&qHNEI*uhBiJ*w>J zdraBM_qb4ePY|9|cJ@7`?BcmgnaHeXkatyO5|!H3sFYD4-;2s*>HCvd;(G~ZFDp}g zuW`8$J`#yr{$Hct2 ze4h|w`TG7s{F$<+@54OJbl>O5_$%)W_L=#<1pkG>UcRrCy?yLd^?jr4lP}rd5b~{P z^!=UQ`VYc)%D%pT(((Ry-N9^oIQ9O>UgIm$m;IoiJ|_nRrl_&0~&82Gb?4EpO0 z{*qVfhW@c)jDMVRtY?4aIEK*i451Uu;Uu=_`b7Vh%1ORB#9N8M{;idh{o5#~__w7n z10d%AY^{fb^q?lX?|u>{yo|AkH08CGbswN#J9VU zs-G#9e_!#KpYL-1XWEW*N9rGM2DE%{y8Y}1WJ~+>RxN^RK7U2lxeEh#E7x<49Q~XE4 z=;(Z=Q~k$qeY$d?|6FB`|2*X)|M|+r{tHOEkhD33iwMUOj#Co;51m6b#(_r2JE{`I5*c0=ulipRJNaMb{xz|a*;ADpU~r?K z7n1)CWfadu?S!C9R-rYrdP`NA6q}&~#w+99)_n@i4SUw{H z%_10R$-g6vf6{vcA@a70VSzS6yK)~m(V#$>JQ47p{PZfK+#iT44+MA_1@QM8=umD8 zbSe)9R_A^V?gv4@j)%bS#EpTNxIVzUz^F+8e|&-A%0qz>N<)AZYk`r3jkw>KFp98= z@^D~n;&lk?@@zfAVC9j(5boFKdZ;2B0vm8KOlfecjO7rI1~x_TX3Ap$uzd4RNO|0N zJ@Y5DBOPmxz!-6CU<(R4mUtXB+ERHUuoYoz@g*bb$-p+sQ@jW6HQJued~9HQDzgJT zcO>44cxTrC26o|QA~)NL#=v-GabP>b1j2M>NdTJ-M%{q}m7c&s%2Fm33kok7UM|b9 z9R~#tQ=SgYRGtYO4*e|RBa~%mcsBNQ=SdTW0dCt z$0{cVjw3#v_ypxS1U?@)9l|pR;5dP^2)N-0%qC#x1(%F@79%4>nEmDdB;C~pM*sJt1tR(UIM9qHGjxy#7&2j%U+<-}K1zLWwt zh_?ba!h1F4oxn|8->lpjxCI%vigy@IvVh493f!Q)Yh`>dzz*fWZQRczzFm3G`ZJp5 zy8>{sLwP@dJs7xC30vy#F_>A~H;`f#R z1U^vyn;*76D$9dD<@;c>@;@1DQGN)9lpi^w^oL*@aXWEX`6=*|vLdj8YeAYqtP(e< zBG@Q`!BtcRWLXJ%xn}wl42V&|psEI&loi1NYC~|KS}~jr!9iX)!9i+ca7}fU;O|sV za4l7OgKMk4;5w>5xUL!qu1AOxRwcv;al&eZ4nikkb;25I!1=CNX2jU&cyA$!wgk1;|N#B~V4f(d^emr42W=}GroE)4)=3R*=6Q-z<;BMlS;8ZmN z<7jYq3bBV65!{m)aCwy_>Z-xL`B${y+TcFcHve|8ch?4}3fGHN7OVA0JZoxFqFCm;yxPWjWVGiLU0xzf_FDQ7* za;BFm_Xc_C1TRz93I0JW30{u+uMmraEHDmUrLN1%WLofQv~dl20FZ*Ws_O;8je?8R z!NG?KkEla}j}ji^`f+vr;1h%=xxbD3d4$`!zJty>AKEO}ImyqRgaw3!gu5WPn{bah zG5jIwJUjI-<~gtH{zfpFzPF)eVDxQbz_~Qa1{|4ACp<#=%!r zOmB6Q;A_fK{;GEjzAmm0zCqKxsg4f5MR=Pqm>%xz@w^9upP;Ev#eyKsN?+PE_=UPz z@Jn^`;5W>gu$F^ZS<-m#2ftOv1pli{2`=aQdl3l!kMINGN5W5p6@vr zP;?JuvH8G@2<(y`m>?txI5Hggh&pHBqlCwVI`DDgC*bjgKVW5kF3q&07+0Mfx_Pp?O=*j~_48W;QJ}Pf*us z-kx|z!cJmIGai6gfct&b zYnt~{_ivuYY4_}aZJvRE1C-mE4^*Z!AH<3F2aDOwhl)3v4--oBP4Kvxg5c7z`9bx9 z=7$Im!-FkZ&5w!qnjaUBH9w(FZGKXCnirFAiF#eLT*}Wf!qbFj2>9l1evVSIpS$@5 z_4?*+YSY6Z^0g14pVKm=$|3Z%=@PP^gqeQQX%0GhP0O0{c8mibUMkyoXA$4s;wq0YBDW`d5HsL?SKbj(D{j^sBxW`d5Huy;)9 z=$Q$6W};;*1ZKNd5cHbAZv~Ql7vQKtuLatj3b}X8M9Y4XnwmW`LC;LsdZxX@C0eGC z&+M4>=c_5$k}IbpbY%;kVO7MvVrbfri&@r=C$IQ?%Gc`J9 zhK`w`W6G@6Gc)wejJ;<%+BHMR%+N8jR>$mne%Auw|HXQT7fST&6=-)VB;9*vre!~B zYIe*F{UcMQV`k`>S*v5#pU)6%$(4?G^)D-UhE@bwR&cTj%n7ql(~A| zLshLt$JFSUDXU{@bWE+(F=fSnxkk^_=$R?2V`_9vtwzVx=$INEGi7zmzU7yrATBG> zuUjC=Y^1UVyOZYLF*Q17%IcUJ9aF2)F*Q17%IcW4^2zdyzn)-AuFOw1G&-AE6Zg)h z(J@n2$Lw3)Lsh*-$JATo5o*rrnL7PIFZIldexTDabvkCw>X1@e%}Of?e)$5)zSUrNYUJKAbvkCw>XX_t{b!J@Yf-SkyoCez` z8|5XOVP$mhm^vLZXLU@SPHfh?p1f@3H~N~aV$r1OY-uc-Mys=>>1^p5oh?mgOJmVA zTAi)l{IWz~mFU+kkn#U-+GLeA*qs`=ceXSZO{3M>(sZ_TmClyNplP%^n|nUy|AysL zp7GZZY{`{nC7fZ^#JvNhv1l5t&X%ULnYFGbZ#Qq*9_+oP;=Pt-%Ev9QViCPYcpd*w zEpKq~CZ^I`?0|fQ;LQ9q&z~W1Bu~q8gy;L2=LLAYNMJ8$%S-Th+2CWm|LrAn&E&}Q zD%0!N2(L4ZeuKDn;S&@-(ef;L-zL1{sDLb}$v0{LDfybCjSv6pJ%C}f@a zByEwQHW_M@r8b#fYLlUm8ETWIHra~W6bkt?dFsjcf+{oACPQtqz0{_@e6R91{u<$R z{;uC3uH7_R%QKQp&yx9Vg0pQ(wIO32`CcH;i-dRKRl8|Q`DCq(ukt>Bjqp0}_&11a z*G8w1I+e*$nOu#^l;x9EGrj<`7YXmetX3iG&G$6#i)RSW@(y{MU}_uuuX4P*WvtBi z0?hCm-GXQ1UJ6(vpDcSTrBQd9w^AeOPTSQT!s$#%5lccioe4D%RuN-D9`%$EE)_z! zV+i3FE)*tDM7=W<6_15h_eyccTW zVXHc&?@ZMNp@2HSf@z*7&+6bQD@&>-VVbSNG+7T*7oH2@nR4MNslB?epG+6QH0Q$9 z;JGNzbErBew1Ik7Xnpne(7Nhf#)$`^!GyI*$2E6oUFnu+OB+JQ_0@S0-(4hjOB<>t zY=Z77=3Sfgydc#*O%_Ttgp8)3dyB+wX+zbFP0)SCylc~Jrl8tsL&#^!x!<6bd387v z^Jzm>%_ispn;^{+R6A`5^roN(i?o$#vLQ57)op?vDrR1rbhAda(}s}G6!dVB)-8?A zi59;{iupLDt}<~5X(q!`Mz^$~P6vCN= zBM3(l^ebwti`w^zAkA`Ltjw9ghFmwueP9@+MAcVKW&@QA+AcQ><1Ep^3JyM zg&fZ-ySyJ{=m#14K_(=p@N*{N2*QzsqX$k_TpmVS_N^n(ojAWJ{U z&=0bI&7VfsOaevql7AM{I@i!9l@u$dI7yoq|PRcID8PK~nG~qJ zA5^VXQP3=CoEk0b2h#CZ`-=#1$T*$}OQ9b~bAq7rLeMF-PCwA;2RfzJ=?6OfK&Kz* zz4U_|{XnN5==6iG(AgLmyD&4J$bES~(CG&``hiYA$k7kFWQcSA%7pL6!>I%iPx^sQ zKhW#w2XzT^ktO>sY$gRN?*|pNst_~_8mC6{{XkZoAgn|oRb=dfy(n>o;b@~YbGSy@ zD9s$M(e}!uk_f#y_#F@=-n zT;8>9evzgzI-RW_NNe_6t$j*0?N6ucy@{Crng2v3LBDE0FxtPK&UOO^#-r+!p~dP` zp(X0#&_XdjbQ@_nDGbe59}jhthO_F>V?2MD^vALPo*;e_Gwc!Q?&kSZ+-FF?7up-3 zxlt$~X)xiG!qDv`-eEDzl7`o#(4BxqH*t-N#SkY~g>EHJhO`24e`pt|Pvi@46RiRGA1piSbcVWx}S)C3#ie2IF!~E(v8xD`_%eY7#z0O-i-@#O0b;;-ZNJ1ukeZ z;i^e#)ZT21zB9OiS#C*{1x;owe%%gDW-Lu+&}6otNlCBF*i_kVsWRzMWjCr!+Ekge zRGBTQQtc0|G<$TpD!W}&nY5`g>8i?-Ci_4ytzLZt6U9nZYL+T{9IDhTRcfd*RZu0G z)NGpUu{5bUG}(hDwW22FP2A+iH;jtCQmv2Jjka8qJuaHmY?@^LUweG_%AkV&2Bun- zn$#^#E_G;<`Jef!)KO*5rb^wW%B7Ynb%!dKqDsA}%A2@0HJP(%vKLy`|5&ftO5$== zE_G3*Zd0XRp^19vW$6V`$>0Y5oQyw-+lb5FY64<&E`ZxC+N+Co4;Rcrpp|AKO!mD}c z8y@_Pv~Rh`t9j^q_36<6I8OUV(G>cL`xWXlt+-EURg@{MI2vu`#FW-XwD^NiTO(pj zYgFB}byc3@jJ!3jKHIt)*BxAUsuNpR=Y9?Kxz;t+=Uaa#e68zq{!i;rb^F#0#AB_) zh=&u8AjVfy>qz3Yh}TBQI$}xdx-eN!G`0>_C$tU`lUp|yO|7F4z6sAqi}9_SQUH7g zw{A{6hJ0g58>jBvx~2L;>sAzMYxTv}ZAcprpY7nc1M!ZMQtSkyogv(XhZA`)Ni1&N zRW!6t;C_4d_-xK*qcOxdB5&G(=et2ORo%OFck=C_{;8EcBdvRpwl`s4uJ;okv`$lR zZkZI25xISNfx%C3|mDUT1=cp59>&3#~nxHgEgmK_RYl<)zfjA#%-2>+T6-w)JAzHsD z-~UMeL7me2qk3^$tNM0ZoBB>$yZUZhSbeW8qQ2i2RX=E3RsFCnrhe4M9`Ux-h&#A< zNo$F*2OzG>Db~f5woWnm=Q3rp*;Q@p5a=sy>j}{|Sm30{EseqrQ9t%XBp2(8{~5dB zd=c?U+fbpl;bx-^HydpmtCQPCiN-cMSlei^q>at!ZJVp>wBeAtZ3_-8nvD>S?`f0j zr){`mZaYu?OB=`Yw9Qs;X*);#tc|@zZ5ODYw_T|IwQUY*7pY&gJqhho&^}FghHLq( z`gPlL+;H4dn|UOXuZiN0onWzn2^QySC%swMwS)JWJJowl7on zZpYti`!mAV{w(*;5kF7-CWU#6@HXKc5v;g>7vU^sXn$Y%xcvk5U+o{#M(rPQ(;MMu z>YVn^)w|mNO887oaD5Ng_i&x$`aZ7j<67hT0j?k5TIc#9t{>t$&GjQ(Khpj!eEzQ9 z-Hw}Qt`qI@@9MqQO_B%qTh|)b54Qh9O_53G`r-EPQ1?#|{{+!b2>l6RKktd~K>7gEIr%!=PI^1(?P^l;qY-pMI=mVWI@G(uorKlM z(4pSL^*vlCxxSC<`?%J)et_!-xYoITi0g;KYeB2fDkg_t7lH6Q zPGXDpUGYJfQ}4nYw;g_ym}8iT7l%1=JN&*nFZ=;?e?chkknrcw{FP^4AoI%x5td&; z^tG5B{*X4sQGEDgGW{8%Pl!KN=hfP~Yu~yX{szW>qp;tJp71}#W8r^6|8Io;AMt+> z_+JDrC(pNpzmtyx%EI3(m&@?~#F&WMphOx7jSYAmXlRId2wvs#h_9hB!pf!a4@x%t zBTRm3SS7qd%#Pq`HKH_lBLRe=&PX#tP-&zE=4dk#5{o0PVtk}c-8<4Q9*YD;Akrk% z$N;e>(j%m=hW{T!y^#(WSnX2ABr3Wis|qE;QmRN?sN`*mbW-5;V8S|{BFzvA z$KiyL^(o9y!s_r`gD{A+H7N*(R7BPi10t*eiL3*Ubt%vWq9-y;!e|5p8xoJC)Ehyt zF*O(kF=uv1MngE9IIO-D*_1+zQ?HL~3E@^sHnO!kDYA`vV`N)2H6BfEM@&H?o1rD6 zFq=a&M)`eY3-XR_@KN{=DmtJfqtyWek)0{kE|hKpF{f8Wc0k~clzu0|MDam{mquiF z3d_2U$esw=3n5H8Bm3}tU-ItP;E(J|Jef()l!icrL(C#mg(t7!Y2uB@p=k0jXl9nQ zEzMzIwcB)r;(9BxKZFO6@j%fSIS7><48udzJtBuU1S7K=nj*(g7|!~R97i5jyF^Z) zP$v?fM4?!$5;=lG9jUH}9EH%Mp*e*#7OzCkRi{KQ$bi5kSG zL3p}4KXQhe$cHo4Ya$$*6**gdJ~ErMbJQgfKG{dkBhUHdzkvMJnY;1M!Z(u-dEShF zi+Kj--7wFifv>-kX5T!;BmnCmdl z!MrPy5~Cvc`-)u4ki+9a1nfA%v0jl3@oj{8X#94<9i0ChxlVl|ay{*FgXoFeNFt|} zM&?4SL(D;ukv|Y{7#6vL_)5Z6_1bqHrHGLjFwJCxqt-FHpG` ziT?!t6M2b?mx*5?yh=t65sSP|V7YDNEf{jTY2+O=@-Fx9alME%knzZ)+%F-pfHl%X z;7=y9jOR>DBhL`-Cfoy`dx`HOW`Y}efcQZIz9S+J6U#^Vd5i~-!|(|bpG448+%I0q zf~v@oc|kuQ{73#WS*;pvA`DRHMF$d^MNhOvsL>Fil|o_vM^ptWSv;Kcflz*$}I;D4VbY1lg<3Ay~9zr;FEjmO5 zqH7?4f3qn6W>KJ%=vq88rrST0UPd|3Ejkp&8&Ru`sof~zO<+En{{$ut(M@@_8A3M@ zjnQH1P0`^LXas2+QlOCy1AZpG91z7&jE+I*7V00PW7TV;;}FgnPtmRDL|gN08=h^) zvk5%go@bot7-dI$bSE_t-I;WDP(`;TeSEJpS!golG~hqI2ueYum59{2bqLBqquXe@ zq7%iayd3_*qnw@{os8Tm6j~a!+>OMkB<@b)9wf39FS-{s3HVyd$jt0rNyY6?b8QL|+{>_&|&w`vlWRg-T^!=bim$>8fjQH39OnWSTzaLszFHqtQyxs zL~0r}vZ_^+z^Yk-Rg*BRn&^QP3ach+SVd))4e2b$HY}UyK|C`pn*^545)7L}B+2uF zVZ%NErtfni_UXHvO~N^tPlh3S9t?_BO^LD1WO8SGItELbRRbT>Vya@)lz7WJnD^1D zDKW2uw_KT4O#-VX5xIi`lp8gP>PC%W|Cv@z0;?twxd!5Lt0qy0Ra2XGJ|n2is6kHQ zUM@i3LNXMs8hhrvRg=J~Nkm!4A2n?Ex-A=K$h8fdgkji7hh>w%vPneQJP{@gdC3c$}JstLqzt? z(&?X&8ZxAdIhC+1m;~0&60Ds>-r6~mS{c^PQK-+|;;B2o&1jLucXl7Fo`j7-zvxRw z3t$pf&l0SjglYBgU*9*Yr+@TYqs?uQDJv`+)VmY*fSYBrIYeV1an z!VFuTFY~3SB&uQcR25X+>S41{bSiWu17}WjFDkmXkR=O;c|demG8IfCa~kd>bhCP# zdEBfXXC7;YEp1j$p-n2Z@e4MI;s2xDdabJ7U!+N-OPl+IL#0?Od3E+;^(0-a zo?^3<@vvJxC8I|g-*S?c)st^a%j(Hu^>kzPboasPNn-VMWA!90t0!B{>M0pLtp6M@L-Bt{S48}{HL|1F0(eE+N-*Fw~`dP+u* zbbQN6V)b-m^&~B;CtJnp$zt_n99B;TtEU^QCxg|Kt!ed?j2`KEL6!rrZ`;m&xqGDxMPs!+!Kl9s82CFB7 z)sw;M$<}T4lnfGC&*zt)E2M@Dqy5c~NEyrONn-VMWA!90t0&uw)l+wVo6%ByWk+TG z-+Gd+4EjJ{vU;f8##C|?>%T0kC)-D>r^ujB^jp(MwxO?-X4umDo>OCrT}jmYH=xZC zGzLNLmXfUy`2VqeRH`+_wh@)l)UtXqSUuUAGi=HBdq<|qZ$FdBvn!0sEh8tLo7LmY zQ!&Gq(W>hGRhk6*&#?2V7J{!=RX@K~bf!YT=tGkLyIPiL$?Ewvn?$;Oe%p@^j?)O! zsr?MT+wITFx6-#B4XdYzDY_PZiIs6L^XwHueGAwsXl0(bcdJLk>gmDi(Xe__;lCod zu!61fTaRX0J(^|p)H(w~8izpS&wy~TdNiz_9;_ZM{2v7V7s1O3<==W1*06dOV)e9O z^(-{4o`z86ryl12hB~o&G()9WEO~WCLafoLzJg72v3iQCE#u*C^%zEvmN$B&)s~SV zW?N$Q^kDV$^ug-UuzGs1dbG$$3cV2%*Nq8vE?|@93O02iR!<97&%($M)I_JMVf7Si z>ga&=SUnn6PY<7Zw8)+mb}vhTDM@ z2#3)w-+EFQ5Sqj4(XbzSuzEDCo>WAmR>mSWw{JZqtEXi2$ovX62rb4X%LImQjQei& z)Z{J8O5OJlNi~@}c$ci6lF=iLb$$J@dNiya4XY>RuzIvQtR4-+MZ@SxMY?3!3O20{ ztH(y{LOWkw7(Lopz(zkXtsX6sMUZjNa%-%fh52j45;F42V&=Tnqha-ESUstgZ1rg6 zR!`pO(J*>6iPe)@$ySf%V)f*OxyWMuUw@X(l|C$03j2Y!{ShtBqGDC7o|4gHjQD_#O~dNZuzEDCo>V`qo{~W#tFLNXc|vN)ke1b>VfFN2^=Q#mc>^9vt>T30-+JoK zZ!=nouWa*E52GQZ%DJv9+}QDETji$p!lW)9HtR>j`su;?(W0A3YCD?$d?putSm|bC z&qp1>$zlC;MUR8d*uPV0{pgnUqg&Qb?St)Pb?ZmR z`dNzgqhtMaMUO||a)g&#KZ|NuKZ~$_TCsi>S=LWm^aOY~w(m$oomfA*p;9cDygGR= zch#_dbQkNVsM<0f)vX`h`s5??ZHe`hZ%eG7rC2{p`(XX(SU*d#esrv#F07wi^h9<) z)M@=hwvopE9d!}bPb=2XBCMab=t-!Fj#cHGPqC(s4p@)%qhtLn#rn~)e!8%Ja#49Q zrLDvIi5k0H%J=ZN7NoBhkc=Fcw}5mkpru$qIu=kD7EmsFD#NdGwObBDMR!<0I)=(p zEFhivehv$$D|#B0s?P!f|2Hk5B4e8cdL0&!js>J+0p+CQyN_On1ym$GK0o9$~X1o+%*@gvVOk5(8zuG!1AiXA&I(gVEARP;6DHf2< z_a6!{n%XkK=z|4RWY8!2t&y`08ZKEtvMY)M(&&ygr`t{$P@pLk2rJ3>{!>N0zedcKUQdD>iHBpUm$!p)u5VeCj3Zv|I(-737;F zze=vUwUf52oqSW8>&nym6otV+GV8u!4i16<5^$xUnbl`&qAL7B#&T!ulJw){af*0Y8%dKFuKuNH4a z@hvE$?Dvn}%y2M zH|gk1gw(s2r?jfA^nItgabwDmzpxO?xJhH&EW@}-n~U10l(m&dR@uu_mB5+bW|$OT zWPRAmBhx>VLE2{3q_Jw2Vb!E92L_G3FKUxz9t`@y0Q${Q=NN<*Z2;b&g)b+QNZ*y` z_N80){L<<1z=a_8f*2EfQJoX}le!{?*QyvkgW?l}FQ%y5$5ftqdFE3ekNJrM9=tPQ3QHbgM(a{%}be4I@ zlC@l9#b!_-+^5A3q(BEzyMu`jp>`ZD7CVgE&4lscFtx$$u>*kdEN@w{W7X?p$BCZU z@#>`52@Ss3iRz6p9GAvUMti5A;aQ5jJaz=CJrYJoq1vN)cnl94=wPSf1q%;Yv9m}! z8^QJ-KHIEKzLy)dI}Ht-P7gl=4V+1zI0t(E+G7_&H-~~>M0_y?Pmq@6TBGnO=+5Q+ zA3F~r=QsFc7gV~=ip^!1=;DpoB|?c^3NapzVwb_7qIuL*zOB0`K)SjIt=JzLg0agR znqt=g?czZzCYe^nu7%-sl=6Dw8z|+Cq+LM?uVnnP**ta?1-KeQrfRX9$#WZd@!=G^ zo%=h~&tvn|{bQUN01Th^8x^~S^jmSi#X_W51|9{({7l?$p-uLN&ntM-l59LLbEow) zgqWMq%Z0dZK)1<|eXWTJp_dDBMbB+QYRJI;cTtzQQmI^s>msH4gjC9i<<$8xTs6kn z|Ggx(kc&mM**xe2B*gZ6f<>@STFB$KnE%{0kyPqE0&pv>_ECMsJ1!_0)G6i|k z5?E{}1ZG!~z!U;C1oj|MD+sjY6`D+H2uzg(s&juv4RZ+85x5kAxG`H+{(%fm}r z?0(5t3fpIv*fNF(uF_&p(;Uwba4HtVsaOoBVX?)8CF&C~{C&lGXsV?QIhw=n@hoQe z1jC+);nFMiIN=FspCmlR^#gHr`B@B%7t#yrI-nAO{ z8j^^U4aP3j&#J%d{aUTWxfq%&#so_ub@D*Y)`%CA<>Y_E?|8B$s5n@cI z`JazBsc*ywAZ(zzBHj%17InXPNZl>oN*oZrco0u$hFdnvB^%SR`e~(uINoNuV~e-L zBuoLA(Z-o#$D`DcnQVMj1jaBhn8DU^%T_NR*(;+sLRX`MPH0#yz6J#ugcjCB3pk;R zuf;~PUDPLl;^)Mf@5h<%$5$6>eC--E>!|Z>bTZKg!mN!j(+9egjZTYqsB=pNWs+F6 zcI&7)8=($iSA1PDDqq9(pc{-<#-f!W)P8-mG87GLV7gYQsezGbU?XUEfmRMv6Y=2? zkAQf?x`?wy;$dp0kF+Tpt!B{5_z2WdpWvL0ST_Zu5&Xa#AClsu(8wleVl;hVQ#z>O z-=UDc8R?soK8Eyi=XUJ>a?e!pg)1+hoKeLWE|)wN>&xO>P|&dyXdDIFlJ9@cKKWA0E~ zq6Ec38-Z68p{o+dxQ`R}0>#Pj$9Oq3u{eA)g7=tET*89l67@iFOg74(xOh9lMh|$y!g4S?5TOTApo59?upDV6ST0cyEGJ929K(|2GqtBQZ&05tr*LEC>B%&{s51Z?K#+J=;5R zx%e)$`9#|MT9{r(Nv|gcnv2sH3ea3(b!-WqguxaNvLL0!;j`Dl}){e`Ox;e}<4gKy$^4$h@lhP?J7Db44L$ zbKrKlvN=FM%i05V0V2%-M0y+$X^sO#DmF_DpYA2l%7Ep{h1FZ3n5=@!^$yGRQ(%q} zVT0wQqlN`s&IOk1x4>GkoUDS&^$N=+faMag=PA@;LOCo~;qTK0mP^E*g#IZBF(=qK zaJdSfpVb*ur#E3a-kKG#95jVFgfzbA<#9O@U$c z6ks{m6A#LvIq5v{0BkPr7}V|;v;>y{Dw)t+0%$G~dl!L|5mmegnUi-1|feVxL|ZuptGv0nnBJg z1yzwFf6mbhc|m!Yjeg(`(ItTBmH^QuOq7iZmLR$W5S;|y>nE`Zv*rKuEr>2rCq!q= zxDAL7TF!s&D{%>0qu^nfFv|s^OPCNHX?=m{Bww+O>GIEFv^Ml5h%QkE(X9jjYA{_K z|DRO}OGFNApq4PT21MsdCru!69km8V=SorTuIvtL6BwwrnnG$LVYkoki$E=MK>&Z4g}+h%N&}*9}CM0iw&sWSom$FghSQ z90})_%i&142+<`ih%VVrh%O66mz2z2y20p@4va1fMwhHyGDl&nLv$G+x@HTa%T$5r zGB$`V3q&W4Wpmv?YDo*D%T{7^6%bvS(_ssu%UTd!vKl{7wqzwlC+$n;XpelSu(fS| z=^WllAqJwW+aa+9(Pe??l0bCbKy*n9qRZMKx@1K5Y3UpVJeejq1vSqiE{Eu{Ky(=g zM3)7kqnFz%G~2990iu)cOXm=DA%t@vyoflzbdIzn*Zqg+vOsjs=8>iL?&H!qAiAst z(ItWCx`F7D7DSh=0nufF=rTZb-9U7i_#|VIUFjiqx4sl@2YClMw@mj$9L zT zg~m$8H~B_TbqQS&6Rb<1LmvBo9z;mtIMf;fT_Cy)5M2g{E(=7L?H@$P`#)+st(0YS znF@^VE7HCue1nj`5mpXFXUdV~>-ByaK{ZywNtV$i!RWfd=#nlg;gY>9qpMA8!fg5f zd<$huIv_e(Z5dtC!su!dSEaQdZE4SXR5TCo8Tj82CV~~~_iAXOcZjY=rC3u~g7@^e%ma`1WpoJMi~`v( zIu~rfnWw@*0r)`{7%yXk@v;_-S4L}`|LTU(m1U{|(Pe??GQB`_jyx6EfHdGYXC?nx`jY>Ee2F4W1Ew)xSXyb6dMP_{0>*rOUvm} z)^fTYpgPTh>Qb>OQWX|rvcSTSB6I0R$_H!P+evF(kEh^m|)NX z)z#@mU$SX5zsr@H9Ei|^Q1QXU=5o4J>@d=2!uW8Q_6@2_0o5%8s%rtNTWCUc@X2p- zh37G(8LR1JahEHJXCv6&+h?1#DfIX%P+bbBP6Mjz0jkq1s4fLmr^PgQrVx5=_0@DT zGL>FhvC9?0%V01Orf%)scc?C9L3J8XT@O&5W@f?t-633+i6{(y0S`C$dHzg|B6}^98s2U zLM?971ggtMth1tl>S_zAE(8CMXW+-LTu2e`K}argK1;ETt&$EQ4ydlGwt9i;Wd7u9 zm*sT*s!?%UZQW2E>%Yxywf$3JwQaR^EZ;LLD6QUI(J`vD*~*6Mq_xXc1FO@(>QZ2J zDF;?paioF^)TRN|X+U);pt_U;s;f9v!A8&eFLRr0uMDi^bPG+Wjg4!Tn(tKv znv)50F2QLyvDXN%^NP*GdgLuZb)__*y7*MX|JPx>c-{x)D(!OB!0I%xx)fMls)*I~ z52~v;dZBD_n>3fxX<&64SX~ONE>#Vyb3kX+kh6*t5y}KQNFRqP6Mjbfa+2}b*bK=I{ZIGz9M{0V4G~@Z^TTcBL4uC z{ElnRhGUi6N)QAuH#yQN$XrgBs+W>Y!lqTnF%1@E*B2ggeAL0j2Dzoc?((x<+E;4&BwDv!FZ6{&z01t3_CSi5*9FR4r%;^DEl{ zD_ONvov79h*jjYGV+IA8(%4j7uF~GHyPASA+e`3Tm1o+M^Z)k3OX}YIS?yEUst2P@5SCx2 zhp@fyh`JR>nNxuK>bexron}CHGQK6X-^z7ePcf63rvke(pgU(CH_X79#}3^|YwKMF zBRA}>&}l0BOl|0{1|94Ft3v3tI@&sPw9=3&hwu6_3?)E<1;N!QWsQyKwF+6sFto4# z{Vj$e<9`S}F%Q507Q@ik|2ZZ6zER3pu1drPx4K}p5(j{3%ZjP9_hgDY7&>QyE5obw?TI~ zpgSGtZYj{64s@3Ty3;M_t}DKmadb<;DV-Fv!yk%<@JHf3mf3N3OCG!9?3N;Sr(4*a zZee#_@x7@<6{mDA&|MDbP6xVM3UsF%&|Q2V=trwvKzF$q-+y!$>~4{P-BmiKQx}2T zwOUK;7TI9Cw)nm+^+8PUo6-z2W+PU+bspQ(=FI87oSEAXTtYzc-DmN zq;PnrqfJgm&8MK|S;YAzc6^?j4#T5)b_{9dyI^y`cI7>Nwpp1%Z?6K|<$&$@F8SfP!9$Bl$|`E(dg{1KlkJy3-xdUGZ2KKrfjyush?xm{^7vL;cuY znE(fRVi!=(zXH0$|5L#go(p!@Um;bu+g9whl{e9;Y^v%*O)A#%)mX|`Cc_ThNgM}O zRaY~J9bxu?)oCoE)S1*?0$B-#H$0l>#xAdWqq>b^RKuJ)9Def z7YB7Z(47u+mjk-XIiS0Wvw&>STON6nc&O9C?sTxb9N1mXf!$S{2jpZ>54{E5EwarS zCdUtC$iHfgf7@gtKaqHiLcGpv*2M0*@@eKy*kT$UaPtgYpgSGtP6xWn0o~<#hwfPa z6L}e|=M}=MU^K50zfO3QSL=t24AVaF4|9~bQI z=LvMklg@R0F4&z8cBg~g<-qQ8Htg=_KzF(Y-GTp>yw&MocRJWz4(u-1J9bwEQY%N) z3WBQ0kt6N<$&&_<+VMZ95M#bjLfm9ybeMWmbhzk_ zj$jGhhPcuj*)X6VjNJLG&9E#%ce(}Lb;S>(AbHGy|9^K6cC`p=Vg@w?x?l!2`@a@p z_1&@Y8U-x@6y?tAY+8}PZ{=#~9W~hn7m~ zjC2cc=!(xY4jDCJvmDr+9zUFdjB!7!324ok#|<-Z=5d4WN_nIy%x&#Y4t!6K&!Rw^ zQXu27NTZ-zP>8XlA3^$-XwDtFbL4S_?(%tLi4ncC!h4-l7%-jPd!30HIE7VU24Kw9 znoe5d@V6R<%>NuKV5^msf>Qg^kSc@G*}_|$u0&Hg3}v;q)2}oPUB-Ve5PJ2tG=^|r zhauyCD7|>*Z#4`#|Iaq&fBj)7E5`FLHw?=mI?)J3mzH33%fRT;CPqhM>EMX8`_ej- z(3Q@82W+|o%|RPMRuq}5632vW1e;6Ou>+Qa#`4e{2aOe>xwHk%rTe!7mcopb2;Yd( zY)o9{rH+TgIhv_*S>5s)%j%W`&$V0d-0~7U$0Ehzxe@B}5d3Z#lK@2>%jN_SC=7D9h zbdp(}Czh?;1IyU|+ou!G9H*a|AS6w8AgVnGwI57uo{-UK+vl6E20}*UIQ9C-mK7l6 z`GAni0U_G~A(uP$`JN95xx5^NqyT3l*glkJ1M3;>Z4Bq?CuB5AP{=fk2bTdtrcDqM zW=XF5z0Vi=%b>5)2^|2W9Md}hNzXQ2@udMEmjOVgO#l)>)+rfI0J0avBn@Jc#-)E_ zY_a60+<92V0b?$RM;gQ=jZgnZeEK&!5R-~S#%j{bDhw>hByFM~yg*p(lwZa4Dgs|b zcwxh0eq$nOuRGFA#H5t3%Em;APyaNKNgAL2jqxck>Vxwz7sRCEATk#KBMoAb#;t#2 ze6sQW@4xdfV`E~)VPw4sbjUOCpS~R?P$AF-F-e1%r19_H82c}wmhUjBfd72S{!Nw8 zK)}0wlojpHL&;d}ly+I|lm;-Fa9V$YdFi zN!r?&*l2SembNw~_K(&?On6C21epH)(~g~q)ixKVEuhU+VB3D}_0VJaq>d;pQ8 zO^AfVzBmud`wp`h^^=dpv3R2mB1so_CK{`oN|sBy%t~4hnvyx4uGl>{isze9siF@l zPC&~WucVJ9z2w$OHeyhw%Uq`ass-Zx?wR>*~B3fk@I*FmDY2YIg)jJLdpAig?XZ5OWf&IXI?x*h-KXKZM?H~ zj|i{F@ZFV_QL^%^^x)# z>nN?~`RrEo3u|x2$SJ7(RGeFu^DH&r1fI(h(*#GyknI-%JyDuBn{=&bMD{ z6N0_=j&>?+LSQ)caspb%M4D@t@?lqW=Ue*PW;Gc@&t>yL@565*!*5dg@Iy!+kMd%K zNt^c**P%F(p*X30DE8xnW!2pj#`j;dohLFbCl$wKepn)?*4bTdK7xDwGD`F4$SDj_ zng8yOpgx@0rFL~3tv=Cl4DEb8!}A0&rsG7ePZEneP8Pn7J$bg5IV=L2i4Rg&bQ}zWLttcQvJXu5g~@&}ndZi% zA3P4FAct`%rTn-0IH#V^>EHy!j-$jFVUOPCr{=hvyRDs!$};tLGV)JXlW43PjU~}o7L6q+0ZNu|iwxSmg(xPBY8zC)gO$@5+vd8CyoFYJAoe1NbI)j848F#8Bb zAH(R+CZoFZe8TZM{7ZIx%3tnZ_@}HWH0frc6SCtiZd^-U%2X|nRiFfgUP7T0(b3Sj z7rI&=nOCEw>I|jsrqo$VopC93)+%*|0%fZdy4O5bp)(Y^yW>N?|5EB~l~P-oYUKF@ z*9-htQ0Nqe);d1p|DvpakZ!74qtGd{(Bvuf51H>oy<{qM#`h8M0m44SWzT46K7vtY z|L8r>C#*T=bxomjl2YrGx~t-EmL`( zPQN<8Goa4t3<_Uo6VSYQCfJ-JB>ytYEhg~UrAm5aK6pVEt2+mtAnybOuqSYD2}n2u zR318J3aChjU!o|$}4~M7OOkjTueD zW)=AB(KCp12L59TuoBFBi($HRplIymGg@a0@H)hWHnz2I%{&N7cZSTi?ri0goGGi6 zCauKIk#wkygxa~WSll^E^mJ~bKHWK5UB?i_vqX(&$r{fz^O-ugoTr+Cr*1rxog1rN zWe-tL=T7QbojZ#$oj@s_lhnsMcO{-o!T2!Uxf|D0h3MQ}y|{B1^>z?#Pv=;5eCIfj z6b`H9OZpu9m-Nmp$-9+$ag}`R|Ja0~G8*Pq#?Gy&{WjvU&TSDip0FK4C-8iG3bX^v zc0_PJdGeKDGy&C6i6vAbVXH*Ktc0wnh3lzxg~HitQ8S;dfC(y*C{=<2*()KHyvIYDqRg$gOC{X>e-|>^YLTQCNn0(lWwkIXQ9X}Yi4>L4 zs6-Ey&^jm6DW?c&bSSM#EnGbw6$)o-ikkUsmC&e!*0~+Me*(g{C*DC;bSRfhRvxn! zIclL(i>1^;rxsnE>}sPDdX-AJ?)@rOLY9V4&5X8M=+r{*+ykK#5Wc;db7_jId2CwC zFMN^Cl`qATl?vv%LZ*<9-?#+WzL z5-w>;mo%*tAlsy+eN9@u^K>+o=ZCh=QQznU^6NZT-LLaJbw%g-od4Si0^WHc33Jrl ztPF`#2G{3F^Et0;KH0d?YbAOLash=Z=dTx^OWf;pUPK8C8Rk+todR`cgGchBZ2K4TCzd0Xs4CIy0t0)470a z4!Dz@i>Sd}2)so!blyqEYxpA82GNydFo>?DK-cjfa6K_6Aa>qJ+D+uYnVHXU(yoH$ zYH0gMC-a2S^%3YS;cYOVN8xTq;2j8@k07Iv2jifL#U~lY#o}h z(HP_ZeroEXP8ZGOZ9O!TLNi+DBF45ca@_k&%BC3&&Geud&C*P&6K`6bH#0M4|F7nv zn)-+xv<}Ufg}n{_^C;;32)u*f=rgiEL@t`i8;Mq|{{$l2Lj<9ZC<~%&2$4gV?FbMx zP8$HqdVq=m%DRBK|DWE`!AYlUWf@T=VVG_qoipfk28fJ~Zn4(ubR`TmJV4O-fD8Z` zAwVvj?3f3m+vyykwTXS&0FmJ#DuKx8Sm4M)P6x-Gu90Ox)##)mT*##rATmK@f@s)7 zGzlWJqeshh?Cj9_Mw%cpLx>dJJop->W&C%E14O2WXc9ywh*W(C$DOW`Wkj{cA6q1#8Ft(7%KH0Mdcb9mFX1PUsGX{#}&48`?vl zUDXh+42Tc)1oN<|V>O1nhn)SLJJ{o~;|Nc1*@$Ln1AsaJCpwN{>^PS3#0ALyKh+UJ zcp!ugA#8v)Fj@!T1OW98Ss!6QT#YtBXoIi_!aNA=`b{YE5`@_X5$5aC1_-ktEP^mw zrwQfCj>93UM;stDKv)7{4unPrdp_6hq|hA*o!f*Q9}In@ld}Fh=+X6vp$!lk7+nIP z(ZLSb9q)y=dMB+;E6Y7PKxl$+5`+a1njjqR;E`;NPFet==^|u177z|c5k>%3(8>zp z0HF!ONf4SK9PVJhh8hU#(+1;43kF+WpOf_ljxcdDZD6p4!BZG))#-FjpYv#W|6i3@ zG9aDBAapkQIk@p$j?W`sL;h9D&evvi=o~9LUC}WPoXd569{C#bfR1b3m1lc&dFbp8 zc^=p58V&+N3SC0OBg{c)ATS4=5u!6ZI@6;oKxaZ%fX)ojnH?8n< zi!qKe87s^t5E=<(W<}Xe-0|An1rzyn@ItHO9?~eo_cz2{9b+65^>ln4nNw-NIyYD@@nIbX`@Z`aF&Sd1k-@cgD`~ZKT^tcc7F9ULAKK|8CB& zcgFvQiJ|pT(!RWA1Eubv908^7p|CT4}qNMkk@SkQ<=vxAV8^u zQU|3D%Jm+~2~aAds?f?r;s9kHlr|`B59KH*Z4YH0lzC9*L75Ms%z`o-LODuPW~=b{ z?O&aVmyIEmSx{y{nZ@wDhjJ8@N7>O zAp{l(ED%^7cfhX(lnnr|+&#88KOMv#qqU<5wv7H41)%;HMcfpJd2<2Eo7eg#M2DXQ^+L zu59RY3_<}Qy$T?CWyen)LLZS{8&LzazM;?tfb?WQ(m`H_FhGh}eO;D}}8yY z3L<;QK%WcI8=b2F5;Z8YXAJa(P8nEa!Z6%<5c~QB21PcE={!x_+WBd5dFSb*&xjj4 zKP#^9JWJfwc{b?JAwNruaIAAY!tp4_HpinJk8x~pJjU@j$0o<)ofirzJ1-K?c3v#5 z?7UoS>14rh=as4HomYvYI!h><6gPBEi6cAjPra%00gfM~{4vTOpY~MeOSt=GZC2;M zIp^;iI$zO>3m0oUEbP;ETsWX@UAUCsXH0EkB~l! z;8PIzG195p>V;pT?hMMltgT#lCiz#85idK-EBi9>|H5-%JQu?AU|vIBt}F|21l)*$ zH;Ky^+R)xizD}FH@D^>>!ds_3weU91Z>RoF^1DcPlSV*&4`r-$UO0x#d&&8e+lAkv z?%U$1g-?^7L6&?`+_3OpRJ=sN%hPV|njzlPHB)Qpnyqp^KHahFWNlX0M@Xk=8@oQH z6}wK=wsw7-<4LZP29gxoYl2ST;H{srunuuy=x0;LYvW5 zq$x|&p6Z&^wscLA?x*}gae3EwQkkyrLMwkJ)^t6Ipl4Ehcl}vg+4UFFUn%<=>F+Q+ zPx)5re@^-ZirA2*>z4@p6^8$YvZp!!KIx%pmv;S#{KwPsU5}C;h}kSPvK-FnSd*G64-t4~g5menjr0;XDxyq40fw6rsGSW5>2515U0yH*gY!6Mo5=~VwMgo`|UfW`!k37BEP6dDG@^>0<8VbJ(12F)y=Y1??_z~3r1xCZWyJalxobN?4n z6t!+ucOp|Ao;a9!Vm)5a6TKjn8$bk6oN;Hq-Kpt?ZQv;b>c9iMMVGii?{1GFVpT(^ zjRG%tObzkG!ORnRykN(?Aft+AKon=(nJ-ssd!czA-wWLT;f6ejvQ2uSF`hV>c_N1w zjBehPyPcc&zwt}L=?l38FBtQG;xRcq6<5SI@ZbgMUJ|NZb9li}UI;0wc11M9Q|W~Q zUNG^39QLpAxS|=Nkl+OqF9bZ5UTBhs|9|tZafPUW7fjC!fugu^eg|^>7_<;t@cM|IS2F4^fiq z>hUz>1?Tz?W}|KM!YXlj_kpB?Nbe*aOnMjT-K0ZEhmsB>9Zq@={q4P4vHJ*dLidrJ z^Z#F$cfXIq_hZO0;_z;kUUYvz+|_*?=f`t=0_lSse@GMECz1zrI&>o*oerJe{Xyn~ zN;(_5QIF1s&W0{urjsFo283fCp#h-*VXjOVqBEfz_vlRMOy~+e9pQNQDF9+ai|&tW z6WyNx;3vsHMZ2FyI-UB@Q2$xVKj+NaMU({xFp8?V@YmauH3EHn{ z)4F*D+kG}3ISYhmgZM0l>a#&~76zV;!DnH>*%)*d9q(-BcV5YMXGw;*n`510o#T5r z&T^dP_!}G>92?z+6!&ssa$-_(U-tzlx)A1zNEdT_0SYffz(u5sIlchJ7b4^$(#0HK zfB_dG=pxd^9AAJT7b5E-(#0HK0jMj*k=<8`8@jL7R(F4W+Ed-viYvRX` zQLO8}i2@sb{e*yTxd)_#yctoc|cQN1=P1vM01u_fIhFrx^G%>Ir1K z30AuaR=a;e`X%XC)c=|$<^4kU)0{tpVZVc)cM9Fy|KHI4dk+2}PU!w4=}##A3mxOH zl>LqT@1*BR|KR+eTnW@d}nVstDdA+u}=MCb@o}D?~h3mg(SFxyPH-yX)>v~$r+q5k` z?FgF-;XEzXGhaKiXMwh{r$a0CbdtXnfybua%EN_;o=a12?YS)Vj-IcjoQDk)J$cS= zPp#^?gX23nzAJS=&)uAlkl#Z-3hg&IF4M?bL_bEzqX>Bnqr%6JQ~m_yKcW1mr1<%B z-fMVX!S@ix_xwSd-t$MXspn6e{~1sGMcmT!4ClWk{_pu61+-1i(^NhyUg>!*HLsE> z)!y?L$~~r@-*LVzJUrOw`5U@;u+j6J*xd6x-+zTHTZd(v10^&^B|~j`7dfwUcr70S zF#&QtgnRxyR%n-v%C@g7o|iz5uxcWTHnZ%gV^hmO03i8LH7M zNK5~aCtJ+*KHO2E+c>e}p6uGBE$TD(I ziQDG27%J%%@|^SfzK3TCUT-e}!U!QR0mAT*=Rj^K5WN3UOd>~ncuYQWkI8NG5L1IZ zJYE5Lu7{^9s<(%A0MzO1@)?vW%bYf^&k&|p$P3Q9eLxKN{6otCViM$L2>B%PO%Hhi zUJi@buVE)S1lKwbd(u#5bk5yQ$&=;)A+We)O285I3*7}uW`R)EAG z<)%Pyg*xvPN-S@{O5h>>$7R)-{+c?75vwKIdsFZ1`4i=T_S*0n&VS3f3#2*v4(TkH zVw~>n5NGsuk}uS@^zxse&hXkhC)M8DI_=V4J`^Zl)4jV-yR=qaZ~L@MS(LD{cdl61 zI}hIZN?x^c$?6w(xbzIr0|Uf*Wq`OnYJj-i83C)+^|p)Koi#q;jbgX)T^2E9Pp8&Q`S!f$j z^}d_VzKZ$3_W*k6A>zp1eW}=w9`980K9@>WcVL~m{pjfq&q46KlXNh0!n`%>CBj{+ z=&}2Y39Qn6X4fdnl~EHI71X&#)u>ZSCooFKD82V!Xe*7H=#|w8a236He^JCJ+hD%3@R&qw+GsoInt(cZ|wmR0*RDRY&huM&&%CN*F~QbO%tU zjH*^A9rru!SHda-tBl@5LyWcS9AgUbPGXGNdzh9%;jm{+!82wOV}d$mOsJ0k|L_@| zN~LfTV@!-OaZ#bE`hB@tRDYR5u@&)NQk`^qf1r2@#TJS!dT~pHSs7NnKFiuM7P9u9 z6WsgvvJb2?koBHN`5JLoZ%*Cn_p)A~_gt?>XG%IFnF_ zxE3ud;@0%)N+B!bSZb>jxQf3@6Q3hCvvY#G6gNaCs}lAqM7l!cO;Q0O9l;|C5tkOL z9(vCuKaYHkxF-e(8L4@_fMV2)(aP$?AkssYy31-k1tYxyB6rzsBXk}h+XJK~J!k)4 zuZ?UhAN3IBL6iki9)(%Tzfnd+^JJYnTnCM6B4`?<1yD9*sJntzdJ0BEh}~h zGwmt`Vk zs!l7pXAcvD$iz~2zV?>LmKBVL40V^#HbUo4-)A$PoXdE^UwvTchH_tW`jJGr6<7*U z4dO5@hFYOMqUL*Ffq%WbD`jiY$@0Kp_1?+=vYvT7&q!6^_%?>)Te$?+GcDiFwO-&@ zm1QX_QZ`Ci)+;k8D^WH^ncDL6a5mD!eS=J)?Kb8zG%#|M##NNbd$N!EdTt z?v6Z*0-a&h8TELq);pG(=R7*^y%(BsX8_@Ly$%hYS>s*-_pyT38wty6hn*479|fJE zS=J)*t!4D{J~jx9rA!&3W31lGo)DGB)~AtJtB0&r9}jqIwXsxpQbRO>vHmv$A!GBN zv004GVr-H=P&&Ylq7NPRLplYt>*=hsGIb zJY^OJSzJ9Wl^wEzMph7EkQHiUcVGz_WMPmRRDw26rt!VUCF@@6T$Vpqvu$u0JJ-K+ zt+R`P>%OgAe@}6!(iWmW5+LZSwZqL(fU)P3WeXM+{>T>oK$kjo4ul=@$&8;d%1Wut;i_2+6DM``pj zWWx$yr!)V%&+cjwc{CvdOpH@8{V%vYov+%;pVv5-bF8l7(tJ`~nofU`q23<7enUiM znvfDJ)MSy%&%Jzu{-o{;UJ=(U(!|w^rio39gjlmE#d!6Ivk@MGa9}v(Kp~?F7JBT83vd|PmG$m+^5KRdh1DaAmBgG^{W{7AKA`_y?*YlSw zi{34cU37?eV9}xCu|xTyzQPQf=#^%Sd0- zCKj<`cF`5unTy!4YSC5NtVI{X%aYqg7ejv!G^5(;MUtD0MJy0rbT5_T2)$36wrGPk zd(n3x{2oNC?OgN_Cl>ML(hL8EBuJcJrd&lK&2+&uTLlJqP{o zwV8|e)iR6s)3z+$U)yQ%JG9i|RpRQ!hln+cxd~a!r~Hfg(q1lJEzU?JJOH8tA>y&h z;&*C0ZWj%YWEQ^*Iq%j=F*#CMDU0$E&5Mg4tiQxqd zH>(@Y^B*iPV7Xbt^2TU*R)pbZ4Z}^qMQQl{Bklo<%dQ23tQrP2M#D2C46jZguHK#d{Wi zgEU6EmvkF-w^PR^gNyGJw=CYkIP*>NJm-XWi}}|*WXMg6@6l#d7eJjWK%2JsE)0k= zH^=K3eV?loKCxNpl!;bv_N=~n@m*q_i?)KXAwC_16N@)8hE(&C4BVv0+@#|seK8vd zxZDJmW@4m9qx?V!5@1-c8v;Jps@}=W+!Z4!&!V+G} zHQ*&9<|P9!834_>GD2RGmDjA>9}wVormDf z2q*DUp#d+Mi|^$7|Io-};wBR}6>N7XZJC4%(m~UL2E>Kyk_oLKD8fR>b?@6uX4&Ph-ao?M) zwAG8hK^l|%+)D}unCNWf2&g*gl!b(4#3rnI{M`RzMI8Z&Ggp#wT&kv9brqG-S4>_3 zuMDA2V%8UL_2+_^>%vC6^L%syQ^>1KM7{wsd{Z-pL=!4lz zxh`Qw3p3Z`weg%cDV6V#5_qM$MT*X93VD^8EkTGgg@a_%IT$SWPU$C(XW=gm|#T&Fx2o#_{Z}O_^IcFZZMf$U!LSAJSOESPk9?XE-#xJ7+5@*6B--=&f(I*xa|1 zSl73^Sku=|nyansnS-FXPLwDo(Umv>`_qAeu8|@vkI!qL&@jNu)du4Z_({J>?xnjN7Z*-q#I^{D+ zGpU zdd-O%dn42Tvtm!L+yTqg7*OmhBi<#1 zR&|_86mJY6RsE(Rnz%06_ZliIH<8~Yy8(6%sTJc@zmdMxHHgX{D*1h2cVWon@SLG3<0IzNXGoSL=H^_%56}Vpi3HkF^j@Pev|Bm0dq*LSg$&cZ*(mh&*(|N z59}^X`i)7yDX4zK^M9XcI>$3eGpU?KiVirY*KsE4I3@#*Nxv!3ZwkHvs^2tB=jxTO z6O;7V|9{1vUg;vc z*8iJgPp|Z5ze>gYF`N=tj!{SwC^i!zEj`X+N?g4JLqBVpe?P~cY(IG??Up6$S)>0xl0=6 zE-AS#+b4&a3X>}h7;{zXOzH}Wb=RZ#2GWhLrYqgd6qne%Vaj^8G20nr4hM4BW`0cHwt_iG!M>>!R> zvZJ=slGkagmhjgtOJ-`RC9|}dOLmgl>?N<~;0;=_XGlA93B7p9oM}%jX%$B=X%i1D z*v_ZQ&e4WrQ6ptw{*Aw$sji7$FC!SV|hyrY%WR@n-TN@(e~T=XfvD-qgQITe)Np?a?KBa=wiG zV6C|1T?jaY{7~o*BOT81YSMcE@?Yfd)moOkn{=cmmK;U>`$$KV-jD2Kw5^T-a>=m} zjETFJ+)El4o0i;1zJdIk4wg(2YVj3Y`s|9D{HS!V-jI5SAbugRlhQ7=&XG8W4^{HxAt-bmP!X zLN^ZGBy{7@jYDTHnZ(E`jGe@YDU6v!$rQ>akuim=Nob~^eIA;BK>JVD|1Eie^gP7> zfa#y47f8>;^beT-NqT|wJk0+<$UjLhke){f|8~#0$+@|NryfgQ5qI@#Vom=va#lI@ zr^s68>7ykZj3sE zI+MC_>P+g!sWYh?r_Su3iQ-upFcT%SP&N~JvyeLz-dV_)3EeE{b|(Js-v#1bNxPAF z7C@m+u2Vij`3U7Blw~Q)QZ`E2C}pFR8I&26jZrp6*%)OeWhQ0gl#Nq1-aikS^O3!P z)IsXxd>-;UN%Msqp<;xJ5el;uW+@z{Y?QK5$_&a3%El-gqil>alQNUCamvOi8}DC) z;Kc~;BVQsmaX!Mi&iM%E6P%B7ZgW1$d6Dxm&W-*)*8fvbqF|f?6M}KhC;RtA&@u!L zlJ-Q%GK3A1_C&xk1Pzk*gm)Q221$Fuw+#M4(q8cF4gU)AeaKgm?*;GP$XP+Y5BW;+ zy#OosM&Jq#_90(Mz8AvwM(_&qeaKgm?}gC4QLuu1AM%x~@pHb8alRe(R<`z^%4hW~ zTJ1kc+|vKwq?5Jj{U1U3M^h*Fe*goH{ikvubub_yM8T|2xZP9qU3$Ccip~8W!&1ix2Z3*S z>LWgy5Al&fR()u&?flID?iaA$65Re%`9{CejU%2Lb=)}O88Z^Nk>$C{3+_iq{T~+V zV_uB%D=#|yGy0|L#_bRQf5;2&t_OJ0UE}L{aU|wN6uVw@!ALqn*o{pK@c11s`fG*p zVm`r(qn;OSyg2H4QI3Y(nD^Z1e))tO^D#G;1!P?T%8d@c*BM!eteT+-eu*WXfRG!r zUT1U{BYSQfjkys%*Nw`Us23aOmmlDocif=_IBxV;HTQpl4Fg!U>|fI#VLVXRvjNXo z|0&d+K<;19ELK(?a6h%`|G3Ec9*pxU?~Tba`X1+t<|diTydlrA1%rDTyPslto*U~w z8ACpr`eJ%2$0(?sc3Eu}coc?j@&;i6Y-7{{B(P?Dq|3yUpa^BL6n|7IL;o>MxR)$S1j>;2&)I zxkK(}d!_#SINm`1P4R61Mkc6D%!;GX)t57Y9343${o~9L_i-#YaL~M@X{p<-0qYmQ) ze0r3Rx`#=MPxtt;@QuQkhc63X5x#7|Cmn@UK1@=KS&z|xaSX;Bj0TJ)7!4TL28L4i zFiG(l9-j%{ID7^8O!y|@GvOQV|0$ku0aEuc$>Ebfr1Dp|7ko+3!pCf1Q9?C}he~*#B#;`w-KTZA&`5!Uh*U0@7`P1ajkpC08FCh2d zS0FsM&Q%o)8W(M z)8W(M(>=Z{e53GXV|=6VW#P-hC$lhSVa&pq^%xBp$6z#KjAJkwFd8r#@EPzK@EIPT z3Ewz;W{htfJ`+9@J`+9@J`+B(|7EFdY~>bu!Oq(B)`GUBm9;sN8J(qL!h2nDRood?14^Igr|WU=MB8z@Dj34lJX9 zfTOKdY#MlTYWl$5oD)P0EZ4RS?4?Z~U_0Fbw$mNxroIP09x4nhf^RY9eb6r<@27r& zcx9jio=$k!%5|WNvMRi?5$3jC5mL?2G{PNYhoD)CQvM5~jbNlf9vNYBT~et?$0HNI zl9e0qf1#W$cJa(a4bSLN&mgCZ?>`2%OMuX;AXP@Ekze5*vEJvA(YCM2 zRK+_s-YNP@R*F2{u|wX;d)~3}PBHEs8R|H8%sqKJj*WL}3aH2LBaH%8MyGlI>s#)3 z9+9uZl*m)XI|kk<`8rl|SrSKHzmZ`?$JUJU6M@zjoK||;3M9*;tkTFa2>if2XZ)vf0Q8F;-h?g?)|Z30*ab+&SM)7gyDf0L$0Afc$-r4 zgvB!s8n-FN2Bb^mpkRD=I~31+k_Z#%0u-XG%mJbPHKK5S>K0Y7Fa_;cuv>5|y zp)o11!7CeLE-Sqpf&51pN@sd}vt6ZEa_%U-jQX!>vt5Oa@yLMbDn_oWNfzl^(sc|- z)xDy7UeO11=!QMM3&=0zytY?#&nxh<|L-<4mz7?Q(koo0)x4s6UeSGBWgc1Gm5S*q zM#8H}7U^2jb&PP;y<&S_vGGbCWs2_t@(Vdn@QMs|7Ta@6!_0}iWu=#+^a@vLHLuus zMLM0u_APCUY4*TX46Rp_EYh{4>lnnUd&Tg)V&Ih=x)k39Fko!6jsPoyG7ijWbo_xr(9sYLZ2|mUJCMb#^t@vFhBnS)F>yw90%R^X$xdGm?(#uhLg{w3QPzLR8c?d1v(rQd`o(bj$o}v!?gy%v(Wq9U) z-3Fc{PT0!5%C==cG;c(gn4h$goT@GyAb$DXB+hAgclu0iX1K*s|U z1N@&b9?)xeU;+>5$^*{$uRNgRfeAdID-Td!(*xVcr$Fg=U;+>51M(4E%v0?e9tenQ z(z+h7@jwv|w3b#6D2&6!xP59liXb=UJVkWCm?Vy2Z)sy47^an3x?-~+`#v!`#wSv zuZC^pb37m)M#)ns`z84!DBy*|z>i6BMZbXf@v^a8CCYu<$m@E@#6y!37Zq@kiHn8@ ze#5hyxZ=lo?(+oo%0mUuLna=Y#6za%p~Aqg;Qc-_;{5J-fez)_IG?P|s8E{pkxBZ9 ziHC;qP+{QLo}rcFMPsyE7>XT(o|cTu5AcZPL2@@uiM!% zLRKI7Dv1+lm(JF9Sh|y#TDm)F9%(-33xu__L)&p_C;3A1F0Ezh>q&3WW-NW9CYJKg zNlSNuc2{A^rMpqca@eJg6f z7VDPwkQ|G9mBmXJQSKPLnAAsF;usqd+JsD5Lnxb&FI^?hSh~NsW$D|r)Y7-7KDG3K z)M-oKLit;9W4UbKDrNgYw?D>*>EdP5VP<3TDvI<3MU`dy!C$GUvg{qgj_Z*gqHKbq z%Ch}LHbGHk**k<0SLEq2VtSaItdwW+=WX2RZdMeBIUMU`c5 zp`%r{d1cvt&{Y~ee@s~;b`_0&0KmK z=O3oSoy4VjGV~weoacc{Pl4uRl$}cYIQ0%K4>6mel}kSq0;q=o>HyT2o+;J?P?izuF{^bD>Pt_7s1jjwv{9pV0P0IW zi(D6=j3Crw-iQ&$Xrl=25JDS-HVE^fCbVM!Z2;O!39<#K}9{fA*9y^iq zr^0)@L0h@tCUQQb-(zRW_-b|!zUSCuI{6IpnPSbH7qsck@$>(mApv^x0wVl&)BG}u zz-U@Pl;3Row3gZPFJjG}e-(F;>*OQkS@KbGgM5tKBp=_C47FGBbNgfBw)0)#I@ z_yUA4LihrNFN*PH+#@cVL)u+SEn|O(`NxY*%h)4g**uO<)V3_+ul1Itv@_?Q#Br-8 zmbH=C`(c@Yrv;uJINwpMS@t?jxV-Eov5dcchEFQS6U8eob7M?Vo>?fF?J0RZg5Q9$ zH)7z<9J8CkvR$>Ac=gO>J7HV}t*k*DMXh7`#4>g`0JUBnHT6-{x`%pV89N~?<8PjQ zZ#kf)<1%(TXo|_4b%}@SwS2{ZG*Z9>O83J8mRLz0Jev^2x=SD z`3PzS+ToGm4pN^firV&27eQ?UBwqt{6e{q? zo*MvguKyi{yxQE+L!HE_(|^ zb%-Oh`v-!TtwM2m$UT7a12N(t40tDU-+|ofw6c;oK<5s*pwpKf!idJOTY;`6WW?cO zJst^o-Ubf{BSu%yv;NN+*Igw^3{lH!$`FeIHYnX;whqcX zC*xkhzdvpknX7Jfs|fPW#o#sO%9X+ z)7xP3Q9|o<)@JFWAPqn=g0la|vI7wAqeOURkM)SF&;}^o5fqdrDBV#s+LVlBWhZ9g1@Jem^C`uEQYQ#JM*#XGmGDuk-9Jq#S6Gtr9S}??-O{YL>EqfcI znQyo^mNZ5$Gt0_@PtvF{&xyO1{SW7#=ll!W z)@7%2|L;}mRE|U|{W_bv(JFNYbz@cPOzOtNb%T40HG?a}y1{+K8G|dem4lLpiGyzy zn+D%T{&sEp;J(_H!G#=mL9_^h#i{neKF;~7b+DiF0gjiF^F8=rH}pN?mBHR^9?HbFcIVsr3dEi<^U z81@jG9^!(B*aYz;hzlS#L0kZFVURl`b=ktl{{PP9&^)8Vw+DOyViUxZATEH|1aV>T zohaH1B?@sOtxP0dC@h6UYw?g+AemwSY5|GG0Ms(LKdJKaY?e=MaocGe4b-~|psOX{S^vAu3eJT0D~B>8luXKFv@zMi+9;VD-v1gIR`L zgY-3qXs7)yML^JoI&G*Ao<{mK^%szwCS+A)s2O#dQKuR8LEa?{vK5cpjQnMfYD)Hh zqAlwXc{JOtEI}9h|HLfvh|a{QuaGXG-f7z~@^dNwJn0Lhi>P4(rPSGK)P+uF3fP21-a+P;2$ zNWOec6r6`~Ye<)2U}f9ew0*f=CKF_tvklVMn71q2-k>=Q+TNh;bF_Ufq3sQt)u8PS z+CE3y=PKKtx{nb5)g^k>lqKkr(Y7~edxN$&X!~43(-^e9LE9U&eJ-Kx>(|HR%h|X?v5lFVOadgtj+ndy{50 zY5M|gUr1!u<$P|@wiaz`ao5x`I83S> zK^voSb+P{I|3%rE==loi5)2Lx>C(9yJ(r5llfFQ@2!hJ_yncN(1$E?0@20T60{+{X zwzUQ?!@$b6wP@R#_30hO8R^$)E7QFDOV1FS(!8!s&tm;=dNvOk{w;19{2Mn3f9EFg zd2!_6UzipD${h`RvURu7?#5Lcu1(B?sFgSH4-I{~d7GCU7h z8?dqnTH8aLPe7Z*)EJLKYlF53T3a=($Vb6){})1Ahgi{iXmg-7KwAQ>k)9>i#yYYQ zLYo7v0ooE^4G(P21uI|XiA2zo8)Hi1QD_a&mOyKyQyA1Da#6ID2OZg^mGy`{v<1+b zpq&J*3EJWG8+f=7T()KiZ2`0_UYFzy56N*LdQ z;Gb$+=lo17&UqBN$H*Ut|1r`Nlt0N>|5o^Z10OFM({G252ixiW;CogRbDo3e_u83r zey+*XoL^`^oAVUJzZ7T8`4#!E#Tl>PsEPFc;`}sAaMP<`JV2YCK2Uso&L1%Fj~Mq? zX#XZ|neWg)FE-8pwYGBpZ=gL$+cN(dl>7<0KSTEyZDJ0a+01!KTiGg7_qV1Kx8CuPgX}{na{9<4 z^q&(k=AF}?YX5>ZyZwK)neAWHQte;DXf~})f0*Y#tw$jEBp6w_nm!rEk6_{ZAvgwu zj!n&IJ)C^CwqxsiQZrls3uE7_?bvp?wz};K?a{XDv}tYE!^=}N*JC`YOMeVGry}R$ z$T?0+wH{BCTnYVEY)W&r*3$NMVYOX@jBCY_tsj-CS*@p}X19J)+uHgmZAR;92>1kO zPFI~O&2zqTr)v8k?mkt#()w}j(bi9-W~F()mp)C~nEoGlc%hW$aa;O-0rN%p4fYcH z0v`I3SeNGcU;1>KgO#=E&r<(6>d&G6TtAv}ijh43866?BFt=*vvmtYSsj1j2M* zSYxv6uq>JWGE*W8MiEv-nBAl>BPtb{3HMsv=aYpNP zc$0q8x)xr(h;HR!RO=tN~fhaPN(@+yF6wyhDV6oPDc5Yq^)9I>(4O?gVGm~K#}Hq@z$rfT7E_S zcS+v^9se2L`VjfUgjM5d_^sK1$A?n759R^C#x51 z_0M9dAf-se1Z^xzZDY}C+jMAHaN5Q{VYRW%a@$AYd!FTrs|x1Y~cy&OK3n8~cSFjpFxn zzD%s|l!M&qR1(=CqI_pEjiG47S_I{)(3ow zvXk4ZPUrUO4zYf250}It;+D<>g+6z_wq@=DZTj2}42&^_c=910yFs2@h({W8=Zm!s zC@O@QOn8RpF4i)xah2YSx;WW;o`EXbDReKU z&|@)$9>f$fF{sc9DkkRtngxZwK}m8@p;r$oxFws8kt(LpYs3^2X?Z9}4ns-(phB+_ zR47*-ft(|e;{+9zF@^5M6cg!~K1on9K~OQ#L{Omv- zla)b*?gkZiGFdo5#a$@pJuiX9M4ETDp}XZZ?%i^&;DQ&{5m|SKWPMS|lC9+^r5s!& z2NqF5)s2b-7d2vwvOHN2WupN`SztYRu^2=0(5U$!Lnp}4(_aW`Kgjqc zH>1r58oCo`REabE`+uE4Lr;&OtQ=_EkFw^24ZTLNQI0i2x}5mViE3UgWt9PkPQan3 zuL77GaKz#b*?hpECj=Zi0f(Mul}z1$BNhwDDgnow46lWYYkF9EfncazUTqiG z^swLl(U|Uh9!lywl=NnXN$P;haLA=5KUv=JM*aRF! z0**WZhg~P&u)To8js+Zc5OBoe4XNH@*aRF!0**WZhg~J$uxkVyHUUS`3pnf=0Y{Ph z|2*-AU5+3WdZQMdFR37jMW$-eTAU97O_-JOPKj z9RY_;JW(Xx2pKMU@(~0aiokJ^gRJp@!zSP;5^&@RIPBU1M=aiu(YF|?ce7fNS<2qd zfWs!>aQhSihu^2-FEJ#~=Iuz3a2Lv1Tu8uCB;c@{3^*Ey0c_$8J3S&%wtWGI-9W(MDNE2Ln|qZ~sjM>Kun9P90*-uQz!8f#WCL$F z?1X^BCg89MIP%Q~9I;qHmfvu^mP!I0>V<{-=M%&m`Si8U`k(r5I6@4y=|gdYnk7}h zVFv+6EN+nM4Ts${qsJEtIBWurA^}I9fWxjDaKz#TxxE4iIP6fsk*^YP#A(Wp=%soM zqN0*GQPSOToF*yY$cJv}?O4DOyBlWyS8q5(6{cEmMXK`D2smOqGI;$`E8vKuPKxQ` zG-Vgp^sr2Li4+&Koi48FVOi(JQ_Nj~w;FeGz?0x%{{O>m|MOY7ptEuz%b!g|mrWT2 z93=vd907-sKAdHBto`xdaNN&|rw6L8oH7VHN(3D_f(|3S5?*IjOnBv#OkO%=5OkCX zI&uUZMtWZuE0<1{-*OmU&|$=a4kNt^zUnKd3}TLwBgX}{J zSp!R_41$glK}U|D!$_YD-!`nAk}RE4J)F;E2s(`PsR(Ll=~Uud4uhbh z9R@*1E*5kcv6md&|GVq3BCkklGJ8RXKU5QR7z7=;^3YAt5!9)m!#}Tl$-(zu1RVxJ zM{YZV4x@pf!yxD|c*&9TV-C4(FCL5rf{sdM3A$th>$fVERR$dfL5D%mk!vLA2*n(- z+OjGmA?Pp&It+r2+;#>X<#+%ctpACv-Fo$vsG!6Bdp3fO94|SH^mUA~&Z;U|eOXm9 zLjrv$c2KjV3ObDRs2a*ER#knHRaJbt@2swpEUz-QM}Wg0iXjYwkP<;ijv&NH-+}?| zGOO5Ik01z<@nu%c3UK)eLJSpzuo`MllqbLSh|_R~%>BQ=7E1*oaiXL*BXOFfJLFs_ z2r)Xj6;rFM+_xS<5F#VXtXRhtyebJX)eJ(a@zi=#;`2xrfrS+%+#>tStm3GXf{-{( zQVBnp}2hOs~pViJT5&wmajtbh%DzhTx0LQH~? zNiPU7y&z;beIM(@qn~d~a)(_Y2=TqAf)JVb{f1d32vM#)0zpS2=qTmNSP)`*K}dx{ zf{;mqkjY38B5QxYVG@K)5`+{8LQH~?;q(TOg}&ctFbFY;F(wH@qJ|TMNIIGG{e~iN zT;w48kV4i#5MmO9OcI0?2trJPkm2+UYj7qBnTN!Z$wbt?>7>I z5R)Lp?NbCHexFJRLd^7O{Qq-0SZY<^zT6}TnIs4?2||Y3zCh1yEC@kZL$ablh^+qR zqfvp41|f;^WCGeo-+)8~-c8e$z4yhC_o6{f{BsUj?|TlDAjBjHDa3*hvwr2r&sl3QiCrw`28_*+38yQI?=fHu@1srLxK(#3TqY2|@~u2O;eLSL53b zGa(2u2|`SQkix4Hgvh^(*ItRELj@u3KPMA}6bM30f{dNUyRP6|St?>{QP^=Lvs zz)uijroY8}QQ&inJyD(@UKJPD^swX~Y=U-q zOAI;pMj;Z{|aFr~Xh)DrAi>wXz5}rubgGg@D6qYN=IprIqU3 zr$_{S3_%TlFrFB2SOgqyry}5>Q>i|c5O7$L7~yVoOZNQX7JQ12#w~xTRrHqG;swPN zUqD;sPqSNVe*tZA$87NhbW7}x*-E-&maUgY?s_e5nJvD6Zi(G8Tfr@J)jQ^zyxtwN z<*yAg(35l8KlnN!s8qMi{(0nzlM&=uc3MW6aE}J z_H{yRu~7NBeX~kx=y0C@Cx3En?Qpv`yX``4R@+6S%Q*g;HY-wgF=dxfXOUm()vfi; zF9@BR)DH*c-kr6@SJqQ$c@1v47WdR&grpc6pbyoF84Fo%Q~9%|7tLo>zsLwwsmG#i0CA@KE_t1>;I%uXmXhGru>%4f6}s zrR@VG7A&+KkIdcSYv(+nTsjp){HxIrf3Gn#pL_wiZ-`irA-XbzV`a$HP%Ct8lz*>w zJqmRU(E~%^Yv(*DC;oFSR23MK#}FGs@)%-=49R1N?HQ6+hNQlWA$bh3F{EZa3T+Ir zLx$ur#BMv5^?ykf7?Q&f14D8cVhnZAmTuFC9EKR}53^3_2OPT|NqrAPau{M@NX>c- zG01aPwL?$VeM=fGIRt&jue~bvTb7f%i@)xcQGFP2QR#W z;CJJhLsAb79SVrUNQZO28pE29C%0AL(9v3{ZC8wYKLZQ0 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⪻&`&?om!EH>O5DSKI~~Ae`yhSz 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 Oc5ut#H%y$d^#1{Jv)L&C From 5b0921df6ed71a788787128b3abed67c028aff80 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 1 Aug 2024 16:11:48 +0200 Subject: [PATCH 06/25] Issue #1925 - Move NS_FOR_CSS_SIDES and operator++ to gfx/2d/Types.h --- gfx/2d/Types.h | 28 ++++++++++++++++++++++++++-- layout/style/nsStyleConsts.h | 22 ---------------------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 3cdf077b11..6dfd2b4054 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -7,6 +7,8 @@ #define MOZILLA_GFX_TYPES_H_ #include "mozilla/EndianUtils.h" +#include "mozilla/MacroArgs.h" // for MOZ_CONCAT +#include "nsDebug.h" #include #include @@ -387,11 +389,33 @@ enum SideBits { eSideBitsAll = eSideBitsTopBottom | eSideBitsLeftRight }; -} // namespace mozilla - #define NS_SIDE_TOP mozilla::eSideTop #define NS_SIDE_RIGHT mozilla::eSideRight #define NS_SIDE_BOTTOM mozilla::eSideBottom #define NS_SIDE_LEFT mozilla::eSideLeft +namespace css { +typedef mozilla::Side Side; +} // namespace css + +// Creates a for loop that walks over the four mozilla::css::Side values. +// We use an int32_t helper variable (instead of a Side) for our loop counter, +// to avoid triggering undefined behavior just before we exit the loop (at +// which point the counter is incremented beyond the largest valid Side value). +#define NS_FOR_CSS_SIDES(var_) \ + int32_t MOZ_CONCAT(var_,__LINE__) = NS_SIDE_TOP; \ + for (mozilla::css::Side var_; \ + MOZ_CONCAT(var_,__LINE__) <= NS_SIDE_LEFT && \ + ((var_ = mozilla::css::Side(MOZ_CONCAT(var_,__LINE__))), true); \ + MOZ_CONCAT(var_,__LINE__)++) + +static inline css::Side operator++(css::Side& side, int) { + NS_PRECONDITION(side >= NS_SIDE_TOP && + side <= NS_SIDE_LEFT, "Out of range side"); + side = css::Side(side + 1); + return side; +} + +} // namespace mozilla + #endif /* MOZILLA_GFX_TYPES_H_ */ diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index e9063b595e..90ead02e67 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -10,33 +10,11 @@ #include "gfxRect.h" #include "nsFont.h" -#include "mozilla/MacroArgs.h" // for MOZ_CONCAT #include "X11UndefineNone.h" // XXX fold this into nsStyleContext and group by nsStyleXXX struct namespace mozilla { -namespace css { -typedef mozilla::Side Side; -} // namespace css - -// Creates a for loop that walks over the four mozilla::css::Side values. -// We use an int32_t helper variable (instead of a Side) for our loop counter, -// to avoid triggering undefined behavior just before we exit the loop (at -// which point the counter is incremented beyond the largest valid Side value). -#define NS_FOR_CSS_SIDES(var_) \ - int32_t MOZ_CONCAT(var_,__LINE__) = NS_SIDE_TOP; \ - for (mozilla::css::Side var_; \ - MOZ_CONCAT(var_,__LINE__) <= NS_SIDE_LEFT && \ - ((var_ = mozilla::css::Side(MOZ_CONCAT(var_,__LINE__))), true); \ - MOZ_CONCAT(var_,__LINE__)++) - -static inline css::Side operator++(css::Side& side, int) { - NS_PRECONDITION(side >= NS_SIDE_TOP && - side <= NS_SIDE_LEFT, "Out of range side"); - side = css::Side(side + 1); - return side; -} #define NS_FOR_CSS_FULL_CORNERS(var_) for (int32_t var_ = 0; var_ < 4; ++var_) From e6e27965419e21a9f2fcc30ae372febea562d7c8 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 1 Aug 2024 16:46:27 +0200 Subject: [PATCH 07/25] Issue #1925 - Remove mozilla::css::Side typedef. --- accessible/base/StyleInfo.cpp | 2 +- gfx/2d/Types.h | 14 +++--- gfx/src/nsRect.cpp | 2 +- layout/base/nsCSSRendering.cpp | 8 ++-- layout/base/nsCSSRenderingBorders.cpp | 64 +++++++++++++-------------- layout/base/nsCSSRenderingBorders.h | 20 ++++----- layout/base/nsLayoutUtils.cpp | 4 +- layout/base/nsLayoutUtils.h | 2 +- layout/forms/nsFieldSetFrame.cpp | 4 +- layout/generic/ReflowInput.cpp | 12 ++--- layout/generic/WritingModes.h | 6 +-- layout/generic/nsContainerFrame.cpp | 4 +- layout/style/StyleAnimationValue.cpp | 2 +- layout/style/nsCSSDataBlock.cpp | 2 +- layout/style/nsComputedDOMStyle.cpp | 24 +++++----- layout/style/nsComputedDOMStyle.h | 22 ++++----- layout/style/nsStyleCoord.h | 14 +++--- layout/style/nsStyleStruct.h | 14 +++--- 18 files changed, 108 insertions(+), 112 deletions(-) diff --git a/accessible/base/StyleInfo.cpp b/accessible/base/StyleInfo.cpp index 41d1c5b78a..b6b41820ed 100644 --- a/accessible/base/StyleInfo.cpp +++ b/accessible/base/StyleInfo.cpp @@ -80,7 +80,7 @@ StyleInfo::TextIndent(nsAString& aValue) } void -StyleInfo::Margin(css::Side aSide, nsAString& aValue) +StyleInfo::Margin(Side aSide, nsAString& aValue) { MOZ_ASSERT(mElement->GetPrimaryFrame(), " mElement->GetPrimaryFrame() needs to be valid pointer"); aValue.Truncate(); diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 6dfd2b4054..4d0d9427b1 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -394,25 +394,21 @@ enum SideBits { #define NS_SIDE_BOTTOM mozilla::eSideBottom #define NS_SIDE_LEFT mozilla::eSideLeft -namespace css { -typedef mozilla::Side Side; -} // namespace css - -// Creates a for loop that walks over the four mozilla::css::Side values. +// Creates a for loop that walks over the four mozilla::Side values. // We use an int32_t helper variable (instead of a Side) for our loop counter, // to avoid triggering undefined behavior just before we exit the loop (at // which point the counter is incremented beyond the largest valid Side value). #define NS_FOR_CSS_SIDES(var_) \ int32_t MOZ_CONCAT(var_,__LINE__) = NS_SIDE_TOP; \ - for (mozilla::css::Side var_; \ + for (mozilla::Side var_; \ MOZ_CONCAT(var_,__LINE__) <= NS_SIDE_LEFT && \ - ((var_ = mozilla::css::Side(MOZ_CONCAT(var_,__LINE__))), true); \ + ((var_ = mozilla::Side(MOZ_CONCAT(var_,__LINE__))), true); \ MOZ_CONCAT(var_,__LINE__)++) -static inline css::Side operator++(css::Side& side, int) { +static inline Side operator++(Side& side, int) { NS_PRECONDITION(side >= NS_SIDE_TOP && side <= NS_SIDE_LEFT, "Out of range side"); - side = css::Side(side + 1); + side = Side(side + 1); return side; } diff --git a/gfx/src/nsRect.cpp b/gfx/src/nsRect.cpp index c17c249b2e..79ccb1e6f1 100644 --- a/gfx/src/nsRect.cpp +++ b/gfx/src/nsRect.cpp @@ -14,7 +14,7 @@ static_assert((int(NS_SIDE_TOP) == 0) && (int(NS_SIDE_RIGHT) == 1) && (int(NS_SIDE_BOTTOM) == 2) && (int(NS_SIDE_LEFT) == 3), - "The mozilla::css::Side sequence must match the nsMargin nscoord sequence"); + "The mozilla::Side sequence must match the nsMargin nscoord sequence"); const mozilla::gfx::IntRect& GetMaxSizedIntRect() { static const mozilla::gfx::IntRect r(0, 0, INT32_MAX, INT32_MAX); diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index 2e2b0d0c84..48b140d156 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -436,7 +436,7 @@ static DrawResult DrawBorderImage(nsPresContext* aPresContext, Sides aSkipSides, PaintBorderFlags aFlags); -static nscolor MakeBevelColor(mozilla::css::Side whichSide, uint8_t style, +static nscolor MakeBevelColor(mozilla::Side whichSide, uint8_t style, nscolor aBackgroundColor, nscolor aBorderColor); @@ -460,7 +460,7 @@ void nsCSSRendering::Shutdown() * Make a bevel color */ static nscolor -MakeBevelColor(mozilla::css::Side whichSide, uint8_t style, +MakeBevelColor(mozilla::Side whichSide, uint8_t style, nscolor aBackgroundColor, nscolor aBorderColor) { @@ -1738,7 +1738,7 @@ nsCSSRendering::PaintBackground(const PaintBGParams& aParams) } static bool -IsOpaqueBorderEdge(const nsStyleBorder& aBorder, mozilla::css::Side aSide) +IsOpaqueBorderEdge(const nsStyleBorder& aBorder, mozilla::Side aSide) { if (aBorder.GetComputedBorder().Side(aSide) == 0) return true; @@ -4425,7 +4425,7 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, ? RoundFloatToPixel(0.5f * (float)aStartBevelOffset, twipsPerPixel, true) : 0; nscoord endBevel = (aEndBevelOffset > 0) ? RoundFloatToPixel(0.5f * (float)aEndBevelOffset, twipsPerPixel, true) : 0; - mozilla::css::Side ridgeGrooveSide = (horizontal) ? NS_SIDE_TOP : NS_SIDE_LEFT; + mozilla::Side ridgeGrooveSide = (horizontal) ? NS_SIDE_TOP : NS_SIDE_LEFT; // FIXME: In theory, this should use the visited-dependent // background color, but I don't care. nscolor bevelColor = MakeBevelColor(ridgeGrooveSide, ridgeGroove, diff --git a/layout/base/nsCSSRenderingBorders.cpp b/layout/base/nsCSSRenderingBorders.cpp index 9720bb2dbf..903b39e550 100644 --- a/layout/base/nsCSSRenderingBorders.cpp +++ b/layout/base/nsCSSRenderingBorders.cpp @@ -63,8 +63,8 @@ static void ComputeBorderCornerDimensions(const Float* aBorderWidths, RectCornerRadii *aDimsResult); // given a side index, get the previous and next side index -#define NEXT_SIDE(_s) mozilla::css::Side(((_s) + 1) & 3) -#define PREV_SIDE(_s) mozilla::css::Side(((_s) + 3) & 3) +#define NEXT_SIDE(_s) mozilla::Side(((_s) + 1) & 3) +#define PREV_SIDE(_s) mozilla::Side(((_s) + 3) & 3) // given a corner index, get the previous and next corner index #define NEXT_CORNER(_s) mozilla::css::Corner(((_s) + 1) & 3) @@ -113,26 +113,26 @@ AllCornersZeroSize(const RectCornerRadii& corners) { IsZeroSize(corners[NS_CORNER_BOTTOM_LEFT]); } -static mozilla::css::Side +static mozilla::Side GetHorizontalSide(mozilla::css::Corner aCorner) { return (aCorner == C_TL || aCorner == C_TR) ? NS_SIDE_TOP : NS_SIDE_BOTTOM; } -static mozilla::css::Side +static mozilla::Side GetVerticalSide(mozilla::css::Corner aCorner) { return (aCorner == C_TL || aCorner == C_BL) ? NS_SIDE_LEFT : NS_SIDE_RIGHT; } static mozilla::css::Corner -GetCWCorner(mozilla::css::Side aSide) +GetCWCorner(mozilla::Side aSide) { return mozilla::css::Corner(NEXT_SIDE(aSide)); } static mozilla::css::Corner -GetCCWCorner(mozilla::css::Side aSide) +GetCCWCorner(mozilla::Side aSide) { return mozilla::css::Corner(aSide); } @@ -145,7 +145,7 @@ IsSingleSide(int aSides) } static bool -IsHorizontalSide(mozilla::css::Side aSide) +IsHorizontalSide(mozilla::Side aSide) { return aSide == NS_SIDE_TOP || aSide == NS_SIDE_BOTTOM; } @@ -385,8 +385,8 @@ nsCSSBorderRenderer::IsCornerMergeable(mozilla::css::Corner aCorner) // +-------------------------+---- // | | // | | - mozilla::css::Side sideH(GetHorizontalSide(aCorner)); - mozilla::css::Side sideV(GetVerticalSide(aCorner)); + mozilla::Side sideH(GetHorizontalSide(aCorner)); + mozilla::Side sideV(GetVerticalSide(aCorner)); uint8_t styleH = mBorderStyles[sideH]; uint8_t styleV = mBorderStyles[sideV]; if (styleH != styleV || styleH != NS_STYLE_BORDER_STYLE_DOTTED) { @@ -449,7 +449,7 @@ nsCSSBorderRenderer::GetCornerRect(mozilla::css::Corner aCorner) } Rect -nsCSSBorderRenderer::GetSideClipWithoutCornersRect(mozilla::css::Side aSide) +nsCSSBorderRenderer::GetSideClipWithoutCornersRect(mozilla::Side aSide) { Point offset(0.f, 0.f); @@ -583,7 +583,7 @@ MaybeMoveToMidPoint(Point& aP0, Point& aP1, const Point& aMidPoint) } already_AddRefed -nsCSSBorderRenderer::GetSideClipSubPath(mozilla::css::Side aSide) +nsCSSBorderRenderer::GetSideClipSubPath(mozilla::Side aSide) { // the clip proceeds clockwise from the top left corner; // so "start" in each case is the start of the region from that side. @@ -673,7 +673,7 @@ nsCSSBorderRenderer::GetSideClipSubPath(mozilla::css::Side aSide) } Point -nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::css::Side aSide, +nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::Side aSide, mozilla::css::Corner aCorner, bool* aIsUnfilled, Float aDotOffset) @@ -726,7 +726,7 @@ nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::css::Side aSide, // | | // otherSide | | // | | - mozilla::css::Side otherSide = ((uint8_t)aSide == (uint8_t)aCorner) + mozilla::Side otherSide = ((uint8_t)aSide == (uint8_t)aCorner) ? PREV_SIDE(aSide) : NEXT_SIDE(aSide); uint8_t otherStyle = mBorderStyles[otherSide]; @@ -1091,8 +1091,8 @@ nsCSSBorderRenderer::GetOuterAndInnerBezier(Bezier* aOuterBezier, // | | // +---------+ - mozilla::css::Side sideH(GetHorizontalSide(aCorner)); - mozilla::css::Side sideV(GetVerticalSide(aCorner)); + mozilla::Side sideH(GetHorizontalSide(aCorner)); + mozilla::Side sideV(GetVerticalSide(aCorner)); Size outerCornerSize(ceil(mBorderRadii[aCorner].width), ceil(mBorderRadii[aCorner].height)); @@ -1627,7 +1627,7 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) void nsCSSBorderRenderer::SetupDashedOptions(StrokeOptions* aStrokeOptions, Float aDash[2], - mozilla::css::Side aSide, + mozilla::Side aSide, Float aBorderLength, bool isCorner) { uint8_t style = mBorderStyles[aSide]; @@ -1803,7 +1803,7 @@ nsCSSBorderRenderer::SetupDashedOptions(StrokeOptions* aStrokeOptions, } static Float -GetBorderLength(mozilla::css::Side aSide, +GetBorderLength(mozilla::Side aSide, const Point& aStart, const Point& aEnd) { if (aSide == NS_SIDE_TOP) { @@ -1819,7 +1819,7 @@ GetBorderLength(mozilla::css::Side aSide, } void -nsCSSBorderRenderer::DrawDashedOrDottedSide(mozilla::css::Side aSide) +nsCSSBorderRenderer::DrawDashedOrDottedSide(mozilla::Side aSide) { // Draw dashed/dotted side with following approach. // @@ -1888,7 +1888,7 @@ nsCSSBorderRenderer::DrawDashedOrDottedSide(mozilla::css::Side aSide) // For dotted sides that can merge with their prior dotted sides, advance the // dash offset to measure the distance around the combined path. This prevents // two dots from bunching together at a corner. - mozilla::css::Side mergeSide = aSide; + mozilla::Side mergeSide = aSide; while (IsCornerMergeable(GetCCWCorner(mergeSide))) { mergeSide = PREV_SIDE(mergeSide); // If we looped all the way around, measure starting at the top side, since @@ -1927,7 +1927,7 @@ nsCSSBorderRenderer::DrawDashedOrDottedSide(mozilla::css::Side aSide) } void -nsCSSBorderRenderer::DrawDottedSideSlow(mozilla::css::Side aSide) +nsCSSBorderRenderer::DrawDottedSideSlow(mozilla::Side aSide) { // Draw each circles separately for dotted with borderWidth > 2.0. // Dashed line with CapStyle::ROUND doesn't render perfect circles. @@ -2307,7 +2307,7 @@ nsCSSBorderRenderer::DrawDottedSideSlow(mozilla::css::Side aSide) } void -nsCSSBorderRenderer::DrawDashedOrDottedCorner(mozilla::css::Side aSide, +nsCSSBorderRenderer::DrawDashedOrDottedCorner(mozilla::Side aSide, mozilla::css::Corner aCorner) { // Draw dashed/dotted corner with following approach. @@ -2345,8 +2345,8 @@ nsCSSBorderRenderer::DrawDashedOrDottedCorner(mozilla::css::Side aSide, return; } - mozilla::css::Side sideH(GetHorizontalSide(aCorner)); - mozilla::css::Side sideV(GetVerticalSide(aCorner)); + mozilla::Side sideH(GetHorizontalSide(aCorner)); + mozilla::Side sideV(GetVerticalSide(aCorner)); Float borderWidthH = mBorderWidths[sideH]; Float borderWidthV = mBorderWidths[sideV]; if (borderWidthH == 0.0f && borderWidthV == 0.0f) { @@ -2416,14 +2416,14 @@ nsCSSBorderRenderer::DrawDashedOrDottedCorner(mozilla::css::Side aSide, } void -nsCSSBorderRenderer::DrawDottedCornerSlow(mozilla::css::Side aSide, +nsCSSBorderRenderer::DrawDottedCornerSlow(mozilla::Side aSide, mozilla::css::Corner aCorner) { NS_ASSERTION(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DOTTED, "Style should be dotted."); - mozilla::css::Side sideH(GetHorizontalSide(aCorner)); - mozilla::css::Side sideV(GetVerticalSide(aCorner)); + mozilla::Side sideH(GetHorizontalSide(aCorner)); + mozilla::Side sideV(GetVerticalSide(aCorner)); Float R0 = mBorderWidths[sideH] / 2.0f; Float Rn = mBorderWidths[sideV] / 2.0f; if (R0 == 0.0f && Rn == 0.0f) { @@ -2493,14 +2493,14 @@ DashedPathOverlapsRect(Rect& pathRect, } void -nsCSSBorderRenderer::DrawDashedCornerSlow(mozilla::css::Side aSide, +nsCSSBorderRenderer::DrawDashedCornerSlow(mozilla::Side aSide, mozilla::css::Corner aCorner) { NS_ASSERTION(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DASHED, "Style should be dashed."); - mozilla::css::Side sideH(GetHorizontalSide(aCorner)); - mozilla::css::Side sideV(GetVerticalSide(aCorner)); + mozilla::Side sideH(GetHorizontalSide(aCorner)); + mozilla::Side sideV(GetVerticalSide(aCorner)); Float borderWidthH = mBorderWidths[sideH]; Float borderWidthV = mBorderWidths[sideV]; if (borderWidthH == 0.0f && borderWidthV == 0.0f) { @@ -2609,7 +2609,7 @@ nsCSSBorderRenderer::DrawDashedCornerSlow(mozilla::css::Side aSide, } void -nsCSSBorderRenderer::DrawFallbackSolidCorner(mozilla::css::Side aSide, +nsCSSBorderRenderer::DrawFallbackSolidCorner(mozilla::Side aSide, mozilla::css::Corner aCorner) { // Render too large dashed or dotted corner with solid style, to avoid hangup @@ -3386,7 +3386,7 @@ nsCSSBorderRenderer::DrawBorders() */ NS_FOR_CSS_CORNERS(corner) { - const mozilla::css::Side sides[2] = { mozilla::css::Side(corner), PREV_SIDE(corner) }; + const mozilla::Side sides[2] = { mozilla::Side(corner), PREV_SIDE(corner) }; if (!IsZeroSize(mBorderRadii[corner])) continue; @@ -3447,7 +3447,7 @@ nsCSSBorderRenderer::DrawBorders() // advantages outway the modest easthetic improvement. for (int cornerSide = 0; cornerSide < 2; cornerSide++) { - mozilla::css::Side side = mozilla::css::Side(sides[cornerSide]); + mozilla::Side side = mozilla::Side(sides[cornerSide]); uint8_t style = mBorderStyles[side]; PrintAsFormatString("corner: %d cornerSide: %d side: %d style: %d\n", corner, cornerSide, side, style); diff --git a/layout/base/nsCSSRenderingBorders.h b/layout/base/nsCSSRenderingBorders.h index 042f186754..5ff8300389 100644 --- a/layout/base/nsCSSRenderingBorders.h +++ b/layout/base/nsCSSRenderingBorders.h @@ -157,7 +157,7 @@ private: // Get the Rect for drawing the given corner Rect GetCornerRect(mozilla::css::Corner aCorner); // add the path for drawing the given side without any adjacent corners to the context - Rect GetSideClipWithoutCornersRect(mozilla::css::Side aSide); + Rect GetSideClipWithoutCornersRect(mozilla::Side aSide); // Create a clip path for the wedge that this side of // the border should take up. This is only called @@ -167,10 +167,10 @@ private: // This code needs to make sure that the individual pieces // don't ever (mathematically) overlap; the pixel overlap // is taken care of by the ADD compositing. - already_AddRefed GetSideClipSubPath(mozilla::css::Side aSide); + already_AddRefed GetSideClipSubPath(mozilla::Side aSide); // Return start or end point for dashed/dotted side - Point GetStraightBorderPoint(mozilla::css::Side aSide, + Point GetStraightBorderPoint(mozilla::Side aSide, mozilla::css::Corner aCorner, bool* aIsUnfilled, Float aDotOffset = 0.0f); @@ -213,29 +213,29 @@ private: // Setup the stroke options for the given dashed/dotted side void SetupDashedOptions(StrokeOptions* aStrokeOptions, - Float aDash[2], mozilla::css::Side aSide, + Float aDash[2], mozilla::Side aSide, Float aBorderLength, bool isCorner); // Draw the given dashed/dotte side - void DrawDashedOrDottedSide(mozilla::css::Side aSide); + void DrawDashedOrDottedSide(mozilla::Side aSide); // Draw the given dotted side, each dot separately - void DrawDottedSideSlow(mozilla::css::Side aSide); + void DrawDottedSideSlow(mozilla::Side aSide); // Draw the given dashed/dotted corner - void DrawDashedOrDottedCorner(mozilla::css::Side aSide, + void DrawDashedOrDottedCorner(mozilla::Side aSide, mozilla::css::Corner aCorner); // Draw the given dotted corner, each segment separately - void DrawDottedCornerSlow(mozilla::css::Side aSide, + void DrawDottedCornerSlow(mozilla::Side aSide, mozilla::css::Corner aCorner); // Draw the given dashed corner, each dot separately - void DrawDashedCornerSlow(mozilla::css::Side aSide, + void DrawDashedCornerSlow(mozilla::Side aSide, mozilla::css::Corner aCorner); // Draw the given dashed/dotted corner with solid style - void DrawFallbackSolidCorner(mozilla::css::Side aSide, + void DrawFallbackSolidCorner(mozilla::Side aSide, mozilla::css::Corner aCorner); // Analyze if all border sides have the same width. diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index fb7390753d..dcb543acd7 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -6787,7 +6787,7 @@ nsLayoutUtils::HasNonZeroCorner(const nsStyleCorners& aCorners) } // aCorner is a "full corner" value, i.e. NS_CORNER_TOP_LEFT etc -static bool IsCornerAdjacentToSide(uint8_t aCorner, css::Side aSide) +static bool IsCornerAdjacentToSide(uint8_t aCorner, Side aSide) { static_assert((int)NS_SIDE_TOP == NS_CORNER_TOP_LEFT, "Check for Full Corner"); static_assert((int)NS_SIDE_RIGHT == NS_CORNER_TOP_RIGHT, "Check for Full Corner"); @@ -6803,7 +6803,7 @@ static bool IsCornerAdjacentToSide(uint8_t aCorner, css::Side aSide) /* static */ bool nsLayoutUtils::HasNonZeroCornerOnSide(const nsStyleCorners& aCorners, - css::Side aSide) + Side aSide) { static_assert(NS_CORNER_TOP_LEFT_X/2 == NS_CORNER_TOP_LEFT, "Check for Non Zero on side"); static_assert(NS_CORNER_TOP_LEFT_Y/2 == NS_CORNER_TOP_LEFT, "Check for Non Zero on side"); diff --git a/layout/base/nsLayoutUtils.h b/layout/base/nsLayoutUtils.h index 7d2b6f6f7f..6091fb45e4 100644 --- a/layout/base/nsLayoutUtils.h +++ b/layout/base/nsLayoutUtils.h @@ -1911,7 +1911,7 @@ public: * given side. */ static bool HasNonZeroCornerOnSide(const nsStyleCorners& aCorners, - mozilla::css::Side aSide); + mozilla::Side aSide); /** * Determine if a widget is likely to require transparency or translucency. diff --git a/layout/forms/nsFieldSetFrame.cpp b/layout/forms/nsFieldSetFrame.cpp index ce66f5d0f1..5936589c94 100644 --- a/layout/forms/nsFieldSetFrame.cpp +++ b/layout/forms/nsFieldSetFrame.cpp @@ -48,7 +48,7 @@ nsRect nsFieldSetFrame::VisualBorderRectRelativeToSelf() const { WritingMode wm = GetWritingMode(); - css::Side legendSide = wm.PhysicalSide(eLogicalSideBStart); + Side legendSide = wm.PhysicalSide(eLogicalSideBStart); nscoord legendBorder = StyleBorder()->GetComputedBorderWidth(legendSide); LogicalRect r(wm, LogicalPoint(wm, 0, 0), GetLogicalSize(wm)); nsSize containerSize = r.Size(wm).GetPhysicalSize(wm); @@ -234,7 +234,7 @@ nsFieldSetFrame::PaintBorder( this, rect); if (nsIFrame* legend = GetLegend()) { - css::Side legendSide = wm.PhysicalSide(eLogicalSideBStart); + Side legendSide = wm.PhysicalSide(eLogicalSideBStart); nscoord legendBorderWidth = StyleBorder()->GetComputedBorderWidth(legendSide); diff --git a/layout/generic/ReflowInput.cpp b/layout/generic/ReflowInput.cpp index 3ab62ac11a..2045609e99 100644 --- a/layout/generic/ReflowInput.cpp +++ b/layout/generic/ReflowInput.cpp @@ -900,10 +900,10 @@ ReflowInput::ComputeRelativeOffsets(WritingMode aWM, nsMargin& aComputedOffsets) { LogicalMargin offsets(aWM); - mozilla::css::Side inlineStart = aWM.PhysicalSide(eLogicalSideIStart); - mozilla::css::Side inlineEnd = aWM.PhysicalSide(eLogicalSideIEnd); - mozilla::css::Side blockStart = aWM.PhysicalSide(eLogicalSideBStart); - mozilla::css::Side blockEnd = aWM.PhysicalSide(eLogicalSideBEnd); + mozilla::Side inlineStart = aWM.PhysicalSide(eLogicalSideIStart); + mozilla::Side inlineEnd = aWM.PhysicalSide(eLogicalSideIEnd); + mozilla::Side blockStart = aWM.PhysicalSide(eLogicalSideBStart); + mozilla::Side blockEnd = aWM.PhysicalSide(eLogicalSideBEnd); const nsStylePosition* position = aFrame->StylePosition(); @@ -1139,9 +1139,9 @@ ReflowInput::CalculateBorderPaddingMargin( nscoord* aOutsideBoxSizing) const { WritingMode wm = GetWritingMode(); - mozilla::css::Side startSide = + mozilla::Side startSide = wm.PhysicalSide(MakeLogicalSide(aAxis, eLogicalEdgeStart)); - mozilla::css::Side endSide = + mozilla::Side endSide = wm.PhysicalSide(MakeLogicalSide(aAxis, eLogicalEdgeEnd)); nsMargin styleBorder = mStyleBorder->GetComputedBorder(); diff --git a/layout/generic/WritingModes.h b/layout/generic/WritingModes.h index 4c4717337e..b6227168d9 100644 --- a/layout/generic/WritingModes.h +++ b/layout/generic/WritingModes.h @@ -324,7 +324,7 @@ public: // two-bit values: // bit 0 = the eOrientationMask value // bit 1 = the eBlockFlowMask value - static const mozilla::css::Side kLogicalBlockSides[][2] = { + static const mozilla::Side kLogicalBlockSides[][2] = { { NS_SIDE_TOP, NS_SIDE_BOTTOM }, // horizontal-tb { NS_SIDE_RIGHT, NS_SIDE_LEFT }, // vertical-rl { NS_SIDE_BOTTOM, NS_SIDE_TOP }, // (horizontal-bt) @@ -352,7 +352,7 @@ public: // is no horizontal-bt writing-mode, and no text-orientation value that // produces "inverted" text. (The former 'sideways-left' value, no longer // in the spec, would have produced this in vertical-rl mode.) - static const mozilla::css::Side kLogicalInlineSides[][2] = { + static const mozilla::Side kLogicalInlineSides[][2] = { { NS_SIDE_LEFT, NS_SIDE_RIGHT }, // horizontal-tb ltr { NS_SIDE_TOP, NS_SIDE_BOTTOM }, // vertical-rl ltr { NS_SIDE_RIGHT, NS_SIDE_LEFT }, // horizontal-tb rtl @@ -404,7 +404,7 @@ public: * given the current writing mode. * (This is the inverse of the PhysicalSide() method above.) */ - LogicalSide LogicalSideForPhysicalSide(mozilla::css::Side aSide) const + LogicalSide LogicalSideForPhysicalSide(mozilla::Side aSide) const { // indexes are four-bit values: // bit 0 = the eOrientationMask value diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp index a13586b8d4..be750a4c7a 100644 --- a/layout/generic/nsContainerFrame.cpp +++ b/layout/generic/nsContainerFrame.cpp @@ -847,9 +847,9 @@ nsContainerFrame::DoInlineIntrinsicISize(nsRenderingContext *aRenderingContext, aType == nsLayoutUtils::PREF_ISIZE, "bad type"); WritingMode wm = GetWritingMode(); - mozilla::css::Side startSide = + mozilla::Side startSide = wm.PhysicalSideForInlineAxis(eLogicalEdgeStart); - mozilla::css::Side endSide = + mozilla::Side endSide = wm.PhysicalSideForInlineAxis(eLogicalEdgeEnd); const nsStylePadding *stylePadding = StylePadding(); diff --git a/layout/style/StyleAnimationValue.cpp b/layout/style/StyleAnimationValue.cpp index 1a46ef7592..d5fa1c51e3 100644 --- a/layout/style/StyleAnimationValue.cpp +++ b/layout/style/StyleAnimationValue.cpp @@ -4381,7 +4381,7 @@ StyleAnimationValue::ExtractComputedValue(nsCSSPropertyID aProperty, const nsStyleCoord &coord = StyleDataAtOffset(styleStruct, ssOffset). - Get(mozilla::css::Side(animType - eStyleAnimType_Sides_Top)); + Get(mozilla::Side(animType - eStyleAnimType_Sides_Top)); return StyleCoordToValue(coord, aComputedValue); } case eStyleAnimType_Corner_TopLeft: diff --git a/layout/style/nsCSSDataBlock.cpp b/layout/style/nsCSSDataBlock.cpp index c32f436106..8f17cc71ca 100644 --- a/layout/style/nsCSSDataBlock.cpp +++ b/layout/style/nsCSSDataBlock.cpp @@ -238,7 +238,7 @@ EnsurePhysicalProperty(nsCSSPropertyID& aProperty, nsRuleData* aRuleData) // We handle block axis logical properties separately to save a bit of // work that the WritingMode constructor does that is unnecessary // unless we have an inline axis property. - mozilla::css::Side side; + mozilla::Side side; if (isBlock) { uint8_t wm = aRuleData->mStyleContext->StyleVisibility()->mWritingMode; side = WritingMode::PhysicalSideForBlockAxis(wm, edge); diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index 7794d6af8e..e6be7dc0bd 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -5085,7 +5085,7 @@ nsComputedDOMStyle::DoGetTop() } already_AddRefed -nsComputedDOMStyle::GetOffsetWidthFor(mozilla::css::Side aSide) +nsComputedDOMStyle::GetOffsetWidthFor(mozilla::Side aSide) { const nsStyleDisplay* display = StyleDisplay(); @@ -5116,7 +5116,7 @@ nsComputedDOMStyle::GetOffsetWidthFor(mozilla::css::Side aSide) } already_AddRefed -nsComputedDOMStyle::GetAbsoluteOffset(mozilla::css::Side aSide) +nsComputedDOMStyle::GetAbsoluteOffset(mozilla::Side aSide) { MOZ_ASSERT(mOuterFrame, "need a frame, so we can call GetContainingBlock()"); @@ -5174,10 +5174,10 @@ nsComputedDOMStyle::GetAbsoluteOffset(mozilla::css::Side aSide) static_assert(NS_SIDE_TOP == 0 && NS_SIDE_RIGHT == 1 && NS_SIDE_BOTTOM == 2 && NS_SIDE_LEFT == 3, "box side constants not as expected for NS_OPPOSITE_SIDE"); -#define NS_OPPOSITE_SIDE(s_) mozilla::css::Side(((s_) + 2) & 3) +#define NS_OPPOSITE_SIDE(s_) mozilla::Side(((s_) + 2) & 3) already_AddRefed -nsComputedDOMStyle::GetRelativeOffset(mozilla::css::Side aSide) +nsComputedDOMStyle::GetRelativeOffset(mozilla::Side aSide) { RefPtr val = new nsROCSSPrimitiveValue; @@ -5207,7 +5207,7 @@ nsComputedDOMStyle::GetRelativeOffset(mozilla::css::Side aSide) } already_AddRefed -nsComputedDOMStyle::GetStickyOffset(mozilla::css::Side aSide) +nsComputedDOMStyle::GetStickyOffset(mozilla::Side aSide) { RefPtr val = new nsROCSSPrimitiveValue; @@ -5237,7 +5237,7 @@ nsComputedDOMStyle::GetStickyOffset(mozilla::css::Side aSide) already_AddRefed -nsComputedDOMStyle::GetStaticOffset(mozilla::css::Side aSide) +nsComputedDOMStyle::GetStaticOffset(mozilla::Side aSide) { RefPtr val = new nsROCSSPrimitiveValue; @@ -5246,7 +5246,7 @@ nsComputedDOMStyle::GetStaticOffset(mozilla::css::Side aSide) } already_AddRefed -nsComputedDOMStyle::GetPaddingWidthFor(mozilla::css::Side aSide) +nsComputedDOMStyle::GetPaddingWidthFor(mozilla::Side aSide) { RefPtr val = new nsROCSSPrimitiveValue; @@ -5302,7 +5302,7 @@ nsComputedDOMStyle::GetLineHeightCoord(nscoord& aCoord) } already_AddRefed -nsComputedDOMStyle::GetBorderColorsFor(mozilla::css::Side aSide) +nsComputedDOMStyle::GetBorderColorsFor(mozilla::Side aSide) { const nsStyleBorder *border = StyleBorder(); @@ -5330,7 +5330,7 @@ nsComputedDOMStyle::GetBorderColorsFor(mozilla::css::Side aSide) } already_AddRefed -nsComputedDOMStyle::GetBorderWidthFor(mozilla::css::Side aSide) +nsComputedDOMStyle::GetBorderWidthFor(mozilla::Side aSide) { RefPtr val = new nsROCSSPrimitiveValue; @@ -5347,7 +5347,7 @@ nsComputedDOMStyle::GetBorderWidthFor(mozilla::css::Side aSide) } already_AddRefed -nsComputedDOMStyle::GetBorderColorFor(mozilla::css::Side aSide) +nsComputedDOMStyle::GetBorderColorFor(mozilla::Side aSide) { RefPtr val = new nsROCSSPrimitiveValue; SetValueFromComplexColor(val, StyleBorder()->mBorderColor[aSide]); @@ -5355,7 +5355,7 @@ nsComputedDOMStyle::GetBorderColorFor(mozilla::css::Side aSide) } already_AddRefed -nsComputedDOMStyle::GetMarginWidthFor(mozilla::css::Side aSide) +nsComputedDOMStyle::GetMarginWidthFor(mozilla::Side aSide) { RefPtr val = new nsROCSSPrimitiveValue; @@ -5376,7 +5376,7 @@ nsComputedDOMStyle::GetMarginWidthFor(mozilla::css::Side aSide) } already_AddRefed -nsComputedDOMStyle::GetBorderStyleFor(mozilla::css::Side aSide) +nsComputedDOMStyle::GetBorderStyleFor(mozilla::Side aSide) { RefPtr val = new nsROCSSPrimitiveValue; val->SetIdent( diff --git a/layout/style/nsComputedDOMStyle.h b/layout/style/nsComputedDOMStyle.h index 996f8ffc42..ce19ca51c1 100644 --- a/layout/style/nsComputedDOMStyle.h +++ b/layout/style/nsComputedDOMStyle.h @@ -160,27 +160,27 @@ private: already_AddRefed GetEllipseRadii(const nsStyleCorners& aRadius, uint8_t aFullCorner); - already_AddRefed GetOffsetWidthFor(mozilla::css::Side aSide); + already_AddRefed GetOffsetWidthFor(mozilla::Side aSide); - already_AddRefed GetAbsoluteOffset(mozilla::css::Side aSide); + already_AddRefed GetAbsoluteOffset(mozilla::Side aSide); - already_AddRefed GetRelativeOffset(mozilla::css::Side aSide); + already_AddRefed GetRelativeOffset(mozilla::Side aSide); - already_AddRefed GetStickyOffset(mozilla::css::Side aSide); + already_AddRefed GetStickyOffset(mozilla::Side aSide); - already_AddRefed GetStaticOffset(mozilla::css::Side aSide); + already_AddRefed GetStaticOffset(mozilla::Side aSide); - already_AddRefed GetPaddingWidthFor(mozilla::css::Side aSide); + already_AddRefed GetPaddingWidthFor(mozilla::Side aSide); - already_AddRefed GetBorderColorsFor(mozilla::css::Side aSide); + already_AddRefed GetBorderColorsFor(mozilla::Side aSide); - already_AddRefed GetBorderStyleFor(mozilla::css::Side aSide); + already_AddRefed GetBorderStyleFor(mozilla::Side aSide); - already_AddRefed GetBorderWidthFor(mozilla::css::Side aSide); + already_AddRefed GetBorderWidthFor(mozilla::Side aSide); - already_AddRefed GetBorderColorFor(mozilla::css::Side aSide); + already_AddRefed GetBorderColorFor(mozilla::Side aSide); - already_AddRefed GetMarginWidthFor(mozilla::css::Side aSide); + already_AddRefed GetMarginWidthFor(mozilla::Side aSide); already_AddRefed GetSVGPaintFor(bool aFill); diff --git a/layout/style/nsStyleCoord.h b/layout/style/nsStyleCoord.h index bda17bbf50..ef37f85423 100644 --- a/layout/style/nsStyleCoord.h +++ b/layout/style/nsStyleCoord.h @@ -272,13 +272,13 @@ public: bool operator==(const nsStyleSides& aOther) const; bool operator!=(const nsStyleSides& aOther) const; - inline nsStyleUnit GetUnit(mozilla::css::Side aSide) const; + inline nsStyleUnit GetUnit(mozilla::Side aSide) const; inline nsStyleUnit GetLeftUnit() const; inline nsStyleUnit GetTopUnit() const; inline nsStyleUnit GetRightUnit() const; inline nsStyleUnit GetBottomUnit() const; - inline nsStyleCoord Get(mozilla::css::Side aSide) const; + inline nsStyleCoord Get(mozilla::Side aSide) const; inline nsStyleCoord GetLeft() const; inline nsStyleCoord GetTop() const; inline nsStyleCoord GetRight() const; @@ -311,13 +311,13 @@ public: // constructors). void Reset(); - inline void Set(mozilla::css::Side aSide, const nsStyleCoord& aCoord); + inline void Set(mozilla::Side aSide, const nsStyleCoord& aCoord); inline void SetLeft(const nsStyleCoord& aCoord); inline void SetTop(const nsStyleCoord& aCoord); inline void SetRight(const nsStyleCoord& aCoord); inline void SetBottom(const nsStyleCoord& aCoord); - nscoord ToLength(mozilla::css::Side aSide) const { + nscoord ToLength(mozilla::Side aSide) const { return nsStyleCoord::ToLength(mUnits[aSide], mValues[aSide]); } @@ -545,7 +545,7 @@ inline bool nsStyleSides::operator!=(const nsStyleSides& aOther) const return !((*this) == aOther); } -inline nsStyleUnit nsStyleSides::GetUnit(mozilla::css::Side aSide) const +inline nsStyleUnit nsStyleSides::GetUnit(mozilla::Side aSide) const { return (nsStyleUnit)mUnits[aSide]; } @@ -570,7 +570,7 @@ inline nsStyleUnit nsStyleSides::GetBottomUnit() const return GetUnit(NS_SIDE_BOTTOM); } -inline nsStyleCoord nsStyleSides::Get(mozilla::css::Side aSide) const +inline nsStyleCoord nsStyleSides::Get(mozilla::Side aSide) const { return nsStyleCoord(mValues[aSide], nsStyleUnit(mUnits[aSide])); } @@ -595,7 +595,7 @@ inline nsStyleCoord nsStyleSides::GetBottom() const return Get(NS_SIDE_BOTTOM); } -inline void nsStyleSides::Set(mozilla::css::Side aSide, const nsStyleCoord& aCoord) +inline void nsStyleSides::Set(mozilla::Side aSide, const nsStyleCoord& aCoord) { nsStyleCoord::SetValue(mUnits[aSide], mValues[aSide], aCoord); } diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index c28f2bca9e..b6d5874239 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -1207,7 +1207,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleBorder } } - void ClearBorderColors(mozilla::css::Side aSide) { + void ClearBorderColors(mozilla::Side aSide) { if (mBorderColors && mBorderColors[aSide]) { delete mBorderColors[aSide]; mBorderColors[aSide] = nullptr; @@ -1219,13 +1219,13 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleBorder // Note that this does *not* consider the effects of 'border-image': // if border-style is none, but there is a loaded border image, // HasVisibleStyle will be false even though there *is* a border. - bool HasVisibleStyle(mozilla::css::Side aSide) const + bool HasVisibleStyle(mozilla::Side aSide) const { return IsVisibleBorderStyle(mBorderStyle[aSide]); } // aBorderWidth is in twips - void SetBorderWidth(mozilla::css::Side aSide, nscoord aBorderWidth) + void SetBorderWidth(mozilla::Side aSide, nscoord aBorderWidth) { nscoord roundedWidth = NS_ROUND_BORDER_TO_PIXELS(aBorderWidth, mTwipsPerPixel); @@ -1252,18 +1252,18 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleBorder // this is zero if and only if there is no border to be painted for this // side. That is, this value takes into account the border style and the // value is rounded to the nearest device pixel by NS_ROUND_BORDER_TO_PIXELS. - nscoord GetComputedBorderWidth(mozilla::css::Side aSide) const + nscoord GetComputedBorderWidth(mozilla::Side aSide) const { return GetComputedBorder().Side(aSide); } - uint8_t GetBorderStyle(mozilla::css::Side aSide) const + uint8_t GetBorderStyle(mozilla::Side aSide) const { NS_ASSERTION(aSide <= NS_SIDE_LEFT, "bad side"); return mBorderStyle[aSide]; } - void SetBorderStyle(mozilla::css::Side aSide, uint8_t aStyle) + void SetBorderStyle(mozilla::Side aSide, uint8_t aStyle) { NS_ASSERTION(aSide <= NS_SIDE_LEFT, "bad side"); mBorderStyle[aSide] = aStyle; @@ -1826,7 +1826,7 @@ public: bool MaxHeightDependsOnContainer() const { return HeightCoordDependsOnContainer(mMaxHeight); } - bool OffsetHasPercent(mozilla::css::Side aSide) const + bool OffsetHasPercent(mozilla::Side aSide) const { return mOffset.Get(aSide).HasPercent(); } From ec7351a5d47ae02ae8de9b117634e25160b24cc0 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 1 Aug 2024 17:28:01 +0200 Subject: [PATCH 08/25] Issue #1925 - Remove use of NS_SIDE_* macros. --- dom/base/DOMIntersectionObserver.cpp | 2 +- dom/html/nsGenericHTMLElement.cpp | 4 +- gfx/2d/BaseRect.h | 24 ++-- gfx/2d/Types.h | 20 ++-- gfx/src/nsRect.cpp | 10 +- gfx/thebes/gfxRect.h | 16 +-- layout/base/BorderConsts.h | 8 +- layout/base/nsCSSRendering.cpp | 86 ++++++------- layout/base/nsCSSRenderingBorders.cpp | 166 +++++++++++++------------- layout/base/nsLayoutUtils.cpp | 20 ++-- layout/generic/WritingModes.h | 40 +++---- layout/generic/nsColumnSetFrame.cpp | 8 +- layout/generic/nsFrame.cpp | 8 +- layout/generic/nsInlineFrame.cpp | 8 +- layout/generic/nsLineLayout.cpp | 4 +- layout/generic/nsPageContentFrame.cpp | 2 +- layout/mathml/nsMathMLmtableFrame.cpp | 12 +- layout/style/StyleAnimationValue.cpp | 8 +- layout/style/nsCSSDataBlock.cpp | 4 +- layout/style/nsCSSProps.cpp | 4 +- layout/style/nsCSSValue.cpp | 4 +- layout/style/nsComputedDOMStyle.cpp | 72 +++++------ layout/style/nsStyleCoord.cpp | 56 ++++----- layout/style/nsStyleCoord.h | 24 ++-- layout/style/nsStyleStruct.h | 4 +- layout/xul/BoxObject.cpp | 8 +- layout/xul/nsMenuPopupFrame.cpp | 8 +- layout/xul/nsResizerFrame.cpp | 4 +- layout/xul/nsStackLayout.cpp | 8 +- layout/xul/tree/nsTreeBodyFrame.cpp | 2 +- 30 files changed, 319 insertions(+), 325 deletions(-) diff --git a/dom/base/DOMIntersectionObserver.cpp b/dom/base/DOMIntersectionObserver.cpp index aaa1609b33..ccfc725639 100644 --- a/dom/base/DOMIntersectionObserver.cpp +++ b/dom/base/DOMIntersectionObserver.cpp @@ -340,7 +340,7 @@ DOMIntersectionObserver::Update(nsIDocument* aDocument, DOMHighResTimeStamp time nsMargin rootMargin; NS_FOR_CSS_SIDES(side) { - nscoord basis = side == NS_SIDE_TOP || side == NS_SIDE_BOTTOM ? + nscoord basis = side == eSideTop || side == eSideBottom ? rootRect.height : rootRect.width; nsCSSValue value = mRootMargin.*nsCSSRect::sides[side]; nsStyleCoord coord; diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp index 8375c6df8e..00eb7c6948 100644 --- a/dom/html/nsGenericHTMLElement.cpp +++ b/dom/html/nsGenericHTMLElement.cpp @@ -340,8 +340,8 @@ nsGenericHTMLElement::GetOffsetRect(CSSIntRect& aRect) if (parent && parent->StylePosition()->mBoxSizing != StyleBoxSizing::Border) { const nsStyleBorder* border = parent->StyleBorder(); - origin.x -= border->GetComputedBorderWidth(NS_SIDE_LEFT); - origin.y -= border->GetComputedBorderWidth(NS_SIDE_TOP); + origin.x -= border->GetComputedBorderWidth(eSideLeft); + origin.y -= border->GetComputedBorderWidth(eSideTop); } // XXX We should really consider subtracting out padding for diff --git a/gfx/2d/BaseRect.h b/gfx/2d/BaseRect.h index a4e5e4c1d0..561a126f64 100644 --- a/gfx/2d/BaseRect.h +++ b/gfx/2d/BaseRect.h @@ -389,19 +389,19 @@ struct BaseRect { } Point CCWCorner(mozilla::Side side) const { switch (side) { - case NS_SIDE_TOP: return TopLeft(); - case NS_SIDE_RIGHT: return TopRight(); - case NS_SIDE_BOTTOM: return BottomRight(); - case NS_SIDE_LEFT: return BottomLeft(); + case eSideTop: return TopLeft(); + case eSideRight: return TopRight(); + case eSideBottom: return BottomRight(); + case eSideLeft: return BottomLeft(); } MOZ_CRASH("GFX: Incomplete switch"); } Point CWCorner(mozilla::Side side) const { switch (side) { - case NS_SIDE_TOP: return TopRight(); - case NS_SIDE_RIGHT: return BottomRight(); - case NS_SIDE_BOTTOM: return BottomLeft(); - case NS_SIDE_LEFT: return TopLeft(); + case eSideTop: return TopRight(); + case eSideRight: return BottomRight(); + case eSideBottom: return BottomLeft(); + case eSideLeft: return TopLeft(); } MOZ_CRASH("GFX: Incomplete switch"); } @@ -422,10 +422,10 @@ struct BaseRect { T Edge(mozilla::Side aSide) const { switch (aSide) { - case NS_SIDE_TOP: return Y(); - case NS_SIDE_RIGHT: return XMost(); - case NS_SIDE_BOTTOM: return YMost(); - case NS_SIDE_LEFT: return X(); + case eSideTop: return Y(); + case eSideRight: return XMost(); + case eSideBottom: return YMost(); + case eSideLeft: return X(); } MOZ_CRASH("GFX: Incomplete switch"); } diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 4d0d9427b1..63545946c2 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -8,7 +8,6 @@ #include "mozilla/EndianUtils.h" #include "mozilla/MacroArgs.h" // for MOZ_CONCAT -#include "nsDebug.h" #include #include @@ -389,27 +388,22 @@ enum SideBits { eSideBitsAll = eSideBitsTopBottom | eSideBitsLeftRight }; -#define NS_SIDE_TOP mozilla::eSideTop -#define NS_SIDE_RIGHT mozilla::eSideRight -#define NS_SIDE_BOTTOM mozilla::eSideBottom -#define NS_SIDE_LEFT mozilla::eSideLeft - // Creates a for loop that walks over the four mozilla::Side values. // We use an int32_t helper variable (instead of a Side) for our loop counter, // to avoid triggering undefined behavior just before we exit the loop (at // which point the counter is incremented beyond the largest valid Side value). -#define NS_FOR_CSS_SIDES(var_) \ - int32_t MOZ_CONCAT(var_,__LINE__) = NS_SIDE_TOP; \ +#define NS_FOR_CSS_SIDES(var_) \ + int32_t MOZ_CONCAT(var_,__LINE__) = mozilla::eSideTop; \ for (mozilla::Side var_; \ - MOZ_CONCAT(var_,__LINE__) <= NS_SIDE_LEFT && \ + MOZ_CONCAT(var_,__LINE__) <= mozilla::eSideLeft && \ ((var_ = mozilla::Side(MOZ_CONCAT(var_,__LINE__))), true); \ MOZ_CONCAT(var_,__LINE__)++) static inline Side operator++(Side& side, int) { - NS_PRECONDITION(side >= NS_SIDE_TOP && - side <= NS_SIDE_LEFT, "Out of range side"); - side = Side(side + 1); - return side; + MOZ_ASSERT(side >= eSideTop && side <= eSideLeft, + "Out of range side"); + side = Side(side + 1); + return side; } } // namespace mozilla diff --git a/gfx/src/nsRect.cpp b/gfx/src/nsRect.cpp index 79ccb1e6f1..85be958f0f 100644 --- a/gfx/src/nsRect.cpp +++ b/gfx/src/nsRect.cpp @@ -4,16 +4,16 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsRect.h" -#include "mozilla/gfx/Types.h" // for NS_SIDE_BOTTOM, etc +#include "mozilla/gfx/Types.h" // for eSideBottom, etc #include "mozilla/CheckedInt.h" // for CheckedInt #include "nsDeviceContext.h" // for nsDeviceContext #include "nsString.h" // for nsAutoString, etc #include "nsMargin.h" // for nsMargin -static_assert((int(NS_SIDE_TOP) == 0) && - (int(NS_SIDE_RIGHT) == 1) && - (int(NS_SIDE_BOTTOM) == 2) && - (int(NS_SIDE_LEFT) == 3), +static_assert((int(eSideTop) == 0) && + (int(eSideRight) == 1) && + (int(eSideBottom) == 2) && + (int(eSideLeft) == 3), "The mozilla::Side sequence must match the nsMargin nscoord sequence"); const mozilla::gfx::IntRect& GetMaxSizedIntRect() { diff --git a/gfx/thebes/gfxRect.h b/gfx/thebes/gfxRect.h index 56d5c43e59..8804ff86b2 100644 --- a/gfx/thebes/gfxRect.h +++ b/gfx/thebes/gfxRect.h @@ -90,20 +90,20 @@ struct gfxRect : gfxPoint CCWCorner(mozilla::Side side) const { switch (side) { - case NS_SIDE_TOP: return TopLeft(); - case NS_SIDE_RIGHT: return TopRight(); - case NS_SIDE_BOTTOM: return BottomRight(); - case NS_SIDE_LEFT: return BottomLeft(); + case mozilla::eSideTop: return TopLeft(); + case mozilla::eSideRight: return TopRight(); + case mozilla::eSideBottom: return BottomRight(); + case mozilla::eSideLeft: return BottomLeft(); } MOZ_CRASH("Incomplete switch"); } gfxPoint CWCorner(mozilla::Side side) const { switch (side) { - case NS_SIDE_TOP: return TopRight(); - case NS_SIDE_RIGHT: return BottomRight(); - case NS_SIDE_BOTTOM: return BottomLeft(); - case NS_SIDE_LEFT: return TopLeft(); + case mozilla::eSideTop: return TopRight(); + case mozilla::eSideRight: return BottomRight(); + case mozilla::eSideBottom: return BottomLeft(); + case mozilla::eSideLeft: return TopLeft(); } MOZ_CRASH("Incomplete switch"); } diff --git a/layout/base/BorderConsts.h b/layout/base/BorderConsts.h index 14b937399e..9bd44c0199 100644 --- a/layout/base/BorderConsts.h +++ b/layout/base/BorderConsts.h @@ -11,10 +11,10 @@ #define DASH_LENGTH 3 // 3 times longer than dot // some shorthand for side bits -#define SIDE_BIT_TOP (1 << NS_SIDE_TOP) -#define SIDE_BIT_RIGHT (1 << NS_SIDE_RIGHT) -#define SIDE_BIT_BOTTOM (1 << NS_SIDE_BOTTOM) -#define SIDE_BIT_LEFT (1 << NS_SIDE_LEFT) +#define SIDE_BIT_TOP (1 << eSideTop) +#define SIDE_BIT_RIGHT (1 << eSideRight) +#define SIDE_BIT_BOTTOM (1 << eSideBottom) +#define SIDE_BIT_LEFT (1 << eSideLeft) #define SIDE_BITS_ALL (SIDE_BIT_TOP|SIDE_BIT_RIGHT|SIDE_BIT_BOTTOM|SIDE_BIT_LEFT) #define C_TL NS_CORNER_TOP_LEFT diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index 48b140d156..a7424cf252 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -475,24 +475,24 @@ MakeBevelColor(mozilla::Side whichSide, uint8_t style, (style == NS_STYLE_BORDER_STYLE_RIDGE)) { // Flip colors for these two border styles switch (whichSide) { - case NS_SIDE_BOTTOM: whichSide = NS_SIDE_TOP; break; - case NS_SIDE_RIGHT: whichSide = NS_SIDE_LEFT; break; - case NS_SIDE_TOP: whichSide = NS_SIDE_BOTTOM; break; - case NS_SIDE_LEFT: whichSide = NS_SIDE_RIGHT; break; + case eSideBottom: whichSide = eSideTop; break; + case eSideRight: whichSide = eSideLeft; break; + case eSideTop: whichSide = eSideBottom; break; + case eSideLeft: whichSide = eSideRight; break; } } switch (whichSide) { - case NS_SIDE_BOTTOM: + case eSideBottom: theColor = colors[1]; break; - case NS_SIDE_RIGHT: + case eSideRight: theColor = colors[1]; break; - case NS_SIDE_TOP: + case eSideTop: theColor = colors[0]; break; - case NS_SIDE_LEFT: + case eSideLeft: default: theColor = colors[0]; break; @@ -1483,10 +1483,10 @@ nsCSSRendering::PaintBoxShadowOuter(nsPresContext* aPresContext, Float borderSizes[4]; - borderSizes[NS_SIDE_LEFT] = spreadDistance; - borderSizes[NS_SIDE_TOP] = spreadDistance; - borderSizes[NS_SIDE_RIGHT] = spreadDistance; - borderSizes[NS_SIDE_BOTTOM] = spreadDistance; + borderSizes[eSideLeft] = spreadDistance; + borderSizes[eSideTop] = spreadDistance; + borderSizes[eSideRight] = spreadDistance; + borderSizes[eSideBottom] = spreadDistance; nsCSSBorderRenderer::ComputeOuterRadii(borderRadii, borderSizes, &clipRectRadii); @@ -1595,19 +1595,19 @@ nsCSSRendering::PaintBoxShadowInner(nsPresContext* aPresContext, // See PaintBoxShadowOuter and bug 514670 if (innerRadii[C_TL].width > 0 || innerRadii[C_BL].width > 0) { - borderSizes[NS_SIDE_LEFT] = spreadDistance; + borderSizes[eSideLeft] = spreadDistance; } if (innerRadii[C_TL].height > 0 || innerRadii[C_TR].height > 0) { - borderSizes[NS_SIDE_TOP] = spreadDistance; + borderSizes[eSideTop] = spreadDistance; } if (innerRadii[C_TR].width > 0 || innerRadii[C_BR].width > 0) { - borderSizes[NS_SIDE_RIGHT] = spreadDistance; + borderSizes[eSideRight] = spreadDistance; } if (innerRadii[C_BL].height > 0 || innerRadii[C_BR].height > 0) { - borderSizes[NS_SIDE_BOTTOM] = spreadDistance; + borderSizes[eSideBottom] = spreadDistance; } nsCSSBorderRenderer::ComputeInnerRadii(innerRadii, borderSizes, @@ -4264,32 +4264,32 @@ DrawSolidBorderSegment(DrawTarget& aDrawTarget, Float startBevelOffset = NSAppUnitsToFloatPixels(aStartBevelOffset, aAppUnitsPerDevPixel); switch(aStartBevelSide) { - case NS_SIDE_TOP: + case eSideTop: poly[0].x += startBevelOffset; break; - case NS_SIDE_BOTTOM: + case eSideBottom: poly[3].x += startBevelOffset; break; - case NS_SIDE_RIGHT: + case eSideRight: poly[1].y += startBevelOffset; break; - case NS_SIDE_LEFT: + case eSideLeft: poly[0].y += startBevelOffset; } Float endBevelOffset = NSAppUnitsToFloatPixels(aEndBevelOffset, aAppUnitsPerDevPixel); switch(aEndBevelSide) { - case NS_SIDE_TOP: + case eSideTop: poly[1].x -= endBevelOffset; break; - case NS_SIDE_BOTTOM: + case eSideBottom: poly[2].x -= endBevelOffset; break; - case NS_SIDE_RIGHT: + case eSideRight: poly[2].y -= endBevelOffset; break; - case NS_SIDE_LEFT: + case eSideLeft: poly[3].y -= endBevelOffset; } @@ -4341,7 +4341,7 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, uint8_t aEndBevelSide, nscoord aEndBevelOffset) { - bool horizontal = ((NS_SIDE_TOP == aStartBevelSide) || (NS_SIDE_BOTTOM == aStartBevelSide)); + bool horizontal = ((eSideTop == aStartBevelSide) || (eSideBottom == aStartBevelSide)); nscoord twipsPerPixel = NSIntPixelsToAppUnits(1, aAppUnitsPerCSSPixel); uint8_t ridgeGroove = NS_STYLE_BORDER_STYLE_RIDGE; @@ -4425,7 +4425,7 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, ? RoundFloatToPixel(0.5f * (float)aStartBevelOffset, twipsPerPixel, true) : 0; nscoord endBevel = (aEndBevelOffset > 0) ? RoundFloatToPixel(0.5f * (float)aEndBevelOffset, twipsPerPixel, true) : 0; - mozilla::Side ridgeGrooveSide = (horizontal) ? NS_SIDE_TOP : NS_SIDE_LEFT; + mozilla::Side ridgeGrooveSide = (horizontal) ? eSideTop : eSideLeft; // FIXME: In theory, this should use the visited-dependent // background color, but I don't care. nscolor bevelColor = MakeBevelColor(ridgeGrooveSide, ridgeGroove, @@ -4436,11 +4436,11 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, if (horizontal) { // top, bottom half = RoundFloatToPixel(0.5f * (float)aBorder.height, twipsPerPixel); rect.height = half; - if (NS_SIDE_TOP == aStartBevelSide) { + if (eSideTop == aStartBevelSide) { rect.x += startBevel; rect.width -= startBevel; } - if (NS_SIDE_TOP == aEndBevelSide) { + if (eSideTop == aEndBevelSide) { rect.width -= endBevel; } DrawSolidBorderSegment(aDrawTarget, rect, bevelColor, @@ -4451,11 +4451,11 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, else { // left, right half = RoundFloatToPixel(0.5f * (float)aBorder.width, twipsPerPixel); rect.width = half; - if (NS_SIDE_LEFT == aStartBevelSide) { + if (eSideLeft == aStartBevelSide) { rect.y += startBevel; rect.height -= startBevel; } - if (NS_SIDE_LEFT == aEndBevelSide) { + if (eSideLeft == aEndBevelSide) { rect.height -= endBevel; } DrawSolidBorderSegment(aDrawTarget, rect, bevelColor, @@ -4465,7 +4465,7 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, } rect = aBorder; - ridgeGrooveSide = (NS_SIDE_TOP == ridgeGrooveSide) ? NS_SIDE_BOTTOM : NS_SIDE_RIGHT; + ridgeGrooveSide = (eSideTop == ridgeGrooveSide) ? eSideBottom : eSideRight; // FIXME: In theory, this should use the visited-dependent // background color, but I don't care. bevelColor = MakeBevelColor(ridgeGrooveSide, ridgeGroove, @@ -4473,11 +4473,11 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, if (horizontal) { rect.y = rect.y + half; rect.height = aBorder.height - half; - if (NS_SIDE_BOTTOM == aStartBevelSide) { + if (eSideBottom == aStartBevelSide) { rect.x += startBevel; rect.width -= startBevel; } - if (NS_SIDE_BOTTOM == aEndBevelSide) { + if (eSideBottom == aEndBevelSide) { rect.width -= endBevel; } DrawSolidBorderSegment(aDrawTarget, rect, bevelColor, @@ -4488,11 +4488,11 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, else { rect.x = rect.x + half; rect.width = aBorder.width - half; - if (NS_SIDE_RIGHT == aStartBevelSide) { + if (eSideRight == aStartBevelSide) { rect.y += aStartBevelOffset - startBevel; rect.height -= startBevel; } - if (NS_SIDE_RIGHT == aEndBevelSide) { + if (eSideRight == aEndBevelSide) { rect.height -= endBevel; } DrawSolidBorderSegment(aDrawTarget, rect, bevelColor, @@ -4517,11 +4517,11 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, // draw the top line or rect nsRect topRect(aBorder.x, aBorder.y, aBorder.width, thirdHeight); - if (NS_SIDE_TOP == aStartBevelSide) { + if (eSideTop == aStartBevelSide) { topRect.x += aStartBevelOffset - startBevel; topRect.width -= aStartBevelOffset - startBevel; } - if (NS_SIDE_TOP == aEndBevelSide) { + if (eSideTop == aEndBevelSide) { topRect.width -= aEndBevelOffset - endBevel; } DrawSolidBorderSegment(aDrawTarget, topRect, aBorderColor, @@ -4532,11 +4532,11 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, // draw the botom line or rect nscoord heightOffset = aBorder.height - thirdHeight; nsRect bottomRect(aBorder.x, aBorder.y + heightOffset, aBorder.width, aBorder.height - heightOffset); - if (NS_SIDE_BOTTOM == aStartBevelSide) { + if (eSideBottom == aStartBevelSide) { bottomRect.x += aStartBevelOffset - startBevel; bottomRect.width -= aStartBevelOffset - startBevel; } - if (NS_SIDE_BOTTOM == aEndBevelSide) { + if (eSideBottom == aEndBevelSide) { bottomRect.width -= aEndBevelOffset - endBevel; } DrawSolidBorderSegment(aDrawTarget, bottomRect, aBorderColor, @@ -4548,11 +4548,11 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, nscoord thirdWidth = RoundFloatToPixel(0.333333f * (float)aBorder.width, twipsPerPixel); nsRect leftRect(aBorder.x, aBorder.y, thirdWidth, aBorder.height); - if (NS_SIDE_LEFT == aStartBevelSide) { + if (eSideLeft == aStartBevelSide) { leftRect.y += aStartBevelOffset - startBevel; leftRect.height -= aStartBevelOffset - startBevel; } - if (NS_SIDE_LEFT == aEndBevelSide) { + if (eSideLeft == aEndBevelSide) { leftRect.height -= aEndBevelOffset - endBevel; } DrawSolidBorderSegment(aDrawTarget, leftRect, aBorderColor, @@ -4562,11 +4562,11 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, nscoord widthOffset = aBorder.width - thirdWidth; nsRect rightRect(aBorder.x + widthOffset, aBorder.y, aBorder.width - widthOffset, aBorder.height); - if (NS_SIDE_RIGHT == aStartBevelSide) { + if (eSideRight == aStartBevelSide) { rightRect.y += aStartBevelOffset - startBevel; rightRect.height -= aStartBevelOffset - startBevel; } - if (NS_SIDE_RIGHT == aEndBevelSide) { + if (eSideRight == aEndBevelSide) { rightRect.height -= aEndBevelOffset - endBevel; } DrawSolidBorderSegment(aDrawTarget, rightRect, aBorderColor, diff --git a/layout/base/nsCSSRenderingBorders.cpp b/layout/base/nsCSSRenderingBorders.cpp index 903b39e550..a73f821508 100644 --- a/layout/base/nsCSSRenderingBorders.cpp +++ b/layout/base/nsCSSRenderingBorders.cpp @@ -116,13 +116,13 @@ AllCornersZeroSize(const RectCornerRadii& corners) { static mozilla::Side GetHorizontalSide(mozilla::css::Corner aCorner) { - return (aCorner == C_TL || aCorner == C_TR) ? NS_SIDE_TOP : NS_SIDE_BOTTOM; + return (aCorner == C_TL || aCorner == C_TR) ? eSideTop : eSideBottom; } static mozilla::Side GetVerticalSide(mozilla::css::Corner aCorner) { - return (aCorner == C_TL || aCorner == C_BL) ? NS_SIDE_LEFT : NS_SIDE_RIGHT; + return (aCorner == C_TL || aCorner == C_BL) ? eSideLeft : eSideRight; } static mozilla::css::Corner @@ -147,7 +147,7 @@ IsSingleSide(int aSides) static bool IsHorizontalSide(mozilla::Side aSide) { - return aSide == NS_SIDE_TOP || aSide == NS_SIDE_BOTTOM; + return aSide == eSideTop || aSide == eSideBottom; } typedef enum { @@ -215,17 +215,17 @@ nsCSSBorderRenderer::ComputeInnerRadii(const RectCornerRadii& aRadii, { RectCornerRadii& iRadii = *aInnerRadiiRet; - iRadii[C_TL].width = std::max(0.f, aRadii[C_TL].width - aBorderSizes[NS_SIDE_LEFT]); - iRadii[C_TL].height = std::max(0.f, aRadii[C_TL].height - aBorderSizes[NS_SIDE_TOP]); + iRadii[C_TL].width = std::max(0.f, aRadii[C_TL].width - aBorderSizes[eSideLeft]); + iRadii[C_TL].height = std::max(0.f, aRadii[C_TL].height - aBorderSizes[eSideTop]); - iRadii[C_TR].width = std::max(0.f, aRadii[C_TR].width - aBorderSizes[NS_SIDE_RIGHT]); - iRadii[C_TR].height = std::max(0.f, aRadii[C_TR].height - aBorderSizes[NS_SIDE_TOP]); + iRadii[C_TR].width = std::max(0.f, aRadii[C_TR].width - aBorderSizes[eSideRight]); + iRadii[C_TR].height = std::max(0.f, aRadii[C_TR].height - aBorderSizes[eSideTop]); - iRadii[C_BR].width = std::max(0.f, aRadii[C_BR].width - aBorderSizes[NS_SIDE_RIGHT]); - iRadii[C_BR].height = std::max(0.f, aRadii[C_BR].height - aBorderSizes[NS_SIDE_BOTTOM]); + iRadii[C_BR].width = std::max(0.f, aRadii[C_BR].width - aBorderSizes[eSideRight]); + iRadii[C_BR].height = std::max(0.f, aRadii[C_BR].height - aBorderSizes[eSideBottom]); - iRadii[C_BL].width = std::max(0.f, aRadii[C_BL].width - aBorderSizes[NS_SIDE_LEFT]); - iRadii[C_BL].height = std::max(0.f, aRadii[C_BL].height - aBorderSizes[NS_SIDE_BOTTOM]); + iRadii[C_BL].width = std::max(0.f, aRadii[C_BL].width - aBorderSizes[eSideLeft]); + iRadii[C_BL].height = std::max(0.f, aRadii[C_BL].height - aBorderSizes[eSideBottom]); } /* static */ void @@ -240,23 +240,23 @@ nsCSSBorderRenderer::ComputeOuterRadii(const RectCornerRadii& aRadii, // round the edges that have radii > 0.0 to start with if (aRadii[C_TL].width > 0.f && aRadii[C_TL].height > 0.f) { - oRadii[C_TL].width = std::max(0.f, aRadii[C_TL].width + aBorderSizes[NS_SIDE_LEFT]); - oRadii[C_TL].height = std::max(0.f, aRadii[C_TL].height + aBorderSizes[NS_SIDE_TOP]); + oRadii[C_TL].width = std::max(0.f, aRadii[C_TL].width + aBorderSizes[eSideLeft]); + oRadii[C_TL].height = std::max(0.f, aRadii[C_TL].height + aBorderSizes[eSideTop]); } if (aRadii[C_TR].width > 0.f && aRadii[C_TR].height > 0.f) { - oRadii[C_TR].width = std::max(0.f, aRadii[C_TR].width + aBorderSizes[NS_SIDE_RIGHT]); - oRadii[C_TR].height = std::max(0.f, aRadii[C_TR].height + aBorderSizes[NS_SIDE_TOP]); + oRadii[C_TR].width = std::max(0.f, aRadii[C_TR].width + aBorderSizes[eSideRight]); + oRadii[C_TR].height = std::max(0.f, aRadii[C_TR].height + aBorderSizes[eSideTop]); } if (aRadii[C_BR].width > 0.f && aRadii[C_BR].height > 0.f) { - oRadii[C_BR].width = std::max(0.f, aRadii[C_BR].width + aBorderSizes[NS_SIDE_RIGHT]); - oRadii[C_BR].height = std::max(0.f, aRadii[C_BR].height + aBorderSizes[NS_SIDE_BOTTOM]); + oRadii[C_BR].width = std::max(0.f, aRadii[C_BR].width + aBorderSizes[eSideRight]); + oRadii[C_BR].height = std::max(0.f, aRadii[C_BR].height + aBorderSizes[eSideBottom]); } if (aRadii[C_BL].width > 0.f && aRadii[C_BL].height > 0.f) { - oRadii[C_BL].width = std::max(0.f, aRadii[C_BL].width + aBorderSizes[NS_SIDE_LEFT]); - oRadii[C_BL].height = std::max(0.f, aRadii[C_BL].height + aBorderSizes[NS_SIDE_BOTTOM]); + oRadii[C_BL].width = std::max(0.f, aRadii[C_BL].width + aBorderSizes[eSideLeft]); + oRadii[C_BL].height = std::max(0.f, aRadii[C_BL].height + aBorderSizes[eSideBottom]); } } @@ -265,10 +265,10 @@ ComputeBorderCornerDimensions(const Float* aBorderWidths, const RectCornerRadii& aRadii, RectCornerRadii* aDimsRet) { - Float leftWidth = aBorderWidths[NS_SIDE_LEFT]; - Float topWidth = aBorderWidths[NS_SIDE_TOP]; - Float rightWidth = aBorderWidths[NS_SIDE_RIGHT]; - Float bottomWidth = aBorderWidths[NS_SIDE_BOTTOM]; + Float leftWidth = aBorderWidths[eSideLeft]; + Float topWidth = aBorderWidths[eSideTop]; + Float rightWidth = aBorderWidths[eSideRight]; + Float bottomWidth = aBorderWidths[eSideBottom]; if (AllCornersZeroSize(aRadii)) { // These will always be in pixel units from CSS @@ -458,15 +458,15 @@ nsCSSBorderRenderer::GetSideClipWithoutCornersRect(mozilla::Side aSide) // must be the border height; the x start must take into account // the corner size (which may be bigger than the right or left // side's width). The same applies to the right and left sides. - if (aSide == NS_SIDE_TOP) { + if (aSide == eSideTop) { offset.x = mBorderCornerDimensions[C_TL].width; - } else if (aSide == NS_SIDE_RIGHT) { - offset.x = mOuterRect.Width() - mBorderWidths[NS_SIDE_RIGHT]; + } else if (aSide == eSideRight) { + offset.x = mOuterRect.Width() - mBorderWidths[eSideRight]; offset.y = mBorderCornerDimensions[C_TR].height; - } else if (aSide == NS_SIDE_BOTTOM) { + } else if (aSide == eSideBottom) { offset.x = mBorderCornerDimensions[C_BL].width; - offset.y = mOuterRect.Height() - mBorderWidths[NS_SIDE_BOTTOM]; - } else if (aSide == NS_SIDE_LEFT) { + offset.y = mOuterRect.Height() - mBorderWidths[eSideBottom]; + } else if (aSide == eSideLeft) { offset.y = mBorderCornerDimensions[C_TL].height; } @@ -681,7 +681,7 @@ nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::Side aSide, { // Calculate the end point of the side for dashed/dotted border, that is also // the end point of the corner curve. The point is specified by aSide and - // aCorner. (e.g. NS_SIDE_TOP and C_TL means the left end of border-top) + // aCorner. (e.g. eSideTop and C_TL means the left end of border-top) // // // aCorner aSide @@ -1163,27 +1163,27 @@ nsCSSBorderRenderer::FillSolidBorder(const Rect& aOuterRect, // compute base rects for each side if (aSides & SIDE_BIT_TOP) { - r[NS_SIDE_TOP] = + r[eSideTop] = Rect(aOuterRect.X(), aOuterRect.Y(), - aOuterRect.Width(), aBorderSizes[NS_SIDE_TOP]); + aOuterRect.Width(), aBorderSizes[eSideTop]); } if (aSides & SIDE_BIT_BOTTOM) { - r[NS_SIDE_BOTTOM] = - Rect(aOuterRect.X(), aOuterRect.YMost() - aBorderSizes[NS_SIDE_BOTTOM], - aOuterRect.Width(), aBorderSizes[NS_SIDE_BOTTOM]); + r[eSideBottom] = + Rect(aOuterRect.X(), aOuterRect.YMost() - aBorderSizes[eSideBottom], + aOuterRect.Width(), aBorderSizes[eSideBottom]); } if (aSides & SIDE_BIT_LEFT) { - r[NS_SIDE_LEFT] = + r[eSideLeft] = Rect(aOuterRect.X(), aOuterRect.Y(), - aBorderSizes[NS_SIDE_LEFT], aOuterRect.Height()); + aBorderSizes[eSideLeft], aOuterRect.Height()); } if (aSides & SIDE_BIT_RIGHT) { - r[NS_SIDE_RIGHT] = - Rect(aOuterRect.XMost() - aBorderSizes[NS_SIDE_RIGHT], aOuterRect.Y(), - aBorderSizes[NS_SIDE_RIGHT], aOuterRect.Height()); + r[eSideRight] = + Rect(aOuterRect.XMost() - aBorderSizes[eSideRight], aOuterRect.Y(), + aBorderSizes[eSideRight], aOuterRect.Height()); } // If two sides meet at a corner that we're rendering, then @@ -1193,24 +1193,24 @@ nsCSSBorderRenderer::FillSolidBorder(const Rect& aOuterRect, if ((aSides & (SIDE_BIT_TOP | SIDE_BIT_LEFT)) == (SIDE_BIT_TOP | SIDE_BIT_LEFT)) { // adjust the left's top down a bit - r[NS_SIDE_LEFT].y += aBorderSizes[NS_SIDE_TOP]; - r[NS_SIDE_LEFT].height -= aBorderSizes[NS_SIDE_TOP]; + r[eSideLeft].y += aBorderSizes[eSideTop]; + r[eSideLeft].height -= aBorderSizes[eSideTop]; } if ((aSides & (SIDE_BIT_TOP | SIDE_BIT_RIGHT)) == (SIDE_BIT_TOP | SIDE_BIT_RIGHT)) { // adjust the top's left a bit - r[NS_SIDE_TOP].width -= aBorderSizes[NS_SIDE_RIGHT]; + r[eSideTop].width -= aBorderSizes[eSideRight]; } if ((aSides & (SIDE_BIT_BOTTOM | SIDE_BIT_RIGHT)) == (SIDE_BIT_BOTTOM | SIDE_BIT_RIGHT)) { // adjust the right's bottom a bit - r[NS_SIDE_RIGHT].height -= aBorderSizes[NS_SIDE_BOTTOM]; + r[eSideRight].height -= aBorderSizes[eSideBottom]; } if ((aSides & (SIDE_BIT_BOTTOM | SIDE_BIT_LEFT)) == (SIDE_BIT_BOTTOM | SIDE_BIT_LEFT)) { // adjust the bottom's left a bit - r[NS_SIDE_BOTTOM].x += aBorderSizes[NS_SIDE_LEFT]; - r[NS_SIDE_BOTTOM].width -= aBorderSizes[NS_SIDE_LEFT]; + r[eSideBottom].x += aBorderSizes[eSideLeft]; + r[eSideBottom].width -= aBorderSizes[eSideLeft]; } // Filling these one by one is faster than filling them all at once. @@ -1305,10 +1305,10 @@ nsCSSBorderRenderer::DrawBorderSidesCompositeColors(int aSides, const nsBorderCo siRect = Rect(tl.x, tl.y, br.x - tl.x , br.y - tl.y); - fakeBorderSizes[NS_SIDE_TOP] = siRect.TopLeft().y - soRect.TopLeft().y; - fakeBorderSizes[NS_SIDE_RIGHT] = soRect.TopRight().x - siRect.TopRight().x; - fakeBorderSizes[NS_SIDE_BOTTOM] = soRect.BottomRight().y - siRect.BottomRight().y; - fakeBorderSizes[NS_SIDE_LEFT] = siRect.BottomLeft().x - soRect.BottomLeft().x; + fakeBorderSizes[eSideTop] = siRect.TopLeft().y - soRect.TopLeft().y; + fakeBorderSizes[eSideRight] = soRect.TopRight().x - siRect.TopRight().x; + fakeBorderSizes[eSideBottom] = soRect.BottomRight().y - siRect.BottomRight().y; + fakeBorderSizes[eSideLeft] = siRect.BottomLeft().x - soRect.BottomLeft().x; FillSolidBorder(soRect, siRect, radii, fakeBorderSizes, aSides, color); @@ -1351,27 +1351,27 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) borderRenderStyle == NS_STYLE_BORDER_STYLE_DOTTED) { // Draw each corner separately, with the given side's color. if (aSides & SIDE_BIT_TOP) { - DrawDashedOrDottedCorner(NS_SIDE_TOP, C_TL); + DrawDashedOrDottedCorner(eSideTop, C_TL); } else if (aSides & SIDE_BIT_LEFT) { - DrawDashedOrDottedCorner(NS_SIDE_LEFT, C_TL); + DrawDashedOrDottedCorner(eSideLeft, C_TL); } if (aSides & SIDE_BIT_TOP) { - DrawDashedOrDottedCorner(NS_SIDE_TOP, C_TR); + DrawDashedOrDottedCorner(eSideTop, C_TR); } else if (aSides & SIDE_BIT_RIGHT) { - DrawDashedOrDottedCorner(NS_SIDE_RIGHT, C_TR); + DrawDashedOrDottedCorner(eSideRight, C_TR); } if (aSides & SIDE_BIT_BOTTOM) { - DrawDashedOrDottedCorner(NS_SIDE_BOTTOM, C_BL); + DrawDashedOrDottedCorner(eSideBottom, C_BL); } else if (aSides & SIDE_BIT_LEFT) { - DrawDashedOrDottedCorner(NS_SIDE_LEFT, C_BL); + DrawDashedOrDottedCorner(eSideLeft, C_BL); } if (aSides & SIDE_BIT_BOTTOM) { - DrawDashedOrDottedCorner(NS_SIDE_BOTTOM, C_BR); + DrawDashedOrDottedCorner(eSideBottom, C_BR); } else if (aSides & SIDE_BIT_RIGHT) { - DrawDashedOrDottedCorner(NS_SIDE_RIGHT, C_BR); + DrawDashedOrDottedCorner(eSideRight, C_BR); } return; } @@ -1545,38 +1545,38 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) // If there is at least one dotted side, every side is rendered separately. if (IsSingleSide(aSides)) { if (aSides == SIDE_BIT_TOP) { - if (mBorderStyles[NS_SIDE_RIGHT] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideRight] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_TR])) { noMarginRight = true; } - if (mBorderStyles[NS_SIDE_LEFT] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideLeft] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_TL])) { noMarginLeft = true; } } else if (aSides == SIDE_BIT_RIGHT) { - if (mBorderStyles[NS_SIDE_TOP] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideTop] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_TR])) { noMarginTop = true; } - if (mBorderStyles[NS_SIDE_BOTTOM] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideBottom] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_BR])) { noMarginBottom = true; } } else if (aSides == SIDE_BIT_BOTTOM) { - if (mBorderStyles[NS_SIDE_RIGHT] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideRight] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_BR])) { noMarginRight = true; } - if (mBorderStyles[NS_SIDE_LEFT] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideLeft] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_BL])) { noMarginLeft = true; } } else { - if (mBorderStyles[NS_SIDE_TOP] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideTop] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_TL])) { noMarginTop = true; } - if (mBorderStyles[NS_SIDE_BOTTOM] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideBottom] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_BL])) { noMarginBottom = true; } @@ -1806,13 +1806,13 @@ static Float GetBorderLength(mozilla::Side aSide, const Point& aStart, const Point& aEnd) { - if (aSide == NS_SIDE_TOP) { + if (aSide == eSideTop) { return aEnd.x - aStart.x; } - if (aSide == NS_SIDE_RIGHT) { + if (aSide == eSideRight) { return aEnd.y - aStart.y; } - if (aSide == NS_SIDE_BOTTOM) { + if (aSide == eSideBottom) { return aStart.x - aEnd.x; } return aStart.y - aEnd.y; @@ -2081,16 +2081,16 @@ nsCSSBorderRenderer::DrawDottedSideSlow(mozilla::Side aSide) // Ei Point I(0.0f, 0.0f), J(0.0f, 0.0f); - if (aSide == NS_SIDE_TOP) { + if (aSide == eSideTop) { I.x = 1.0f; J.y = 1.0f; - } else if (aSide == NS_SIDE_RIGHT) { + } else if (aSide == eSideRight) { I.y = 1.0f; J.x = -1.0f; - } else if (aSide == NS_SIDE_BOTTOM) { + } else if (aSide == eSideBottom) { I.x = -1.0f; J.y = -1.0f; - } else if (aSide == NS_SIDE_LEFT) { + } else if (aSide == eSideLeft) { I.y = -1.0f; J.x = 1.0f; } @@ -2167,7 +2167,7 @@ nsCSSBorderRenderer::DrawDottedSideSlow(mozilla::Side aSide) // Extend dirty rect to avoid clipping pixel for anti-aliasing. const Float AA_MARGIN = 2.0f; - if (aSide == NS_SIDE_TOP) { + if (aSide == eSideTop) { // Tweak |from| and |to| to fit into |mDirtyRect + radius margin|, // to render only paths that may overlap mDirtyRect. // @@ -2212,7 +2212,7 @@ nsCSSBorderRenderer::DrawDottedSideSlow(mozilla::Side aSide) } } } - } else if (aSide == NS_SIDE_RIGHT) { + } else if (aSide == eSideRight) { Float top = mDirtyRect.y - radius - AA_MARGIN; if (fromP.y < top) { size_t tmp = ceil(count * (top - start.y) / (end.y - start.y)); @@ -2235,7 +2235,7 @@ nsCSSBorderRenderer::DrawDottedSideSlow(mozilla::Side aSide) } } } - } else if (aSide == NS_SIDE_BOTTOM) { + } else if (aSide == eSideBottom) { Float right = mDirtyRect.x + mDirtyRect.width + radius + AA_MARGIN; if (fromP.x > right) { size_t tmp = ceil(count * (right - start.x) / (end.x - start.x)); @@ -2258,7 +2258,7 @@ nsCSSBorderRenderer::DrawDottedSideSlow(mozilla::Side aSide) } } } - } else if (aSide == NS_SIDE_LEFT) { + } else if (aSide == eSideLeft) { Float bottom = mDirtyRect.y + mDirtyRect.height + radius + AA_MARGIN; if (fromP.y > bottom) { size_t tmp = ceil(count * (bottom - start.y) / (end.y - start.y)); @@ -3240,8 +3240,8 @@ nsCSSBorderRenderer::DrawBorders() } // Initial values only used when the border colors/widths are all the same: - ColorPattern color(ToDeviceColor(mBorderColors[NS_SIDE_TOP])); - StrokeOptions strokeOptions(mBorderWidths[NS_SIDE_TOP]); // stroke width + ColorPattern color(ToDeviceColor(mBorderColors[eSideTop])); + StrokeOptions strokeOptions(mBorderWidths[eSideTop]); // stroke width bool allBordersSolid; @@ -3271,10 +3271,10 @@ nsCSSBorderRenderer::DrawBorders() // Relatively simple case. gfxRect outerRect = ThebesRect(mOuterRect); RoundedRect borderInnerRect(outerRect, mBorderRadii); - borderInnerRect.Deflate(mBorderWidths[NS_SIDE_TOP], - mBorderWidths[NS_SIDE_BOTTOM], - mBorderWidths[NS_SIDE_LEFT], - mBorderWidths[NS_SIDE_RIGHT]); + borderInnerRect.Deflate(mBorderWidths[eSideTop], + mBorderWidths[eSideBottom], + mBorderWidths[eSideLeft], + mBorderWidths[eSideRight]); // Instead of stroking we just use two paths: an inner and an outer. // This allows us to draw borders that we couldn't when stroking. For example, diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index dcb543acd7..397ca98338 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -4655,9 +4655,9 @@ GetBSizeTakenByBoxSizing(StyleBoxSizing aBoxSizing, const nsStyleSides& stylePadding = aFrame->StylePadding()->mPadding; const nsStyleCoord& paddingStart = - stylePadding.Get(aHorizontalAxis ? NS_SIDE_TOP : NS_SIDE_LEFT); + stylePadding.Get(aHorizontalAxis ? eSideTop : eSideLeft); const nsStyleCoord& paddingEnd = - stylePadding.Get(aHorizontalAxis ? NS_SIDE_BOTTOM : NS_SIDE_RIGHT); + stylePadding.Get(aHorizontalAxis ? eSideBottom : eSideRight); nscoord pad; // XXXbz Calling GetPercentBSize on padding values looks bogus, since // percent padding is always a percentage of the inline-size of the @@ -6789,14 +6789,14 @@ nsLayoutUtils::HasNonZeroCorner(const nsStyleCorners& aCorners) // aCorner is a "full corner" value, i.e. NS_CORNER_TOP_LEFT etc static bool IsCornerAdjacentToSide(uint8_t aCorner, Side aSide) { - static_assert((int)NS_SIDE_TOP == NS_CORNER_TOP_LEFT, "Check for Full Corner"); - static_assert((int)NS_SIDE_RIGHT == NS_CORNER_TOP_RIGHT, "Check for Full Corner"); - static_assert((int)NS_SIDE_BOTTOM == NS_CORNER_BOTTOM_RIGHT, "Check for Full Corner"); - static_assert((int)NS_SIDE_LEFT == NS_CORNER_BOTTOM_LEFT, "Check for Full Corner"); - static_assert((int)NS_SIDE_TOP == ((NS_CORNER_TOP_RIGHT - 1)&3), "Check for Full Corner"); - static_assert((int)NS_SIDE_RIGHT == ((NS_CORNER_BOTTOM_RIGHT - 1)&3), "Check for Full Corner"); - static_assert((int)NS_SIDE_BOTTOM == ((NS_CORNER_BOTTOM_LEFT - 1)&3), "Check for Full Corner"); - static_assert((int)NS_SIDE_LEFT == ((NS_CORNER_TOP_LEFT - 1)&3), "Check for Full Corner"); + static_assert((int)eSideTop == NS_CORNER_TOP_LEFT, "Check for Full Corner"); + static_assert((int)eSideRight == NS_CORNER_TOP_RIGHT, "Check for Full Corner"); + static_assert((int)eSideBottom == NS_CORNER_BOTTOM_RIGHT, "Check for Full Corner"); + static_assert((int)eSideLeft == NS_CORNER_BOTTOM_LEFT, "Check for Full Corner"); + static_assert((int)eSideTop == ((NS_CORNER_TOP_RIGHT - 1)&3), "Check for Full Corner"); + static_assert((int)eSideRight == ((NS_CORNER_BOTTOM_RIGHT - 1)&3), "Check for Full Corner"); + static_assert((int)eSideBottom == ((NS_CORNER_BOTTOM_LEFT - 1)&3), "Check for Full Corner"); + static_assert((int)eSideLeft == ((NS_CORNER_TOP_LEFT - 1)&3), "Check for Full Corner"); return aSide == aCorner || aSide == ((aCorner - 1)&3); } diff --git a/layout/generic/WritingModes.h b/layout/generic/WritingModes.h index b6227168d9..b6010c9ffd 100644 --- a/layout/generic/WritingModes.h +++ b/layout/generic/WritingModes.h @@ -325,10 +325,10 @@ public: // bit 0 = the eOrientationMask value // bit 1 = the eBlockFlowMask value static const mozilla::Side kLogicalBlockSides[][2] = { - { NS_SIDE_TOP, NS_SIDE_BOTTOM }, // horizontal-tb - { NS_SIDE_RIGHT, NS_SIDE_LEFT }, // vertical-rl - { NS_SIDE_BOTTOM, NS_SIDE_TOP }, // (horizontal-bt) - { NS_SIDE_LEFT, NS_SIDE_RIGHT }, // vertical-lr + { eSideTop, eSideBottom }, // horizontal-tb + { eSideRight, eSideLeft }, // vertical-rl + { eSideBottom, eSideTop }, // (horizontal-bt) + { eSideLeft, eSideRight }, // vertical-lr }; // Ignore the SIDEWAYS_MASK bit of the writing-mode value, as this has no @@ -353,22 +353,22 @@ public: // produces "inverted" text. (The former 'sideways-left' value, no longer // in the spec, would have produced this in vertical-rl mode.) static const mozilla::Side kLogicalInlineSides[][2] = { - { NS_SIDE_LEFT, NS_SIDE_RIGHT }, // horizontal-tb ltr - { NS_SIDE_TOP, NS_SIDE_BOTTOM }, // vertical-rl ltr - { NS_SIDE_RIGHT, NS_SIDE_LEFT }, // horizontal-tb rtl - { NS_SIDE_BOTTOM, NS_SIDE_TOP }, // vertical-rl rtl - { NS_SIDE_RIGHT, NS_SIDE_LEFT }, // (horizontal-bt) (inverted) ltr - { NS_SIDE_TOP, NS_SIDE_BOTTOM }, // sideways-lr rtl - { NS_SIDE_LEFT, NS_SIDE_RIGHT }, // (horizontal-bt) (inverted) rtl - { NS_SIDE_BOTTOM, NS_SIDE_TOP }, // sideways-lr ltr - { NS_SIDE_LEFT, NS_SIDE_RIGHT }, // horizontal-tb (inverted) rtl - { NS_SIDE_TOP, NS_SIDE_BOTTOM }, // vertical-rl (inverted) rtl - { NS_SIDE_RIGHT, NS_SIDE_LEFT }, // horizontal-tb (inverted) ltr - { NS_SIDE_BOTTOM, NS_SIDE_TOP }, // vertical-rl (inverted) ltr - { NS_SIDE_LEFT, NS_SIDE_RIGHT }, // (horizontal-bt) ltr - { NS_SIDE_TOP, NS_SIDE_BOTTOM }, // vertical-lr ltr - { NS_SIDE_RIGHT, NS_SIDE_LEFT }, // (horizontal-bt) rtl - { NS_SIDE_BOTTOM, NS_SIDE_TOP }, // vertical-lr rtl + { eSideLeft, eSideRight }, // horizontal-tb ltr + { eSideTop, eSideBottom }, // vertical-rl ltr + { eSideRight, eSideLeft }, // horizontal-tb rtl + { eSideBottom, eSideTop }, // vertical-rl rtl + { eSideRight, eSideLeft }, // (horizontal-bt) (inverted) ltr + { eSideTop, eSideBottom }, // sideways-lr rtl + { eSideLeft, eSideRight }, // (horizontal-bt) (inverted) rtl + { eSideBottom, eSideTop }, // sideways-lr ltr + { eSideLeft, eSideRight }, // horizontal-tb (inverted) rtl + { eSideTop, eSideBottom }, // vertical-rl (inverted) rtl + { eSideRight, eSideLeft }, // horizontal-tb (inverted) ltr + { eSideBottom, eSideTop }, // vertical-rl (inverted) ltr + { eSideLeft, eSideRight }, // (horizontal-bt) ltr + { eSideTop, eSideBottom }, // vertical-lr ltr + { eSideRight, eSideLeft }, // (horizontal-bt) rtl + { eSideBottom, eSideTop }, // vertical-lr rtl }; // Inline axis sides depend on all three of writing-mode, text-orientation diff --git a/layout/generic/nsColumnSetFrame.cpp b/layout/generic/nsColumnSetFrame.cpp index ad4211bd8c..377f63998f 100644 --- a/layout/generic/nsColumnSetFrame.cpp +++ b/layout/generic/nsColumnSetFrame.cpp @@ -93,14 +93,14 @@ nsColumnSetFrame::PaintColumnRule(nsRenderingContext* aCtx, nsStyleBorder border(presContext); Sides skipSides; if (isVertical) { - border.SetBorderWidth(NS_SIDE_TOP, ruleWidth); - border.SetBorderStyle(NS_SIDE_TOP, ruleStyle); + border.SetBorderWidth(eSideTop, ruleWidth); + border.SetBorderStyle(eSideTop, ruleStyle); border.mBorderTopColor = StyleComplexColor::FromColor(ruleColor); skipSides |= mozilla::eSideBitsLeftRight; skipSides |= mozilla::eSideBitsBottom; } else { - border.SetBorderWidth(NS_SIDE_LEFT, ruleWidth); - border.SetBorderStyle(NS_SIDE_LEFT, ruleStyle); + border.SetBorderWidth(eSideLeft, ruleWidth); + border.SetBorderStyle(eSideLeft, ruleStyle); border.mBorderLeftColor = StyleComplexColor::FromColor(ruleColor); skipSides |= mozilla::eSideBitsTopBottom; skipSides |= mozilla::eSideBitsRight; diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 27b75dce32..3b9a09fd21 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -4579,11 +4579,11 @@ IntrinsicSizeOffsets(nsIFrame* aFrame, nscoord aPercentageBasis, bool aForISize) const nsStyleBorder* styleBorder = aFrame->StyleBorder(); if (verticalAxis) { - result.hBorder += styleBorder->GetComputedBorderWidth(NS_SIDE_TOP); - result.hBorder += styleBorder->GetComputedBorderWidth(NS_SIDE_BOTTOM); + result.hBorder += styleBorder->GetComputedBorderWidth(eSideTop); + result.hBorder += styleBorder->GetComputedBorderWidth(eSideBottom); } else { - result.hBorder += styleBorder->GetComputedBorderWidth(NS_SIDE_LEFT); - result.hBorder += styleBorder->GetComputedBorderWidth(NS_SIDE_RIGHT); + result.hBorder += styleBorder->GetComputedBorderWidth(eSideLeft); + result.hBorder += styleBorder->GetComputedBorderWidth(eSideRight); } const nsStyleDisplay* disp = aFrame->StyleDisplay(); diff --git a/layout/generic/nsInlineFrame.cpp b/layout/generic/nsInlineFrame.cpp index ed6e6027dc..a4056123b4 100644 --- a/layout/generic/nsInlineFrame.cpp +++ b/layout/generic/nsInlineFrame.cpp @@ -114,20 +114,20 @@ nsInlineFrame::IsSelfEmpty() // get logical start and end flags. if (wm.IsVertical()) { haveStart = - border->GetComputedBorderWidth(NS_SIDE_TOP) != 0 || + border->GetComputedBorderWidth(eSideTop) != 0 || !nsLayoutUtils::IsPaddingZero(padding->mPadding.GetTop()) || !IsMarginZero(margin->mMargin.GetTop()); haveEnd = - border->GetComputedBorderWidth(NS_SIDE_BOTTOM) != 0 || + border->GetComputedBorderWidth(eSideBottom) != 0 || !nsLayoutUtils::IsPaddingZero(padding->mPadding.GetBottom()) || !IsMarginZero(margin->mMargin.GetBottom()); } else { haveStart = - border->GetComputedBorderWidth(NS_SIDE_LEFT) != 0 || + border->GetComputedBorderWidth(eSideLeft) != 0 || !nsLayoutUtils::IsPaddingZero(padding->mPadding.GetLeft()) || !IsMarginZero(margin->mMargin.GetLeft()); haveEnd = - border->GetComputedBorderWidth(NS_SIDE_RIGHT) != 0 || + border->GetComputedBorderWidth(eSideRight) != 0 || !nsLayoutUtils::IsPaddingZero(padding->mPadding.GetRight()) || !IsMarginZero(margin->mMargin.GetRight()); } diff --git a/layout/generic/nsLineLayout.cpp b/layout/generic/nsLineLayout.cpp index aa465d3584..2312bba070 100644 --- a/layout/generic/nsLineLayout.cpp +++ b/layout/generic/nsLineLayout.cpp @@ -760,8 +760,8 @@ IsPercentageAware(const nsIFrame* aFrame) pos->mWidth.GetUnit() != eStyleUnit_Auto) || pos->MaxWidthDependsOnContainer() || pos->MinWidthDependsOnContainer() || - pos->OffsetHasPercent(NS_SIDE_RIGHT) || - pos->OffsetHasPercent(NS_SIDE_LEFT)) { + pos->OffsetHasPercent(eSideRight) || + pos->OffsetHasPercent(eSideLeft)) { return true; } diff --git a/layout/generic/nsPageContentFrame.cpp b/layout/generic/nsPageContentFrame.cpp index 5a7af2ec85..8ae2820d27 100644 --- a/layout/generic/nsPageContentFrame.cpp +++ b/layout/generic/nsPageContentFrame.cpp @@ -80,7 +80,7 @@ nsPageContentFrame::Reflow(nsPresContext* aPresContext, nscoord xmost = aDesiredSize.ScrollableOverflow().XMost(); if (xmost > aDesiredSize.Width()) { nscoord widthToFit = xmost + padding.right + - kidReflowInput.mStyleBorder->GetComputedBorderWidth(NS_SIDE_RIGHT); + kidReflowInput.mStyleBorder->GetComputedBorderWidth(eSideRight); float ratio = float(maxSize.width) / widthToFit; NS_ASSERTION(ratio >= 0.0 && ratio < 1.0, "invalid shrink-to-fit ratio"); mPD->mShrinkToFitRatio = std::min(mPD->mShrinkToFitRatio, ratio); diff --git a/layout/mathml/nsMathMLmtableFrame.cpp b/layout/mathml/nsMathMLmtableFrame.cpp index ad4bb55682..8cf25f6e07 100644 --- a/layout/mathml/nsMathMLmtableFrame.cpp +++ b/layout/mathml/nsMathMLmtableFrame.cpp @@ -200,13 +200,13 @@ ApplyBorderToStyle(const nsMathMLmtdFrame* aFrame, // values, we simply repeat the last value. uint32_t listLength = rowLinesList->Length(); if (rowIndex < listLength) { - aStyleBorder.SetBorderStyle(NS_SIDE_TOP, + aStyleBorder.SetBorderStyle(eSideTop, rowLinesList->ElementAt(rowIndex - 1)); } else { - aStyleBorder.SetBorderStyle(NS_SIDE_TOP, + aStyleBorder.SetBorderStyle(eSideTop, rowLinesList->ElementAt(listLength - 1)); } - aStyleBorder.SetBorderWidth(NS_SIDE_TOP, borderWidth); + aStyleBorder.SetBorderWidth(eSideTop, borderWidth); } // We don't place a column line on the left of the first column. @@ -215,13 +215,13 @@ ApplyBorderToStyle(const nsMathMLmtdFrame* aFrame, // values, we simply repeat the last value. uint32_t listLength = columnLinesList->Length(); if (columnIndex < listLength) { - aStyleBorder.SetBorderStyle(NS_SIDE_LEFT, + aStyleBorder.SetBorderStyle(eSideLeft, columnLinesList->ElementAt(columnIndex - 1)); } else { - aStyleBorder.SetBorderStyle(NS_SIDE_LEFT, + aStyleBorder.SetBorderStyle(eSideLeft, columnLinesList->ElementAt(listLength - 1)); } - aStyleBorder.SetBorderWidth(NS_SIDE_LEFT, borderWidth); + aStyleBorder.SetBorderWidth(eSideLeft, borderWidth); } } diff --git a/layout/style/StyleAnimationValue.cpp b/layout/style/StyleAnimationValue.cpp index d5fa1c51e3..cfaf19df3c 100644 --- a/layout/style/StyleAnimationValue.cpp +++ b/layout/style/StyleAnimationValue.cpp @@ -4373,10 +4373,10 @@ StyleAnimationValue::ExtractComputedValue(nsCSSPropertyID aProperty, case eStyleAnimType_Sides_Bottom: case eStyleAnimType_Sides_Left: { static_assert( - NS_SIDE_TOP == eStyleAnimType_Sides_Top -eStyleAnimType_Sides_Top && - NS_SIDE_RIGHT == eStyleAnimType_Sides_Right -eStyleAnimType_Sides_Top && - NS_SIDE_BOTTOM == eStyleAnimType_Sides_Bottom-eStyleAnimType_Sides_Top && - NS_SIDE_LEFT == eStyleAnimType_Sides_Left -eStyleAnimType_Sides_Top, + eSideTop == eStyleAnimType_Sides_Top -eStyleAnimType_Sides_Top && + eSideRight == eStyleAnimType_Sides_Right -eStyleAnimType_Sides_Top && + eSideBottom == eStyleAnimType_Sides_Bottom-eStyleAnimType_Sides_Top && + eSideLeft == eStyleAnimType_Sides_Left -eStyleAnimType_Sides_Top, "box side constants out of sync with animation side constants"); const nsStyleCoord &coord = diff --git a/layout/style/nsCSSDataBlock.cpp b/layout/style/nsCSSDataBlock.cpp index 8f17cc71ca..e6045451d8 100644 --- a/layout/style/nsCSSDataBlock.cpp +++ b/layout/style/nsCSSDataBlock.cpp @@ -249,8 +249,8 @@ EnsurePhysicalProperty(nsCSSPropertyID& aProperty, nsRuleData* aRuleData) // We rely on the physical side constant values matching the order of // the physical properties in the logical group array. - static_assert(NS_SIDE_TOP == 0 && NS_SIDE_RIGHT == 1 && - NS_SIDE_BOTTOM == 2 && NS_SIDE_LEFT == 3, + static_assert(eSideTop == 0 && eSideRight == 1 && + eSideBottom == 2 && eSideLeft == 3, "unexpected side constant values"); index = side; } diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp index 9acc69daf1..73a8d5dd29 100644 --- a/layout/style/nsCSSProps.cpp +++ b/layout/style/nsCSSProps.cpp @@ -2794,8 +2794,8 @@ static const nsCSSPropertyID gBorderBottomSubpropTable[] = { eCSSProperty_UNKNOWN }; -static_assert(NS_SIDE_TOP == 0 && NS_SIDE_RIGHT == 1 && - NS_SIDE_BOTTOM == 2 && NS_SIDE_LEFT == 3, +static_assert(eSideTop == 0 && eSideRight == 1 && + eSideBottom == 2 && eSideLeft == 3, "box side constants not top/right/bottom/left == 0/1/2/3"); static const nsCSSPropertyID gBorderColorSubpropTable[] = { // Code relies on these being in top-right-bottom-left order. diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp index db2374c68f..aba5ba42cc 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -2565,8 +2565,8 @@ nsCSSRect_heap::SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const return n; } -static_assert(NS_SIDE_TOP == 0 && NS_SIDE_RIGHT == 1 && - NS_SIDE_BOTTOM == 2 && NS_SIDE_LEFT == 3, +static_assert(eSideTop == 0 && eSideRight == 1 && + eSideBottom == 2 && eSideLeft == 3, "box side constants not top/right/bottom/left == 0/1/2/3"); /* static */ const nsCSSRect::side_type nsCSSRect::sides[4] = { diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index e6be7dc0bd..847f7d4415 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -985,7 +985,7 @@ nsComputedDOMStyle::DoGetFloat() already_AddRefed nsComputedDOMStyle::DoGetBottom() { - return GetOffsetWidthFor(NS_SIDE_BOTTOM); + return GetOffsetWidthFor(eSideBottom); } already_AddRefed @@ -3013,25 +3013,25 @@ nsComputedDOMStyle::DoGetRowGap() already_AddRefed nsComputedDOMStyle::DoGetPaddingTop() { - return GetPaddingWidthFor(NS_SIDE_TOP); + return GetPaddingWidthFor(eSideTop); } already_AddRefed nsComputedDOMStyle::DoGetPaddingBottom() { - return GetPaddingWidthFor(NS_SIDE_BOTTOM); + return GetPaddingWidthFor(eSideBottom); } already_AddRefed nsComputedDOMStyle::DoGetPaddingLeft() { - return GetPaddingWidthFor(NS_SIDE_LEFT); + return GetPaddingWidthFor(eSideLeft); } already_AddRefed nsComputedDOMStyle::DoGetPaddingRight() { - return GetPaddingWidthFor(NS_SIDE_RIGHT); + return GetPaddingWidthFor(eSideRight); } already_AddRefed @@ -3095,50 +3095,50 @@ nsComputedDOMStyle::DoGetTableLayout() already_AddRefed nsComputedDOMStyle::DoGetBorderTopStyle() { - return GetBorderStyleFor(NS_SIDE_TOP); + return GetBorderStyleFor(eSideTop); } already_AddRefed nsComputedDOMStyle::DoGetBorderBottomStyle() { - return GetBorderStyleFor(NS_SIDE_BOTTOM); + return GetBorderStyleFor(eSideBottom); } already_AddRefed nsComputedDOMStyle::DoGetBorderLeftStyle() { - return GetBorderStyleFor(NS_SIDE_LEFT); + return GetBorderStyleFor(eSideLeft); } already_AddRefed nsComputedDOMStyle::DoGetBorderRightStyle() { - return GetBorderStyleFor(NS_SIDE_RIGHT); + return GetBorderStyleFor(eSideRight); } already_AddRefed nsComputedDOMStyle::DoGetBorderBottomColors() { - return GetBorderColorsFor(NS_SIDE_BOTTOM); + return GetBorderColorsFor(eSideBottom); } already_AddRefed nsComputedDOMStyle::DoGetBorderLeftColors() { - return GetBorderColorsFor(NS_SIDE_LEFT); + return GetBorderColorsFor(eSideLeft); } already_AddRefed nsComputedDOMStyle::DoGetBorderRightColors() { - return GetBorderColorsFor(NS_SIDE_RIGHT); + return GetBorderColorsFor(eSideRight); } already_AddRefed nsComputedDOMStyle::DoGetBorderTopColors() { - return GetBorderColorsFor(NS_SIDE_TOP); + return GetBorderColorsFor(eSideTop); } already_AddRefed @@ -3172,73 +3172,73 @@ nsComputedDOMStyle::DoGetBorderTopRightRadius() already_AddRefed nsComputedDOMStyle::DoGetBorderTopWidth() { - return GetBorderWidthFor(NS_SIDE_TOP); + return GetBorderWidthFor(eSideTop); } already_AddRefed nsComputedDOMStyle::DoGetBorderBottomWidth() { - return GetBorderWidthFor(NS_SIDE_BOTTOM); + return GetBorderWidthFor(eSideBottom); } already_AddRefed nsComputedDOMStyle::DoGetBorderLeftWidth() { - return GetBorderWidthFor(NS_SIDE_LEFT); + return GetBorderWidthFor(eSideLeft); } already_AddRefed nsComputedDOMStyle::DoGetBorderRightWidth() { - return GetBorderWidthFor(NS_SIDE_RIGHT); + return GetBorderWidthFor(eSideRight); } already_AddRefed nsComputedDOMStyle::DoGetBorderTopColor() { - return GetBorderColorFor(NS_SIDE_TOP); + return GetBorderColorFor(eSideTop); } already_AddRefed nsComputedDOMStyle::DoGetBorderBottomColor() { - return GetBorderColorFor(NS_SIDE_BOTTOM); + return GetBorderColorFor(eSideBottom); } already_AddRefed nsComputedDOMStyle::DoGetBorderLeftColor() { - return GetBorderColorFor(NS_SIDE_LEFT); + return GetBorderColorFor(eSideLeft); } already_AddRefed nsComputedDOMStyle::DoGetBorderRightColor() { - return GetBorderColorFor(NS_SIDE_RIGHT); + return GetBorderColorFor(eSideRight); } already_AddRefed nsComputedDOMStyle::DoGetMarginTopWidth() { - return GetMarginWidthFor(NS_SIDE_TOP); + return GetMarginWidthFor(eSideTop); } already_AddRefed nsComputedDOMStyle::DoGetMarginBottomWidth() { - return GetMarginWidthFor(NS_SIDE_BOTTOM); + return GetMarginWidthFor(eSideBottom); } already_AddRefed nsComputedDOMStyle::DoGetMarginLeftWidth() { - return GetMarginWidthFor(NS_SIDE_LEFT); + return GetMarginWidthFor(eSideLeft); } already_AddRefed nsComputedDOMStyle::DoGetMarginRightWidth() { - return GetMarginWidthFor(NS_SIDE_RIGHT); + return GetMarginWidthFor(eSideRight); } already_AddRefed @@ -5069,19 +5069,19 @@ nsComputedDOMStyle::DoGetObjectPosition() already_AddRefed nsComputedDOMStyle::DoGetLeft() { - return GetOffsetWidthFor(NS_SIDE_LEFT); + return GetOffsetWidthFor(eSideLeft); } already_AddRefed nsComputedDOMStyle::DoGetRight() { - return GetOffsetWidthFor(NS_SIDE_RIGHT); + return GetOffsetWidthFor(eSideRight); } already_AddRefed nsComputedDOMStyle::DoGetTop() { - return GetOffsetWidthFor(NS_SIDE_TOP); + return GetOffsetWidthFor(eSideTop); } already_AddRefed @@ -5143,21 +5143,21 @@ nsComputedDOMStyle::GetAbsoluteOffset(mozilla::Side aSide) nscoord offset = 0; switch (aSide) { - case NS_SIDE_TOP: + case eSideTop: offset = rect.y - margin.top - border.top - scrollbarSizes.top; break; - case NS_SIDE_RIGHT: + case eSideRight: offset = containerRect.width - rect.width - rect.x - margin.right - border.right - scrollbarSizes.right; break; - case NS_SIDE_BOTTOM: + case eSideBottom: offset = containerRect.height - rect.height - rect.y - margin.bottom - border.bottom - scrollbarSizes.bottom; break; - case NS_SIDE_LEFT: + case eSideLeft: offset = rect.x - margin.left - border.left - scrollbarSizes.left; break; @@ -5171,8 +5171,8 @@ nsComputedDOMStyle::GetAbsoluteOffset(mozilla::Side aSide) return val.forget(); } -static_assert(NS_SIDE_TOP == 0 && NS_SIDE_RIGHT == 1 && - NS_SIDE_BOTTOM == 2 && NS_SIDE_LEFT == 3, +static_assert(eSideTop == 0 && eSideRight == 1 && + eSideBottom == 2 && eSideLeft == 3, "box side constants not as expected for NS_OPPOSITE_SIDE"); #define NS_OPPOSITE_SIDE(s_) mozilla::Side(((s_) + 2) & 3) @@ -5196,7 +5196,7 @@ nsComputedDOMStyle::GetRelativeOffset(mozilla::Side aSide) sign = -1; } PercentageBaseGetter baseGetter; - if (aSide == NS_SIDE_LEFT || aSide == NS_SIDE_RIGHT) { + if (aSide == eSideLeft || aSide == eSideRight) { baseGetter = &nsComputedDOMStyle::GetCBContentWidth; } else { baseGetter = &nsComputedDOMStyle::GetCBContentHeight; @@ -5225,7 +5225,7 @@ nsComputedDOMStyle::GetStickyOffset(mozilla::Side aSide) return val.forget(); } PercentageBaseGetter baseGetter; - if (aSide == NS_SIDE_LEFT || aSide == NS_SIDE_RIGHT) { + if (aSide == eSideLeft || aSide == eSideRight) { baseGetter = &nsComputedDOMStyle::GetScrollFrameContentWidth; } else { baseGetter = &nsComputedDOMStyle::GetScrollFrameContentHeight; diff --git a/layout/style/nsStyleCoord.cpp b/layout/style/nsStyleCoord.cpp index 27bf436942..2fd735308d 100644 --- a/layout/style/nsStyleCoord.cpp +++ b/layout/style/nsStyleCoord.cpp @@ -332,10 +332,10 @@ void nsStyleCorners::Reset() #define CASE(side, result) \ static_assert(NS_SIDE_IS_VERTICAL(side) == result, \ "NS_SIDE_IS_VERTICAL is wrong") -CASE(NS_SIDE_TOP, false); -CASE(NS_SIDE_RIGHT, true); -CASE(NS_SIDE_BOTTOM, false); -CASE(NS_SIDE_LEFT, true); +CASE(eSideTop, false); +CASE(eSideRight, true); +CASE(eSideBottom, false); +CASE(eSideLeft, true); #undef CASE #define CASE(corner, result) \ @@ -383,39 +383,39 @@ CASE(NS_CORNER_BOTTOM_LEFT, true, NS_CORNER_BOTTOM_LEFT_Y); #define CASE(side, second, result) \ static_assert(NS_SIDE_TO_FULL_CORNER(side, second) == result, \ "NS_SIDE_TO_FULL_CORNER is wrong") -CASE(NS_SIDE_TOP, false, NS_CORNER_TOP_LEFT); -CASE(NS_SIDE_TOP, true, NS_CORNER_TOP_RIGHT); +CASE(eSideTop, false, NS_CORNER_TOP_LEFT); +CASE(eSideTop, true, NS_CORNER_TOP_RIGHT); -CASE(NS_SIDE_RIGHT, false, NS_CORNER_TOP_RIGHT); -CASE(NS_SIDE_RIGHT, true, NS_CORNER_BOTTOM_RIGHT); +CASE(eSideRight, false, NS_CORNER_TOP_RIGHT); +CASE(eSideRight, true, NS_CORNER_BOTTOM_RIGHT); -CASE(NS_SIDE_BOTTOM, false, NS_CORNER_BOTTOM_RIGHT); -CASE(NS_SIDE_BOTTOM, true, NS_CORNER_BOTTOM_LEFT); +CASE(eSideBottom, false, NS_CORNER_BOTTOM_RIGHT); +CASE(eSideBottom, true, NS_CORNER_BOTTOM_LEFT); -CASE(NS_SIDE_LEFT, false, NS_CORNER_BOTTOM_LEFT); -CASE(NS_SIDE_LEFT, true, NS_CORNER_TOP_LEFT); +CASE(eSideLeft, false, NS_CORNER_BOTTOM_LEFT); +CASE(eSideLeft, true, NS_CORNER_TOP_LEFT); #undef CASE #define CASE(side, second, parallel, result) \ static_assert(NS_SIDE_TO_HALF_CORNER(side, second, parallel) == result, \ "NS_SIDE_TO_HALF_CORNER is wrong") -CASE(NS_SIDE_TOP, false, true, NS_CORNER_TOP_LEFT_X); -CASE(NS_SIDE_TOP, false, false, NS_CORNER_TOP_LEFT_Y); -CASE(NS_SIDE_TOP, true, true, NS_CORNER_TOP_RIGHT_X); -CASE(NS_SIDE_TOP, true, false, NS_CORNER_TOP_RIGHT_Y); +CASE(eSideTop, false, true, NS_CORNER_TOP_LEFT_X); +CASE(eSideTop, false, false, NS_CORNER_TOP_LEFT_Y); +CASE(eSideTop, true, true, NS_CORNER_TOP_RIGHT_X); +CASE(eSideTop, true, false, NS_CORNER_TOP_RIGHT_Y); -CASE(NS_SIDE_RIGHT, false, false, NS_CORNER_TOP_RIGHT_X); -CASE(NS_SIDE_RIGHT, false, true, NS_CORNER_TOP_RIGHT_Y); -CASE(NS_SIDE_RIGHT, true, false, NS_CORNER_BOTTOM_RIGHT_X); -CASE(NS_SIDE_RIGHT, true, true, NS_CORNER_BOTTOM_RIGHT_Y); +CASE(eSideRight, false, false, NS_CORNER_TOP_RIGHT_X); +CASE(eSideRight, false, true, NS_CORNER_TOP_RIGHT_Y); +CASE(eSideRight, true, false, NS_CORNER_BOTTOM_RIGHT_X); +CASE(eSideRight, true, true, NS_CORNER_BOTTOM_RIGHT_Y); -CASE(NS_SIDE_BOTTOM, false, true, NS_CORNER_BOTTOM_RIGHT_X); -CASE(NS_SIDE_BOTTOM, false, false, NS_CORNER_BOTTOM_RIGHT_Y); -CASE(NS_SIDE_BOTTOM, true, true, NS_CORNER_BOTTOM_LEFT_X); -CASE(NS_SIDE_BOTTOM, true, false, NS_CORNER_BOTTOM_LEFT_Y); +CASE(eSideBottom, false, true, NS_CORNER_BOTTOM_RIGHT_X); +CASE(eSideBottom, false, false, NS_CORNER_BOTTOM_RIGHT_Y); +CASE(eSideBottom, true, true, NS_CORNER_BOTTOM_LEFT_X); +CASE(eSideBottom, true, false, NS_CORNER_BOTTOM_LEFT_Y); -CASE(NS_SIDE_LEFT, false, false, NS_CORNER_BOTTOM_LEFT_X); -CASE(NS_SIDE_LEFT, false, true, NS_CORNER_BOTTOM_LEFT_Y); -CASE(NS_SIDE_LEFT, true, false, NS_CORNER_TOP_LEFT_X); -CASE(NS_SIDE_LEFT, true, true, NS_CORNER_TOP_LEFT_Y); +CASE(eSideLeft, false, false, NS_CORNER_BOTTOM_LEFT_X); +CASE(eSideLeft, false, true, NS_CORNER_BOTTOM_LEFT_Y); +CASE(eSideLeft, true, false, NS_CORNER_TOP_LEFT_X); +CASE(eSideLeft, true, true, NS_CORNER_TOP_LEFT_Y); #undef CASE diff --git a/layout/style/nsStyleCoord.h b/layout/style/nsStyleCoord.h index ef37f85423..e1b95e9cc8 100644 --- a/layout/style/nsStyleCoord.h +++ b/layout/style/nsStyleCoord.h @@ -552,22 +552,22 @@ inline nsStyleUnit nsStyleSides::GetUnit(mozilla::Side aSide) const inline nsStyleUnit nsStyleSides::GetLeftUnit() const { - return GetUnit(NS_SIDE_LEFT); + return GetUnit(mozilla::eSideLeft); } inline nsStyleUnit nsStyleSides::GetTopUnit() const { - return GetUnit(NS_SIDE_TOP); + return GetUnit(mozilla::eSideTop); } inline nsStyleUnit nsStyleSides::GetRightUnit() const { - return GetUnit(NS_SIDE_RIGHT); + return GetUnit(mozilla::eSideRight); } inline nsStyleUnit nsStyleSides::GetBottomUnit() const { - return GetUnit(NS_SIDE_BOTTOM); + return GetUnit(mozilla::eSideBottom); } inline nsStyleCoord nsStyleSides::Get(mozilla::Side aSide) const @@ -577,22 +577,22 @@ inline nsStyleCoord nsStyleSides::Get(mozilla::Side aSide) const inline nsStyleCoord nsStyleSides::GetLeft() const { - return Get(NS_SIDE_LEFT); + return Get(mozilla::eSideLeft); } inline nsStyleCoord nsStyleSides::GetTop() const { - return Get(NS_SIDE_TOP); + return Get(mozilla::eSideTop); } inline nsStyleCoord nsStyleSides::GetRight() const { - return Get(NS_SIDE_RIGHT); + return Get(mozilla::eSideRight); } inline nsStyleCoord nsStyleSides::GetBottom() const { - return Get(NS_SIDE_BOTTOM); + return Get(mozilla::eSideBottom); } inline void nsStyleSides::Set(mozilla::Side aSide, const nsStyleCoord& aCoord) @@ -602,22 +602,22 @@ inline void nsStyleSides::Set(mozilla::Side aSide, const nsStyleCoord& aCoord) inline void nsStyleSides::SetLeft(const nsStyleCoord& aCoord) { - Set(NS_SIDE_LEFT, aCoord); + Set(mozilla::eSideLeft, aCoord); } inline void nsStyleSides::SetTop(const nsStyleCoord& aCoord) { - Set(NS_SIDE_TOP, aCoord); + Set(mozilla::eSideTop, aCoord); } inline void nsStyleSides::SetRight(const nsStyleCoord& aCoord) { - Set(NS_SIDE_RIGHT, aCoord); + Set(mozilla::eSideRight, aCoord); } inline void nsStyleSides::SetBottom(const nsStyleCoord& aCoord) { - Set(NS_SIDE_BOTTOM, aCoord); + Set(mozilla::eSideBottom, aCoord); } // ------------------------- diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index b6d5874239..b7711f75a7 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -1259,13 +1259,13 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleBorder uint8_t GetBorderStyle(mozilla::Side aSide) const { - NS_ASSERTION(aSide <= NS_SIDE_LEFT, "bad side"); + NS_ASSERTION(aSide <= eSideLeft, "bad side"); return mBorderStyle[aSide]; } void SetBorderStyle(mozilla::Side aSide, uint8_t aStyle) { - NS_ASSERTION(aSide <= NS_SIDE_LEFT, "bad side"); + NS_ASSERTION(aSide <= eSideLeft, "bad side"); mBorderStyle[aSide] = aStyle; mComputedBorder.Side(aSide) = (HasVisibleStyle(aSide) ? mBorder.Side(aSide) : 0); diff --git a/layout/xul/BoxObject.cpp b/layout/xul/BoxObject.cpp index c8e7b221ab..2292c20ef1 100644 --- a/layout/xul/BoxObject.cpp +++ b/layout/xul/BoxObject.cpp @@ -183,13 +183,13 @@ BoxObject::GetOffsetRect(nsIntRect& aRect) // For the origin, add in the border for the frame const nsStyleBorder* border = frame->StyleBorder(); - origin.x += border->GetComputedBorderWidth(NS_SIDE_LEFT); - origin.y += border->GetComputedBorderWidth(NS_SIDE_TOP); + origin.x += border->GetComputedBorderWidth(eSideLeft); + origin.y += border->GetComputedBorderWidth(eSideTop); // And subtract out the border for the parent const nsStyleBorder* parentBorder = parent->StyleBorder(); - origin.x -= parentBorder->GetComputedBorderWidth(NS_SIDE_LEFT); - origin.y -= parentBorder->GetComputedBorderWidth(NS_SIDE_TOP); + origin.x -= parentBorder->GetComputedBorderWidth(eSideLeft); + origin.y -= parentBorder->GetComputedBorderWidth(eSideTop); aRect.x = nsPresContext::AppUnitsToIntCSSPixels(origin.x); aRect.y = nsPresContext::AppUnitsToIntCSSPixels(origin.y); diff --git a/layout/xul/nsMenuPopupFrame.cpp b/layout/xul/nsMenuPopupFrame.cpp index 73e7d2fa55..7490b97f09 100644 --- a/layout/xul/nsMenuPopupFrame.cpp +++ b/layout/xul/nsMenuPopupFrame.cpp @@ -1707,23 +1707,23 @@ void nsMenuPopupFrame::CanAdjustEdges(int8_t aHorizontalSide, popupAlign = -popupAlign; } - if (aHorizontalSide == (mHFlip ? NS_SIDE_RIGHT : NS_SIDE_LEFT)) { + if (aHorizontalSide == (mHFlip ? eSideRight : eSideLeft)) { if (popupAlign == POPUPALIGNMENT_TOPLEFT || popupAlign == POPUPALIGNMENT_BOTTOMLEFT) { aChange.x = 0; } } - else if (aHorizontalSide == (mHFlip ? NS_SIDE_LEFT : NS_SIDE_RIGHT)) { + else if (aHorizontalSide == (mHFlip ? eSideLeft : eSideRight)) { if (popupAlign == POPUPALIGNMENT_TOPRIGHT || popupAlign == POPUPALIGNMENT_BOTTOMRIGHT) { aChange.x = 0; } } - if (aVerticalSide == (mVFlip ? NS_SIDE_BOTTOM : NS_SIDE_TOP)) { + if (aVerticalSide == (mVFlip ? eSideBottom : eSideTop)) { if (popupAlign == POPUPALIGNMENT_TOPLEFT || popupAlign == POPUPALIGNMENT_TOPRIGHT) { aChange.y = 0; } } - else if (aVerticalSide == (mVFlip ? NS_SIDE_TOP : NS_SIDE_BOTTOM)) { + else if (aVerticalSide == (mVFlip ? eSideTop : eSideBottom)) { if (popupAlign == POPUPALIGNMENT_BOTTOMLEFT || popupAlign == POPUPALIGNMENT_BOTTOMRIGHT) { aChange.y = 0; } diff --git a/layout/xul/nsResizerFrame.cpp b/layout/xul/nsResizerFrame.cpp index b32b84fe50..1c8c19fd6b 100644 --- a/layout/xul/nsResizerFrame.cpp +++ b/layout/xul/nsResizerFrame.cpp @@ -173,8 +173,8 @@ nsResizerFrame::HandleEvent(nsPresContext* aPresContext, if (window || menuPopupFrame) { if (menuPopupFrame) { menuPopupFrame->CanAdjustEdges( - (direction.mHorizontal == -1) ? NS_SIDE_LEFT : NS_SIDE_RIGHT, - (direction.mVertical == -1) ? NS_SIDE_TOP : NS_SIDE_BOTTOM, mouseMove); + (direction.mHorizontal == -1) ? eSideLeft : eSideRight, + (direction.mVertical == -1) ? eSideTop : eSideBottom, mouseMove); } } else if (!contentToResize) { diff --git a/layout/xul/nsStackLayout.cpp b/layout/xul/nsStackLayout.cpp index 6072e0612b..562d9a852f 100644 --- a/layout/xul/nsStackLayout.cpp +++ b/layout/xul/nsStackLayout.cpp @@ -23,10 +23,10 @@ using namespace mozilla; nsBoxLayout* nsStackLayout::gInstance = nullptr; -#define SPECIFIED_LEFT (1 << NS_SIDE_LEFT) -#define SPECIFIED_RIGHT (1 << NS_SIDE_RIGHT) -#define SPECIFIED_TOP (1 << NS_SIDE_TOP) -#define SPECIFIED_BOTTOM (1 << NS_SIDE_BOTTOM) +#define SPECIFIED_LEFT (1 << eSideLeft) +#define SPECIFIED_RIGHT (1 << eSideRight) +#define SPECIFIED_TOP (1 << eSideTop) +#define SPECIFIED_BOTTOM (1 << eSideBottom) nsresult NS_NewStackLayout(nsCOMPtr& aNewLayout) diff --git a/layout/xul/tree/nsTreeBodyFrame.cpp b/layout/xul/tree/nsTreeBodyFrame.cpp index ec054a234e..6af20efe90 100644 --- a/layout/xul/tree/nsTreeBodyFrame.cpp +++ b/layout/xul/tree/nsTreeBodyFrame.cpp @@ -3322,7 +3322,7 @@ nsTreeBodyFrame::PaintCell(int32_t aRowIndex, CalcComplexColor(borderStyle->mBorderLeftColor); ColorPattern colorPatt(ToDeviceColor(color)); - uint8_t style = borderStyle->GetBorderStyle(NS_SIDE_LEFT); + uint8_t style = borderStyle->GetBorderStyle(eSideLeft); StrokeOptions strokeOptions; nsLayoutUtils::InitDashPattern(strokeOptions, style); From 8bf61a2f5c2482366752a02f362d9932267b52e6 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 1 Aug 2024 18:23:03 +0200 Subject: [PATCH 09/25] Issue #1925 - Remove use of SIDE_BIT{S}_* macros. This already has an enum in gfx/Types.h --- layout/base/BorderConsts.h | 7 --- layout/base/nsCSSRenderingBorders.cpp | 74 +++++++++++++-------------- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/layout/base/BorderConsts.h b/layout/base/BorderConsts.h index 9bd44c0199..0bc50e61db 100644 --- a/layout/base/BorderConsts.h +++ b/layout/base/BorderConsts.h @@ -10,13 +10,6 @@ #define DOT_LENGTH 1 // square #define DASH_LENGTH 3 // 3 times longer than dot -// some shorthand for side bits -#define SIDE_BIT_TOP (1 << eSideTop) -#define SIDE_BIT_RIGHT (1 << eSideRight) -#define SIDE_BIT_BOTTOM (1 << eSideBottom) -#define SIDE_BIT_LEFT (1 << eSideLeft) -#define SIDE_BITS_ALL (SIDE_BIT_TOP|SIDE_BIT_RIGHT|SIDE_BIT_BOTTOM|SIDE_BIT_LEFT) - #define C_TL NS_CORNER_TOP_LEFT #define C_TR NS_CORNER_TOP_RIGHT #define C_BR NS_CORNER_BOTTOM_RIGHT diff --git a/layout/base/nsCSSRenderingBorders.cpp b/layout/base/nsCSSRenderingBorders.cpp index a73f821508..72172c210b 100644 --- a/layout/base/nsCSSRenderingBorders.cpp +++ b/layout/base/nsCSSRenderingBorders.cpp @@ -140,8 +140,8 @@ GetCCWCorner(mozilla::Side aSide) static bool IsSingleSide(int aSides) { - return aSides == SIDE_BIT_TOP || aSides == SIDE_BIT_RIGHT || - aSides == SIDE_BIT_BOTTOM || aSides == SIDE_BIT_LEFT; + return aSides == eSideBitsTop || aSides == eSideBitsRight || + aSides == eSideBitsBottom || aSides == eSideBitsLeft; } static bool @@ -294,7 +294,7 @@ ComputeBorderCornerDimensions(const Float* aBorderWidths, bool nsCSSBorderRenderer::AreBorderSideFinalStylesSame(uint8_t aSides) { - NS_ASSERTION(aSides != 0 && (aSides & ~SIDE_BITS_ALL) == 0, + NS_ASSERTION(aSides != 0 && (aSides & ~eSideBitsAll) == 0, "AreBorderSidesSame: invalid whichSides!"); /* First check if the specified styles and colors are the same for all sides */ @@ -324,8 +324,8 @@ nsCSSBorderRenderer::AreBorderSideFinalStylesSame(uint8_t aSides) case NS_STYLE_BORDER_STYLE_RIDGE: case NS_STYLE_BORDER_STYLE_INSET: case NS_STYLE_BORDER_STYLE_OUTSET: - return ((aSides & ~(SIDE_BIT_TOP | SIDE_BIT_LEFT)) == 0 || - (aSides & ~(SIDE_BIT_BOTTOM | SIDE_BIT_RIGHT)) == 0); + return ((aSides & ~(eSideBitsTop | eSideBitsLeft)) == 0 || + (aSides & ~(eSideBitsBottom | eSideBitsRight)) == 0); } return true; @@ -1144,7 +1144,7 @@ nsCSSBorderRenderer::FillSolidBorder(const Rect& aOuterRect, // sides is probably second in the list -- there are a bunch of // common border styles, such as inset and outset, that are // top-left/bottom-right split. - if (aSides == SIDE_BITS_ALL && + if (aSides == eSideBitsAll && CheckFourFloatsEqual(aBorderSizes, aBorderSizes[0]) && !mAvoidStroke) { @@ -1162,25 +1162,25 @@ nsCSSBorderRenderer::FillSolidBorder(const Rect& aOuterRect, Rect r[4]; // compute base rects for each side - if (aSides & SIDE_BIT_TOP) { + if (aSides & eSideBitsTop) { r[eSideTop] = Rect(aOuterRect.X(), aOuterRect.Y(), aOuterRect.Width(), aBorderSizes[eSideTop]); } - if (aSides & SIDE_BIT_BOTTOM) { + if (aSides & eSideBitsBottom) { r[eSideBottom] = Rect(aOuterRect.X(), aOuterRect.YMost() - aBorderSizes[eSideBottom], aOuterRect.Width(), aBorderSizes[eSideBottom]); } - if (aSides & SIDE_BIT_LEFT) { + if (aSides & eSideBitsLeft) { r[eSideLeft] = Rect(aOuterRect.X(), aOuterRect.Y(), aBorderSizes[eSideLeft], aOuterRect.Height()); } - if (aSides & SIDE_BIT_RIGHT) { + if (aSides & eSideBitsRight) { r[eSideRight] = Rect(aOuterRect.XMost() - aBorderSizes[eSideRight], aOuterRect.Y(), aBorderSizes[eSideRight], aOuterRect.Height()); @@ -1191,23 +1191,23 @@ nsCSSBorderRenderer::FillSolidBorder(const Rect& aOuterRect, // This is especially important in the case of colors with // an alpha channel. - if ((aSides & (SIDE_BIT_TOP | SIDE_BIT_LEFT)) == (SIDE_BIT_TOP | SIDE_BIT_LEFT)) { + if ((aSides & (eSideBitsTop | eSideBitsLeft)) == (eSideBitsTop | eSideBitsLeft)) { // adjust the left's top down a bit r[eSideLeft].y += aBorderSizes[eSideTop]; r[eSideLeft].height -= aBorderSizes[eSideTop]; } - if ((aSides & (SIDE_BIT_TOP | SIDE_BIT_RIGHT)) == (SIDE_BIT_TOP | SIDE_BIT_RIGHT)) { + if ((aSides & (eSideBitsTop | eSideBitsRight)) == (eSideBitsTop | eSideBitsRight)) { // adjust the top's left a bit r[eSideTop].width -= aBorderSizes[eSideRight]; } - if ((aSides & (SIDE_BIT_BOTTOM | SIDE_BIT_RIGHT)) == (SIDE_BIT_BOTTOM | SIDE_BIT_RIGHT)) { + if ((aSides & (eSideBitsBottom | eSideBitsRight)) == (eSideBitsBottom | eSideBitsRight)) { // adjust the right's bottom a bit r[eSideRight].height -= aBorderSizes[eSideBottom]; } - if ((aSides & (SIDE_BIT_BOTTOM | SIDE_BIT_LEFT)) == (SIDE_BIT_BOTTOM | SIDE_BIT_LEFT)) { + if ((aSides & (eSideBitsBottom | eSideBitsLeft)) == (eSideBitsBottom | eSideBitsLeft)) { // adjust the bottom's left a bit r[eSideBottom].x += aBorderSizes[eSideLeft]; r[eSideBottom].width -= aBorderSizes[eSideLeft]; @@ -1321,7 +1321,7 @@ nsCSSBorderRenderer::DrawBorderSidesCompositeColors(int aSides, const nsBorderCo void nsCSSBorderRenderer::DrawBorderSides(int aSides) { - if (aSides == 0 || (aSides & ~SIDE_BITS_ALL) != 0) { + if (aSides == 0 || (aSides & ~eSideBitsAll) != 0) { NS_WARNING("DrawBorderSides: invalid sides!"); return; } @@ -1350,27 +1350,27 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) if (borderRenderStyle == NS_STYLE_BORDER_STYLE_DASHED || borderRenderStyle == NS_STYLE_BORDER_STYLE_DOTTED) { // Draw each corner separately, with the given side's color. - if (aSides & SIDE_BIT_TOP) { + if (aSides & eSideBitsTop) { DrawDashedOrDottedCorner(eSideTop, C_TL); - } else if (aSides & SIDE_BIT_LEFT) { + } else if (aSides & eSideBitsLeft) { DrawDashedOrDottedCorner(eSideLeft, C_TL); } - if (aSides & SIDE_BIT_TOP) { + if (aSides & eSideBitsTop) { DrawDashedOrDottedCorner(eSideTop, C_TR); - } else if (aSides & SIDE_BIT_RIGHT) { + } else if (aSides & eSideBitsRight) { DrawDashedOrDottedCorner(eSideRight, C_TR); } - if (aSides & SIDE_BIT_BOTTOM) { + if (aSides & eSideBitsBottom) { DrawDashedOrDottedCorner(eSideBottom, C_BL); - } else if (aSides & SIDE_BIT_LEFT) { + } else if (aSides & eSideBitsLeft) { DrawDashedOrDottedCorner(eSideLeft, C_BL); } - if (aSides & SIDE_BIT_BOTTOM) { + if (aSides & eSideBitsBottom) { DrawDashedOrDottedCorner(eSideBottom, C_BR); - } else if (aSides & SIDE_BIT_RIGHT) { + } else if (aSides & eSideBitsRight) { DrawDashedOrDottedCorner(eSideRight, C_BR); } return; @@ -1474,7 +1474,7 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) // The caller should never give us anything with a mix // of TL/BR if the border style would require a // TL/BR split. - if (aSides & (SIDE_BIT_BOTTOM | SIDE_BIT_RIGHT)) + if (aSides & (eSideBitsBottom | eSideBitsRight)) borderColorStyle = borderColorStyleBottomRight; else borderColorStyle = borderColorStyleTopLeft; @@ -1544,7 +1544,7 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) // If there is at least one dotted side, every side is rendered separately. if (IsSingleSide(aSides)) { - if (aSides == SIDE_BIT_TOP) { + if (aSides == eSideBitsTop) { if (mBorderStyles[eSideRight] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_TR])) { noMarginRight = true; @@ -1553,7 +1553,7 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) IsZeroSize(mBorderRadii[C_TL])) { noMarginLeft = true; } - } else if (aSides == SIDE_BIT_RIGHT) { + } else if (aSides == eSideBitsRight) { if (mBorderStyles[eSideTop] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_TR])) { noMarginTop = true; @@ -1562,7 +1562,7 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) IsZeroSize(mBorderRadii[C_BR])) { noMarginBottom = true; } - } else if (aSides == SIDE_BIT_BOTTOM) { + } else if (aSides == eSideBitsBottom) { if (mBorderStyles[eSideRight] == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(mBorderRadii[C_BR])) { noMarginRight = true; @@ -3184,9 +3184,9 @@ nsCSSBorderRenderer::DrawBorders() // Examine the border style to figure out if we can draw it in one // go or not. - bool tlBordersSame = AreBorderSideFinalStylesSame(SIDE_BIT_TOP | SIDE_BIT_LEFT); - bool brBordersSame = AreBorderSideFinalStylesSame(SIDE_BIT_BOTTOM | SIDE_BIT_RIGHT); - bool allBordersSame = AreBorderSideFinalStylesSame(SIDE_BITS_ALL); + bool tlBordersSame = AreBorderSideFinalStylesSame(eSideBitsTop | eSideBitsLeft); + bool brBordersSame = AreBorderSideFinalStylesSame(eSideBitsBottom | eSideBitsRight); + bool allBordersSame = AreBorderSideFinalStylesSame(eSideBitsAll); if (allBordersSame && ((mCompositeColors[0] == nullptr && (mBorderStyles[0] == NS_STYLE_BORDER_STYLE_NONE || @@ -3368,7 +3368,7 @@ nsCSSBorderRenderer::DrawBorders() if (allBordersSame && !forceSeparateCorners) { /* Draw everything in one go */ - DrawBorderSides(SIDE_BITS_ALL); + DrawBorderSides(eSideBitsAll); PrintAsStringNewline("---------------- (1)"); } else { PROFILER_LABEL("nsCSSBorderRenderer", "DrawBorders::multipass", @@ -3476,16 +3476,16 @@ nsCSSBorderRenderer::DrawBorders() int alreadyDrawnSides = 0; if (mOneUnitBorder && mNoBorderRadius && - (dashedSides & (SIDE_BIT_TOP | SIDE_BIT_LEFT)) == 0) + (dashedSides & (eSideBitsTop | eSideBitsLeft)) == 0) { if (tlBordersSame) { - DrawBorderSides(SIDE_BIT_TOP | SIDE_BIT_LEFT); - alreadyDrawnSides |= (SIDE_BIT_TOP | SIDE_BIT_LEFT); + DrawBorderSides(eSideBitsTop | eSideBitsLeft); + alreadyDrawnSides |= (eSideBitsTop | eSideBitsLeft); } - if (brBordersSame && (dashedSides & (SIDE_BIT_BOTTOM | SIDE_BIT_RIGHT)) == 0) { - DrawBorderSides(SIDE_BIT_BOTTOM | SIDE_BIT_RIGHT); - alreadyDrawnSides |= (SIDE_BIT_BOTTOM | SIDE_BIT_RIGHT); + if (brBordersSame && (dashedSides & (eSideBitsBottom | eSideBitsRight)) == 0) { + DrawBorderSides(eSideBitsBottom | eSideBitsRight); + alreadyDrawnSides |= (eSideBitsBottom | eSideBitsRight); } } From 3a153f32e31a295ee7e5f97b47bc8889160cee53 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 1 Aug 2024 18:58:14 +0200 Subject: [PATCH 10/25] Issue #1925 - Change Side's operator++ from postfix to prefix. The postfix operator++ was actually incorrectly implemented (the implementation is a prefix version). Since it's only used in the adjacent macro, there's no risk with this change to correct that. --- gfx/2d/Types.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 63545946c2..6fb9d955db 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -397,9 +397,9 @@ enum SideBits { for (mozilla::Side var_; \ MOZ_CONCAT(var_,__LINE__) <= mozilla::eSideLeft && \ ((var_ = mozilla::Side(MOZ_CONCAT(var_,__LINE__))), true); \ - MOZ_CONCAT(var_,__LINE__)++) + ++MOZ_CONCAT(var_,__LINE__)) -static inline Side operator++(Side& side, int) { +static inline Side& operator++(Side& side) { MOZ_ASSERT(side >= eSideTop && side <= eSideLeft, "Out of range side"); side = Side(side + 1); From bdb12f10e3201c5b47e5552e8e30535f50fe2307 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 1 Aug 2024 19:55:20 +0200 Subject: [PATCH 11/25] Issue #1925 - Move NS_FOR_CSS_CORNERS and enum to gfx/2d/Types.h. --- gfx/2d/Types.h | 29 +++++++++++++++++++++++++++++ gfx/thebes/gfxRect.h | 30 ------------------------------ 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 6fb9d955db..e3ccf2a442 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -406,6 +406,35 @@ static inline Side& operator++(Side& side) { return side; } +namespace css { +enum Corner { + // This order is important! + eCornerTopLeft = 0, + eCornerTopRight = 1, + eCornerBottomRight = 2, + eCornerBottomLeft = 3, + eNumCorners = 4 +}; +} // namespace css + +#define NS_CORNER_TOP_LEFT mozilla::css::eCornerTopLeft +#define NS_CORNER_TOP_RIGHT mozilla::css::eCornerTopRight +#define NS_CORNER_BOTTOM_RIGHT mozilla::css::eCornerBottomRight +#define NS_CORNER_BOTTOM_LEFT mozilla::css::eCornerBottomLeft +#define NS_NUM_CORNERS mozilla::css::eNumCorners + +#define NS_FOR_CSS_CORNERS(var_) \ + for (mozilla::css::Corner var_ = NS_CORNER_TOP_LEFT; \ + var_ <= NS_CORNER_BOTTOM_LEFT; \ + var_++) + +static inline mozilla::css::Corner operator++(mozilla::css::Corner& corner, int) { + MOZ_ASSERT(corner >= NS_CORNER_TOP_LEFT && + corner < NS_NUM_CORNERS, "Out of range corner"); + corner = mozilla::css::Corner(corner + 1); + return corner; +} + } // namespace mozilla #endif /* MOZILLA_GFX_TYPES_H_ */ diff --git a/gfx/thebes/gfxRect.h b/gfx/thebes/gfxRect.h index 8804ff86b2..5e057506c6 100644 --- a/gfx/thebes/gfxRect.h +++ b/gfx/thebes/gfxRect.h @@ -27,36 +27,6 @@ struct gfxMargin : public mozilla::gfx::BaseMargin { : Super(aTop, aRight, aBottom, aLeft) {} }; -namespace mozilla { - namespace css { - enum Corner { - // this order is important! - eCornerTopLeft = 0, - eCornerTopRight = 1, - eCornerBottomRight = 2, - eCornerBottomLeft = 3, - eNumCorners = 4 - }; - } // namespace css -} // namespace mozilla -#define NS_CORNER_TOP_LEFT mozilla::css::eCornerTopLeft -#define NS_CORNER_TOP_RIGHT mozilla::css::eCornerTopRight -#define NS_CORNER_BOTTOM_RIGHT mozilla::css::eCornerBottomRight -#define NS_CORNER_BOTTOM_LEFT mozilla::css::eCornerBottomLeft -#define NS_NUM_CORNERS mozilla::css::eNumCorners - -#define NS_FOR_CSS_CORNERS(var_) \ - for (mozilla::css::Corner var_ = NS_CORNER_TOP_LEFT; \ - var_ <= NS_CORNER_BOTTOM_LEFT; \ - var_++) - -static inline mozilla::css::Corner operator++(mozilla::css::Corner& corner, int) { - NS_PRECONDITION(corner >= NS_CORNER_TOP_LEFT && - corner < NS_NUM_CORNERS, "Out of range corner"); - corner = mozilla::css::Corner(corner + 1); - return corner; -} - struct gfxRect : public mozilla::gfx::BaseRect { typedef mozilla::gfx::BaseRect Super; From 81f60b575a1b4c2c50adbcecb606b808884178ee Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 1 Aug 2024 20:09:22 +0200 Subject: [PATCH 12/25] Issue #1925 - Rename Corner to LogicalCorner and move it to nsStyleCoord.h. To avoid confusion with mozilla::css::corner, rename ::Corner to mozilla::LogicalCorner, and move it to nsStyleCoord.h from the illogical nsCellMap.h location. Also, append the LogicalCorner prefix to all the enum values, to match the surrounding coding style. --- layout/style/nsStyleCoord.h | 10 +++++++++- layout/tables/nsCellMap.cpp | 8 ++++---- layout/tables/nsCellMap.h | 10 +--------- layout/tables/nsTableFrame.cpp | 21 +++++++++++---------- 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/layout/style/nsStyleCoord.h b/layout/style/nsStyleCoord.h index e1b95e9cc8..bd4f15ab51 100644 --- a/layout/style/nsStyleCoord.h +++ b/layout/style/nsStyleCoord.h @@ -15,7 +15,7 @@ namespace mozilla { class WritingMode; -// Logical axis, edge and side constants for use in various places. +// Logical axis, edge, side and corner constants for use in various places. enum LogicalAxis { eLogicalAxisBlock = 0x0, eLogicalAxisInline = 0x1 @@ -31,6 +31,14 @@ enum LogicalSide { eLogicalSideIEnd = (eLogicalAxisInline << 1) | eLogicalEdgeEnd // 0x3 }; +enum LogicalCorner +{ + eLogicalCornerBStartIStart = 0, + eLogicalCornerBStartIEnd = 1, + eLogicalCornerBEndIEnd = 2, + eLogicalCornerBEndIStart = 3 +}; + } // namespace mozilla enum nsStyleUnit : uint8_t { diff --git a/layout/tables/nsCellMap.cpp b/layout/tables/nsCellMap.cpp index 4852a4bdde..06041e0300 100644 --- a/layout/tables/nsCellMap.cpp +++ b/layout/tables/nsCellMap.cpp @@ -1055,7 +1055,7 @@ nsTableCellMap::SetBCBorderEdge(LogicalSide aSide, // (aRowIndex, aColIndex). For eBStartIEnd, store it in the entry to the iEnd-wards where // it would be BStartIStart. For eBEndIEnd, store it in the entry to the bEnd-wards. etc. void -nsTableCellMap::SetBCBorderCorner(Corner aCorner, +nsTableCellMap::SetBCBorderCorner(LogicalCorner aCorner, nsCellMap& aCellMap, uint32_t aCellMapStart, uint32_t aRowIndex, @@ -1076,15 +1076,15 @@ nsTableCellMap::SetBCBorderCorner(Corner aCorner, int32_t yPos = aRowIndex; int32_t rgYPos = aRowIndex - aCellMapStart; - if (eBStartIEnd == aCorner) { + if (eLogicalCornerBStartIEnd == aCorner) { xPos++; } - else if (eBEndIEnd == aCorner) { + else if (eLogicalCornerBEndIEnd == aCorner) { xPos++; rgYPos++; yPos++; } - else if (eBEndIStart == aCorner) { + else if (eLogicalCornerBEndIStart == aCorner) { rgYPos++; yPos++; } diff --git a/layout/tables/nsCellMap.h b/layout/tables/nsCellMap.h index 991343aa71..c729fea3ec 100644 --- a/layout/tables/nsCellMap.h +++ b/layout/tables/nsCellMap.h @@ -35,14 +35,6 @@ struct nsColInfo int32_t aNumCellsSpan); }; -enum Corner -{ - eBStartIStart = 0, - eBStartIEnd = 1, - eBEndIEnd = 2, - eBEndIStart = 3 -}; - struct BCInfo { nsTArray mIEndBorders; @@ -213,7 +205,7 @@ public: nscoord aSize, bool aChanged); - void SetBCBorderCorner(::Corner aCorner, + void SetBCBorderCorner(mozilla::LogicalCorner aCorner, nsCellMap& aCellMap, uint32_t aCellMapStart, uint32_t aYPos, diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp index 24bb28b73a..b18de99e03 100644 --- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -5733,7 +5733,8 @@ nsTableFrame::CalcBCBorders() } else { tlCorner.Update(eLogicalSideIEnd, currentBorder); - tableCellMap->SetBCBorderCorner(eBStartIStart, *iter.mCellMap, 0, 0, colIdx, + tableCellMap->SetBCBorderCorner(eLogicalCornerBStartIStart, + *iter.mCellMap, 0, 0, colIdx, LogicalSide(tlCorner.ownerSide), tlCorner.subWidth, tlCorner.bevel); @@ -5783,7 +5784,7 @@ nsTableFrame::CalcBCBorders() currentBorder = info.GetIStartEdgeBorder(); BCCornerInfo& tlCorner = (0 == rowB) ? bStartCorners[0] : bEndCorners[0]; tlCorner.Update(eLogicalSideBEnd, currentBorder); - tableCellMap->SetBCBorderCorner(eBStartIStart, *iter.mCellMap, + tableCellMap->SetBCBorderCorner(eLogicalCornerBStartIStart, *iter.mCellMap, iter.mRowGroupStart, rowB, 0, LogicalSide(tlCorner.ownerSide), tlCorner.subWidth, @@ -5822,7 +5823,7 @@ nsTableFrame::CalcBCBorders() bStartCorners[info.GetCellEndColIndex() + 1] : bEndCorners[info.GetCellEndColIndex() + 1]; trCorner.Update(eLogicalSideBEnd, currentBorder); // bStart-iEnd - tableCellMap->SetBCBorderCorner(eBStartIEnd, *iter.mCellMap, + tableCellMap->SetBCBorderCorner(eLogicalCornerBStartIEnd, *iter.mCellMap, iter.mRowGroupStart, rowB, info.GetCellEndColIndex(), LogicalSide(trCorner.ownerSide), @@ -5830,7 +5831,7 @@ nsTableFrame::CalcBCBorders() trCorner.bevel); BCCornerInfo& brCorner = bEndCorners[info.GetCellEndColIndex() + 1]; brCorner.Set(eLogicalSideBStart, currentBorder); // bEnd-iEnd - tableCellMap->SetBCBorderCorner(eBEndIEnd, *iter.mCellMap, + tableCellMap->SetBCBorderCorner(eLogicalCornerBEndIEnd, *iter.mCellMap, iter.mRowGroupStart, rowB, info.GetCellEndColIndex(), LogicalSide(brCorner.ownerSide), @@ -5899,7 +5900,7 @@ nsTableFrame::CalcBCBorders() if (info.GetCellEndColIndex() < damageArea.EndCol() && rowB >= damageArea.StartRow()) { if (0 != rowB) { - tableCellMap->SetBCBorderCorner(eBStartIEnd, *iter.mCellMap, + tableCellMap->SetBCBorderCorner(eLogicalCornerBStartIEnd, *iter.mCellMap, iter.mRowGroupStart, rowB, info.GetCellEndColIndex(), LogicalSide(trCorner->ownerSide), @@ -5908,7 +5909,7 @@ nsTableFrame::CalcBCBorders() } // store any corners this cell spans together with the aja cell for (int32_t rX = rowB + 1; rX < rowB + segLength; rX++) { - tableCellMap->SetBCBorderCorner(eBEndIEnd, *iter.mCellMap, + tableCellMap->SetBCBorderCorner(eLogicalCornerBEndIEnd, *iter.mCellMap, iter.mRowGroupStart, rX, info.GetCellEndColIndex(), LogicalSide(trCorner->ownerSide), @@ -5945,7 +5946,7 @@ nsTableFrame::CalcBCBorders() // update/store the bEnd-iStart & bEnd-IEnd corners BCCornerInfo& blCorner = bEndCorners[colIdx]; // bEnd-iStart blCorner.Update(eLogicalSideIEnd, currentBorder); - tableCellMap->SetBCBorderCorner(eBEndIStart, *iter.mCellMap, + tableCellMap->SetBCBorderCorner(eLogicalCornerBEndIStart, *iter.mCellMap, iter.mRowGroupStart, info.GetCellEndRowIndex(), colIdx, @@ -5954,7 +5955,7 @@ nsTableFrame::CalcBCBorders() BCCornerInfo& brCorner = bEndCorners[colIdx + 1]; // bEnd-iEnd brCorner.Update(eLogicalSideIStart, currentBorder); if (info.mNumTableCols == colIdx + 1) { // bEnd-IEnd corner of the table - tableCellMap->SetBCBorderCorner(eBEndIEnd, *iter.mCellMap, + tableCellMap->SetBCBorderCorner(eLogicalCornerBEndIEnd, *iter.mCellMap, iter.mRowGroupStart, info.GetCellEndRowIndex(), colIdx, LogicalSide(brCorner.ownerSide), @@ -6026,7 +6027,7 @@ nsTableFrame::CalcBCBorders() if (info.GetCellEndRowIndex() < damageArea.EndRow() && colIdx >= damageArea.StartCol()) { if (hitsSpanBelow) { - tableCellMap->SetBCBorderCorner(eBEndIStart, *iter.mCellMap, + tableCellMap->SetBCBorderCorner(eLogicalCornerBEndIStart, *iter.mCellMap, iter.mRowGroupStart, info.GetCellEndRowIndex(), colIdx, LogicalSide(blCorner.ownerSide), @@ -6036,7 +6037,7 @@ nsTableFrame::CalcBCBorders() for (int32_t c = colIdx + 1; c < colIdx + segLength; c++) { BCCornerInfo& corner = bEndCorners[c]; corner.Set(eLogicalSideIEnd, currentBorder); - tableCellMap->SetBCBorderCorner(eBEndIStart, *iter.mCellMap, + tableCellMap->SetBCBorderCorner(eLogicalCornerBEndIStart, *iter.mCellMap, iter.mRowGroupStart, info.GetCellEndRowIndex(), c, LogicalSide(corner.ownerSide), From b3a51c2711a00338cb41c3b446f170d7bbcbf379 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 1 Aug 2024 20:28:28 +0200 Subject: [PATCH 13/25] Issue #1925 - Move Corner enum from mozilla::css to mozilla namespace. --- gfx/2d/BezierUtils.cpp | 2 +- gfx/2d/BezierUtils.h | 2 +- gfx/2d/Types.h | 18 +++++------- gfx/thebes/gfxRect.h | 2 +- layout/base/DottedCornerFinder.cpp | 2 +- layout/base/DottedCornerFinder.h | 4 +-- layout/base/nsCSSRenderingBorders.cpp | 42 +++++++++++++-------------- layout/base/nsCSSRenderingBorders.h | 20 ++++++------- 8 files changed, 45 insertions(+), 47 deletions(-) diff --git a/gfx/2d/BezierUtils.cpp b/gfx/2d/BezierUtils.cpp index 3ba47df446..eeb65ce1ba 100644 --- a/gfx/2d/BezierUtils.cpp +++ b/gfx/2d/BezierUtils.cpp @@ -241,7 +241,7 @@ FindBezierNearestPoint(const Bezier& aBezier, const Point& aTarget, } void -GetBezierPointsForCorner(Bezier* aBezier, mozilla::css::Corner aCorner, +GetBezierPointsForCorner(Bezier* aBezier, mozilla::Corner aCorner, const Point& aCornerPoint, const Size& aCornerSize) { // Calculate bezier control points for elliptic arc. diff --git a/gfx/2d/BezierUtils.h b/gfx/2d/BezierUtils.h index 7871f02845..eb1d5fd89c 100644 --- a/gfx/2d/BezierUtils.h +++ b/gfx/2d/BezierUtils.h @@ -127,7 +127,7 @@ Point FindBezierNearestPoint(const Bezier& aBezier, const Point& aTarget, // | | // v mPoints[0] | // -------------+ -void GetBezierPointsForCorner(Bezier* aBezier, mozilla::css::Corner aCorner, +void GetBezierPointsForCorner(Bezier* aBezier, mozilla::Corner aCorner, const Point& aCornerPoint, const Size& aCornerSize); diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index e3ccf2a442..882b8991f6 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -406,7 +406,6 @@ static inline Side& operator++(Side& side) { return side; } -namespace css { enum Corner { // This order is important! eCornerTopLeft = 0, @@ -415,23 +414,22 @@ enum Corner { eCornerBottomLeft = 3, eNumCorners = 4 }; -} // namespace css -#define NS_CORNER_TOP_LEFT mozilla::css::eCornerTopLeft -#define NS_CORNER_TOP_RIGHT mozilla::css::eCornerTopRight -#define NS_CORNER_BOTTOM_RIGHT mozilla::css::eCornerBottomRight -#define NS_CORNER_BOTTOM_LEFT mozilla::css::eCornerBottomLeft -#define NS_NUM_CORNERS mozilla::css::eNumCorners +#define NS_CORNER_TOP_LEFT mozilla::eCornerTopLeft +#define NS_CORNER_TOP_RIGHT mozilla::eCornerTopRight +#define NS_CORNER_BOTTOM_RIGHT mozilla::eCornerBottomRight +#define NS_CORNER_BOTTOM_LEFT mozilla::eCornerBottomLeft +#define NS_NUM_CORNERS mozilla::eNumCorners #define NS_FOR_CSS_CORNERS(var_) \ - for (mozilla::css::Corner var_ = NS_CORNER_TOP_LEFT; \ + for (mozilla::Corner var_ = NS_CORNER_TOP_LEFT; \ var_ <= NS_CORNER_BOTTOM_LEFT; \ var_++) -static inline mozilla::css::Corner operator++(mozilla::css::Corner& corner, int) { +static inline mozilla::Corner operator++(mozilla::Corner& corner, int) { MOZ_ASSERT(corner >= NS_CORNER_TOP_LEFT && corner < NS_NUM_CORNERS, "Out of range corner"); - corner = mozilla::css::Corner(corner + 1); + corner = mozilla::Corner(corner + 1); return corner; } diff --git a/gfx/thebes/gfxRect.h b/gfx/thebes/gfxRect.h index 5e057506c6..780b91f22c 100644 --- a/gfx/thebes/gfxRect.h +++ b/gfx/thebes/gfxRect.h @@ -45,7 +45,7 @@ struct gfxRect : */ bool WithinEpsilonOfIntegerPixels(gfxFloat aEpsilon) const; - gfxPoint AtCorner(mozilla::css::Corner corner) const { + gfxPoint AtCorner(mozilla::Corner corner) const { switch (corner) { case NS_CORNER_TOP_LEFT: return TopLeft(); case NS_CORNER_TOP_RIGHT: return TopRight(); diff --git a/layout/base/DottedCornerFinder.cpp b/layout/base/DottedCornerFinder.cpp index f109ec5017..83d6290c5d 100644 --- a/layout/base/DottedCornerFinder.cpp +++ b/layout/base/DottedCornerFinder.cpp @@ -44,7 +44,7 @@ nsDataHashtable DottedCornerCache; DottedCornerFinder::DottedCornerFinder(const Bezier& aOuterBezier, const Bezier& aInnerBezier, - mozilla::css::Corner aCorner, + mozilla::Corner aCorner, Float aBorderRadiusX, Float aBorderRadiusY, const Point& aC0, Float aR0, diff --git a/layout/base/DottedCornerFinder.h b/layout/base/DottedCornerFinder.h index 79eba5af8b..328298075d 100644 --- a/layout/base/DottedCornerFinder.h +++ b/layout/base/DottedCornerFinder.h @@ -116,7 +116,7 @@ public: // |<------->| // aRn DottedCornerFinder(const Bezier& aOuterBezier, const Bezier& aInnerBezier, - mozilla::css::Corner aCorner, + mozilla::Corner aCorner, Float aBorderRadiusX, Float aBorderRadiusY, const Point& aC0, Float aR0, const Point& aCn, Float aRn, const Size& aCornerDim); @@ -150,7 +150,7 @@ private: Bezier mInnerBezier; Bezier mCenterBezier; - mozilla::css::Corner mCorner; + mozilla::Corner mCorner; // Sign of the normal vector used in radius calculation, flipped depends on // corner and start and end radii. diff --git a/layout/base/nsCSSRenderingBorders.cpp b/layout/base/nsCSSRenderingBorders.cpp index 72172c210b..e786cc5e0d 100644 --- a/layout/base/nsCSSRenderingBorders.cpp +++ b/layout/base/nsCSSRenderingBorders.cpp @@ -67,8 +67,8 @@ static void ComputeBorderCornerDimensions(const Float* aBorderWidths, #define PREV_SIDE(_s) mozilla::Side(((_s) + 3) & 3) // given a corner index, get the previous and next corner index -#define NEXT_CORNER(_s) mozilla::css::Corner(((_s) + 1) & 3) -#define PREV_CORNER(_s) mozilla::css::Corner(((_s) + 3) & 3) +#define NEXT_CORNER(_s) mozilla::Corner(((_s) + 1) & 3) +#define PREV_CORNER(_s) mozilla::Corner(((_s) + 3) & 3) // from the given base color and the background color, turn // color into a color for the given border pattern style @@ -114,27 +114,27 @@ AllCornersZeroSize(const RectCornerRadii& corners) { } static mozilla::Side -GetHorizontalSide(mozilla::css::Corner aCorner) +GetHorizontalSide(mozilla::Corner aCorner) { return (aCorner == C_TL || aCorner == C_TR) ? eSideTop : eSideBottom; } static mozilla::Side -GetVerticalSide(mozilla::css::Corner aCorner) +GetVerticalSide(mozilla::Corner aCorner) { return (aCorner == C_TL || aCorner == C_BL) ? eSideLeft : eSideRight; } -static mozilla::css::Corner +static mozilla::Corner GetCWCorner(mozilla::Side aSide) { - return mozilla::css::Corner(NEXT_SIDE(aSide)); + return mozilla::Corner(NEXT_SIDE(aSide)); } -static mozilla::css::Corner +static mozilla::Corner GetCCWCorner(mozilla::Side aSide) { - return mozilla::css::Corner(aSide); + return mozilla::Corner(aSide); } static bool @@ -332,7 +332,7 @@ nsCSSBorderRenderer::AreBorderSideFinalStylesSame(uint8_t aSides) } bool -nsCSSBorderRenderer::IsSolidCornerStyle(uint8_t aStyle, mozilla::css::Corner aCorner) +nsCSSBorderRenderer::IsSolidCornerStyle(uint8_t aStyle, mozilla::Corner aCorner) { switch (aStyle) { case NS_STYLE_BORDER_STYLE_SOLID: @@ -355,7 +355,7 @@ nsCSSBorderRenderer::IsSolidCornerStyle(uint8_t aStyle, mozilla::css::Corner aCo } bool -nsCSSBorderRenderer::IsCornerMergeable(mozilla::css::Corner aCorner) +nsCSSBorderRenderer::IsCornerMergeable(mozilla::Corner aCorner) { // Corner between dotted borders with same width and small radii is // merged into single dot. @@ -405,7 +405,7 @@ nsCSSBorderRenderer::IsCornerMergeable(mozilla::css::Corner aCorner) } BorderColorStyle -nsCSSBorderRenderer::BorderColorStyleForSolidCorner(uint8_t aStyle, mozilla::css::Corner aCorner) +nsCSSBorderRenderer::BorderColorStyleForSolidCorner(uint8_t aStyle, mozilla::Corner aCorner) { // note that this function assumes that the corner is already solid, // as per the earlier function @@ -435,7 +435,7 @@ nsCSSBorderRenderer::BorderColorStyleForSolidCorner(uint8_t aStyle, mozilla::css } Rect -nsCSSBorderRenderer::GetCornerRect(mozilla::css::Corner aCorner) +nsCSSBorderRenderer::GetCornerRect(mozilla::Corner aCorner) { Point offset(0.f, 0.f); @@ -674,7 +674,7 @@ nsCSSBorderRenderer::GetSideClipSubPath(mozilla::Side aSide) Point nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::Side aSide, - mozilla::css::Corner aCorner, + mozilla::Corner aCorner, bool* aIsUnfilled, Float aDotOffset) @@ -1070,7 +1070,7 @@ nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::Side aSide, void nsCSSBorderRenderer::GetOuterAndInnerBezier(Bezier* aOuterBezier, Bezier* aInnerBezier, - mozilla::css::Corner aCorner) + mozilla::Corner aCorner) { // Return bezier control points for outer and inner curve for given corner. // @@ -2308,7 +2308,7 @@ nsCSSBorderRenderer::DrawDottedSideSlow(mozilla::Side aSide) void nsCSSBorderRenderer::DrawDashedOrDottedCorner(mozilla::Side aSide, - mozilla::css::Corner aCorner) + mozilla::Corner aCorner) { // Draw dashed/dotted corner with following approach. // @@ -2417,7 +2417,7 @@ nsCSSBorderRenderer::DrawDashedOrDottedCorner(mozilla::Side aSide, void nsCSSBorderRenderer::DrawDottedCornerSlow(mozilla::Side aSide, - mozilla::css::Corner aCorner) + mozilla::Corner aCorner) { NS_ASSERTION(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DOTTED, "Style should be dotted."); @@ -2494,7 +2494,7 @@ DashedPathOverlapsRect(Rect& pathRect, void nsCSSBorderRenderer::DrawDashedCornerSlow(mozilla::Side aSide, - mozilla::css::Corner aCorner) + mozilla::Corner aCorner) { NS_ASSERTION(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DASHED, "Style should be dashed."); @@ -2610,7 +2610,7 @@ nsCSSBorderRenderer::DrawDashedCornerSlow(mozilla::Side aSide, void nsCSSBorderRenderer::DrawFallbackSolidCorner(mozilla::Side aSide, - mozilla::css::Corner aCorner) + mozilla::Corner aCorner) { // Render too large dashed or dotted corner with solid style, to avoid hangup // inside DashedCornerFinder and DottedCornerFinder. @@ -2839,7 +2839,7 @@ ComputeCornerSkirtSize(Float aAlpha1, Float aAlpha2, // seams when anti-aliased drawing is used. static void DrawBorderRadius(DrawTarget* aDrawTarget, - mozilla::css::Corner c, + mozilla::Corner c, const Point& aOuterCorner, const Point& aInnerCorner, const twoFloats& aCornerMultPrev, const twoFloats& aCornerMultNext, const Size& aCornerDims, @@ -3046,8 +3046,8 @@ nsCSSBorderRenderer::DrawNoCompositeColorSolidBorder() // Thus, the CCW corner of the next side will end up drawn here. // the corner index -- either 1 2 3 0 (cw) or 0 3 2 1 (ccw) - mozilla::css::Corner c = mozilla::css::Corner((i+1) % 4); - mozilla::css::Corner prevCorner = mozilla::css::Corner(i); + mozilla::Corner c = mozilla::Corner((i+1) % 4); + mozilla::Corner prevCorner = mozilla::Corner(i); // i+2 and i+3 respectively. These are used to index into the corner // multiplier table, and were deduced by calculating out the long form diff --git a/layout/base/nsCSSRenderingBorders.h b/layout/base/nsCSSRenderingBorders.h index 5ff8300389..e4d8360910 100644 --- a/layout/base/nsCSSRenderingBorders.h +++ b/layout/base/nsCSSRenderingBorders.h @@ -142,20 +142,20 @@ private: bool AreBorderSideFinalStylesSame(uint8_t aSides); // For the given style, is the given corner a solid color? - bool IsSolidCornerStyle(uint8_t aStyle, mozilla::css::Corner aCorner); + bool IsSolidCornerStyle(uint8_t aStyle, mozilla::Corner aCorner); // For the given corner, is the given corner mergeable into one dot? - bool IsCornerMergeable(mozilla::css::Corner aCorner); + bool IsCornerMergeable(mozilla::Corner aCorner); // For the given solid corner, what color style should be used? - BorderColorStyle BorderColorStyleForSolidCorner(uint8_t aStyle, mozilla::css::Corner aCorner); + BorderColorStyle BorderColorStyleForSolidCorner(uint8_t aStyle, mozilla::Corner aCorner); // // Path generation functions // // Get the Rect for drawing the given corner - Rect GetCornerRect(mozilla::css::Corner aCorner); + Rect GetCornerRect(mozilla::Corner aCorner); // add the path for drawing the given side without any adjacent corners to the context Rect GetSideClipWithoutCornersRect(mozilla::Side aSide); @@ -171,7 +171,7 @@ private: // Return start or end point for dashed/dotted side Point GetStraightBorderPoint(mozilla::Side aSide, - mozilla::css::Corner aCorner, + mozilla::Corner aCorner, bool* aIsUnfilled, Float aDotOffset = 0.0f); @@ -179,7 +179,7 @@ private: // corner void GetOuterAndInnerBezier(Bezier* aOuterBezier, Bezier* aInnerBezier, - mozilla::css::Corner aCorner); + mozilla::Corner aCorner); // Given a set of sides to fill and a color, do so in the fastest way. // @@ -224,19 +224,19 @@ private: // Draw the given dashed/dotted corner void DrawDashedOrDottedCorner(mozilla::Side aSide, - mozilla::css::Corner aCorner); + mozilla::Corner aCorner); // Draw the given dotted corner, each segment separately void DrawDottedCornerSlow(mozilla::Side aSide, - mozilla::css::Corner aCorner); + mozilla::Corner aCorner); // Draw the given dashed corner, each dot separately void DrawDashedCornerSlow(mozilla::Side aSide, - mozilla::css::Corner aCorner); + mozilla::Corner aCorner); // Draw the given dashed/dotted corner with solid style void DrawFallbackSolidCorner(mozilla::Side aSide, - mozilla::css::Corner aCorner); + mozilla::Corner aCorner); // Analyze if all border sides have the same width. bool AllBordersSameWidth(); From 0a7f42b4524b4cdfb4f8aa64c9a3d04167c9d5ca Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 04:50:01 +0200 Subject: [PATCH 14/25] Issue #1925 - Rewrite NS_FOR_CSS_CORNERS to be similar to *_SIDES - Renames it to NS_CSS_FULL_CORNERS and uses the one macro for all full corners. In preparation for giving half corners the same treatment. - Swaps to prefix operator++ --- gfx/2d/Types.h | 26 ++++++++++++++------------ gfx/thebes/gfxRect.h | 3 --- layout/base/nsCSSRenderingBorders.cpp | 4 ++-- layout/style/nsStyleConsts.h | 2 -- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 882b8991f6..211577e7ab 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -411,26 +411,28 @@ enum Corner { eCornerTopLeft = 0, eCornerTopRight = 1, eCornerBottomRight = 2, - eCornerBottomLeft = 3, - eNumCorners = 4 + eCornerBottomLeft = 3 }; #define NS_CORNER_TOP_LEFT mozilla::eCornerTopLeft #define NS_CORNER_TOP_RIGHT mozilla::eCornerTopRight #define NS_CORNER_BOTTOM_RIGHT mozilla::eCornerBottomRight #define NS_CORNER_BOTTOM_LEFT mozilla::eCornerBottomLeft -#define NS_NUM_CORNERS mozilla::eNumCorners -#define NS_FOR_CSS_CORNERS(var_) \ - for (mozilla::Corner var_ = NS_CORNER_TOP_LEFT; \ - var_ <= NS_CORNER_BOTTOM_LEFT; \ - var_++) +// Creates a for loop that walks over the four mozilla::Corner values. This +// implementation uses the same technique as NS_FOR_CSS_SIDES. +#define NS_FOR_CSS_FULL_CORNERS(var_) \ + int32_t MOZ_CONCAT(var_,__LINE__) = mozilla::eCornerTopLeft; \ + for (mozilla::Corner var_; \ + MOZ_CONCAT(var_,__LINE__) <= mozilla::eCornerBottomLeft && \ + (var_ = mozilla::Corner(MOZ_CONCAT(var_,__LINE__)), true); \ + ++MOZ_CONCAT(var_,__LINE__)) -static inline mozilla::Corner operator++(mozilla::Corner& corner, int) { - MOZ_ASSERT(corner >= NS_CORNER_TOP_LEFT && - corner < NS_NUM_CORNERS, "Out of range corner"); - corner = mozilla::Corner(corner + 1); - return corner; +static inline mozilla::Corner operator++(mozilla::Corner& aCorner) { + MOZ_ASSERT(aCorner >= eCornerTopLeft && aCorner <= eCornerBottomLeft, + "Out of range corner!"); + aCorner = mozilla::Corner(aCorner + 1); + return aCorner; } } // namespace mozilla diff --git a/gfx/thebes/gfxRect.h b/gfx/thebes/gfxRect.h index 780b91f22c..dd0e500119 100644 --- a/gfx/thebes/gfxRect.h +++ b/gfx/thebes/gfxRect.h @@ -51,9 +51,6 @@ struct gfxRect : case NS_CORNER_TOP_RIGHT: return TopRight(); case NS_CORNER_BOTTOM_RIGHT: return BottomRight(); case NS_CORNER_BOTTOM_LEFT: return BottomLeft(); - default: - NS_ERROR("Invalid corner!"); - break; } return gfxPoint(0.0, 0.0); } diff --git a/layout/base/nsCSSRenderingBorders.cpp b/layout/base/nsCSSRenderingBorders.cpp index e786cc5e0d..27758bcc0c 100644 --- a/layout/base/nsCSSRenderingBorders.cpp +++ b/layout/base/nsCSSRenderingBorders.cpp @@ -3385,7 +3385,7 @@ nsCSSBorderRenderer::DrawBorders() * a 1.0 unit border all around and no border radius. */ - NS_FOR_CSS_CORNERS(corner) { + NS_FOR_CSS_FULL_CORNERS(corner) { const mozilla::Side sides[2] = { mozilla::Side(corner), PREV_SIDE(corner) }; if (!IsZeroSize(mBorderRadii[corner])) @@ -3400,7 +3400,7 @@ nsCSSBorderRenderer::DrawBorders() } // First, the corners - NS_FOR_CSS_CORNERS(corner) { + NS_FOR_CSS_FULL_CORNERS(corner) { // if there's no corner, don't do all this work for it if (IsZeroSize(mBorderCornerDimensions[corner])) continue; diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index 90ead02e67..9465052321 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -16,8 +16,6 @@ namespace mozilla { -#define NS_FOR_CSS_FULL_CORNERS(var_) for (int32_t var_ = 0; var_ < 4; ++var_) - // Indices into "half corner" arrays (nsStyleCorners e.g.) #define NS_CORNER_TOP_LEFT_X 0 #define NS_CORNER_TOP_LEFT_Y 1 From d73f8c2e849f4eb753f28f94b2454dcb26b5dd0f Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 06:08:29 +0200 Subject: [PATCH 15/25] Issue #1925 - Remove use of NS_CORNER_{TOP|BOTTOM}_{LEFT|RIGHT} macros. --- gfx/2d/Types.h | 5 --- gfx/thebes/RoundedRect.h | 24 +++++++++----- gfx/thebes/gfxRect.h | 8 ++--- layout/base/BorderConsts.h | 8 ++--- layout/base/nsCSSRenderingBorders.cpp | 22 ++++++------ layout/base/nsLayoutUtils.cpp | 32 +++++++++--------- layout/style/StyleAnimationValue.cpp | 16 ++++----- layout/style/nsCSSValue.cpp | 4 +-- layout/style/nsComputedDOMStyle.cpp | 16 ++++----- layout/style/nsStyleCoord.cpp | 48 +++++++++++++-------------- 10 files changed, 93 insertions(+), 90 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 211577e7ab..a1210c9c95 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -414,11 +414,6 @@ enum Corner { eCornerBottomLeft = 3 }; -#define NS_CORNER_TOP_LEFT mozilla::eCornerTopLeft -#define NS_CORNER_TOP_RIGHT mozilla::eCornerTopRight -#define NS_CORNER_BOTTOM_RIGHT mozilla::eCornerBottomRight -#define NS_CORNER_BOTTOM_LEFT mozilla::eCornerBottomLeft - // Creates a for loop that walks over the four mozilla::Corner values. This // implementation uses the same technique as NS_FOR_CSS_SIDES. #define NS_FOR_CSS_FULL_CORNERS(var_) \ diff --git a/gfx/thebes/RoundedRect.h b/gfx/thebes/RoundedRect.h index 6da69275f7..bd2a3bc8a7 100644 --- a/gfx/thebes/RoundedRect.h +++ b/gfx/thebes/RoundedRect.h @@ -24,17 +24,25 @@ struct RoundedRect { rect.width = std::max(0., rect.width - aLeftWidth - aRightWidth); rect.height = std::max(0., rect.height - aTopWidth - aBottomWidth); - corners.radii[NS_CORNER_TOP_LEFT].width = std::max(0., corners.radii[NS_CORNER_TOP_LEFT].width - aLeftWidth); - corners.radii[NS_CORNER_TOP_LEFT].height = std::max(0., corners.radii[NS_CORNER_TOP_LEFT].height - aTopWidth); + corners.radii[mozilla::eCornerTopLeft].width = + std::max(0., corners.radii[mozilla::eCornerTopLeft].width - aLeftWidth); + corners.radii[mozilla::eCornerTopLeft].height = + std::max(0., corners.radii[mozilla::eCornerTopLeft].height - aTopWidth); - corners.radii[NS_CORNER_TOP_RIGHT].width = std::max(0., corners.radii[NS_CORNER_TOP_RIGHT].width - aRightWidth); - corners.radii[NS_CORNER_TOP_RIGHT].height = std::max(0., corners.radii[NS_CORNER_TOP_RIGHT].height - aTopWidth); + corners.radii[mozilla::eCornerTopRight].width = + std::max(0., corners.radii[mozilla::eCornerTopRight].width - aRightWidth); + corners.radii[mozilla::eCornerTopRight].height = + std::max(0., corners.radii[mozilla::eCornerTopRight].height - aTopWidth); - corners.radii[NS_CORNER_BOTTOM_LEFT].width = std::max(0., corners.radii[NS_CORNER_BOTTOM_LEFT].width - aLeftWidth); - corners.radii[NS_CORNER_BOTTOM_LEFT].height = std::max(0., corners.radii[NS_CORNER_BOTTOM_LEFT].height - aBottomWidth); + corners.radii[mozilla::eCornerBottomLeft].width = + std::max(0., corners.radii[mozilla::eCornerBottomLeft].width - aLeftWidth); + corners.radii[mozilla::eCornerBottomLeft].height = + std::max(0., corners.radii[mozilla::eCornerBottomLeft].height - aBottomWidth); - corners.radii[NS_CORNER_BOTTOM_RIGHT].width = std::max(0., corners.radii[NS_CORNER_BOTTOM_RIGHT].width - aRightWidth); - corners.radii[NS_CORNER_BOTTOM_RIGHT].height = std::max(0., corners.radii[NS_CORNER_BOTTOM_RIGHT].height - aBottomWidth); + corners.radii[mozilla::eCornerBottomRight].width = + std::max(0., corners.radii[mozilla::eCornerBottomRight].width - aRightWidth); + corners.radii[mozilla::eCornerBottomRight].height = + std::max(0., corners.radii[mozilla::eCornerBottomRight].height - aBottomWidth); } gfxRect rect; RectCornerRadii corners; diff --git a/gfx/thebes/gfxRect.h b/gfx/thebes/gfxRect.h index dd0e500119..8c1a5ee518 100644 --- a/gfx/thebes/gfxRect.h +++ b/gfx/thebes/gfxRect.h @@ -47,10 +47,10 @@ struct gfxRect : gfxPoint AtCorner(mozilla::Corner corner) const { switch (corner) { - case NS_CORNER_TOP_LEFT: return TopLeft(); - case NS_CORNER_TOP_RIGHT: return TopRight(); - case NS_CORNER_BOTTOM_RIGHT: return BottomRight(); - case NS_CORNER_BOTTOM_LEFT: return BottomLeft(); + case mozilla::eCornerTopLeft: return TopLeft(); + case mozilla::eCornerTopRight: return TopRight(); + case mozilla::eCornerBottomRight: return BottomRight(); + case mozilla::eCornerBottomLeft: return BottomLeft(); } return gfxPoint(0.0, 0.0); } diff --git a/layout/base/BorderConsts.h b/layout/base/BorderConsts.h index 0bc50e61db..4eea1e1434 100644 --- a/layout/base/BorderConsts.h +++ b/layout/base/BorderConsts.h @@ -10,10 +10,10 @@ #define DOT_LENGTH 1 // square #define DASH_LENGTH 3 // 3 times longer than dot -#define C_TL NS_CORNER_TOP_LEFT -#define C_TR NS_CORNER_TOP_RIGHT -#define C_BR NS_CORNER_BOTTOM_RIGHT -#define C_BL NS_CORNER_BOTTOM_LEFT +#define C_TL mozilla::eCornerTopLeft +#define C_TR mozilla::eCornerTopRight +#define C_BR mozilla::eCornerBottomRight +#define C_BL mozilla::eCornerBottomLeft #define BORDER_SEGMENT_COUNT_MAX 100 #define BORDER_DOTTED_CORNER_MAX_RADIUS 100000 diff --git a/layout/base/nsCSSRenderingBorders.cpp b/layout/base/nsCSSRenderingBorders.cpp index 27758bcc0c..9b80ed9ede 100644 --- a/layout/base/nsCSSRenderingBorders.cpp +++ b/layout/base/nsCSSRenderingBorders.cpp @@ -107,10 +107,10 @@ IsZeroSize(const Size& sz) { static bool AllCornersZeroSize(const RectCornerRadii& corners) { - return IsZeroSize(corners[NS_CORNER_TOP_LEFT]) && - IsZeroSize(corners[NS_CORNER_TOP_RIGHT]) && - IsZeroSize(corners[NS_CORNER_BOTTOM_RIGHT]) && - IsZeroSize(corners[NS_CORNER_BOTTOM_LEFT]); + return IsZeroSize(corners[eCornerTopLeft]) && + IsZeroSize(corners[eCornerTopRight]) && + IsZeroSize(corners[eCornerBottomRight]) && + IsZeroSize(corners[eCornerBottomLeft]); } static mozilla::Side @@ -340,11 +340,11 @@ nsCSSBorderRenderer::IsSolidCornerStyle(uint8_t aStyle, mozilla::Corner aCorner) case NS_STYLE_BORDER_STYLE_INSET: case NS_STYLE_BORDER_STYLE_OUTSET: - return (aCorner == NS_CORNER_TOP_LEFT || aCorner == NS_CORNER_BOTTOM_RIGHT); + return (aCorner == eCornerTopLeft || aCorner == eCornerBottomRight); case NS_STYLE_BORDER_STYLE_GROOVE: case NS_STYLE_BORDER_STYLE_RIDGE: - return mOneUnitBorder && (aCorner == NS_CORNER_TOP_LEFT || aCorner == NS_CORNER_BOTTOM_RIGHT); + return mOneUnitBorder && (aCorner == eCornerTopLeft || aCorner == eCornerBottomRight); case NS_STYLE_BORDER_STYLE_DOUBLE: return mOneUnitBorder; @@ -416,17 +416,17 @@ nsCSSBorderRenderer::BorderColorStyleForSolidCorner(uint8_t aStyle, mozilla::Cor case NS_STYLE_BORDER_STYLE_INSET: case NS_STYLE_BORDER_STYLE_GROOVE: - if (aCorner == NS_CORNER_TOP_LEFT) + if (aCorner == eCornerTopLeft) return BorderColorStyleDark; - else if (aCorner == NS_CORNER_BOTTOM_RIGHT) + else if (aCorner == eCornerBottomRight) return BorderColorStyleLight; break; case NS_STYLE_BORDER_STYLE_OUTSET: case NS_STYLE_BORDER_STYLE_RIDGE: - if (aCorner == NS_CORNER_TOP_LEFT) + if (aCorner == eCornerTopLeft) return BorderColorStyleLight; - else if (aCorner == NS_CORNER_BOTTOM_RIGHT) + else if (aCorner == eCornerBottomRight) return BorderColorStyleDark; break; } @@ -3392,7 +3392,7 @@ nsCSSBorderRenderer::DrawBorders() continue; if (mBorderWidths[sides[0]] == 1.0 && mBorderWidths[sides[1]] == 1.0) { - if (corner == NS_CORNER_TOP_LEFT || corner == NS_CORNER_TOP_RIGHT) + if (corner == eCornerTopLeft || corner == eCornerTopRight) mBorderCornerDimensions[corner].width = 0.0; else mBorderCornerDimensions[corner].height = 0.0; diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 397ca98338..04e90041bb 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -6789,14 +6789,14 @@ nsLayoutUtils::HasNonZeroCorner(const nsStyleCorners& aCorners) // aCorner is a "full corner" value, i.e. NS_CORNER_TOP_LEFT etc static bool IsCornerAdjacentToSide(uint8_t aCorner, Side aSide) { - static_assert((int)eSideTop == NS_CORNER_TOP_LEFT, "Check for Full Corner"); - static_assert((int)eSideRight == NS_CORNER_TOP_RIGHT, "Check for Full Corner"); - static_assert((int)eSideBottom == NS_CORNER_BOTTOM_RIGHT, "Check for Full Corner"); - static_assert((int)eSideLeft == NS_CORNER_BOTTOM_LEFT, "Check for Full Corner"); - static_assert((int)eSideTop == ((NS_CORNER_TOP_RIGHT - 1)&3), "Check for Full Corner"); - static_assert((int)eSideRight == ((NS_CORNER_BOTTOM_RIGHT - 1)&3), "Check for Full Corner"); - static_assert((int)eSideBottom == ((NS_CORNER_BOTTOM_LEFT - 1)&3), "Check for Full Corner"); - static_assert((int)eSideLeft == ((NS_CORNER_TOP_LEFT - 1)&3), "Check for Full Corner"); + static_assert((int)eSideTop == eCornerTopLeft, "Check for Full Corner"); + static_assert((int)eSideRight == eCornerTopRight, "Check for Full Corner"); + static_assert((int)eSideBottom == eCornerBottomRight, "Check for Full Corner"); + static_assert((int)eSideLeft == eCornerBottomLeft, "Check for Full Corner"); + static_assert((int)eSideTop == ((eCornerTopRight - 1)&3), "Check for Full Corner"); + static_assert((int)eSideRight == ((eCornerBottomRight - 1)&3), "Check for Full Corner"); + static_assert((int)eSideBottom == ((eCornerBottomLeft - 1)&3), "Check for Full Corner"); + static_assert((int)eSideLeft == ((eCornerTopLeft - 1)&3), "Check for Full Corner"); return aSide == aCorner || aSide == ((aCorner - 1)&3); } @@ -6805,14 +6805,14 @@ static bool IsCornerAdjacentToSide(uint8_t aCorner, Side aSide) nsLayoutUtils::HasNonZeroCornerOnSide(const nsStyleCorners& aCorners, Side aSide) { - static_assert(NS_CORNER_TOP_LEFT_X/2 == NS_CORNER_TOP_LEFT, "Check for Non Zero on side"); - static_assert(NS_CORNER_TOP_LEFT_Y/2 == NS_CORNER_TOP_LEFT, "Check for Non Zero on side"); - static_assert(NS_CORNER_TOP_RIGHT_X/2 == NS_CORNER_TOP_RIGHT, "Check for Non Zero on side"); - static_assert(NS_CORNER_TOP_RIGHT_Y/2 == NS_CORNER_TOP_RIGHT, "Check for Non Zero on side"); - static_assert(NS_CORNER_BOTTOM_RIGHT_X/2 == NS_CORNER_BOTTOM_RIGHT, "Check for Non Zero on side"); - static_assert(NS_CORNER_BOTTOM_RIGHT_Y/2 == NS_CORNER_BOTTOM_RIGHT, "Check for Non Zero on side"); - static_assert(NS_CORNER_BOTTOM_LEFT_X/2 == NS_CORNER_BOTTOM_LEFT, "Check for Non Zero on side"); - static_assert(NS_CORNER_BOTTOM_LEFT_Y/2 == NS_CORNER_BOTTOM_LEFT, "Check for Non Zero on side"); + static_assert(NS_CORNER_TOP_LEFT_X/2 == eCornerTopLeft, "Check for Non Zero on side"); + static_assert(NS_CORNER_TOP_LEFT_Y/2 == eCornerTopLeft, "Check for Non Zero on side"); + static_assert(NS_CORNER_TOP_RIGHT_X/2 == eCornerTopRight, "Check for Non Zero on side"); + static_assert(NS_CORNER_TOP_RIGHT_Y/2 == eCornerTopRight, "Check for Non Zero on side"); + static_assert(NS_CORNER_BOTTOM_RIGHT_X/2 == eCornerBottomRight, "Check for Non Zero on side"); + static_assert(NS_CORNER_BOTTOM_RIGHT_Y/2 == eCornerBottomRight, "Check for Non Zero on side"); + static_assert(NS_CORNER_BOTTOM_LEFT_X/2 == eCornerBottomLeft, "Check for Non Zero on side"); + static_assert(NS_CORNER_BOTTOM_LEFT_Y/2 == eCornerBottomLeft, "Check for Non Zero on side"); NS_FOR_CSS_HALF_CORNERS(corner) { // corner is a "half corner" value, so dividing by two gives us a diff --git a/layout/style/StyleAnimationValue.cpp b/layout/style/StyleAnimationValue.cpp index cfaf19df3c..e007d8335e 100644 --- a/layout/style/StyleAnimationValue.cpp +++ b/layout/style/StyleAnimationValue.cpp @@ -4389,14 +4389,14 @@ StyleAnimationValue::ExtractComputedValue(nsCSSPropertyID aProperty, case eStyleAnimType_Corner_BottomRight: case eStyleAnimType_Corner_BottomLeft: { static_assert( - NS_CORNER_TOP_LEFT == eStyleAnimType_Corner_TopLeft - - eStyleAnimType_Corner_TopLeft && - NS_CORNER_TOP_RIGHT == eStyleAnimType_Corner_TopRight - - eStyleAnimType_Corner_TopLeft && - NS_CORNER_BOTTOM_RIGHT == eStyleAnimType_Corner_BottomRight - - eStyleAnimType_Corner_TopLeft && - NS_CORNER_BOTTOM_LEFT == eStyleAnimType_Corner_BottomLeft - - eStyleAnimType_Corner_TopLeft, + eCornerTopLeft == eStyleAnimType_Corner_TopLeft - + eStyleAnimType_Corner_TopLeft && + eCornerTopRight == eStyleAnimType_Corner_TopRight - + eStyleAnimType_Corner_TopLeft && + eCornerBottomRight == eStyleAnimType_Corner_BottomRight - + eStyleAnimType_Corner_TopLeft && + eCornerBottomLeft == eStyleAnimType_Corner_BottomLeft - + eStyleAnimType_Corner_TopLeft, "box corner constants out of sync with animation corner constants"); const nsStyleCorners& corners = diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp index aba5ba42cc..6553ebaf33 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -3253,8 +3253,8 @@ nsCSSCornerSizes::Reset() } } -static_assert(NS_CORNER_TOP_LEFT == 0 && NS_CORNER_TOP_RIGHT == 1 && - NS_CORNER_BOTTOM_RIGHT == 2 && NS_CORNER_BOTTOM_LEFT == 3, +static_assert(eCornerTopLeft == 0 && eCornerTopRight == 1 && + eCornerBottomRight == 2 && eCornerBottomLeft == 3, "box corner constants not tl/tr/br/bl == 0/1/2/3"); /* static */ const nsCSSCornerSizes::corner_type diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index 847f7d4415..39449b697a 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -3145,28 +3145,28 @@ already_AddRefed nsComputedDOMStyle::DoGetBorderBottomLeftRadius() { return GetEllipseRadii(StyleBorder()->mBorderRadius, - NS_CORNER_BOTTOM_LEFT); + eCornerBottomLeft); } already_AddRefed nsComputedDOMStyle::DoGetBorderBottomRightRadius() { return GetEllipseRadii(StyleBorder()->mBorderRadius, - NS_CORNER_BOTTOM_RIGHT); + eCornerBottomRight); } already_AddRefed nsComputedDOMStyle::DoGetBorderTopLeftRadius() { return GetEllipseRadii(StyleBorder()->mBorderRadius, - NS_CORNER_TOP_LEFT); + eCornerTopLeft); } already_AddRefed nsComputedDOMStyle::DoGetBorderTopRightRadius() { return GetEllipseRadii(StyleBorder()->mBorderRadius, - NS_CORNER_TOP_RIGHT); + eCornerTopRight); } already_AddRefed @@ -3406,28 +3406,28 @@ already_AddRefed nsComputedDOMStyle::DoGetOutlineRadiusBottomLeft() { return GetEllipseRadii(StyleOutline()->mOutlineRadius, - NS_CORNER_BOTTOM_LEFT); + eCornerBottomLeft); } already_AddRefed nsComputedDOMStyle::DoGetOutlineRadiusBottomRight() { return GetEllipseRadii(StyleOutline()->mOutlineRadius, - NS_CORNER_BOTTOM_RIGHT); + eCornerBottomRight); } already_AddRefed nsComputedDOMStyle::DoGetOutlineRadiusTopLeft() { return GetEllipseRadii(StyleOutline()->mOutlineRadius, - NS_CORNER_TOP_LEFT); + eCornerTopLeft); } already_AddRefed nsComputedDOMStyle::DoGetOutlineRadiusTopRight() { return GetEllipseRadii(StyleOutline()->mOutlineRadius, - NS_CORNER_TOP_RIGHT); + eCornerTopRight); } already_AddRefed diff --git a/layout/style/nsStyleCoord.cpp b/layout/style/nsStyleCoord.cpp index 2fd735308d..05f78108bf 100644 --- a/layout/style/nsStyleCoord.cpp +++ b/layout/style/nsStyleCoord.cpp @@ -355,45 +355,45 @@ CASE(NS_CORNER_BOTTOM_LEFT_Y, false); #define CASE(corner, result) \ static_assert(NS_HALF_TO_FULL_CORNER(corner) == result, \ "NS_HALF_TO_FULL_CORNER is wrong") -CASE(NS_CORNER_TOP_LEFT_X, NS_CORNER_TOP_LEFT); -CASE(NS_CORNER_TOP_LEFT_Y, NS_CORNER_TOP_LEFT); -CASE(NS_CORNER_TOP_RIGHT_X, NS_CORNER_TOP_RIGHT); -CASE(NS_CORNER_TOP_RIGHT_Y, NS_CORNER_TOP_RIGHT); -CASE(NS_CORNER_BOTTOM_RIGHT_X, NS_CORNER_BOTTOM_RIGHT); -CASE(NS_CORNER_BOTTOM_RIGHT_Y, NS_CORNER_BOTTOM_RIGHT); -CASE(NS_CORNER_BOTTOM_LEFT_X, NS_CORNER_BOTTOM_LEFT); -CASE(NS_CORNER_BOTTOM_LEFT_Y, NS_CORNER_BOTTOM_LEFT); +CASE(NS_CORNER_TOP_LEFT_X, eCornerTopLeft); +CASE(NS_CORNER_TOP_LEFT_Y, eCornerTopLeft); +CASE(NS_CORNER_TOP_RIGHT_X, eCornerTopRight); +CASE(NS_CORNER_TOP_RIGHT_Y, eCornerTopRight); +CASE(NS_CORNER_BOTTOM_RIGHT_X, eCornerBottomRight); +CASE(NS_CORNER_BOTTOM_RIGHT_Y, eCornerBottomRight); +CASE(NS_CORNER_BOTTOM_LEFT_X, eCornerBottomLeft); +CASE(NS_CORNER_BOTTOM_LEFT_Y, eCornerBottomLeft); #undef CASE // Validation of NS_FULL_TO_HALF_CORNER. #define CASE(corner, vert, result) \ static_assert(NS_FULL_TO_HALF_CORNER(corner, vert) == result, \ "NS_FULL_TO_HALF_CORNER is wrong") -CASE(NS_CORNER_TOP_LEFT, false, NS_CORNER_TOP_LEFT_X); -CASE(NS_CORNER_TOP_LEFT, true, NS_CORNER_TOP_LEFT_Y); -CASE(NS_CORNER_TOP_RIGHT, false, NS_CORNER_TOP_RIGHT_X); -CASE(NS_CORNER_TOP_RIGHT, true, NS_CORNER_TOP_RIGHT_Y); -CASE(NS_CORNER_BOTTOM_RIGHT, false, NS_CORNER_BOTTOM_RIGHT_X); -CASE(NS_CORNER_BOTTOM_RIGHT, true, NS_CORNER_BOTTOM_RIGHT_Y); -CASE(NS_CORNER_BOTTOM_LEFT, false, NS_CORNER_BOTTOM_LEFT_X); -CASE(NS_CORNER_BOTTOM_LEFT, true, NS_CORNER_BOTTOM_LEFT_Y); +CASE(eCornerTopLeft, false, NS_CORNER_TOP_LEFT_X); +CASE(eCornerTopLeft, true, NS_CORNER_TOP_LEFT_Y); +CASE(eCornerTopRight, false, NS_CORNER_TOP_RIGHT_X); +CASE(eCornerTopRight, true, NS_CORNER_TOP_RIGHT_Y); +CASE(eCornerBottomRight, false, NS_CORNER_BOTTOM_RIGHT_X); +CASE(eCornerBottomRight, true, NS_CORNER_BOTTOM_RIGHT_Y); +CASE(eCornerBottomLeft, false, NS_CORNER_BOTTOM_LEFT_X); +CASE(eCornerBottomLeft, true, NS_CORNER_BOTTOM_LEFT_Y); #undef CASE // Validation of NS_SIDE_TO_{FULL,HALF}_CORNER. #define CASE(side, second, result) \ static_assert(NS_SIDE_TO_FULL_CORNER(side, second) == result, \ "NS_SIDE_TO_FULL_CORNER is wrong") -CASE(eSideTop, false, NS_CORNER_TOP_LEFT); -CASE(eSideTop, true, NS_CORNER_TOP_RIGHT); +CASE(eSideTop, false, eCornerTopLeft); +CASE(eSideTop, true, eCornerTopRight); -CASE(eSideRight, false, NS_CORNER_TOP_RIGHT); -CASE(eSideRight, true, NS_CORNER_BOTTOM_RIGHT); +CASE(eSideRight, false, eCornerTopRight); +CASE(eSideRight, true, eCornerBottomRight); -CASE(eSideBottom, false, NS_CORNER_BOTTOM_RIGHT); -CASE(eSideBottom, true, NS_CORNER_BOTTOM_LEFT); +CASE(eSideBottom, false, eCornerBottomRight); +CASE(eSideBottom, true, eCornerBottomLeft); -CASE(eSideLeft, false, NS_CORNER_BOTTOM_LEFT); -CASE(eSideLeft, true, NS_CORNER_TOP_LEFT); +CASE(eSideLeft, false, eCornerBottomLeft); +CASE(eSideLeft, true, eCornerTopLeft); #undef CASE #define CASE(side, second, parallel, result) \ From 8dc8875db6515d71f0260831c021032312323ebe Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 08:01:01 +0200 Subject: [PATCH 16/25] Issue #1925 - Convert half-corner index macros to an enum. --- gfx/2d/Types.h | 13 +++++ layout/base/DisplayItemClip.cpp | 48 ++++++++--------- layout/base/nsCSSRendering.cpp | 16 +++--- layout/base/nsDisplayList.cpp | 8 +-- layout/base/nsLayoutUtils.cpp | 44 ++++++++-------- layout/generic/nsFrame.cpp | 32 ++++++------ layout/generic/nsGfxScrollFrame.cpp | 16 +++--- layout/style/nsStyleConsts.h | 10 ---- layout/style/nsStyleCoord.cpp | 80 ++++++++++++++--------------- 9 files changed, 135 insertions(+), 132 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index a1210c9c95..8d094bcb15 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -430,6 +430,19 @@ static inline mozilla::Corner operator++(mozilla::Corner& aCorner) { return aCorner; } +// Indices into "half corner" arrays (e.g. nsStyleCorners) +enum HalfCorner { + // This order is important! + eCornerTopLeftX = 0, + eCornerTopLeftY = 1, + eCornerTopRightX = 2, + eCornerTopRightY = 3, + eCornerBottomRightX = 4, + eCornerBottomRightY = 5, + eCornerBottomLeftX = 6, + eCornerBottomLeftY = 7 +}; + } // namespace mozilla #endif /* MOZILLA_GFX_TYPES_H_ */ diff --git a/layout/base/DisplayItemClip.cpp b/layout/base/DisplayItemClip.cpp index ee4e19e5e8..d2629180be 100644 --- a/layout/base/DisplayItemClip.cpp +++ b/layout/base/DisplayItemClip.cpp @@ -203,49 +203,49 @@ DisplayItemClip::IsRectClippedByRoundedCorner(const nsRect& aRect) const i < iEnd; ++i) { const RoundedRect &rr = mRoundedClipRects[i]; // top left - if (rect.x < rr.mRect.x + rr.mRadii[NS_CORNER_TOP_LEFT_X] && - rect.y < rr.mRect.y + rr.mRadii[NS_CORNER_TOP_LEFT_Y]) { - if (!IsInsideEllipse(rr.mRadii[NS_CORNER_TOP_LEFT_X], - rr.mRect.x + rr.mRadii[NS_CORNER_TOP_LEFT_X], + if (rect.x < rr.mRect.x + rr.mRadii[eCornerTopLeftX] && + rect.y < rr.mRect.y + rr.mRadii[eCornerTopLeftY]) { + if (!IsInsideEllipse(rr.mRadii[eCornerTopLeftX], + rr.mRect.x + rr.mRadii[eCornerTopLeftX], rect.x, - rr.mRadii[NS_CORNER_TOP_LEFT_Y], - rr.mRect.y + rr.mRadii[NS_CORNER_TOP_LEFT_Y], + rr.mRadii[eCornerTopLeftY], + rr.mRect.y + rr.mRadii[eCornerTopLeftY], rect.y)) { return true; } } // top right - if (rect.XMost() > rr.mRect.XMost() - rr.mRadii[NS_CORNER_TOP_RIGHT_X] && - rect.y < rr.mRect.y + rr.mRadii[NS_CORNER_TOP_RIGHT_Y]) { - if (!IsInsideEllipse(rr.mRadii[NS_CORNER_TOP_RIGHT_X], - rr.mRect.XMost() - rr.mRadii[NS_CORNER_TOP_RIGHT_X], + if (rect.XMost() > rr.mRect.XMost() - rr.mRadii[eCornerTopRightX] && + rect.y < rr.mRect.y + rr.mRadii[eCornerTopRightY]) { + if (!IsInsideEllipse(rr.mRadii[eCornerTopRightX], + rr.mRect.XMost() - rr.mRadii[eCornerTopRightX], rect.XMost(), - rr.mRadii[NS_CORNER_TOP_RIGHT_Y], - rr.mRect.y + rr.mRadii[NS_CORNER_TOP_RIGHT_Y], + rr.mRadii[eCornerTopRightY], + rr.mRect.y + rr.mRadii[eCornerTopRightY], rect.y)) { return true; } } // bottom left - if (rect.x < rr.mRect.x + rr.mRadii[NS_CORNER_BOTTOM_LEFT_X] && - rect.YMost() > rr.mRect.YMost() - rr.mRadii[NS_CORNER_BOTTOM_LEFT_Y]) { - if (!IsInsideEllipse(rr.mRadii[NS_CORNER_BOTTOM_LEFT_X], - rr.mRect.x + rr.mRadii[NS_CORNER_BOTTOM_LEFT_X], + if (rect.x < rr.mRect.x + rr.mRadii[eCornerBottomLeftX] && + rect.YMost() > rr.mRect.YMost() - rr.mRadii[eCornerBottomLeftY]) { + if (!IsInsideEllipse(rr.mRadii[eCornerBottomLeftX], + rr.mRect.x + rr.mRadii[eCornerBottomLeftX], rect.x, - rr.mRadii[NS_CORNER_BOTTOM_LEFT_Y], - rr.mRect.YMost() - rr.mRadii[NS_CORNER_BOTTOM_LEFT_Y], + rr.mRadii[eCornerBottomLeftY], + rr.mRect.YMost() - rr.mRadii[eCornerBottomLeftY], rect.YMost())) { return true; } } // bottom right - if (rect.XMost() > rr.mRect.XMost() - rr.mRadii[NS_CORNER_BOTTOM_RIGHT_X] && - rect.YMost() > rr.mRect.YMost() - rr.mRadii[NS_CORNER_BOTTOM_RIGHT_Y]) { - if (!IsInsideEllipse(rr.mRadii[NS_CORNER_BOTTOM_RIGHT_X], - rr.mRect.XMost() - rr.mRadii[NS_CORNER_BOTTOM_RIGHT_X], + if (rect.XMost() > rr.mRect.XMost() - rr.mRadii[eCornerBottomRightX] && + rect.YMost() > rr.mRect.YMost() - rr.mRadii[eCornerBottomRightY]) { + if (!IsInsideEllipse(rr.mRadii[eCornerBottomRightX], + rr.mRect.XMost() - rr.mRadii[eCornerBottomRightX], rect.XMost(), - rr.mRadii[NS_CORNER_BOTTOM_RIGHT_Y], - rr.mRect.YMost() - rr.mRadii[NS_CORNER_BOTTOM_RIGHT_Y], + rr.mRadii[eCornerBottomRightY], + rr.mRect.YMost() - rr.mRadii[eCornerBottomRightY], rect.YMost())) { return true; } diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index a7424cf252..a6cfbbe16c 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -632,14 +632,14 @@ nsCSSRendering::ComputePixelRadii(const nscoord *aAppUnitsRadii, NS_FOR_CSS_HALF_CORNERS(corner) radii[corner] = Float(aAppUnitsRadii[corner]) / aAppUnitsPerPixel; - (*oBorderRadii)[C_TL] = Size(radii[NS_CORNER_TOP_LEFT_X], - radii[NS_CORNER_TOP_LEFT_Y]); - (*oBorderRadii)[C_TR] = Size(radii[NS_CORNER_TOP_RIGHT_X], - radii[NS_CORNER_TOP_RIGHT_Y]); - (*oBorderRadii)[C_BR] = Size(radii[NS_CORNER_BOTTOM_RIGHT_X], - radii[NS_CORNER_BOTTOM_RIGHT_Y]); - (*oBorderRadii)[C_BL] = Size(radii[NS_CORNER_BOTTOM_LEFT_X], - radii[NS_CORNER_BOTTOM_LEFT_Y]); + (*oBorderRadii)[C_TL] = Size(radii[eCornerTopLeftX], + radii[eCornerTopLeftY]); + (*oBorderRadii)[C_TR] = Size(radii[eCornerTopRightX], + radii[eCornerTopRightY]); + (*oBorderRadii)[C_BR] = Size(radii[eCornerBottomRightX], + radii[eCornerBottomRightY]); + (*oBorderRadii)[C_BL] = Size(radii[eCornerBottomLeftX], + radii[eCornerBottomLeftY]); } DrawResult diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index 3cc8bbaa89..fa28ea5f87 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -4129,19 +4129,19 @@ nsDisplayBorder::CalculateBounds(const nsStyleBorder& aStyleBorder) nscoord radii[8]; if (mFrame->GetBorderRadii(radii)) { if (border.left > 0 || border.top > 0) { - nsSize cornerSize(radii[NS_CORNER_TOP_LEFT_X], radii[NS_CORNER_TOP_LEFT_Y]); + nsSize cornerSize(radii[eCornerTopLeftX], radii[eCornerTopLeftY]); result.UnionRect(result, nsRect(borderBounds.TopLeft(), cornerSize)); } if (border.top > 0 || border.right > 0) { - nsSize cornerSize(radii[NS_CORNER_TOP_RIGHT_X], radii[NS_CORNER_TOP_RIGHT_Y]); + nsSize cornerSize(radii[eCornerTopRightX], radii[eCornerTopRightY]); result.UnionRect(result, nsRect(borderBounds.TopRight() - nsPoint(cornerSize.width, 0), cornerSize)); } if (border.right > 0 || border.bottom > 0) { - nsSize cornerSize(radii[NS_CORNER_BOTTOM_RIGHT_X], radii[NS_CORNER_BOTTOM_RIGHT_Y]); + nsSize cornerSize(radii[eCornerBottomRightX], radii[eCornerBottomRightY]); result.UnionRect(result, nsRect(borderBounds.BottomRight() - nsPoint(cornerSize.width, cornerSize.height), cornerSize)); } if (border.bottom > 0 || border.left > 0) { - nsSize cornerSize(radii[NS_CORNER_BOTTOM_LEFT_X], radii[NS_CORNER_BOTTOM_LEFT_Y]); + nsSize cornerSize(radii[eCornerBottomLeftX], radii[eCornerBottomLeftY]); result.UnionRect(result, nsRect(borderBounds.BottomLeft() - nsPoint(0, cornerSize.height), cornerSize)); } } diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 04e90041bb..87ad428ab8 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -2412,18 +2412,18 @@ nsLayoutUtils::RoundedRectIntersectRect(const nsRect& aRoundedRect, // rectFullHeight and rectFullWidth together will approximately contain // the total area of the frame minus the rounded corners. nsRect rectFullHeight = aRoundedRect; - nscoord xDiff = std::max(aRadii[NS_CORNER_TOP_LEFT_X], aRadii[NS_CORNER_BOTTOM_LEFT_X]); + nscoord xDiff = std::max(aRadii[eCornerTopLeftX], aRadii[eCornerBottomLeftX]); rectFullHeight.x += xDiff; - rectFullHeight.width -= std::max(aRadii[NS_CORNER_TOP_RIGHT_X], - aRadii[NS_CORNER_BOTTOM_RIGHT_X]) + xDiff; + rectFullHeight.width -= std::max(aRadii[eCornerTopRightX], + aRadii[eCornerBottomRightX]) + xDiff; nsRect r1; r1.IntersectRect(rectFullHeight, aContainedRect); nsRect rectFullWidth = aRoundedRect; - nscoord yDiff = std::max(aRadii[NS_CORNER_TOP_LEFT_Y], aRadii[NS_CORNER_TOP_RIGHT_Y]); + nscoord yDiff = std::max(aRadii[eCornerTopLeftY], aRadii[eCornerTopRightY]); rectFullWidth.y += yDiff; - rectFullWidth.height -= std::max(aRadii[NS_CORNER_BOTTOM_LEFT_Y], - aRadii[NS_CORNER_BOTTOM_RIGHT_Y]) + yDiff; + rectFullWidth.height -= std::max(aRadii[eCornerBottomLeftY], + aRadii[eCornerBottomRightY]) + yDiff; nsRect r2; r2.IntersectRect(rectFullWidth, aContainedRect); @@ -2505,17 +2505,17 @@ nsLayoutUtils::RoundedRectIntersectsRect(const nsRect& aRoundedRect, // top left corner of aBounds when rounded by aRadii, etc. If any // corner is not, then fail; otherwise succeed. return CheckCorner(insets.left, insets.top, - aRadii[NS_CORNER_TOP_LEFT_X], - aRadii[NS_CORNER_TOP_LEFT_Y]) && + aRadii[eCornerTopLeftX], + aRadii[eCornerTopLeftY]) && CheckCorner(insets.right, insets.top, - aRadii[NS_CORNER_TOP_RIGHT_X], - aRadii[NS_CORNER_TOP_RIGHT_Y]) && + aRadii[eCornerTopRightX], + aRadii[eCornerTopRightY]) && CheckCorner(insets.right, insets.bottom, - aRadii[NS_CORNER_BOTTOM_RIGHT_X], - aRadii[NS_CORNER_BOTTOM_RIGHT_Y]) && + aRadii[eCornerBottomRightX], + aRadii[eCornerBottomRightY]) && CheckCorner(insets.left, insets.bottom, - aRadii[NS_CORNER_BOTTOM_LEFT_X], - aRadii[NS_CORNER_BOTTOM_LEFT_Y]); + aRadii[eCornerBottomLeftX], + aRadii[eCornerBottomLeftY]); } nsRect @@ -6805,14 +6805,14 @@ static bool IsCornerAdjacentToSide(uint8_t aCorner, Side aSide) nsLayoutUtils::HasNonZeroCornerOnSide(const nsStyleCorners& aCorners, Side aSide) { - static_assert(NS_CORNER_TOP_LEFT_X/2 == eCornerTopLeft, "Check for Non Zero on side"); - static_assert(NS_CORNER_TOP_LEFT_Y/2 == eCornerTopLeft, "Check for Non Zero on side"); - static_assert(NS_CORNER_TOP_RIGHT_X/2 == eCornerTopRight, "Check for Non Zero on side"); - static_assert(NS_CORNER_TOP_RIGHT_Y/2 == eCornerTopRight, "Check for Non Zero on side"); - static_assert(NS_CORNER_BOTTOM_RIGHT_X/2 == eCornerBottomRight, "Check for Non Zero on side"); - static_assert(NS_CORNER_BOTTOM_RIGHT_Y/2 == eCornerBottomRight, "Check for Non Zero on side"); - static_assert(NS_CORNER_BOTTOM_LEFT_X/2 == eCornerBottomLeft, "Check for Non Zero on side"); - static_assert(NS_CORNER_BOTTOM_LEFT_Y/2 == eCornerBottomLeft, "Check for Non Zero on side"); + static_assert(eCornerTopLeftX/2 == eCornerTopLeft, "Check for Non Zero on side"); + static_assert(eCornerTopLeftY/2 == eCornerTopLeft, "Check for Non Zero on side"); + static_assert(eCornerTopRightX/2 == eCornerTopRight, "Check for Non Zero on side"); + static_assert(eCornerTopRightY/2 == eCornerTopRight, "Check for Non Zero on side"); + static_assert(eCornerBottomRightX/2 == eCornerBottomRight, "Check for Non Zero on side"); + static_assert(eCornerBottomRightY/2 == eCornerBottomRight, "Check for Non Zero on side"); + static_assert(eCornerBottomLeftX/2 == eCornerBottomLeft, "Check for Non Zero on side"); + static_assert(eCornerBottomLeftY/2 == eCornerBottomLeft, "Check for Non Zero on side"); NS_FOR_CSS_HALF_CORNERS(corner) { // corner is a "half corner" value, so dividing by two gives us a diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 3b9a09fd21..f567bb3b7e 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -1252,31 +1252,31 @@ nsIFrame::ComputeBorderRadii(const nsStyleCorners& aBorderRadius, } if (aSkipSides.Top()) { - aRadii[NS_CORNER_TOP_LEFT_X] = 0; - aRadii[NS_CORNER_TOP_LEFT_Y] = 0; - aRadii[NS_CORNER_TOP_RIGHT_X] = 0; - aRadii[NS_CORNER_TOP_RIGHT_Y] = 0; + aRadii[eCornerTopLeftX] = 0; + aRadii[eCornerTopLeftY] = 0; + aRadii[eCornerTopRightX] = 0; + aRadii[eCornerTopRightY] = 0; } if (aSkipSides.Right()) { - aRadii[NS_CORNER_TOP_RIGHT_X] = 0; - aRadii[NS_CORNER_TOP_RIGHT_Y] = 0; - aRadii[NS_CORNER_BOTTOM_RIGHT_X] = 0; - aRadii[NS_CORNER_BOTTOM_RIGHT_Y] = 0; + aRadii[eCornerTopRightX] = 0; + aRadii[eCornerTopRightY] = 0; + aRadii[eCornerBottomRightX] = 0; + aRadii[eCornerBottomRightY] = 0; } if (aSkipSides.Bottom()) { - aRadii[NS_CORNER_BOTTOM_RIGHT_X] = 0; - aRadii[NS_CORNER_BOTTOM_RIGHT_Y] = 0; - aRadii[NS_CORNER_BOTTOM_LEFT_X] = 0; - aRadii[NS_CORNER_BOTTOM_LEFT_Y] = 0; + aRadii[eCornerBottomRightX] = 0; + aRadii[eCornerBottomRightY] = 0; + aRadii[eCornerBottomLeftX] = 0; + aRadii[eCornerBottomLeftY] = 0; } if (aSkipSides.Left()) { - aRadii[NS_CORNER_BOTTOM_LEFT_X] = 0; - aRadii[NS_CORNER_BOTTOM_LEFT_Y] = 0; - aRadii[NS_CORNER_TOP_LEFT_X] = 0; - aRadii[NS_CORNER_TOP_LEFT_Y] = 0; + aRadii[eCornerBottomLeftX] = 0; + aRadii[eCornerBottomLeftY] = 0; + aRadii[eCornerTopLeftX] = 0; + aRadii[eCornerTopLeftY] = 0; } // css3-background specifies this algorithm for reducing diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index ff8500b92f..8328f70da5 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -5814,26 +5814,26 @@ ScrollFrameHelper::GetBorderRadii(const nsSize& aFrameSize, if (sb.left > 0 || sb.top > 0) { ReduceRadii(border.left, border.top, - aRadii[NS_CORNER_TOP_LEFT_X], - aRadii[NS_CORNER_TOP_LEFT_Y]); + aRadii[eCornerTopLeftX], + aRadii[eCornerTopLeftY]); } if (sb.top > 0 || sb.right > 0) { ReduceRadii(border.right, border.top, - aRadii[NS_CORNER_TOP_RIGHT_X], - aRadii[NS_CORNER_TOP_RIGHT_Y]); + aRadii[eCornerTopRightX], + aRadii[eCornerTopRightY]); } if (sb.right > 0 || sb.bottom > 0) { ReduceRadii(border.right, border.bottom, - aRadii[NS_CORNER_BOTTOM_RIGHT_X], - aRadii[NS_CORNER_BOTTOM_RIGHT_Y]); + aRadii[eCornerBottomRightX], + aRadii[eCornerBottomRightY]); } if (sb.bottom > 0 || sb.left > 0) { ReduceRadii(border.left, border.bottom, - aRadii[NS_CORNER_BOTTOM_LEFT_X], - aRadii[NS_CORNER_BOTTOM_LEFT_Y]); + aRadii[eCornerBottomLeftX], + aRadii[eCornerBottomLeftY]); } return true; diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index 9465052321..c8948862ed 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -16,16 +16,6 @@ namespace mozilla { -// Indices into "half corner" arrays (nsStyleCorners e.g.) -#define NS_CORNER_TOP_LEFT_X 0 -#define NS_CORNER_TOP_LEFT_Y 1 -#define NS_CORNER_TOP_RIGHT_X 2 -#define NS_CORNER_TOP_RIGHT_Y 3 -#define NS_CORNER_BOTTOM_RIGHT_X 4 -#define NS_CORNER_BOTTOM_RIGHT_Y 5 -#define NS_CORNER_BOTTOM_LEFT_X 6 -#define NS_CORNER_BOTTOM_LEFT_Y 7 - #define NS_FOR_CSS_HALF_CORNERS(var_) for (int32_t var_ = 0; var_ < 8; ++var_) // The results of these conversion macros are exhaustively checked in diff --git a/layout/style/nsStyleCoord.cpp b/layout/style/nsStyleCoord.cpp index 05f78108bf..8db41f3ac0 100644 --- a/layout/style/nsStyleCoord.cpp +++ b/layout/style/nsStyleCoord.cpp @@ -341,42 +341,42 @@ CASE(eSideLeft, true); #define CASE(corner, result) \ static_assert(NS_HALF_CORNER_IS_X(corner) == result, \ "NS_HALF_CORNER_IS_X is wrong") -CASE(NS_CORNER_TOP_LEFT_X, true); -CASE(NS_CORNER_TOP_LEFT_Y, false); -CASE(NS_CORNER_TOP_RIGHT_X, true); -CASE(NS_CORNER_TOP_RIGHT_Y, false); -CASE(NS_CORNER_BOTTOM_RIGHT_X, true); -CASE(NS_CORNER_BOTTOM_RIGHT_Y, false); -CASE(NS_CORNER_BOTTOM_LEFT_X, true); -CASE(NS_CORNER_BOTTOM_LEFT_Y, false); +CASE(eCornerTopLeftX, true); +CASE(eCornerTopLeftY, false); +CASE(eCornerTopRightX, true); +CASE(eCornerTopRightY, false); +CASE(eCornerBottomRightX, true); +CASE(eCornerBottomRightY, false); +CASE(eCornerBottomLeftX, true); +CASE(eCornerBottomLeftY, false); #undef CASE // Validation of NS_HALF_TO_FULL_CORNER. #define CASE(corner, result) \ static_assert(NS_HALF_TO_FULL_CORNER(corner) == result, \ "NS_HALF_TO_FULL_CORNER is wrong") -CASE(NS_CORNER_TOP_LEFT_X, eCornerTopLeft); -CASE(NS_CORNER_TOP_LEFT_Y, eCornerTopLeft); -CASE(NS_CORNER_TOP_RIGHT_X, eCornerTopRight); -CASE(NS_CORNER_TOP_RIGHT_Y, eCornerTopRight); -CASE(NS_CORNER_BOTTOM_RIGHT_X, eCornerBottomRight); -CASE(NS_CORNER_BOTTOM_RIGHT_Y, eCornerBottomRight); -CASE(NS_CORNER_BOTTOM_LEFT_X, eCornerBottomLeft); -CASE(NS_CORNER_BOTTOM_LEFT_Y, eCornerBottomLeft); +CASE(eCornerTopLeftX, eCornerTopLeft); +CASE(eCornerTopLeftY, eCornerTopLeft); +CASE(eCornerTopRightX, eCornerTopRight); +CASE(eCornerTopRightY, eCornerTopRight); +CASE(eCornerBottomRightX, eCornerBottomRight); +CASE(eCornerBottomRightY, eCornerBottomRight); +CASE(eCornerBottomLeftX, eCornerBottomLeft); +CASE(eCornerBottomLeftY, eCornerBottomLeft); #undef CASE // Validation of NS_FULL_TO_HALF_CORNER. #define CASE(corner, vert, result) \ static_assert(NS_FULL_TO_HALF_CORNER(corner, vert) == result, \ "NS_FULL_TO_HALF_CORNER is wrong") -CASE(eCornerTopLeft, false, NS_CORNER_TOP_LEFT_X); -CASE(eCornerTopLeft, true, NS_CORNER_TOP_LEFT_Y); -CASE(eCornerTopRight, false, NS_CORNER_TOP_RIGHT_X); -CASE(eCornerTopRight, true, NS_CORNER_TOP_RIGHT_Y); -CASE(eCornerBottomRight, false, NS_CORNER_BOTTOM_RIGHT_X); -CASE(eCornerBottomRight, true, NS_CORNER_BOTTOM_RIGHT_Y); -CASE(eCornerBottomLeft, false, NS_CORNER_BOTTOM_LEFT_X); -CASE(eCornerBottomLeft, true, NS_CORNER_BOTTOM_LEFT_Y); +CASE(eCornerTopLeft, false, eCornerTopLeftX); +CASE(eCornerTopLeft, true, eCornerTopLeftY); +CASE(eCornerTopRight, false, eCornerTopRightX); +CASE(eCornerTopRight, true, eCornerTopRightY); +CASE(eCornerBottomRight, false, eCornerBottomRightX); +CASE(eCornerBottomRight, true, eCornerBottomRightY); +CASE(eCornerBottomLeft, false, eCornerBottomLeftX); +CASE(eCornerBottomLeft, true, eCornerBottomLeftY); #undef CASE // Validation of NS_SIDE_TO_{FULL,HALF}_CORNER. @@ -399,23 +399,23 @@ CASE(eSideLeft, true, eCornerTopLeft); #define CASE(side, second, parallel, result) \ static_assert(NS_SIDE_TO_HALF_CORNER(side, second, parallel) == result, \ "NS_SIDE_TO_HALF_CORNER is wrong") -CASE(eSideTop, false, true, NS_CORNER_TOP_LEFT_X); -CASE(eSideTop, false, false, NS_CORNER_TOP_LEFT_Y); -CASE(eSideTop, true, true, NS_CORNER_TOP_RIGHT_X); -CASE(eSideTop, true, false, NS_CORNER_TOP_RIGHT_Y); +CASE(eSideTop, false, true, eCornerTopLeftX); +CASE(eSideTop, false, false, eCornerTopLeftY); +CASE(eSideTop, true, true, eCornerTopRightX); +CASE(eSideTop, true, false, eCornerTopRightY); -CASE(eSideRight, false, false, NS_CORNER_TOP_RIGHT_X); -CASE(eSideRight, false, true, NS_CORNER_TOP_RIGHT_Y); -CASE(eSideRight, true, false, NS_CORNER_BOTTOM_RIGHT_X); -CASE(eSideRight, true, true, NS_CORNER_BOTTOM_RIGHT_Y); +CASE(eSideRight, false, false, eCornerTopRightX); +CASE(eSideRight, false, true, eCornerTopRightY); +CASE(eSideRight, true, false, eCornerBottomRightX); +CASE(eSideRight, true, true, eCornerBottomRightY); -CASE(eSideBottom, false, true, NS_CORNER_BOTTOM_RIGHT_X); -CASE(eSideBottom, false, false, NS_CORNER_BOTTOM_RIGHT_Y); -CASE(eSideBottom, true, true, NS_CORNER_BOTTOM_LEFT_X); -CASE(eSideBottom, true, false, NS_CORNER_BOTTOM_LEFT_Y); +CASE(eSideBottom, false, true, eCornerBottomRightX); +CASE(eSideBottom, false, false, eCornerBottomRightY); +CASE(eSideBottom, true, true, eCornerBottomLeftX); +CASE(eSideBottom, true, false, eCornerBottomLeftY); -CASE(eSideLeft, false, false, NS_CORNER_BOTTOM_LEFT_X); -CASE(eSideLeft, false, true, NS_CORNER_BOTTOM_LEFT_Y); -CASE(eSideLeft, true, false, NS_CORNER_TOP_LEFT_X); -CASE(eSideLeft, true, true, NS_CORNER_TOP_LEFT_Y); +CASE(eSideLeft, false, false, eCornerBottomLeftX); +CASE(eSideLeft, false, true, eCornerBottomLeftY); +CASE(eSideLeft, true, false, eCornerTopLeftX); +CASE(eSideLeft, true, true, eCornerTopLeftY); #undef CASE From 173019975597b59055abead0afb3cfc428af3614 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 08:10:52 +0200 Subject: [PATCH 17/25] Issue #1925 - Move NS_FOR_CSS_HALF_CORNER to gfx/2d/Types.h and rewrite it. --- gfx/2d/Types.h | 16 ++++++++++++++++ layout/style/nsStyleConsts.h | 2 -- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 8d094bcb15..09458ee002 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -443,6 +443,22 @@ enum HalfCorner { eCornerBottomLeftY = 7 }; +// Creates a for loop that walks over the eight mozilla::HalfCorner values. +// This implementation uses the same technique as NS_FOR_CSS_SIDES. +#define NS_FOR_CSS_HALF_CORNERS(var_) \ + int32_t MOZ_CONCAT(var_,__LINE__) = mozilla::eCornerTopLeftX; \ + for (mozilla::HalfCorner var_; \ + MOZ_CONCAT(var_,__LINE__) <= mozilla::eCornerBottomLeftY && \ + (var_ = mozilla::HalfCorner(MOZ_CONCAT(var_,__LINE__)), true); \ + ++MOZ_CONCAT(var_,__LINE__)) + +static inline mozilla::HalfCorner operator++(mozilla::HalfCorner& aHalfCorner) { + MOZ_ASSERT(aHalfCorner >= eCornerTopLeftX && aHalfCorner <= eCornerBottomLeftY, + "Out of range half corner!"); + aHalfCorner = mozilla::HalfCorner(aHalfCorner + 1); + return aHalfCorner; +} + } // namespace mozilla #endif /* MOZILLA_GFX_TYPES_H_ */ diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index c8948862ed..dba65d74e7 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -16,8 +16,6 @@ namespace mozilla { -#define NS_FOR_CSS_HALF_CORNERS(var_) for (int32_t var_ = 0; var_ < 8; ++var_) - // The results of these conversion macros are exhaustively checked in // nsStyleCoord.cpp. // Arguments must not have side effects. From f507d2cdbce6dc7f873520c965ab7e6148c527ce Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 08:30:23 +0200 Subject: [PATCH 18/25] Issue #1925 - Convert NS_HALF_CORNER_IS_X to a constexpr function. --- gfx/2d/Types.h | 5 +++++ layout/generic/nsFrame.cpp | 2 +- layout/style/nsStyleConsts.h | 1 - layout/style/nsStyleCoord.cpp | 11 ++++++----- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 09458ee002..ebd72f2391 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -459,6 +459,11 @@ static inline mozilla::HalfCorner operator++(mozilla::HalfCorner& aHalfCorner) { return aHalfCorner; } +constexpr bool HalfCornerIsX(HalfCorner aHalfCorner) +{ + return !(aHalfCorner % 2); +} + } // namespace mozilla #endif /* MOZILLA_GFX_TYPES_H_ */ diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index f567bb3b7e..4e1c4ff027 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -1237,7 +1237,7 @@ nsIFrame::ComputeBorderRadii(const nsStyleCorners& aBorderRadius, NS_FOR_CSS_HALF_CORNERS(i) { const nsStyleCoord c = aBorderRadius.Get(i); nscoord axis = - NS_HALF_CORNER_IS_X(i) ? aFrameSize.width : aFrameSize.height; + HalfCornerIsX(i) ? aFrameSize.width : aFrameSize.height; if (c.IsCoordPercentCalcUnit()) { aRadii[i] = nsRuleNode::ComputeCoordPercentCalc(c, axis); diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index dba65d74e7..8ed98de230 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -20,7 +20,6 @@ namespace mozilla { // nsStyleCoord.cpp. // Arguments must not have side effects. -#define NS_HALF_CORNER_IS_X(var_) (!((var_)%2)) #define NS_HALF_TO_FULL_CORNER(var_) ((var_)/2) #define NS_FULL_TO_HALF_CORNER(var_, vert_) ((var_)*2 + !!(vert_)) diff --git a/layout/style/nsStyleCoord.cpp b/layout/style/nsStyleCoord.cpp index 8db41f3ac0..1c1b100d1b 100644 --- a/layout/style/nsStyleCoord.cpp +++ b/layout/style/nsStyleCoord.cpp @@ -328,9 +328,9 @@ void nsStyleCorners::Reset() } } -// Validation of NS_SIDE_IS_VERTICAL and NS_HALF_CORNER_IS_X. +// Validation of NS_SIDE_IS_VERTICAL. #define CASE(side, result) \ - static_assert(NS_SIDE_IS_VERTICAL(side) == result, \ + static_assert(NS_SIDE_IS_VERTICAL(side) == result, \ "NS_SIDE_IS_VERTICAL is wrong") CASE(eSideTop, false); CASE(eSideRight, true); @@ -338,9 +338,10 @@ CASE(eSideBottom, false); CASE(eSideLeft, true); #undef CASE +// Validation of HalfCornerIsX. #define CASE(corner, result) \ - static_assert(NS_HALF_CORNER_IS_X(corner) == result, \ - "NS_HALF_CORNER_IS_X is wrong") + static_assert(HalfCornerIsX(corner) == result, \ + "HalfCornerIsX is wrong") CASE(eCornerTopLeftX, true); CASE(eCornerTopLeftY, false); CASE(eCornerTopRightX, true); @@ -353,7 +354,7 @@ CASE(eCornerBottomLeftY, false); // Validation of NS_HALF_TO_FULL_CORNER. #define CASE(corner, result) \ - static_assert(NS_HALF_TO_FULL_CORNER(corner) == result, \ + static_assert(NS_HALF_TO_FULL_CORNER(corner) == result, \ "NS_HALF_TO_FULL_CORNER is wrong") CASE(eCornerTopLeftX, eCornerTopLeft); CASE(eCornerTopLeftY, eCornerTopLeft); From 31badb0f2ee826a2f7a276a55e5f2c912b4416f2 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 09:25:03 +0200 Subject: [PATCH 19/25] Issue #1925 - Convert NS_HALF_TO_FULL_CORNER to a constexpr function. --- gfx/2d/Types.h | 5 +++++ layout/style/nsStyleConsts.h | 1 - layout/style/nsStyleCoord.cpp | 6 +++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index ebd72f2391..4a3b26c811 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -464,6 +464,11 @@ constexpr bool HalfCornerIsX(HalfCorner aHalfCorner) return !(aHalfCorner % 2); } +constexpr Corner HalfToFullCorner(HalfCorner aHalfCorner) +{ + return Corner(aHalfCorner / 2); +} + } // namespace mozilla #endif /* MOZILLA_GFX_TYPES_H_ */ diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index 8ed98de230..e076025f4e 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -20,7 +20,6 @@ namespace mozilla { // nsStyleCoord.cpp. // Arguments must not have side effects. -#define NS_HALF_TO_FULL_CORNER(var_) ((var_)/2) #define NS_FULL_TO_HALF_CORNER(var_, vert_) ((var_)*2 + !!(vert_)) #define NS_SIDE_IS_VERTICAL(side_) ((side_) % 2) diff --git a/layout/style/nsStyleCoord.cpp b/layout/style/nsStyleCoord.cpp index 1c1b100d1b..a7b5413357 100644 --- a/layout/style/nsStyleCoord.cpp +++ b/layout/style/nsStyleCoord.cpp @@ -352,10 +352,10 @@ CASE(eCornerBottomLeftX, true); CASE(eCornerBottomLeftY, false); #undef CASE -// Validation of NS_HALF_TO_FULL_CORNER. +// Validation of HalfToFullCorner. #define CASE(corner, result) \ - static_assert(NS_HALF_TO_FULL_CORNER(corner) == result, \ - "NS_HALF_TO_FULL_CORNER is wrong") + static_assert(HalfToFullCorner(corner) == result, \ + "HalfToFullCorner is wrong") CASE(eCornerTopLeftX, eCornerTopLeft); CASE(eCornerTopLeftY, eCornerTopLeft); CASE(eCornerTopRightX, eCornerTopRight); From 8a2bc8ef4dc12e1f5b5f482f61eccb4bb5b3f395 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 10:15:50 +0200 Subject: [PATCH 20/25] Issue #1925 - Convert NS_FULL_TO_HALF_CORNER to a constexpr function. Note: Because the new function checks types, we need to change the fullCorner type in `nsComputedDOMStyle::GetEllipseRadii()` and `StyleAnimationValue::ExtractComputedValue()` to `Corner` instead of the underlying base type. --- gfx/2d/Types.h | 5 +++++ layout/style/StyleAnimationValue.cpp | 10 +++++----- layout/style/nsComputedDOMStyle.cpp | 10 +++++----- layout/style/nsComputedDOMStyle.h | 2 +- layout/style/nsRuleNode.cpp | 12 ++++++------ layout/style/nsStyleConsts.h | 2 -- layout/style/nsStyleCoord.cpp | 12 ++++++------ 7 files changed, 28 insertions(+), 25 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 4a3b26c811..923baf03e0 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -469,6 +469,11 @@ constexpr Corner HalfToFullCorner(HalfCorner aHalfCorner) return Corner(aHalfCorner / 2); } +constexpr HalfCorner FullToHalfCorner(Corner aCorner, bool aIsVertical) +{ + return HalfCorner(aCorner * 2 + aIsVertical); +} + } // namespace mozilla #endif /* MOZILLA_GFX_TYPES_H_ */ diff --git a/layout/style/StyleAnimationValue.cpp b/layout/style/StyleAnimationValue.cpp index e007d8335e..f7a9625211 100644 --- a/layout/style/StyleAnimationValue.cpp +++ b/layout/style/StyleAnimationValue.cpp @@ -3945,9 +3945,9 @@ StyleClipBasicShapeToCSSArray(const StyleClipPath& aClipPath, const nsStyleCorners& radii = shape->GetRadius(); NS_FOR_CSS_FULL_CORNERS(corner) { auto pair = MakeUnique(); - if (!StyleCoordToCSSValue(radii.Get(NS_FULL_TO_HALF_CORNER(corner, false)), + if (!StyleCoordToCSSValue(radii.Get(FullToHalfCorner(corner, false)), pair->mXValue) || - !StyleCoordToCSSValue(radii.Get(NS_FULL_TO_HALF_CORNER(corner, true)), + !StyleCoordToCSSValue(radii.Get(FullToHalfCorner(corner, true)), pair->mYValue)) { return false; } @@ -4401,11 +4401,11 @@ StyleAnimationValue::ExtractComputedValue(nsCSSPropertyID aProperty, const nsStyleCorners& corners = StyleDataAtOffset(styleStruct, ssOffset); - uint8_t fullCorner = animType - eStyleAnimType_Corner_TopLeft; + Corner fullCorner = Corner(animType - eStyleAnimType_Corner_TopLeft); const nsStyleCoord &horiz = - corners.Get(NS_FULL_TO_HALF_CORNER(fullCorner, false)); + corners.Get(FullToHalfCorner(fullCorner, false)); const nsStyleCoord &vert = - corners.Get(NS_FULL_TO_HALF_CORNER(fullCorner, true)); + corners.Get(FullToHalfCorner(fullCorner, true)); nsAutoPtr pair(new nsCSSValuePair); if (!StyleCoordToCSSValue(horiz, pair->mXValue) || !StyleCoordToCSSValue(vert, pair->mYValue)) { diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index 39449b697a..33a2836590 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -3440,10 +3440,10 @@ nsComputedDOMStyle::DoGetOutlineColor() already_AddRefed nsComputedDOMStyle::GetEllipseRadii(const nsStyleCorners& aRadius, - uint8_t aFullCorner) + Corner aFullCorner) { - nsStyleCoord radiusX = aRadius.Get(NS_FULL_TO_HALF_CORNER(aFullCorner, false)); - nsStyleCoord radiusY = aRadius.Get(NS_FULL_TO_HALF_CORNER(aFullCorner, true)); + nsStyleCoord radiusX = aRadius.Get(FullToHalfCorner(aFullCorner, false)); + nsStyleCoord radiusY = aRadius.Get(FullToHalfCorner(aFullCorner, true)); // for compatibility, return a single value if X and Y are equal if (radiusX == radiusY) { @@ -6002,9 +6002,9 @@ nsComputedDOMStyle::BasicShapeRadiiToString(nsAString& aCssText, nsAutoString horizontalString, verticalString; NS_FOR_CSS_FULL_CORNERS(corner) { horizontal.AppendElement( - aCorners.Get(NS_FULL_TO_HALF_CORNER(corner, false))); + aCorners.Get(FullToHalfCorner(corner, false))); vertical.AppendElement( - aCorners.Get(NS_FULL_TO_HALF_CORNER(corner, true))); + aCorners.Get(FullToHalfCorner(corner, true))); } BoxValuesToString(horizontalString, horizontal); BoxValuesToString(verticalString, vertical); diff --git a/layout/style/nsComputedDOMStyle.h b/layout/style/nsComputedDOMStyle.h index ce19ca51c1..f256d22a50 100644 --- a/layout/style/nsComputedDOMStyle.h +++ b/layout/style/nsComputedDOMStyle.h @@ -158,7 +158,7 @@ private: #undef STYLE_STRUCT already_AddRefed GetEllipseRadii(const nsStyleCorners& aRadius, - uint8_t aFullCorner); + mozilla::Corner aFullCorner); already_AddRefed GetOffsetWidthFor(mozilla::Side aSide); diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index 349669959c..d1d14d0f7a 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -7874,8 +7874,8 @@ nsRuleNode::ComputeBorderData(void* aStartStruct, const nsCSSPropertyID* subprops = nsCSSProps::SubpropertyEntryFor(eCSSProperty_border_radius); NS_FOR_CSS_FULL_CORNERS(corner) { - int cx = NS_FULL_TO_HALF_CORNER(corner, false); - int cy = NS_FULL_TO_HALF_CORNER(corner, true); + int cx = FullToHalfCorner(corner, false); + int cy = FullToHalfCorner(corner, true); const nsCSSValue& radius = *aRuleData->ValueFor(subprops[corner]); nsStyleCoord parentX = parentBorder->mBorderRadius.Get(cx); nsStyleCoord parentY = parentBorder->mBorderRadius.Get(cy); @@ -8066,8 +8066,8 @@ nsRuleNode::ComputeOutlineData(void* aStartStruct, const nsCSSPropertyID* subprops = nsCSSProps::SubpropertyEntryFor(eCSSProperty__moz_outline_radius); NS_FOR_CSS_FULL_CORNERS(corner) { - int cx = NS_FULL_TO_HALF_CORNER(corner, false); - int cy = NS_FULL_TO_HALF_CORNER(corner, true); + int cx = FullToHalfCorner(corner, false); + int cy = FullToHalfCorner(corner, true); const nsCSSValue& radius = *aRuleData->ValueFor(subprops[corner]); nsStyleCoord parentX = parentOutline->mOutlineRadius.Get(cx); nsStyleCoord parentY = parentOutline->mOutlineRadius.Get(cy); @@ -9915,8 +9915,8 @@ GetStyleBasicShapeFromCSSValue(const nsCSSValue& aValue, if (shapeFunction->Item(5).GetUnit() == eCSSUnit_Array) { nsCSSValue::Array* radiiArray = shapeFunction->Item(5).GetArrayValue(); NS_FOR_CSS_FULL_CORNERS(corner) { - int cx = NS_FULL_TO_HALF_CORNER(corner, false); - int cy = NS_FULL_TO_HALF_CORNER(corner, true); + int cx = FullToHalfCorner(corner, false); + int cy = FullToHalfCorner(corner, true); const nsCSSValue& radius = radiiArray->Item(corner); nsStyleCoord coordX, coordY; DebugOnly didSetRadii = SetPairCoords(radius, coordX, coordY, diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index e076025f4e..ca64bf1d5f 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -20,8 +20,6 @@ namespace mozilla { // nsStyleCoord.cpp. // Arguments must not have side effects. -#define NS_FULL_TO_HALF_CORNER(var_, vert_) ((var_)*2 + !!(vert_)) - #define NS_SIDE_IS_VERTICAL(side_) ((side_) % 2) #define NS_SIDE_TO_FULL_CORNER(side_, second_) \ (((side_) + !!(second_)) % 4) diff --git a/layout/style/nsStyleCoord.cpp b/layout/style/nsStyleCoord.cpp index a7b5413357..7e233949e9 100644 --- a/layout/style/nsStyleCoord.cpp +++ b/layout/style/nsStyleCoord.cpp @@ -354,7 +354,7 @@ CASE(eCornerBottomLeftY, false); // Validation of HalfToFullCorner. #define CASE(corner, result) \ - static_assert(HalfToFullCorner(corner) == result, \ + static_assert(HalfToFullCorner(corner) == result, \ "HalfToFullCorner is wrong") CASE(eCornerTopLeftX, eCornerTopLeft); CASE(eCornerTopLeftY, eCornerTopLeft); @@ -366,10 +366,10 @@ CASE(eCornerBottomLeftX, eCornerBottomLeft); CASE(eCornerBottomLeftY, eCornerBottomLeft); #undef CASE -// Validation of NS_FULL_TO_HALF_CORNER. +// Validation of FullToHalfCorner. #define CASE(corner, vert, result) \ - static_assert(NS_FULL_TO_HALF_CORNER(corner, vert) == result, \ - "NS_FULL_TO_HALF_CORNER is wrong") + static_assert(FullToHalfCorner(corner, vert) == result, \ + "FullToHalfCorner is wrong") CASE(eCornerTopLeft, false, eCornerTopLeftX); CASE(eCornerTopLeft, true, eCornerTopLeftY); CASE(eCornerTopRight, false, eCornerTopRightX); @@ -382,7 +382,7 @@ CASE(eCornerBottomLeft, true, eCornerBottomLeftY); // Validation of NS_SIDE_TO_{FULL,HALF}_CORNER. #define CASE(side, second, result) \ - static_assert(NS_SIDE_TO_FULL_CORNER(side, second) == result, \ + static_assert(NS_SIDE_TO_FULL_CORNER(side, second) == result, \ "NS_SIDE_TO_FULL_CORNER is wrong") CASE(eSideTop, false, eCornerTopLeft); CASE(eSideTop, true, eCornerTopRight); @@ -398,7 +398,7 @@ CASE(eSideLeft, true, eCornerTopLeft); #undef CASE #define CASE(side, second, parallel, result) \ - static_assert(NS_SIDE_TO_HALF_CORNER(side, second, parallel) == result, \ + static_assert(NS_SIDE_TO_HALF_CORNER(side, second, parallel) == result, \ "NS_SIDE_TO_HALF_CORNER is wrong") CASE(eSideTop, false, true, eCornerTopLeftX); CASE(eSideTop, false, false, eCornerTopLeftY); From b0b13b87198018be6f5f58ca8459a952f5b18978 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 10:31:21 +0200 Subject: [PATCH 21/25] Issue #1925 - Convert NS_SIDE_IS_VERTICAL to a constexpr function. --- gfx/2d/Types.h | 5 +++++ layout/base/nsCSSRendering.cpp | 6 ++---- layout/generic/nsFrame.cpp | 2 +- layout/style/nsStyleConsts.h | 1 - layout/style/nsStyleCoord.cpp | 6 +++--- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 923baf03e0..7626987a87 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -474,6 +474,11 @@ constexpr HalfCorner FullToHalfCorner(Corner aCorner, bool aIsVertical) return HalfCorner(aCorner * 2 + aIsVertical); } +constexpr bool SideIsVertical(Side aSide) +{ + return aSide % 2; +} + } // namespace mozilla #endif /* MOZILLA_GFX_TYPES_H_ */ diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index a6cfbbe16c..c683a19605 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -3920,10 +3920,8 @@ DrawBorderImage(nsPresContext* aPresContext, nsMargin border; NS_FOR_CSS_SIDES(s) { nsStyleCoord coord = aStyleBorder.mBorderImageSlice.Get(s); - int32_t imgDimension = NS_SIDE_IS_VERTICAL(s) - ? imageSize.width : imageSize.height; - nscoord borderDimension = NS_SIDE_IS_VERTICAL(s) - ? borderImgArea.width : borderImgArea.height; + int32_t imgDimension = SideIsVertical(s) ? imageSize.width : imageSize.height; + nscoord borderDimension = SideIsVertical(s) ? borderImgArea.width : borderImgArea.height; double value; switch (coord.GetUnit()) { case eStyleUnit_Percent: diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 4e1c4ff027..451a1ff7cd 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -1287,7 +1287,7 @@ nsIFrame::ComputeBorderRadii(const nsStyleCorners& aBorderRadius, uint32_t hc1 = NS_SIDE_TO_HALF_CORNER(side, false, true); uint32_t hc2 = NS_SIDE_TO_HALF_CORNER(side, true, true); nscoord length = - NS_SIDE_IS_VERTICAL(side) ? aBorderArea.height : aBorderArea.width; + SideIsVertical(side) ? aBorderArea.height : aBorderArea.width; nscoord sum = aRadii[hc1] + aRadii[hc2]; if (sum) haveRadius = true; diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index ca64bf1d5f..879b77269d 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -20,7 +20,6 @@ namespace mozilla { // nsStyleCoord.cpp. // Arguments must not have side effects. -#define NS_SIDE_IS_VERTICAL(side_) ((side_) % 2) #define NS_SIDE_TO_FULL_CORNER(side_, second_) \ (((side_) + !!(second_)) % 4) #define NS_SIDE_TO_HALF_CORNER(side_, second_, parallel_) \ diff --git a/layout/style/nsStyleCoord.cpp b/layout/style/nsStyleCoord.cpp index 7e233949e9..ba673201e3 100644 --- a/layout/style/nsStyleCoord.cpp +++ b/layout/style/nsStyleCoord.cpp @@ -328,10 +328,10 @@ void nsStyleCorners::Reset() } } -// Validation of NS_SIDE_IS_VERTICAL. +// Validation of SideIsVertical. #define CASE(side, result) \ - static_assert(NS_SIDE_IS_VERTICAL(side) == result, \ - "NS_SIDE_IS_VERTICAL is wrong") + static_assert(SideIsVertical(side) == result, \ + "SideIsVertical is wrong") CASE(eSideTop, false); CASE(eSideRight, true); CASE(eSideBottom, false); From 2a399b60a184e292d401980e007fbf8166cee9f6 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 10:36:07 +0200 Subject: [PATCH 22/25] Issue #1925 - Convert NS_SIDE_TO_FULL_CORNER to a constexpr function. --- gfx/2d/Types.h | 10 ++++++++++ layout/style/nsStyleConsts.h | 2 -- layout/style/nsStyleCoord.cpp | 6 +++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 7626987a87..ad83a79889 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -479,6 +479,16 @@ constexpr bool SideIsVertical(Side aSide) return aSide % 2; } +/* @param aIsSecond: when true, return the clockwise second of the two + * corners associated with aSide. For example, with aSide = eSideBottom the + * result is eCornerBottomRight when aIsSecond is false, and + * eCornerBottomLeft when aIsSecond is true. + */ +constexpr Corner SideToFullCorner(Side aSide, bool aIsSecond) +{ + return Corner((aSide + aIsSecond) % 4); +} + } // namespace mozilla #endif /* MOZILLA_GFX_TYPES_H_ */ diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index 879b77269d..96690ae2d8 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -20,8 +20,6 @@ namespace mozilla { // nsStyleCoord.cpp. // Arguments must not have side effects. -#define NS_SIDE_TO_FULL_CORNER(side_, second_) \ - (((side_) + !!(second_)) % 4) #define NS_SIDE_TO_HALF_CORNER(side_, second_, parallel_) \ ((((side_) + !!(second_))*2 + ((side_) + !(parallel_))%2) % 8) diff --git a/layout/style/nsStyleCoord.cpp b/layout/style/nsStyleCoord.cpp index ba673201e3..263b0844b2 100644 --- a/layout/style/nsStyleCoord.cpp +++ b/layout/style/nsStyleCoord.cpp @@ -380,10 +380,10 @@ CASE(eCornerBottomLeft, false, eCornerBottomLeftX); CASE(eCornerBottomLeft, true, eCornerBottomLeftY); #undef CASE -// Validation of NS_SIDE_TO_{FULL,HALF}_CORNER. +// Validation of SideToFullCorner. #define CASE(side, second, result) \ - static_assert(NS_SIDE_TO_FULL_CORNER(side, second) == result, \ - "NS_SIDE_TO_FULL_CORNER is wrong") + static_assert(SideToFullCorner(side, second) == result, \ + "SideToFullCorner is wrong") CASE(eSideTop, false, eCornerTopLeft); CASE(eSideTop, true, eCornerTopRight); From c096b46278449f2d0126a5c9327a8b0218dd5beb Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 11:15:28 +0200 Subject: [PATCH 23/25] Issue #1925 - Convert NS_SIDE_TO_HALF_CORNER to a constexpr function. --- gfx/2d/Types.h | 20 ++++++++++++++++++++ layout/generic/nsFrame.cpp | 12 ++++++------ layout/style/nsStyleConsts.h | 7 ------- layout/style/nsStyleCoord.cpp | 5 +++-- 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index ad83a79889..43e8c14963 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -459,6 +459,9 @@ static inline mozilla::HalfCorner operator++(mozilla::HalfCorner& aHalfCorner) { return aHalfCorner; } +// The result of the conversion functions below are exhaustively checked in +// nsStyleCoord.cpp, which also serves as usage examples. + constexpr bool HalfCornerIsX(HalfCorner aHalfCorner) { return !(aHalfCorner % 2); @@ -489,6 +492,23 @@ constexpr Corner SideToFullCorner(Side aSide, bool aIsSecond) return Corner((aSide + aIsSecond) % 4); } +/* @param aIsSecond: when true, return the clockwise second of the two + * corners associated with aSide. For example, with aSide = eSideBottom the + * result is eCornerBottomRight when aIsSecond is false, and + * eCornerBottomLeft when aIsSecond is true. + * @param aIsParallel: return the half-corner that is parallel with aSide + * when aIsParallel is true. For example with aSide=eSideTop, aIsSecond=true + * the result is eCornerTopRightX when aIsParallel is true, and + * eCornerTopRightY when aIsParallel is false (because "X" is parallel with + * eSideTop/eSideBottom, similarly "Y" is parallel with eSideLeft/eSideRight) + */ +constexpr HalfCorner SideToHalfCorner(Side aSide, + bool aIsSecond, + bool aIsParallel) +{ + return HalfCorner(((aSide + aIsSecond) * 2 + (aSide + !aIsParallel) % 2) % 8); +} + } // namespace mozilla #endif /* MOZILLA_GFX_TYPES_H_ */ diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 451a1ff7cd..c7f2471bca 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -1284,8 +1284,8 @@ nsIFrame::ComputeBorderRadii(const nsStyleCorners& aBorderRadius, bool haveRadius = false; double ratio = 1.0f; NS_FOR_CSS_SIDES(side) { - uint32_t hc1 = NS_SIDE_TO_HALF_CORNER(side, false, true); - uint32_t hc2 = NS_SIDE_TO_HALF_CORNER(side, true, true); + uint32_t hc1 = SideToHalfCorner(side, false, true); + uint32_t hc2 = SideToHalfCorner(side, true, true); nscoord length = SideIsVertical(side) ? aBorderArea.height : aBorderArea.width; nscoord sum = aRadii[hc1] + aRadii[hc2]; @@ -1310,8 +1310,8 @@ nsIFrame::InsetBorderRadii(nscoord aRadii[8], const nsMargin &aOffsets) { NS_FOR_CSS_SIDES(side) { nscoord offset = aOffsets.Side(side); - uint32_t hc1 = NS_SIDE_TO_HALF_CORNER(side, false, false); - uint32_t hc2 = NS_SIDE_TO_HALF_CORNER(side, true, false); + uint32_t hc1 = SideToHalfCorner(side, false, false); + uint32_t hc2 = SideToHalfCorner(side, true, false); aRadii[hc1] = std::max(0, aRadii[hc1] - offset); aRadii[hc2] = std::max(0, aRadii[hc2] - offset); } @@ -1322,8 +1322,8 @@ nsIFrame::OutsetBorderRadii(nscoord aRadii[8], const nsMargin &aOffsets) { NS_FOR_CSS_SIDES(side) { nscoord offset = aOffsets.Side(side); - uint32_t hc1 = NS_SIDE_TO_HALF_CORNER(side, false, false); - uint32_t hc2 = NS_SIDE_TO_HALF_CORNER(side, true, false); + uint32_t hc1 = SideToHalfCorner(side, false, false); + uint32_t hc2 = SideToHalfCorner(side, true, false); if (aRadii[hc1] > 0) aRadii[hc1] += offset; if (aRadii[hc2] > 0) diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index 96690ae2d8..9507ea6fab 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -16,13 +16,6 @@ namespace mozilla { -// The results of these conversion macros are exhaustively checked in -// nsStyleCoord.cpp. -// Arguments must not have side effects. - -#define NS_SIDE_TO_HALF_CORNER(side_, second_, parallel_) \ - ((((side_) + !!(second_))*2 + ((side_) + !(parallel_))%2) % 8) - // Basic shapes enum class StyleBasicShapeType : uint8_t { Polygon, diff --git a/layout/style/nsStyleCoord.cpp b/layout/style/nsStyleCoord.cpp index 263b0844b2..f93bb53f63 100644 --- a/layout/style/nsStyleCoord.cpp +++ b/layout/style/nsStyleCoord.cpp @@ -397,9 +397,10 @@ CASE(eSideLeft, false, eCornerBottomLeft); CASE(eSideLeft, true, eCornerTopLeft); #undef CASE +//Validation of SideToHalfCorner. #define CASE(side, second, parallel, result) \ - static_assert(NS_SIDE_TO_HALF_CORNER(side, second, parallel) == result, \ - "NS_SIDE_TO_HALF_CORNER is wrong") + static_assert(SideToHalfCorner(side, second, parallel) == result, \ + "SideToHalfCorner is wrong") CASE(eSideTop, false, true, eCornerTopLeftX); CASE(eSideTop, false, false, eCornerTopLeftY); CASE(eSideTop, true, true, eCornerTopRightX); From 5c509ea6ce587ee38dce501ea4a1d066600744d9 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Fri, 2 Aug 2024 12:10:27 +0200 Subject: [PATCH 24/25] Issue #1925 - Replace RectCorner with Corner. --- gfx/2d/BaseRect.h | 10 ++++---- gfx/2d/PathHelpers.cpp | 4 +-- gfx/2d/PathHelpers.h | 57 ++++++++++++++++++++---------------------- gfx/2d/Types.h | 20 ++++----------- gfx/thebes/gfxBlur.cpp | 4 +-- 5 files changed, 41 insertions(+), 54 deletions(-) diff --git a/gfx/2d/BaseRect.h b/gfx/2d/BaseRect.h index 561a126f64..79a786412a 100644 --- a/gfx/2d/BaseRect.h +++ b/gfx/2d/BaseRect.h @@ -378,12 +378,12 @@ struct BaseRect { Point TopRight() const { return Point(XMost(), y); } Point BottomLeft() const { return Point(x, YMost()); } Point BottomRight() const { return Point(XMost(), YMost()); } - Point AtCorner(int aCorner) const { + Point AtCorner(Corner aCorner) const { switch (aCorner) { - case RectCorner::TopLeft: return TopLeft(); - case RectCorner::TopRight: return TopRight(); - case RectCorner::BottomRight: return BottomRight(); - case RectCorner::BottomLeft: return BottomLeft(); + case eCornerTopLeft: return TopLeft(); + case eCornerTopRight: return TopRight(); + case eCornerBottomRight: return BottomRight(); + case eCornerBottomLeft: return BottomLeft(); } MOZ_CRASH("GFX: Incomplete switch"); } diff --git a/gfx/2d/PathHelpers.cpp b/gfx/2d/PathHelpers.cpp index 49c344b427..e76954497b 100644 --- a/gfx/2d/PathHelpers.cpp +++ b/gfx/2d/PathHelpers.cpp @@ -125,10 +125,10 @@ AppendRoundedRectToPath(PathBuilder* aPathBuilder, Point pc, p0, p1, p2, p3; if (aDrawClockwise) { - aPathBuilder->MoveTo(Point(aRect.X() + aRadii[RectCorner::TopLeft].width, + aPathBuilder->MoveTo(Point(aRect.X() + aRadii[eCornerTopLeft].width, aRect.Y())); } else { - aPathBuilder->MoveTo(Point(aRect.X() + aRect.Width() - aRadii[RectCorner::TopRight].width, + aPathBuilder->MoveTo(Point(aRect.X() + aRect.Width() - aRadii[eCornerTopRight].width, aRect.Y())); } diff --git a/gfx/2d/PathHelpers.h b/gfx/2d/PathHelpers.h index 6b7135db1b..9e92542660 100644 --- a/gfx/2d/PathHelpers.h +++ b/gfx/2d/PathHelpers.h @@ -178,35 +178,35 @@ inline already_AddRefed MakePathForRect(const DrawTarget& aDrawTarget, } struct RectCornerRadii { - Size radii[RectCorner::Count]; + Size radii[eCornerCount]; RectCornerRadii() {} explicit RectCornerRadii(Float radius) { - for (int i = 0; i < RectCorner::Count; i++) { + NS_FOR_CSS_FULL_CORNERS(i) { radii[i].SizeTo(radius, radius); } } explicit RectCornerRadii(Float radiusX, Float radiusY) { - for (int i = 0; i < RectCorner::Count; i++) { + NS_FOR_CSS_FULL_CORNERS(i) { radii[i].SizeTo(radiusX, radiusY); } } RectCornerRadii(Float tl, Float tr, Float br, Float bl) { - radii[RectCorner::TopLeft].SizeTo(tl, tl); - radii[RectCorner::TopRight].SizeTo(tr, tr); - radii[RectCorner::BottomRight].SizeTo(br, br); - radii[RectCorner::BottomLeft].SizeTo(bl, bl); + radii[eCornerTopLeft].SizeTo(tl, tl); + radii[eCornerTopRight].SizeTo(tr, tr); + radii[eCornerBottomRight].SizeTo(br, br); + radii[eCornerBottomLeft].SizeTo(bl, bl); } RectCornerRadii(const Size& tl, const Size& tr, const Size& br, const Size& bl) { - radii[RectCorner::TopLeft] = tl; - radii[RectCorner::TopRight] = tr; - radii[RectCorner::BottomRight] = br; - radii[RectCorner::BottomLeft] = bl; + radii[eCornerTopLeft] = tl; + radii[eCornerTopRight] = tr; + radii[eCornerBottomRight] = br; + radii[eCornerBottomLeft] = bl; } const Size& operator[](size_t aCorner) const { @@ -218,38 +218,35 @@ struct RectCornerRadii { } bool operator==(const RectCornerRadii& aOther) const { - for (size_t i = 0; i < RectCorner::Count; i++) { - if (radii[i] != aOther.radii[i]) return false; - } - return true; + return TopLeft() == aOther.TopLeft() && + TopRight() == aOther.TopRight() && + BottomRight() == aOther.BottomRight() && + BottomLeft() == aOther.BottomLeft(); } bool AreRadiiSame() const { - for (size_t i = 1; i < RectCorner::Count; i++) { - if (radii[i] != radii[0]) { - return false; - } - } - return true; + return TopLeft() == TopRight() && + TopLeft() == BottomRight() && + TopLeft() == BottomLeft(); } void Scale(Float aXScale, Float aYScale) { - for (int i = 0; i < RectCorner::Count; i++) { + NS_FOR_CSS_FULL_CORNERS(i) { radii[i].Scale(aXScale, aYScale); } } - const Size TopLeft() const { return radii[RectCorner::TopLeft]; } - Size& TopLeft() { return radii[RectCorner::TopLeft]; } + const Size TopLeft() const { return radii[eCornerTopLeft]; } + Size& TopLeft() { return radii[eCornerTopLeft]; } - const Size TopRight() const { return radii[RectCorner::TopRight]; } - Size& TopRight() { return radii[RectCorner::TopRight]; } + const Size TopRight() const { return radii[eCornerTopRight]; } + Size& TopRight() { return radii[eCornerTopRight]; } - const Size BottomRight() const { return radii[RectCorner::BottomRight]; } - Size& BottomRight() { return radii[RectCorner::BottomRight]; } + const Size BottomRight() const { return radii[eCornerBottomRight]; } + Size& BottomRight() { return radii[eCornerBottomRight]; } - const Size BottomLeft() const { return radii[RectCorner::BottomLeft]; } - Size& BottomLeft() { return radii[RectCorner::BottomLeft]; } + const Size BottomLeft() const { return radii[eCornerBottomLeft]; } + Size& BottomLeft() { return radii[eCornerBottomLeft]; } }; /** diff --git a/gfx/2d/Types.h b/gfx/2d/Types.h index 43e8c14963..3413788d64 100644 --- a/gfx/2d/Types.h +++ b/gfx/2d/Types.h @@ -359,21 +359,6 @@ typedef mozilla::gfx::SurfaceFormat gfxImageFormat; namespace mozilla { -// We can't use MOZ_BEGIN_ENUM_CLASS here because that prevents the enum -// values from being used for indexing. Wrapping the enum in a struct does at -// least gives us name scoping. -struct RectCorner { - enum { - // This order is important since Rect::AtCorner, AppendRoundedRectToPath - // and other code depends on it! - TopLeft = 0, - TopRight = 1, - BottomRight = 2, - BottomLeft = 3, - Count = 4 - }; -}; - // Side constants for use in various places. enum Side { eSideTop, eSideRight, eSideBottom, eSideLeft }; @@ -414,6 +399,11 @@ enum Corner { eCornerBottomLeft = 3 }; +// RectCornerRadii::radii depends on this value. It is not being added to +// Corner because we want to lift the responsibility to handle it in the +// switch-case. +constexpr int eCornerCount = 4; + // Creates a for loop that walks over the four mozilla::Corner values. This // implementation uses the same technique as NS_FOR_CSS_SIDES. #define NS_FOR_CSS_FULL_CORNERS(var_) \ diff --git a/gfx/thebes/gfxBlur.cpp b/gfx/thebes/gfxBlur.cpp index 63e261a9ec..c68d80e1fc 100644 --- a/gfx/thebes/gfxBlur.cpp +++ b/gfx/thebes/gfxBlur.cpp @@ -435,7 +435,7 @@ ComputeMinSizeForShadowShape(const RectCornerRadii* aCornerRadii, Size cornerSize(0, 0); if (aCornerRadii) { const RectCornerRadii& corners = *aCornerRadii; - for (size_t i = 0; i < RectCorner::Count; i++) { + NS_FOR_CSS_FULL_CORNERS(i) { cornerSize.width = std::max(cornerSize.width, corners[i].width); cornerSize.height = std::max(cornerSize.height, corners[i].height); } @@ -1169,7 +1169,7 @@ static void GetBlurMargins(const RectCornerRadii* aInnerClipRadii, Size cornerSize(0, 0); if (aInnerClipRadii) { const RectCornerRadii& corners = *aInnerClipRadii; - for (size_t i = 0; i < RectCorner::Count; i++) { + NS_FOR_CSS_FULL_CORNERS(i) { cornerSize.width = std::max(cornerSize.width, corners[i].width); cornerSize.height = std::max(cornerSize.height, corners[i].height); } From a023a81fef9707b1d91f195b8a9b40613620a768 Mon Sep 17 00:00:00 2001 From: Nia Alarie Date: Sun, 4 Aug 2024 13:34:07 +0200 Subject: [PATCH 25/25] Fix loading libGL on NetBSD The unversioned libGL is preferred on OpenBSD and NetBSD because both (a) always install it (b) have forks of X11 with different ABI versions. However, many Linux distributions do not ship unversioned .so symlinks unless you install -dev packages. Unfortunately also needs to be fixed in ANGLE which has the same problem. --- gfx/gl/GLContextProviderGLX.cpp | 2 +- toolkit/xre/glxtest.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/gl/GLContextProviderGLX.cpp b/gfx/gl/GLContextProviderGLX.cpp index 27d07e391d..4efca41ff8 100644 --- a/gfx/gl/GLContextProviderGLX.cpp +++ b/gfx/gl/GLContextProviderGLX.cpp @@ -84,7 +84,7 @@ GLXLibrary::EnsureInitialized() // see e.g. bug 608526: it is intrinsically interesting to know whether we have dynamically linked to libGL.so.1 // because at least the NVIDIA implementation requires an executable stack, which causes mprotect calls, // which trigger glibc bug http://sourceware.org/bugzilla/show_bug.cgi?id=12225 -#ifdef __OpenBSD__ +#if defined(__OpenBSD__) || defined(__NetBSD__) libGLfilename = "libGL.so"; #else libGLfilename = "libGL.so.1"; diff --git a/toolkit/xre/glxtest.cpp b/toolkit/xre/glxtest.cpp index f6f1d4d9c9..714b039e50 100644 --- a/toolkit/xre/glxtest.cpp +++ b/toolkit/xre/glxtest.cpp @@ -161,7 +161,7 @@ void glxtest() fatal_error("The MOZ_AVOID_OPENGL_ALTOGETHER environment variable is defined"); ///// Open libGL and load needed symbols ///// -#ifdef __OpenBSD__ +#if defined(__OpenBSD__) || defined(__NetBSD__) #define LIBGL_FILENAME "libGL.so" #else #define LIBGL_FILENAME "libGL.so.1"