Index: gm/rrects.cpp |
diff --git a/gm/rrects.cpp b/gm/rrects.cpp |
index 35120c119efee8d6fc16362a32acc21743cc091c..4a1e29762bc18114d140f5f42b1d2890d602f9aa 100644 |
--- a/gm/rrects.cpp |
+++ b/gm/rrects.cpp |
@@ -6,7 +6,10 @@ |
*/ |
#include "gm.h" |
+#include "GrTest.h" |
+#include "SkDevice.h" |
#include "SkRRect.h" |
+#include "effects/GrRRectEffect.h" |
namespace skiagm { |
@@ -14,51 +17,115 @@ namespace skiagm { |
class RRectGM : public GM { |
public: |
- RRectGM(bool doAA, bool doClip) : fDoAA(doAA), fDoClip(doClip) { |
+ enum Type { |
+ kBW_Draw_Type, |
+ kAA_Draw_Type, |
+ kBW_Clip_Type, |
+ kAA_Clip_Type, |
+ kEffect_Type, |
+ }; |
+ RRectGM(Type type) : fType(type) { |
this->setBGColor(0xFFDDDDDD); |
this->setUpRRects(); |
} |
protected: |
- SkString onShortName() { |
+ SkString onShortName() SK_OVERRIDE { |
SkString name("rrect"); |
- if (fDoClip) { |
- name.append("_clip"); |
+ switch (fType) { |
+ case kBW_Draw_Type: |
+ name.append("_draw_bw"); |
+ break; |
+ case kAA_Draw_Type: |
+ name.append("_draw_aa"); |
+ break; |
+ case kBW_Clip_Type: |
+ name.append("_clip_bw"); |
+ break; |
+ case kAA_Clip_Type: |
+ name.append("_clip_aa"); |
+ break; |
+ case kEffect_Type: |
+ name.append("_effect"); |
+ break; |
} |
- if (fDoAA) { |
- name.append("_aa"); |
- } else { |
- name.append("_bw"); |
- } |
- |
return name; |
} |
- virtual SkISize onISize() { return make_isize(kImageWidth, kImageHeight); } |
+ virtual SkISize onISize() SK_OVERRIDE { return make_isize(kImageWidth, kImageHeight); } |
- virtual void onDraw(SkCanvas* canvas) { |
+ virtual uint32_t onGetFlags() const SK_OVERRIDE { |
+ if (kEffect_Type == fType) { |
+ return kGPUOnly_Flag; |
+ } else { |
+ return 0; |
+ } |
+ } |
- SkPaint paint; |
- // when clipping the AA is pushed into the clip operation |
- paint.setAntiAlias(fDoClip ? false : fDoAA); |
+ virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
+ SkBaseDevice* device = canvas->getTopDevice(); |
+ GrContext* context = NULL; |
+ GrRenderTarget* rt = device->accessRenderTarget(); |
+ if (NULL != rt) { |
+ context = rt->getContext(); |
+ } |
+ if (kEffect_Type == fType && NULL == context) { |
+ return; |
+ } |
+ SkPaint paint; |
+ if (kAA_Draw_Type == fType) { |
+ paint.setAntiAlias(true); |
+ } |
+ |
static const SkRect kMaxTileBound = SkRect::MakeWH(SkIntToScalar(kTileX), SkIntToScalar(kTileY)); |
int curRRect = 0; |
+ int numRRects = kNumRRects; |
+ if (kEffect_Type == fType) { |
+ numRRects *= GrRRectEffect::kEdgeTypeCnt; |
+ } |
for (int y = 1; y < kImageHeight; y += kTileY) { |
for (int x = 1; x < kImageWidth; x += kTileX) { |
- if (curRRect >= kNumRRects) { |
+ if (curRRect >= numRRects) { |
break; |
} |
- SkASSERT(kMaxTileBound.contains(fRRects[curRRect].getBounds())); |
+ int rrectIdx = curRRect % kNumRRects; |
+ SkASSERT(kMaxTileBound.contains(fRRects[rrectIdx].getBounds())); |
canvas->save(); |
canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); |
- if (fDoClip) { |
- canvas->clipRRect(fRRects[curRRect], SkRegion::kReplace_Op, fDoAA); |
+ if (kEffect_Type == fType) { |
+ GrTestTarget tt; |
+ context->getTestTarget(&tt); |
+ if (NULL == tt.target()) { |
+ SkDEBUGFAIL("Couldn't get Gr test target."); |
+ return; |
+ } |
+ GrDrawState* drawState = tt.target()->drawState(); |
+ |
+ SkRRect rrect = fRRects[rrectIdx]; |
+ rrect.offset(SkIntToScalar(x), SkIntToScalar(y)); |
+ GrRRectEffect::EdgeType edgeType = (GrRRectEffect::EdgeType) |
+ (curRRect / kNumRRects); |
+ SkAutoTUnref<GrEffectRef> effect(GrRRectEffect::Create(edgeType, rrect)); |
+ if (effect) { |
+ drawState->addCoverageEffect(effect); |
+ drawState->setIdentityViewMatrix(); |
+ drawState->setRenderTarget(rt); |
+ drawState->setColor(0xff000000); |
+ |
+ SkRect bounds = rrect.getBounds(); |
+ bounds.outset(2.f, 2.f); |
+ |
+ tt.target()->drawSimpleRect(bounds); |
+ } |
+ } else if (kBW_Clip_Type == fType || kAA_Clip_Type == fType) { |
+ bool aaClip = (kAA_Clip_Type == fType); |
+ canvas->clipRRect(fRRects[rrectIdx], SkRegion::kReplace_Op, aaClip); |
canvas->drawRect(kMaxTileBound, paint); |
} else { |
- canvas->drawRRect(fRRects[curRRect], paint); |
+ canvas->drawRRect(fRRects[rrectIdx], paint); |
} |
++curRRect; |
canvas->restore(); |
@@ -88,9 +155,8 @@ protected: |
} |
private: |
- bool fDoAA; |
- bool fDoClip; // use clipRRect & drawRect instead of drawRRect |
- |
+ Type fType; |
+ |
static const int kImageWidth = 640; |
static const int kImageHeight = 480; |
@@ -151,9 +217,10 @@ const SkVector RRectGM::gRadii[kNumComplexCases][4] = { |
/////////////////////////////////////////////////////////////////////////////// |
-DEF_GM( return new RRectGM(false, false); ) |
-DEF_GM( return new RRectGM(true, false); ) |
-DEF_GM( return new RRectGM(false, true); ) |
-DEF_GM( return new RRectGM(true, true); ) |
+DEF_GM( return new RRectGM(RRectGM::kAA_Draw_Type); ) |
+DEF_GM( return new RRectGM(RRectGM::kBW_Draw_Type); ) |
+DEF_GM( return new RRectGM(RRectGM::kAA_Clip_Type); ) |
+DEF_GM( return new RRectGM(RRectGM::kBW_Clip_Type); ) |
+DEF_GM( return new RRectGM(RRectGM::kEffect_Type); ) |
} |