/* * Copyright 2014 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrConvexPolyEffect_DEFINED #define GrConvexPolyEffect_DEFINED #include "GrCaps.h" #include "GrFragmentProcessor.h" #include "GrProcessor.h" #include "GrTypesPriv.h" class GrInvariantOutput; class SkPath; /** * An effect that renders a convex polygon. It is intended to be used as a coverage effect. * Bounding geometry is rendered and the effect computes coverage based on the fragment's * position relative to the polygon. */ class GrConvexPolyEffect : public GrFragmentProcessor { public: enum { kMaxEdges = 8, }; /** * edges is a set of n edge equations where n is limited to kMaxEdges. It contains 3*n values. * The edges should form a convex polygon. The positive half-plane is considered to be the * inside. The equations should be normalized such that the first two coefficients are a unit * 2d vector. * * Currently the edges are specified in device space. In the future we may prefer to specify * them in src space. There are a number of ways this could be accomplished but we'd probably * have to modify the effect/shaderbuilder interface to make it possible (e.g. give access * to the view matrix or untransformed positions in the fragment shader). */ static std::unique_ptr<GrFragmentProcessor> Make(GrClipEdgeType edgeType, int n, const SkScalar edges[]) { if (n <= 0 || n > kMaxEdges || GrClipEdgeType::kHairlineAA == edgeType) { return nullptr; } return std::unique_ptr<GrFragmentProcessor>(new GrConvexPolyEffect(edgeType, n, edges)); } /** * Creates an effect that clips against the path. If the path is not a convex polygon, is * inverse filled, or has too many edges, this will return nullptr. */ static std::unique_ptr<GrFragmentProcessor> Make(GrClipEdgeType, const SkPath&); /** * Creates an effect that fills inside the rect with AA edges.. */ static std::unique_ptr<GrFragmentProcessor> Make(GrClipEdgeType, const SkRect&); ~GrConvexPolyEffect() override; const char* name() const override { return "ConvexPoly"; } std::unique_ptr<GrFragmentProcessor> clone() const override; GrClipEdgeType getEdgeType() const { return fEdgeType; } int getEdgeCount() const { return fEdgeCount; } const SkScalar* getEdges() const { return fEdges; } private: GrConvexPolyEffect(GrClipEdgeType edgeType, int n, const SkScalar edges[]); GrConvexPolyEffect(const GrConvexPolyEffect&); GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; bool onIsEqual(const GrFragmentProcessor& other) const override; GrClipEdgeType fEdgeType; int fEdgeCount; SkScalar fEdges[3 * kMaxEdges]; GR_DECLARE_FRAGMENT_PROCESSOR_TEST typedef GrFragmentProcessor INHERITED; }; #endif