blob: 2ea890c1b00c4cec0b16c5f3f907d8d5b7736070 [file] [log] [blame]
// Copyright 2019 Google LLC.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#ifndef SkPDFGraphicStackState_DEFINED
#define SkPDFGraphicStackState_DEFINED
#include "include/core/SkColor.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkScalar.h"
#include "include/private/base/SkFloatingPoint.h"
#include "src/core/SkClipStack.h"
class SkDynamicMemoryWStream;
// It is important to not confuse SkPDFGraphicStackState with SkPDFGraphicState, the
// later being our representation of an object in the PDF file.
struct SkPDFGraphicStackState {
struct Entry {
SkMatrix fMatrix = SkMatrix::I();
uint32_t fClipStackGenID = SkClipStack::kWideOpenGenID;
SkColor4f fColor = {SK_FloatNaN, SK_FloatNaN, SK_FloatNaN, SK_FloatNaN};
SkScalar fTextScaleX = 1; // Zero means we don't care what the value is.
int fShaderIndex = -1;
int fGraphicStateIndex = -1;
};
// Must use stack for matrix, and for clip, plus one for no matrix or clip.
inline static constexpr int kMaxStackDepth = 2;
Entry fEntries[kMaxStackDepth + 1];
int fStackDepth = 0;
SkDynamicMemoryWStream* fContentStream;
SkPDFGraphicStackState(SkDynamicMemoryWStream* s = nullptr) : fContentStream(s) {}
void updateClip(const SkClipStack* clipStack, const SkIRect& bounds);
void updateMatrix(const SkMatrix& matrix);
void updateDrawingState(const Entry& state);
void push();
void pop();
void drainStack();
Entry* currentEntry() { return &fEntries[fStackDepth]; }
};
#endif // SkPDFGraphicStackState_DEFINED