1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef mozilla_image_AutoRestoreSVGState_h
7 #define mozilla_image_AutoRestoreSVGState_h
9 #include "mozilla/Attributes.h"
10 #include "mozilla/AutoRestore.h"
11 #include "mozilla/SVGContextPaint.h"
12 #include "mozilla/dom/SVGSVGElement.h"
13 #include "nsPresContext.h"
14 #include "SVGDrawingParameters.h"
15 #include "SVGDocumentWrapper.h"
16 #include "mozilla/dom/DocumentInlines.h"
17 #include "mozilla/dom/SVGDocument.h"
18 #include "mozilla/dom/BrowsingContextBinding.h"
20 namespace mozilla::image
{
22 class MOZ_STACK_CLASS AutoRestoreSVGState final
{
24 AutoRestoreSVGState(const SVGDrawingParameters
& aParams
,
25 SVGDocumentWrapper
* aSVGDocumentWrapper
,
27 : AutoRestoreSVGState(aParams
.svgContext
, aParams
.animationTime
,
28 aSVGDocumentWrapper
, aContextPaint
) {}
30 AutoRestoreSVGState(const SVGImageContext
& aSVGContext
, float aAnimationTime
,
31 SVGDocumentWrapper
* aSVGDocumentWrapper
,
33 : mIsDrawing(aSVGDocumentWrapper
->mIsDrawing
),
34 // Apply any 'preserveAspectRatio' override (if specified) to the root
36 mPAR(aSVGContext
, aSVGDocumentWrapper
->GetRootSVGElem()),
37 // Set the animation time:
38 mTime(aSVGDocumentWrapper
->GetRootSVGElem(), aAnimationTime
) {
39 MOZ_ASSERT(!mIsDrawing
.SavedValue());
40 MOZ_ASSERT(aSVGDocumentWrapper
->GetDocument());
42 if (auto* pc
= aSVGDocumentWrapper
->GetDocument()->GetPresContext()) {
43 pc
->SetColorSchemeOverride([&] {
44 if (auto scheme
= aSVGContext
.GetColorScheme()) {
45 return *scheme
== ColorScheme::Light
46 ? dom::PrefersColorSchemeOverride::Light
47 : dom::PrefersColorSchemeOverride::Dark
;
49 return dom::PrefersColorSchemeOverride::None
;
53 aSVGDocumentWrapper
->mIsDrawing
= true;
55 // Set context paint (if specified) on the document:
57 MOZ_ASSERT(aSVGContext
.GetContextPaint());
58 mContextPaint
.emplace(aSVGContext
.GetContextPaint(),
59 aSVGDocumentWrapper
->GetDocument());
64 AutoRestore
<bool> mIsDrawing
;
65 AutoPreserveAspectRatioOverride mPAR
;
66 AutoSVGTimeSetRestore mTime
;
67 Maybe
<AutoSetRestoreSVGContextPaint
> mContextPaint
;
70 } // namespace mozilla::image
72 #endif // mozilla_image_AutoRestoreSVGState_h