| /* | |
| * Copyright 2017 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef SkClipStackDevice_DEFINED | |
| #define SkClipStackDevice_DEFINED | |
| #include "include/core/SkRect.h" | |
| #include "include/core/SkRefCnt.h" | |
| #include "src/core/SkClipStack.h" | |
| #include "src/core/SkDevice.h" | |
| #include <cstdint> | |
| class SkPath; | |
| class SkRRect; | |
| class SkRegion; | |
| class SkShader; | |
| class SkSurfaceProps; | |
| enum class SkClipOp; | |
| struct SkImageInfo; | |
| class SkClipStackDevice : public SkDevice { | |
| public: | |
| SkClipStackDevice(const SkImageInfo& info, const SkSurfaceProps& props) | |
| : SkDevice(info, props) | |
| , fClipStack(fStorage, sizeof(fStorage)) | |
| {} | |
| SkClipStack& cs() { return fClipStack; } | |
| const SkClipStack& cs() const { return fClipStack; } | |
| void pushClipStack() override; | |
| void popClipStack() override; | |
| void clipRect(const SkRect& rect, SkClipOp, bool aa) override; | |
| void clipRRect(const SkRRect& rrect, SkClipOp, bool aa) override; | |
| void clipPath(const SkPath& path, SkClipOp, bool aa) override; | |
| void clipRegion(const SkRegion& deviceRgn, SkClipOp) override; | |
| void replaceClip(const SkIRect& rect) override; | |
| bool isClipAntiAliased() const override; | |
| bool isClipWideOpen() const override; | |
| bool isClipEmpty() const override; | |
| bool isClipRect() const override; | |
| void android_utils_clipAsRgn(SkRegion*) const override; | |
| SkIRect devClipBounds() const override; | |
| private: | |
| // empirically determined, adjust as needed to reduce mallocs | |
| static constexpr int kPreallocCount = 16; | |
| void onClipShader(sk_sp<SkShader>) override; | |
| intptr_t fStorage[kPreallocCount * sizeof(SkClipStack::Element) / sizeof(intptr_t)]; | |
| SkClipStack fClipStack; | |
| }; | |
| #endif |