summaryrefslogtreecommitdiffstats
path: root/image/AutoRestoreSVGState.h
blob: c01c2f612b2719255d69460f7d005e26c28f0347 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */

#ifndef mozilla_image_AutoRestoreSVGState_h
#define mozilla_image_AutoRestoreSVGState_h

#include "mozilla/Attributes.h"
#include "mozilla/AutoRestore.h"
#include "mozilla/SVGContextPaint.h"
#include "mozilla/dom/SVGSVGElement.h"
#include "nsPresContext.h"
#include "SVGDrawingParameters.h"
#include "SVGDocumentWrapper.h"
#include "mozilla/dom/DocumentInlines.h"
#include "mozilla/dom/SVGDocument.h"
#include "mozilla/dom/BrowsingContextBinding.h"

namespace mozilla::image {

class MOZ_STACK_CLASS AutoRestoreSVGState final {
 public:
  AutoRestoreSVGState(const SVGDrawingParameters& aParams,
                      SVGDocumentWrapper* aSVGDocumentWrapper,
                      bool aContextPaint)
      : AutoRestoreSVGState(aParams.svgContext, aParams.animationTime,
                            aSVGDocumentWrapper, aContextPaint) {}

  AutoRestoreSVGState(const SVGImageContext& aSVGContext, float aAnimationTime,
                      SVGDocumentWrapper* aSVGDocumentWrapper,
                      bool aContextPaint)
      : mIsDrawing(aSVGDocumentWrapper->mIsDrawing),
        // Apply any 'preserveAspectRatio' override (if specified) to the root
        // element:
        mPAR(aSVGContext, aSVGDocumentWrapper->GetRootSVGElem()),
        // Set the animation time:
        mTime(aSVGDocumentWrapper->GetRootSVGElem(), aAnimationTime) {
    MOZ_ASSERT(!mIsDrawing.SavedValue());
    MOZ_ASSERT(aSVGDocumentWrapper->GetDocument());

    if (auto* pc = aSVGDocumentWrapper->GetDocument()->GetPresContext()) {
      pc->SetColorSchemeOverride([&] {
        if (auto scheme = aSVGContext.GetColorScheme()) {
          return *scheme == ColorScheme::Light
                     ? dom::PrefersColorSchemeOverride::Light
                     : dom::PrefersColorSchemeOverride::Dark;
        }
        return dom::PrefersColorSchemeOverride::None;
      }());
    }

    aSVGDocumentWrapper->mIsDrawing = true;

    // Set context paint (if specified) on the document:
    if (aContextPaint) {
      MOZ_ASSERT(aSVGContext.GetContextPaint());
      mContextPaint.emplace(aSVGContext.GetContextPaint(),
                            aSVGDocumentWrapper->GetDocument());
    }
  }

 private:
  AutoRestore<bool> mIsDrawing;
  AutoPreserveAspectRatioOverride mPAR;
  AutoSVGTimeSetRestore mTime;
  Maybe<AutoSetRestoreSVGContextPaint> mContextPaint;
};

}  // namespace mozilla::image

#endif  // mozilla_image_AutoRestoreSVGState_h