Add GM mixed_xfermodes. This is a work in progress and will be used to test fixes...
authorbsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 1 Apr 2013 18:02:55 +0000 (18:02 +0000)
committerbsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 1 Apr 2013 18:02:55 +0000 (18:02 +0000)
Review URL: https://codereview.chromium.org/13365005

git-svn-id: http://skia.googlecode.com/svn/trunk@8461 2bbb7eff-a529-9590-31e7-b0007b416f81

gm/mixedxfermodes.cpp [new file with mode: 0644]
gyp/gmslides.gypi

diff --git a/gm/mixedxfermodes.cpp b/gm/mixedxfermodes.cpp
new file mode 100644 (file)
index 0000000..7d42607
--- /dev/null
@@ -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);
+
+}
index 430eaa3..caff5a4 100644 (file)
@@ -55,6 +55,7 @@
     '../gm/lcdtext.cpp',
     '../gm/linepaths.cpp',
     '../gm/matrixconvolution.cpp',
+    '../gm/mixedxfermodes.cpp',
     '../gm/modecolorfilters.cpp',
     '../gm/morphology.cpp',
     '../gm/ninepatchstretch.cpp',