/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrFillRRectOp_DEFINED #define GrFillRRectOp_DEFINED #include "src/gpu/ops/GrDrawOp.h" class GrRecordingContext; class GrFillRRectOp : public GrDrawOp { public: DEFINE_OP_CLASS_ID static std::unique_ptr Make( GrRecordingContext*, GrAAType, const SkMatrix& viewMatrix, const SkRRect&, const GrCaps&, GrPaint&&); const char* name() const override { return "GrFillRRectOp"; } FixedFunctionFlags fixedFunctionFlags() const override { return (GrAAType::kMSAA == fAAType) ? FixedFunctionFlags::kUsesHWAA : FixedFunctionFlags::kNone; } GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*, bool hasMixedSampledCoverage, GrClampType) override; CombineResult onCombineIfPossible(GrOp*, const GrCaps&) override; void visitProxies(const VisitProxyFunc& fn) const override { fProcessors.visitProxies(fn); } void onPrepare(GrOpFlushState*) override; void onExecute(GrOpFlushState*, const SkRect& chainBounds) override; private: enum class Flags { kNone = 0, kUseHWDerivatives = 1 << 0, kHasPerspective = 1 << 1, kHasLocalCoords = 1 << 2, kWideColor = 1 << 3 }; GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(Flags); class Processor; GrFillRRectOp(GrAAType, const SkRRect&, Flags, const SkMatrix& totalShapeMatrix, GrPaint&&, const SkRect& devBounds); // These methods are used to append data of various POD types to our internal array of instance // data. The actual layout of the instance buffer can vary from Op to Op. template inline T* appendInstanceData(int count) { static_assert(std::is_pod::value, ""); static_assert(4 == alignof(T), ""); return reinterpret_cast(fInstanceData.push_back_n(sizeof(T) * count)); } template inline void writeInstanceData(const T& val, const Args&... remainder) { memcpy(this->appendInstanceData(1), &val, sizeof(T)); this->writeInstanceData(remainder...); } void writeInstanceData() {} // Halt condition. const GrAAType fAAType; const SkPMColor4f fOriginalColor; const SkRect fLocalRect; Flags fFlags; GrProcessorSet fProcessors; SkSTArray fInstanceData; int fInstanceCount = 1; int fInstanceStride = 0; sk_sp fInstanceBuffer; int fBaseInstance; friend class GrOpMemoryPool; }; GR_MAKE_BITFIELD_CLASS_OPS(GrFillRRectOp::Flags) #endif