blob: a883435aae469dd407db112485bf5bcbb3a95239 [file] [log] [blame]
/*
* 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