Chromium Code Reviews| Index: src/gpu/effects/GrEdgeEffect.h |
| =================================================================== |
| --- src/gpu/effects/GrEdgeEffect.h (revision 0) |
| +++ src/gpu/effects/GrEdgeEffect.h (revision 0) |
| @@ -0,0 +1,85 @@ |
| +/* |
| + * Copyright 2013 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
| +#ifndef GrEdgeEffect_DEFINED |
| +#define GrEdgeEffect_DEFINED |
| + |
| +#include "GrEffect.h" |
| + |
| +class GrGLEdgeEffect; |
| + |
| +/** |
| + * The output of this effect is one of three different edge types: hairlines, quads, |
| + * and hairline quads. |
| + */ |
| + |
| +class GrEdgeEffect : public GrEffect { |
| +public: |
| + enum EdgeType { |
| + /* 1-pixel wide line |
| + 2D implicit device coord line eq (a*x + b*y +c = 0). 4th component unused. */ |
| + kHairLine_EdgeType = 0, |
| + /* Quadratic specified by 0=u^2-v canonical coords. u and v are the first |
| + two components of the vertex attribute. Coverage is based on signed |
| + distance with negative being inside, positive outside. The edge is specified in |
| + window space (y-down). If either the third or fourth component of the interpolated |
| + vertex coord is > 0 then the pixel is considered outside the edge. This is used to |
| + attempt to trim to a portion of the infinite quad. Requires shader derivative |
| + instruction support. */ |
| + kQuad_EdgeType, |
| + /* Similar to above but for hairline quadratics. Uses unsigned distance. |
| + Coverage is min(0, 1-distance). 3rd & 4th component unused. Requires |
| + shader derivative instruction support. */ |
| + kHairQuad_EdgeType, |
| + |
| + kLast_EdgeType = kHairQuad_EdgeType |
| + }; |
| + static const int kEdgeTypeCount = kLast_EdgeType + 1; |
| + |
| + static GrEffectRef* Create(EdgeType type) { |
| + // we go through this so we only have one copy of each effect |
| + static GrEffectRef* gEdgeEffectRef[kEdgeTypeCount] = { |
|
bsalomon
2013/03/26 13:41:50
XCode/clang did not like the SkAutoTUnref<GrEffect
|
| + CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(GrEdgeEffect, (kHairLine_EdgeType)))), |
| + CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(GrEdgeEffect, (kQuad_EdgeType)))), |
| + CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(GrEdgeEffect, (kHairQuad_EdgeType)))), |
| + }; |
| + static SkAutoTUnref<GrEffectRef> gUnref0(gEdgeEffectRef[0]); |
| + static SkAutoTUnref<GrEffectRef> gUnref1(gEdgeEffectRef[1]); |
| + static SkAutoTUnref<GrEffectRef> gUnref2(gEdgeEffectRef[2]); |
| + |
| + gEdgeEffectRef[type]->ref(); |
| + return gEdgeEffectRef[type]; |
| + } |
| + |
| + virtual ~GrEdgeEffect() {} |
| + |
| + static const char* Name() { return "Edge"; } |
| + |
| + virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE; |
| + |
| + typedef GrGLEdgeEffect GLEffect; |
| + |
| + virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; |
| + |
|
robertphillips
2013/03/26 14:09:20
We don't usually bother with inlines on these
bsalomon
2013/03/26 14:45:30
Done.
|
| + inline EdgeType edgeType() const { return fEdgeType; } |
| + |
| +private: |
| + GrEdgeEffect(EdgeType edgeType); |
| + |
| + virtual bool onIsEqual(const GrEffect& other) const SK_OVERRIDE { |
| + const GrEdgeEffect& qee = CastEffect<GrEdgeEffect>(other); |
| + return qee.fEdgeType == fEdgeType; |
| + } |
| + |
| + EdgeType fEdgeType; |
| + |
| + GR_DECLARE_EFFECT_TEST; |
| + |
| + typedef GrEffect INHERITED; |
| +}; |
| + |
| +#endif |