Index: gm/bigrrectaaeffect.cpp |
diff --git a/gm/bigrrectaaeffect.cpp b/gm/bigrrectaaeffect.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..41e4d0565c58add04d47ca9e66e61f32cc0daa66 |
--- /dev/null |
+++ b/gm/bigrrectaaeffect.cpp |
@@ -0,0 +1,132 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "gm.h" |
+#if SK_SUPPORT_GPU |
+#include "GrTest.h" |
+#include "effects/GrRRectEffect.h" |
+#include "SkDevice.h" |
+#include "SkRRect.h" |
+ |
+namespace skiagm { |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+class BigRRectAAEffectGM : public GM { |
+public: |
+ BigRRectAAEffectGM() { |
+ this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); |
+ this->setUpRRects(); |
+ } |
+ |
+protected: |
+ SkString onShortName() override { |
+ return SkString("big_rrect_aa_effect"); |
+ } |
+ |
+ SkISize onISize() override { return SkISize::Make(kImageWidth, kImageHeight); } |
+ |
+ void onDraw(SkCanvas* canvas) override { |
+ GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget(); |
+ GrContext* context = rt ? rt->getContext() : NULL; |
+ if (!context) { |
+ this->drawGpuOnlyMessage(canvas); |
+ return; |
+ } |
+ |
+ SkPaint paint; |
+ |
+#ifdef SK_DEBUG |
+ static const SkRect kMaxRRectBound = SkRect::MakeWH(SkIntToScalar(kMaxSize), |
+ SkIntToScalar(kMaxSize)); |
+ static const SkRect kMaxImageBound = SkRect::MakeWH(SkIntToScalar(kImageWidth), |
+ SkIntToScalar(kImageHeight)); |
+#endif |
+ |
+ int y = kPad; |
+ int x = kPad; |
+ static const GrPrimitiveEdgeType kEdgeTypes[] = { |
+ kFillAA_GrProcessorEdgeType, |
+ kInverseFillAA_GrProcessorEdgeType, |
+ }; |
+ for (size_t et = 0; et < SK_ARRAY_COUNT(kEdgeTypes); ++et) { |
+ GrPrimitiveEdgeType edgeType = kEdgeTypes[et]; |
+ for (int curRRect = 0; curRRect < fRRects.count(); ++curRRect) { |
+#ifdef SK_DEBUG |
+ SkASSERT(kMaxRRectBound.contains(fRRects[curRRect].getBounds())); |
+ SkRect imageSpaceBounds = fRRects[curRRect].getBounds(); |
+ imageSpaceBounds.offset(SkIntToScalar(x), SkIntToScalar(y)); |
+ SkASSERT(kMaxImageBound.contains(imageSpaceBounds)); |
+#endif |
+ canvas->save(); |
+ canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); |
+ GrTestTarget tt; |
+ context->getTestTarget(&tt); |
+ if (NULL == tt.target()) { |
+ SkDEBUGFAIL("Couldn't get Gr test target."); |
+ return; |
+ } |
+ GrPipelineBuilder pipelineBuilder; |
+ |
+ SkRRect rrect = fRRects[curRRect]; |
+ rrect.offset(SkIntToScalar(x), SkIntToScalar(y)); |
+ SkAutoTUnref<GrFragmentProcessor> fp(GrRRectEffect::Create(edgeType, rrect)); |
+ SkASSERT(fp); |
+ if (fp) { |
+ pipelineBuilder.addCoverageProcessor(fp); |
+ pipelineBuilder.setRenderTarget(rt); |
+ |
+ SkRect bounds = SkRect::MakeWH(SkIntToScalar(kMaxSize), |
+ SkIntToScalar(kMaxSize)); |
+ bounds.outset(2.f, 2.f); |
+ bounds.offset(SkIntToScalar(x), SkIntToScalar(y)); |
+ |
+ tt.target()->drawSimpleRect(pipelineBuilder, |
+ 0xff000000, |
+ SkMatrix::I(), |
+ bounds); |
+ } |
+ canvas->restore(); |
+ x = x + kDrawOffset; |
+ if (x + kMaxSize> kImageWidth) { |
+ x = kPad; |
+ y += kDrawOffset; |
+ } |
+ } |
+ } |
+ } |
+ |
+ void setUpRRects() { |
+ SkScalar maxSize = SkIntToScalar(kMaxSize); |
+ fRRects.push()->setRect(SkRect::MakeWH(maxSize, maxSize)); |
+ fRRects.push()->setOval(SkRect::MakeWH(maxSize, maxSize)); |
+ fRRects.push()->setOval(SkRect::MakeWH(maxSize - 1.f, maxSize - 10.f)); |
+ fRRects.push()->setRectXY(SkRect::MakeWH(maxSize - 1.f, maxSize - 10.f), |
+ maxSize/2.f - 10.f, maxSize/2.f - 10.f); |
+ fRRects.push()->setRectXY(SkRect::MakeWH(maxSize - 1.f, maxSize - 10), |
+ maxSize/2.f - 10.f, maxSize/2.f - 20.f); |
+ } |
+ |
+private: |
+ static const int kPad = 5; |
+ static const int kMaxSize = 300; |
+ static const int kDrawOffset = kMaxSize + kPad; |
+ |
+ static const int kImageWidth = 4 * kDrawOffset + kPad; |
+ static const int kImageHeight = 3 * kDrawOffset + kPad; |
+ |
+ |
+ SkTDArray<SkRRect> fRRects; |
+ typedef GM INHERITED; |
+}; |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+DEF_GM( return new BigRRectAAEffectGM (); ) |
+ |
+} |
+#endif |