Index: gm/samplerstress.cpp |
diff --git a/gm/samplerstress.cpp b/gm/samplerstress.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c395b08ba170fee1c2efe34eee63e05c75078a46 |
--- /dev/null |
+++ b/gm/samplerstress.cpp |
@@ -0,0 +1,157 @@ |
+/* |
+ * Copyright 2012 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" |
+#include "SkCanvas.h" |
+#include "SkShader.h" |
+#include "SkBlurMaskFilter.h" |
+ |
+namespace skiagm { |
+ |
+/** |
+ * Stress test the GPU samplers by rendering a textured glyph with a mask and |
+ * an AA clip |
+ */ |
+class SamplerStressGM : public GM { |
+public: |
+ SamplerStressGM() |
+ : fTextureCreated(false) |
+ , fShader(NULL) |
+ , fMaskFilter(NULL) { |
+ } |
+ |
+ virtual ~SamplerStressGM() { |
+ } |
+ |
+protected: |
+ virtual uint32_t onGetFlags() const SK_OVERRIDE { |
+ return kSkipTiled_Flag; |
+ } |
+ |
+ virtual SkString onShortName() { |
+ return SkString("gpusamplerstress"); |
+ } |
+ |
+ virtual SkISize onISize() { |
+ return SkISize::Make(640, 480); |
+ } |
+ |
+ /** |
+ * Create a red & green stripes on black texture |
+ */ |
+ void createTexture() { |
+ if (fTextureCreated) { |
+ return; |
+ } |
+ |
+ static const int xSize = 16; |
+ static const int ySize = 16; |
+ |
+ fTexture.allocN32Pixels(xSize, ySize); |
+ SkPMColor* addr = fTexture.getAddr32(0, 0); |
+ |
+ for (int y = 0; y < ySize; ++y) { |
+ for (int x = 0; x < xSize; ++x) { |
+ addr[y*xSize+x] = SkPreMultiplyColor(SK_ColorBLACK); |
+ |
+ if ((y % 5) == 0) { |
+ addr[y*xSize+x] = SkPreMultiplyColor(SK_ColorRED); |
+ } |
+ if ((x % 7) == 0) { |
+ addr[y*xSize+x] = SkPreMultiplyColor(SK_ColorGREEN); |
+ } |
+ } |
+ } |
+ |
+ fTextureCreated = true; |
+ } |
+ |
+ void createShader() { |
+ if (NULL != fShader.get()) { |
+ return; |
+ } |
+ |
+ createTexture(); |
+ |
+ fShader.reset(SkShader::CreateBitmapShader(fTexture, |
+ SkShader::kRepeat_TileMode, |
+ SkShader::kRepeat_TileMode)); |
+ } |
+ |
+ void createMaskFilter() { |
+ if (NULL != fMaskFilter.get()) { |
+ return; |
+ } |
+ |
+ const SkScalar sigma = 1; |
+ fMaskFilter.reset(SkBlurMaskFilter::Create(kNormal_SkBlurStyle, sigma)); |
+ } |
+ |
+ virtual void onDraw(SkCanvas* canvas) { |
+ |
+ createShader(); |
+ createMaskFilter(); |
+ |
+ canvas->save(); |
+ |
+ // draw a letter "M" with a green & red striped texture and a |
robertphillips
2014/08/12 13:52:46
blur
|
+ // stipple mask with a round rect soft clip |
+ SkPaint paint; |
+ paint.setAntiAlias(true); |
+ paint.setTextSize(72); |
+ paint.setShader(fShader.get()); |
+ paint.setMaskFilter(fMaskFilter.get()); |
+ |
+ SkRect temp; |
+ temp.set(SkIntToScalar(115), |
+ SkIntToScalar(75), |
+ SkIntToScalar(144), |
+ SkIntToScalar(110)); |
+ |
+ SkPath path; |
+ path.addRoundRect(temp, SkIntToScalar(5), SkIntToScalar(5)); |
+ |
+ canvas->clipPath(path, SkRegion::kReplace_Op, true); // AA is on |
+ |
+ canvas->drawText("M", 1, |
+ SkIntToScalar(100), SkIntToScalar(100), |
+ paint); |
+ |
+ canvas->restore(); |
+ |
+ // Now draw stroked versions of the "M" and the round rect so we can |
+ // see what is going on |
+ SkPaint paint2; |
+ paint2.setColor(SK_ColorBLACK); |
+ paint2.setAntiAlias(true); |
+ paint2.setTextSize(72); |
+ paint2.setStyle(SkPaint::kStroke_Style); |
+ paint2.setStrokeWidth(1); |
+ canvas->drawText("M", 1, |
+ SkIntToScalar(100), SkIntToScalar(100), |
+ paint2); |
+ |
+ paint2.setColor(SK_ColorGRAY); |
+ |
+ canvas->drawPath(path, paint2); |
+ } |
+ |
+private: |
+ SkBitmap fTexture; |
+ bool fTextureCreated; |
+ SkAutoTUnref<SkShader> fShader; |
+ SkAutoTUnref<SkMaskFilter> fMaskFilter; |
+ |
+ typedef GM INHERITED; |
+}; |
+ |
+////////////////////////////////////////////////////////////////////////////// |
+ |
+static GM* MyFactory(void*) { return new SamplerStressGM; } |
+static GMRegistry reg(MyFactory); |
+ |
+} |