Index: gm/composeshader.cpp |
diff --git a/gm/composeshader.cpp b/gm/composeshader.cpp |
index f5ab996f37e33d332e50e37ef0e6ead58660aeaa..2bcbbd327fbecf6e3dae37ebed2e58c490c6c691 100644 |
--- a/gm/composeshader.cpp |
+++ b/gm/composeshader.cpp |
@@ -14,6 +14,7 @@ |
#include "SkShader.h" |
#include "SkString.h" |
#include "SkXfermode.h" |
+#include "SkBitmapProcShader.h" |
egdaniel
2015/09/02 20:15:36
Alphabetize this include
wangyix
2015/09/02 20:49:35
Done.
|
static SkShader* make_shader(SkXfermode::Mode mode) { |
SkPoint pts[2]; |
@@ -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,127 @@ 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(length/2, length/2, 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(length/2, length/2, 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: |
+ /** Can set the dimension of the bitmap that will be used. This way, larger numbers can be |
egdaniel
2015/09/02 20:15:36
Are you saying this will draw differently in relea
wangyix
2015/09/02 20:27:43
No, I was trying to say you can easily change this
|
+ * used for release mode since debug mode will fail an assertion in SkSmallAllocator unless the |
egdaniel
2015/09/02 20:15:36
align comment
|
+ * size of the bitmap is sufficiently small, making the result hard to see. |
+ */ |
+ ComposeShaderBitmapGM(int squareSize) |
+ : squareLength(squareSize) { |
+ 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)); |
egdaniel
2015/09/02 20:15:36
I wonder if it would be interesting to loop over x
|
+ |
+ // 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, squareLength, 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: |
+ const int squareLength; |
+ 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(20); ) |
egdaniel
2015/09/02 20:15:36
This is a general question to anyone, but do we ha
|