/*
* 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 GrStencilClip_DEFINED
#define GrStencilClip_DEFINED
#include "GrAppliedClip.h"
#include "GrFixedClip.h"
/**
* Implements GrHardClip with the currently-existing stencil buffer contents and GrFixedClip.
*/
class GrStencilClip final : public GrHardClip {
public:
GrStencilClip(uint32_t stencilStackID = SK_InvalidGenID) : fStencilStackID(stencilStackID) {}
explicit GrStencilClip(const SkIRect& scissorRect, uint32_t stencilStackID = SK_InvalidGenID)
: fFixedClip(scissorRect)
, fStencilStackID(stencilStackID) {
}
const GrFixedClip& fixedClip() const { return fFixedClip; }
GrFixedClip& fixedClip() { return fFixedClip; }
bool stencilStackID() const { return fStencilStackID; }
bool hasStencilClip() const { return SK_InvalidGenID != fStencilStackID; }
void setStencilClip(uint32_t stencilStackID) { fStencilStackID = stencilStackID; }
bool quickContains(const SkRect& rect) const override {
return !this->hasStencilClip() && fFixedClip.quickContains(rect);
}
void getConservativeBounds(int width, int height, SkIRect* bounds, bool* iior) const override {
fFixedClip.getConservativeBounds(width, height, bounds, iior);
}
bool isRRect(const SkRect& rtBounds, SkRRect* rr, GrAA* aa) const override {
return !this->hasStencilClip() && fFixedClip.isRRect(rtBounds, rr, aa);
}
bool apply(int rtWidth, int rtHeight, GrAppliedHardClip* out, SkRect* bounds) const override {
if (!fFixedClip.apply(rtWidth, rtHeight, out, bounds)) {
return false;
}
if (this->hasStencilClip()) {
out->addStencilClip(fStencilStackID);
}
return true;
}
private:
GrFixedClip fFixedClip;
uint32_t fStencilStackID;
typedef GrClip INHERITED;
};
#endif