Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(307)

Unified Diff: src/gpu/effects/GrConvexPolyEffect.cpp

Issue 183893023: Unify edge type enums across GrEffect subclasses that clip rendering to a geometry. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: tot again Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/effects/GrConvexPolyEffect.h ('k') | src/gpu/effects/GrRRectEffect.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/effects/GrConvexPolyEffect.cpp
diff --git a/src/gpu/effects/GrConvexPolyEffect.cpp b/src/gpu/effects/GrConvexPolyEffect.cpp
index baad92837c233721542a4d723bb3c354d154824b..0793befb57c1b9d1903001b971163fc08a12f070 100644
--- a/src/gpu/effects/GrConvexPolyEffect.cpp
+++ b/src/gpu/effects/GrConvexPolyEffect.cpp
@@ -19,13 +19,12 @@ class GLAARectEffect;
class AARectEffect : public GrEffect {
public:
typedef GLAARectEffect GLEffect;
- typedef GrConvexPolyEffect::EdgeType EdgeType;
const SkRect& getRect() const { return fRect; }
static const char* Name() { return "AARect"; }
- static GrEffectRef* Create(EdgeType edgeType, const SkRect& rect) {
+ static GrEffectRef* Create(GrEffectEdgeType edgeType, const SkRect& rect) {
return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(AARectEffect, (edgeType, rect))));
}
@@ -40,12 +39,12 @@ public:
}
}
- GrConvexPolyEffect::EdgeType getEdgeType() const { return fEdgeType; }
+ GrEffectEdgeType getEdgeType() const { return fEdgeType; }
virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
private:
- AARectEffect(EdgeType edgeType, const SkRect& rect) : fRect(rect), fEdgeType(edgeType) {
+ AARectEffect(GrEffectEdgeType edgeType, const SkRect& rect) : fRect(rect), fEdgeType(edgeType) {
this->setWillReadFragmentPosition();
}
@@ -55,7 +54,7 @@ private:
}
SkRect fRect;
- EdgeType fEdgeType;
+ GrEffectEdgeType fEdgeType;
typedef GrEffect INHERITED;
@@ -69,14 +68,18 @@ GrEffectRef* AARectEffect::TestCreate(SkRandom* random,
GrContext*,
const GrDrawTargetCaps& caps,
GrTexture*[]) {
- EdgeType edgeType = static_cast<EdgeType>(
- random->nextULessThan(GrConvexPolyEffect::kEdgeTypeCnt));
-
SkRect rect = SkRect::MakeLTRB(random->nextSScalar1(),
random->nextSScalar1(),
random->nextSScalar1(),
random->nextSScalar1());
- return AARectEffect::Create(edgeType, rect);
+ GrEffectRef* effect;
+ do {
+ GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(random->nextULessThan(
+ kGrEffectEdgeTypeCnt));
+
+ effect = AARectEffect::Create(edgeType, rect);
+ } while (NULL == effect);
+ return effect;
}
//////////////////////////////////////////////////////////////////////////////
@@ -125,8 +128,7 @@ void GLAARectEffect::emitCode(GrGLShaderBuilder* builder,
"rect",
&rectName);
const char* fragmentPos = builder->fragmentPosition();
- if (GrConvexPolyEffect::kFillAA_EdgeType == aare.getEdgeType() ||
- GrConvexPolyEffect::kInverseFillAA_EdgeType == aare.getEdgeType()) {
+ if (GrEffectEdgeTypeIsAA(aare.getEdgeType())) {
// The amount of coverage removed in x and y by the edges is computed as a pair of negative
// numbers, xSub and ySub.
builder->fsCodeAppend("\t\tfloat xSub, ySub;\n");
@@ -145,8 +147,7 @@ void GLAARectEffect::emitCode(GrGLShaderBuilder* builder,
builder->fsCodeAppendf("\t\talpha *= (%s.w - %s.y) > 0.5 ? 1.0 : 0.0;\n", rectName, fragmentPos);
}
- if (GrConvexPolyEffect::kInverseFillAA_EdgeType == aare.getEdgeType() ||
- GrConvexPolyEffect::kInverseFillNoAA_EdgeType == aare.getEdgeType()) {
+ if (GrEffectEdgeTypeIsInverseFill(aare.getEdgeType())) {
builder->fsCodeAppend("\t\talpha = 1.0 - alpha;\n");
}
builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor,
@@ -223,15 +224,10 @@ void GrGLConvexPolyEffect::emitCode(GrGLShaderBuilder* builder,
for (int i = 0; i < cpe.getEdgeCount(); ++i) {
builder->fsCodeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x, %s.y, 1));\n",
edgeArrayName, i, fragmentPos, fragmentPos);
- switch (cpe.getEdgeType()) {
- case GrConvexPolyEffect::kFillAA_EdgeType:
- case GrConvexPolyEffect::kInverseFillAA_EdgeType: // inverse handled at the end
- builder->fsCodeAppend("\t\tedge = clamp(edge, 0.0, 1.0);\n");
- break;
- case GrConvexPolyEffect::kFillNoAA_EdgeType:
- case GrConvexPolyEffect::kInverseFillNoAA_EdgeType: // inverse handled at the end
- builder->fsCodeAppend("\t\tedge = edge >= 0.5 ? 1.0 : 0.0;\n");
- break;
+ if (GrEffectEdgeTypeIsAA(cpe.getEdgeType())) {
+ builder->fsCodeAppend("\t\tedge = clamp(edge, 0.0, 1.0);\n");
+ } else {
+ builder->fsCodeAppend("\t\tedge = edge >= 0.5 ? 1.0 : 0.0;\n");
}
builder->fsCodeAppend("\t\talpha *= edge;\n");
}
@@ -241,8 +237,7 @@ void GrGLConvexPolyEffect::emitCode(GrGLShaderBuilder* builder,
builder->fsCodeAppend("\t\tif (-1.0 == alpha) {\n\t\t\tdiscard;\n\t\t}\n");
}
- if (GrConvexPolyEffect::kInverseFillAA_EdgeType == cpe.getEdgeType() ||
- GrConvexPolyEffect::kInverseFillNoAA_EdgeType == cpe.getEdgeType() ) {
+ if (GrEffectEdgeTypeIsInverseFill(cpe.getEdgeType())) {
builder->fsCodeAppend("\talpha = 1.0 - alpha;\n");
}
builder->fsCodeAppendf("\t%s = %s;\n", outputColor,
@@ -261,16 +256,18 @@ void GrGLConvexPolyEffect::setData(const GrGLUniformManager& uman, const GrDrawE
GrGLEffect::EffectKey GrGLConvexPolyEffect::GenKey(const GrDrawEffect& drawEffect,
const GrGLCaps&) {
const GrConvexPolyEffect& cpe = drawEffect.castEffect<GrConvexPolyEffect>();
- GR_STATIC_ASSERT(GrConvexPolyEffect::kEdgeTypeCnt <= 4);
- return (cpe.getEdgeCount() << 2) | cpe.getEdgeType();
+ GR_STATIC_ASSERT(kGrEffectEdgeTypeCnt <= 8);
+ return (cpe.getEdgeCount() << 3) | cpe.getEdgeType();
}
//////////////////////////////////////////////////////////////////////////////
-GrEffectRef* GrConvexPolyEffect::Create(EdgeType type, const SkPath& path, const SkVector* offset) {
+GrEffectRef* GrConvexPolyEffect::Create(GrEffectEdgeType type, const SkPath& path, const SkVector* offset) {
+ if (kHairlineAA_GrEffectEdgeType == type) {
+ return NULL;
+ }
if (path.getSegmentMasks() != SkPath::kLine_SegmentMask ||
- !path.isConvex() ||
- path.isInverseFillType()) {
+ !path.isConvex()) {
return NULL;
}
@@ -309,10 +306,16 @@ GrEffectRef* GrConvexPolyEffect::Create(EdgeType type, const SkPath& path, const
++n;
}
}
+ if (path.isInverseFillType()) {
+ type = GrInvertEffectEdgeType(type);
+ }
return Create(type, n, edges);
}
-GrEffectRef* GrConvexPolyEffect::Create(EdgeType edgeType, const SkRect& rect) {
+GrEffectRef* GrConvexPolyEffect::Create(GrEffectEdgeType edgeType, const SkRect& rect) {
+ if (kHairlineAA_GrEffectEdgeType == edgeType){
+ return NULL;
+ }
return AARectEffect::Create(edgeType, rect);
}
@@ -326,7 +329,7 @@ const GrBackendEffectFactory& GrConvexPolyEffect::getFactory() const {
return GrTBackendEffectFactory<GrConvexPolyEffect>::getInstance();
}
-GrConvexPolyEffect::GrConvexPolyEffect(EdgeType edgeType, int n, const SkScalar edges[])
+GrConvexPolyEffect::GrConvexPolyEffect(GrEffectEdgeType edgeType, int n, const SkScalar edges[])
: fEdgeType(edgeType)
, fEdgeCount(n) {
// Factory function should have already ensured this.
@@ -355,12 +358,17 @@ GrEffectRef* GrConvexPolyEffect::TestCreate(SkRandom* random,
GrContext*,
const GrDrawTargetCaps& caps,
GrTexture*[]) {
- EdgeType edgeType = static_cast<EdgeType>(random->nextULessThan(kEdgeTypeCnt));
int count = random->nextULessThan(kMaxEdges) + 1;
SkScalar edges[kMaxEdges * 3];
for (int i = 0; i < 3 * count; ++i) {
edges[i] = random->nextSScalar1();
}
- return GrConvexPolyEffect::Create(edgeType, count, edges);
+ GrEffectRef* effect;
+ do {
+ GrEffectEdgeType edgeType = static_cast<GrEffectEdgeType>(
+ random->nextULessThan(kGrEffectEdgeTypeCnt));
+ effect = GrConvexPolyEffect::Create(edgeType, count, edges);
+ } while (NULL == effect);
+ return effect;
}
« no previous file with comments | « src/gpu/effects/GrConvexPolyEffect.h ('k') | src/gpu/effects/GrRRectEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698