Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Unified Diff: gm/composeshader.cpp

Issue 1311043008: Added ComposeShaderBitmapGM that tests composing bitmaps with gradients (Closed) Base URL: https://skia.googlesource.com/skia@cs3_programstest
Patch Set: fixed build errors Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gm/composeshader.cpp
diff --git a/gm/composeshader.cpp b/gm/composeshader.cpp
index f5ab996f37e33d332e50e37ef0e6ead58660aeaa..e012bbb28590b21282b59b47a3da5173c4e8603b 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; )
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698