1/*
2* Copyright 2020 Google LLC
3*
4* Use of this source code is governed by a BSD-style license that can be
5* found in the LICENSE file.
6*/
7
8#ifndef SkMatrixProvider_DEFINED
9#define SkMatrixProvider_DEFINED
10
11#include "include/core/SkM44.h"
12#include "include/core/SkMatrix.h"
13
14class SkMatrixProvider {
15public:
16 SkMatrixProvider(const SkMatrix& localToDevice)
17 : fLocalToDevice(localToDevice)
18 , fLocalToDevice33(localToDevice) {}
19
20 SkMatrixProvider(const SkM44& localToDevice)
21 : fLocalToDevice(localToDevice)
22 , fLocalToDevice33(localToDevice.asM33()) {}
23
24 virtual ~SkMatrixProvider() {}
25
26 // These should return the "same" matrix, as either a 3x3 or 4x4. Most sites in Skia still
27 // call localToDevice, and operate on SkMatrix.
28 const SkMatrix& localToDevice() const { return fLocalToDevice33; }
29 const SkM44& localToDevice44() const { return fLocalToDevice; }
30
31 virtual bool getLocalToMarker(uint32_t id, SkM44* localToMarker) const = 0;
32
33private:
34 friend class SkBaseDevice;
35
36 SkM44 fLocalToDevice;
37 SkMatrix fLocalToDevice33; // Cached SkMatrix version of above, for legacy usage
38};
39
40class SkOverrideDeviceMatrixProvider : public SkMatrixProvider {
41public:
42 SkOverrideDeviceMatrixProvider(const SkMatrixProvider& parent, const SkMatrix& localToDevice)
43 : SkMatrixProvider(localToDevice)
44 , fParent(parent) {}
45
46 bool getLocalToMarker(uint32_t id, SkM44* localToMarker) const override {
47 return fParent.getLocalToMarker(id, localToMarker);
48 }
49
50private:
51 const SkMatrixProvider& fParent;
52};
53
54class SkPostTranslateMatrixProvider : public SkMatrixProvider {
55public:
56 SkPostTranslateMatrixProvider(const SkMatrixProvider& parent, SkScalar dx, SkScalar dy)
57 : SkMatrixProvider(SkM44::Translate(dx, dy) * parent.localToDevice44())
58 , fParent(parent) {}
59
60 // Assume that the post-translation doesn't apply to any marked matrices
61 bool getLocalToMarker(uint32_t id, SkM44* localToMarker) const override {
62 return fParent.getLocalToMarker(id, localToMarker);
63 }
64
65private:
66 const SkMatrixProvider& fParent;
67};
68
69class SkPreConcatMatrixProvider : public SkMatrixProvider {
70public:
71 SkPreConcatMatrixProvider(const SkMatrixProvider& parent, const SkMatrix& preMatrix)
72 : SkMatrixProvider(parent.localToDevice44() * SkM44(preMatrix))
73 , fParent(parent)
74 , fPreMatrix(preMatrix) {}
75
76 bool getLocalToMarker(uint32_t id, SkM44* localToMarker) const override {
77 if (fParent.getLocalToMarker(id, localToMarker)) {
78 if (localToMarker) {
79 localToMarker->preConcat(fPreMatrix);
80 }
81 return true;
82 }
83 return false;
84 }
85
86private:
87 const SkMatrixProvider& fParent;
88 const SkMatrix fPreMatrix;
89};
90
91class SkSimpleMatrixProvider : public SkMatrixProvider {
92public:
93 SkSimpleMatrixProvider(const SkMatrix& localToDevice)
94 : SkMatrixProvider(localToDevice) {}
95
96 bool getLocalToMarker(uint32_t, SkM44*) const override { return false; }
97};
98
99#endif
100