aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/composeshader.cpp
diff options
context:
space:
mode:
authorGravatar wangyix <wangyix@google.com>2015-09-03 08:32:22 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-09-03 08:32:22 -0700
commitd7059583758a4a500cb4ebfe6b3bc18c86d1816a (patch)
treeaf8a0f61a2d03d717cbf5ef3fab5ceaf571c92f4 /gm/composeshader.cpp
parentfac9ceb5de5288fa9f98a6cf77085b37da601b36 (diff)
Will try composing a linear gradient with a color bitmap as well as an alpha8 bitmap to make sure the paint's color is being used/ignored in the right places.
Diffstat (limited to 'gm/composeshader.cpp')
-rw-r--r--gm/composeshader.cpp125
1 files changed, 124 insertions, 1 deletions
diff --git a/gm/composeshader.cpp b/gm/composeshader.cpp
index f5ab996f37..e012bbb285 100644
--- a/gm/composeshader.cpp
+++ b/gm/composeshader.cpp
@@ -7,6 +7,7 @@
#include "gm.h"
+#include "SkBitmapProcShader.h"
#include "SkCanvas.h"
#include "SkComposeShader.h"
#include "SkGradientShader.h"
@@ -84,7 +85,7 @@ protected:
}
SkISize onISize() override {
- return SkISize::Make(220, 750);
+ return SkISize::Make(750, 220);
}
void onDraw(SkCanvas* canvas) override {
@@ -115,9 +116,131 @@ protected:
canvas->translate(0, r.height() + 5);
}
}
+
+private:
+ typedef GM INHERITED ;
+};
+
+
+// creates a square bitmap with red background and a green circle in the center
+static void draw_color_bm(SkBitmap* bm, int length) {
+ SkPaint paint;
+ paint.setColor(SK_ColorGREEN);
+
+ bm->allocN32Pixels(length, length);
+ bm->eraseColor(SK_ColorRED);
+
+ SkCanvas canvas(*bm);
+ canvas.drawCircle(SkIntToScalar(length/2), SkIntToScalar(length/2), SkIntToScalar(length/2),
+ paint);
+}
+
+// creates a square alpha8 bitmap with transparent background and an opaque circle in the center
+static void draw_alpha8_bm(SkBitmap* bm, int length) {
+ SkPaint circlePaint;
+ circlePaint.setColor(SK_ColorBLACK);
+
+ bm->allocPixels(SkImageInfo::MakeA8(length, length));
+ bm->eraseColor(SK_ColorTRANSPARENT);
+
+ SkCanvas canvas(*bm);
+ canvas.drawCircle(SkIntToScalar(length/2), SkIntToScalar(length/2), SkIntToScalar(length/4),
+ circlePaint);
+}
+
+// creates a linear gradient shader
+static SkShader* make_linear_gradient_shader(int length) {
+ SkPoint pts[2];
+ SkColor colors[2];
+ pts[0].set(0, 0);
+ pts[1].set(SkIntToScalar(length), 0);
+ colors[0] = SK_ColorBLUE;
+ colors[1] = SkColorSetARGB(0, 0, 0, 0xFF);
+ return SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
+}
+
+
+class ComposeShaderBitmapGM : public skiagm::GM {
+public:
+ ComposeShaderBitmapGM() {
+ draw_color_bm(&fColorBitmap, squareLength);
+ draw_alpha8_bm(&fAlpha8Bitmap, squareLength);
+ SkMatrix s;
+ s.reset();
+ fColorBitmapShader = new SkBitmapProcShader(fColorBitmap, SkShader::kRepeat_TileMode,
+ SkShader::kRepeat_TileMode, &s);
+ fAlpha8BitmapShader = new SkBitmapProcShader(fAlpha8Bitmap, SkShader::kRepeat_TileMode,
+ SkShader::kRepeat_TileMode, &s);
+ fLinearGradientShader = make_linear_gradient_shader(squareLength);
+ }
+ ~ComposeShaderBitmapGM() {
+ SkSafeUnref(fColorBitmapShader);
+ SkSafeUnref(fAlpha8BitmapShader);
+ SkSafeUnref(fLinearGradientShader);
+ }
+
+protected:
+ SkString onShortName() override {
+ return SkString("composeshader_bitmap");
+ }
+
+ SkISize onISize() override {
+ return SkISize::Make(7 * (squareLength + 5), 2 * (squareLength + 5));
+ }
+
+ void onDraw(SkCanvas* canvas) override {
+ SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(SkXfermode::kDstOver_Mode));
+
+ // gradient should appear over color bitmap
+ SkAutoTUnref<SkShader> shader0(new SkComposeShader(fLinearGradientShader,
+ fColorBitmapShader,
+ xfer));
+ // gradient should appear over alpha8 bitmap colorized by the paint color
+ SkAutoTUnref<SkShader> shader1(new SkComposeShader(fLinearGradientShader,
+ fAlpha8BitmapShader,
+ xfer));
+
+ SkShader* shaders[] = { shader0.get(), shader1.get() };
+
+ SkPaint paint;
+ paint.setColor(SK_ColorYELLOW);
+
+ const SkRect r = SkRect::MakeXYWH(0, 0, SkIntToScalar(squareLength),
+ SkIntToScalar(squareLength));
+
+ for (size_t y = 0; y < SK_ARRAY_COUNT(shaders); ++y) {
+ SkShader* shader = shaders[y];
+ canvas->save();
+ for (int alpha = 0xFF; alpha > 0; alpha -= 0x28) {
+ paint.setAlpha(alpha);
+ paint.setShader(shader);
+ canvas->drawRect(r, paint);
+
+ canvas->translate(r.width() + 5, 0);
+ }
+ canvas->restore();
+ canvas->translate(0, r.height() + 5);
+ }
+ }
+private:
+ /** This determines the length and width of the bitmaps used in the SkComposeShaders. Values
+ * above 20 may cause an SkASSERT to fail in SkSmallAllocator. However, larger values will
+ * work in a release build. You can change this parameter and then compile a release build
+ * to have this GM draw larger bitmaps for easier visual inspection.
+ */
+ static const int squareLength = 20;
+
+ SkBitmap fColorBitmap;
+ SkBitmap fAlpha8Bitmap;
+ SkShader* fColorBitmapShader;
+ SkShader* fAlpha8BitmapShader;
+ SkShader* fLinearGradientShader;
+
+ typedef GM INHERITED;
};
//////////////////////////////////////////////////////////////////////////////
DEF_GM( return new ComposeShaderGM; )
DEF_GM( return new ComposeShaderAlphaGM; )
+DEF_GM( return new ComposeShaderBitmapGM; )