xref: /aosp_15_r20/external/skia/src/pdf/SkPDFGraphicStackState.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 // Copyright 2019 Google LLC.
2 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3 #ifndef SkPDFGraphicStackState_DEFINED
4 #define SkPDFGraphicStackState_DEFINED
5 
6 #include "include/core/SkColor.h"
7 #include "include/core/SkMatrix.h"
8 #include "include/core/SkScalar.h"
9 #include "include/private/base/SkFloatingPoint.h"
10 #include "src/core/SkClipStack.h"
11 
12 #include <cstdint>
13 
14 class SkDynamicMemoryWStream;
15 struct SkIRect;
16 
17 // It is important to not confuse SkPDFGraphicStackState with SkPDFGraphicState, the
18 // later being our representation of an object in the PDF file.
19 struct SkPDFGraphicStackState {
20     struct Entry {
21         SkMatrix fMatrix = SkMatrix::I();
22         uint32_t fClipStackGenID = SkClipStack::kWideOpenGenID;
23         SkColor4f fColor = {SK_FloatNaN, SK_FloatNaN, SK_FloatNaN, SK_FloatNaN};
24         SkScalar fTextScaleX = 1;  // Zero means we don't care what the value is.
25         int fShaderIndex = -1;
26         int fGraphicStateIndex = -1;
27     };
28     // Must use stack for matrix, and for clip, plus one for no matrix or clip.
29     inline static constexpr int kMaxStackDepth = 2;
30     Entry fEntries[kMaxStackDepth + 1];
31     int fStackDepth = 0;
32     SkDynamicMemoryWStream* fContentStream;
33 
fContentStreamSkPDFGraphicStackState34     SkPDFGraphicStackState(SkDynamicMemoryWStream* s = nullptr) : fContentStream(s) {}
35     void updateClip(const SkClipStack* clipStack, const SkIRect& bounds);
36     void updateMatrix(const SkMatrix& matrix);
37     void updateDrawingState(const Entry& state);
38     void push();
39     void pop();
40     void drainStack();
currentEntrySkPDFGraphicStackState41     Entry* currentEntry() { return &fEntries[fStackDepth]; }
42 };
43 
44 #endif  // SkPDFGraphicStackState_DEFINED
45