diff options
author | wangyix <wangyix@google.com> | 2015-09-03 08:32:22 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-03 08:32:22 -0700 |
commit | d7059583758a4a500cb4ebfe6b3bc18c86d1816a (patch) | |
tree | af8a0f61a2d03d717cbf5ef3fab5ceaf571c92f4 /gm/composeshader.cpp | |
parent | fac9ceb5de5288fa9f98a6cf77085b37da601b36 (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.
BUG=skia:4182
Review URL: https://codereview.chromium.org/1311043008
Diffstat (limited to 'gm/composeshader.cpp')
-rw-r--r-- | gm/composeshader.cpp | 125 |
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; ) |