Chromium Code Reviews| Index: gm/rrects.cpp |
| diff --git a/gm/rrects.cpp b/gm/rrects.cpp |
| index 35120c119efee8d6fc16362a32acc21743cc091c..8fb79d33bd5c9c4a61ba1c74cfc14dfe38d525c9 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,116 @@ 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); |
|
robertphillips
2014/03/04 16:05:15
remove the empty else?
bsalomon
2014/03/04 16:10:38
Done.
|
| + } else { |
| + } |
| + } 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 +156,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 +218,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); ) |
| } |