Index: gm/verylargebitmap.cpp |
diff --git a/gm/verylargebitmap.cpp b/gm/verylargebitmap.cpp |
index 9b5496bc0f74206b978f3be6a87321477fe5f5bf..eaf7316687e2e544f1801bd3a6151dc9e78dc4ab 100644 |
--- a/gm/verylargebitmap.cpp |
+++ b/gm/verylargebitmap.cpp |
@@ -9,24 +9,24 @@ |
#include "SkCanvas.h" |
#include "SkGradientShader.h" |
#include "SkPath.h" |
+#include "SkSurface.h" |
-static void make_bm(SkBitmap* bm, int width, int height, SkColor colors[2]) { |
- bm->allocN32Pixels(width, height); |
- SkCanvas canvas(*bm); |
- SkPoint center = {SkIntToScalar(width)/2, SkIntToScalar(height)/2}; |
- SkScalar radius = 40; |
+static SkImage* make_image(int width, int height, SkColor colors[2]) { |
+ SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(width, height)); |
+ |
+ const SkPoint center = { SkIntToScalar(width)/2, SkIntToScalar(height)/2 }; |
+ const SkScalar radius = 40; |
SkShader* shader = SkGradientShader::CreateRadial(center, radius, colors, nullptr, 2, |
SkShader::kMirror_TileMode); |
SkPaint paint; |
paint.setShader(shader)->unref(); |
paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
- canvas.drawPaint(paint); |
- bm->setImmutable(); |
+ surface->getCanvas()->drawPaint(paint); |
+ return surface->newImageSnapshot(); |
} |
-static void show_bm(SkCanvas* canvas, int width, int height, SkColor colors[2]) { |
- SkBitmap bm; |
- make_bm(&bm, width, height, colors); |
+static void show_image(SkCanvas* canvas, int width, int height, SkColor colors[2]) { |
+ SkAutoTUnref<SkImage> image(make_image(width, height, colors)); |
SkPaint paint; |
SkRect r; |
@@ -39,18 +39,16 @@ static void show_bm(SkCanvas* canvas, int width, int height, SkColor colors[2]) |
canvas->save(); |
canvas->clipRect(r); |
- canvas->drawBitmap(bm, 0, 0, nullptr); |
+ canvas->drawImage(image, 0, 0, nullptr); |
canvas->restore(); |
canvas->drawRect(r, paint); |
r.offset(SkIntToScalar(150), 0); |
- // exercises extract bitmap, but not shader |
- canvas->drawBitmapRect(bm, ir, r, nullptr); |
+ canvas->drawImageRect(image, ir, r, nullptr); |
canvas->drawRect(r, paint); |
r.offset(SkIntToScalar(150), 0); |
- // exercises bitmapshader |
- canvas->drawBitmapRect(bm, r, nullptr); |
+ canvas->drawImageRect(image, r, nullptr); |
canvas->drawRect(r, paint); |
} |
@@ -79,31 +77,28 @@ protected: |
canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); |
colors[0] = SK_ColorRED; |
colors[1] = SK_ColorGREEN; |
- show_bm(canvas, small, small, colors); |
+ show_image(canvas, small, small, colors); |
canvas->translate(0, SkIntToScalar(150)); |
colors[0] = SK_ColorBLUE; |
colors[1] = SK_ColorMAGENTA; |
- show_bm(canvas, big, small, colors); |
+ show_image(canvas, big, small, colors); |
canvas->translate(0, SkIntToScalar(150)); |
colors[0] = SK_ColorMAGENTA; |
colors[1] = SK_ColorYELLOW; |
- show_bm(canvas, medium, medium, colors); |
+ show_image(canvas, medium, medium, colors); |
canvas->translate(0, SkIntToScalar(150)); |
colors[0] = SK_ColorGREEN; |
colors[1] = SK_ColorYELLOW; |
// as of this writing, the raster code will fail to draw the scaled version |
// since it has a 64K limit on x,y coordinates... (but gpu should succeed) |
- show_bm(canvas, veryBig, small, colors); |
+ show_image(canvas, veryBig, small, colors); |
} |
private: |
typedef skiagm::GM INHERITED; |
}; |
+DEF_GM( return new VeryLargeBitmapGM; ) |
-////////////////////////////////////////////////////////////////////////////// |
- |
-static skiagm::GM* MyFactory(void*) { return new VeryLargeBitmapGM; } |
-static skiagm::GMRegistry reg(MyFactory); |