aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-04-01 18:02:55 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-04-01 18:02:55 +0000
commit20edf38a9ea04b990e0412654e342ced45d3ef15 (patch)
tree82ea1377ec214b9a1d5e5f5f4a2d037617d5d5cc /gm
parent02009c781da3e586546fed7cbb533e7bd683522b (diff)
Add GM mixed_xfermodes. This is a work in progress and will be used to test fixes for GPU Xfermodes effects.
Review URL: https://codereview.chromium.org/13365005 git-svn-id: http://skia.googlecode.com/svn/trunk@8461 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm')
-rw-r--r--gm/mixedxfermodes.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/gm/mixedxfermodes.cpp b/gm/mixedxfermodes.cpp
new file mode 100644
index 0000000000..7d426078d5
--- /dev/null
+++ b/gm/mixedxfermodes.cpp
@@ -0,0 +1,111 @@
+
+/*
+ * Copyright 2013 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 "SkBitmap.h"
+#include "SkRandom.h"
+#include "SkShader.h"
+#include "SkXfermode.h"
+
+namespace skiagm {
+
+/**
+ * Renders overlapping circles with random SkXfermode::Modes against a checkerboard.
+ */
+class MixedXfermodesGM : public GM {
+public:
+ MixedXfermodesGM() {
+ static uint32_t kCheckerPixelData[] = { 0xFFFFFFFF, 0xFFCCCCCC, 0xFFCCCCCC, 0xFFFFFFFF };
+ SkBitmap bitmap;
+ bitmap.setConfig(SkBitmap::kARGB_8888_Config, 2, 2, 2 * sizeof(uint32_t));
+ bitmap.allocPixels();
+ bitmap.lockPixels();
+ memcpy(bitmap.getPixels(), kCheckerPixelData, sizeof(kCheckerPixelData));
+ bitmap.unlockPixels();
+ fBG.reset(SkShader::CreateBitmapShader(bitmap,
+ SkShader::kRepeat_TileMode,
+ SkShader::kRepeat_TileMode));
+ SkASSERT(NULL != fBG);
+ SkMatrix lm;
+ lm.setScale(SkIntToScalar(20), SkIntToScalar(20));
+ fBG->setLocalMatrix(lm);
+ }
+
+protected:
+ virtual SkString onShortName() {
+ return SkString("mixed_xfermodes");
+ }
+
+ virtual SkISize onISize() {
+ return make_isize(790, 640);
+ }
+
+ virtual void onDraw(SkCanvas* canvas) {
+ // FIXME: Currently necessary for GPU to be able to make dst-copy in SampleApp because
+ // main layer is not a texture.
+ SkPaint layerPaint;
+ layerPaint.setXfermodeMode(SkXfermode::kSrc_Mode);
+ canvas->saveLayer(NULL, &layerPaint);
+
+ SkPaint bgPaint;
+ bgPaint.setShader(fBG.get());
+ canvas->drawPaint(bgPaint);
+ SkISize size = canvas->getDeviceSize();
+ SkScalar areaSqrt = SkScalarSqrt((SkIntToScalar(size.fWidth * size.fHeight)));
+ SkScalar minR = areaSqrt / 10;
+ SkScalar maxR = areaSqrt / 4;
+ SkMWCRandom random;
+ for (int i = 0; i < kNumCircles; ++i) {
+ SkScalar cx = random.nextRangeScalar(0, SkIntToScalar(size.fWidth));
+ SkScalar cy = random.nextRangeScalar(0, SkIntToScalar(size.fHeight));
+ SkScalar r = random.nextRangeScalar(minR, maxR);
+ SkColor color = random.nextU();
+
+ SkXfermode::Mode mode =
+ static_cast<SkXfermode::Mode>(random.nextULessThan(SkXfermode::kLastMode + 1));
+ // FIXME: Currently testing kDarken on GPU.
+ mode = SkXfermode::kDarken_Mode;
+
+ SkPaint p;
+ p.setAntiAlias(true);
+ p.setColor(color);
+ p.setXfermodeMode(mode);
+ canvas->drawCircle(cx, cy, r, p);
+ }
+
+ // FIXME: Remove text draw once this GM is finished.
+ SkPaint txtPaint;
+ txtPaint.setTextSize(areaSqrt / 20);
+ txtPaint.setAntiAlias(true);
+ static const char kTxt[] = "Work in progres... Do not baseline.";
+ canvas->drawText(kTxt, strlen(kTxt),
+ areaSqrt/50,
+ SkIntToScalar(size.fHeight / 2),
+ txtPaint);
+
+ canvas->restore();
+ }
+
+ // https://code.google.com/p/skia/issues/detail?id=1199&thanks=1199&ts=1364839297
+ virtual uint32_t onGetFlags() const SK_OVERRIDE { return kSkipPipe_Flag; }
+
+private:
+ enum {
+ kMinR = 10,
+ kMaxR = 50,
+ kNumCircles = 50,
+ };
+ SkAutoTUnref<SkShader> fBG;
+ typedef GM INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static GM* MyFactory(void*) { return new MixedXfermodesGM; }
+static GMRegistry reg(MyFactory);
+
+}