Chromium Code Reviews| Index: src/gpu/effects/GrConvexPolyEffect.h |
| diff --git a/src/gpu/effects/GrConvexPolyEffect.h b/src/gpu/effects/GrConvexPolyEffect.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..2dc4bb4f1dfaecbf4531c8a11b2d42b4591086ef |
| --- /dev/null |
| +++ b/src/gpu/effects/GrConvexPolyEffect.h |
| @@ -0,0 +1,94 @@ |
| +/* |
| + * Copyright 2014 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
|
robertphillips
2014/01/29 20:57:55
Fix this name?
bsalomon
2014/01/29 22:19:42
nice catch, guess you can tell how I started this
|
| +#ifndef GrBezierEffect_DEFINED |
| +#define GrBezierEffect_DEFINED |
| + |
| +#include "GrDrawTargetCaps.h" |
| +#include "GrEffect.h" |
| +#include "GrVertexEffect.h" |
| + |
| +class GrGLConvexPolyEffect; |
| +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 GrEffect { |
| +public: |
| + /** This could be expanded to include a AA hairline mode. If so, unify with GrBezierEffect's |
| + enum. */ |
| + enum EdgeType { |
| + kFillNoAA_EdgeType, |
| + kFillAA_EdgeType, |
| + |
| + kLastEdgeType = kFillAA_EdgeType, |
| + }; |
| + |
| + enum { |
| + kEdgeTypeCnt = kLastEdgeType + 1, |
| + kMaxEdges = 8, |
| + }; |
| + |
| + /** |
|
robertphillips
2014/01/29 20:57:55
Do we want to state in the comment that n must be
bsalomon
2014/01/29 22:19:42
Done.
|
| + * edges is a set of n edge equations. It contains 3*n values. The edges should form a convex |
|
robertphillips
2014/01/29 20:57:55
equations rather than equalizations?
bsalomon
2014/01/29 22:19:42
Done.
|
| + * polygon. The positive half-plane is considered to be the inside. The equalizations 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 GrEffectRef* Create(EdgeType edgeType, int n, const SkScalar edges[]) { |
| + if (n <= 0 || n > kMaxEdges) { |
| + return NULL; |
| + } |
| + return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(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 NULL. |
| + */ |
| + static GrEffectRef* Create(EdgeType, const SkPath&); |
| + |
| + virtual ~GrConvexPolyEffect(); |
| + |
| + static const char* Name() { return "ConvexPoly"; } |
| + |
| + EdgeType getEdgeType() const { return fEdgeType; } |
| + |
| + int getEdgeCount() const { return fEdgeCount; } |
| + |
| + const SkScalar* getEdges() const { return fEdges; } |
| + |
| + typedef GrGLConvexPolyEffect GLEffect; |
| + |
| + virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; |
| + |
| + virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; |
| + |
| +private: |
| + GrConvexPolyEffect(EdgeType edgeType, int n, const SkScalar edges[]); |
| + |
| + virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE; |
| + |
| + EdgeType fEdgeType; |
| + int fEdgeCount; |
| + SkScalar fEdges[3 * kMaxEdges]; |
| + |
| + GR_DECLARE_EFFECT_TEST; |
| + |
| + typedef GrEffect INHERITED; |
| +}; |
| + |
| + |
| +#endif |