From d7127e7b835b4c5d4767ee9d8794e9865c81f1ac Mon Sep 17 00:00:00 2001 From: reed Date: Tue, 12 Aug 2014 06:53:09 -0700 Subject: re-add samplerstress gm, but use blurmaskfilter instead (std filter) BUG=skia: R=robertphillips@google.com Author: reed@google.com Review URL: https://codereview.chromium.org/468483002 --- gm/samplerstress.cpp | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 gm/samplerstress.cpp (limited to 'gm/samplerstress.cpp') diff --git a/gm/samplerstress.cpp b/gm/samplerstress.cpp new file mode 100644 index 0000000000..c395b08ba1 --- /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 + // 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 fShader; + SkAutoTUnref fMaskFilter; + + typedef GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +static GM* MyFactory(void*) { return new SamplerStressGM; } +static GMRegistry reg(MyFactory); + +} -- cgit v1.2.3