Index: gm/ninepatchstretch.cpp |
diff --git a/gm/ninepatchstretch.cpp b/gm/ninepatchstretch.cpp |
index 5031480aa5be21734becef5bc0b9d29850923573..267c41587b3aeb6b11ea9811618bce0a03c1fba5 100644 |
--- a/gm/ninepatchstretch.cpp |
+++ b/gm/ninepatchstretch.cpp |
@@ -6,15 +6,24 @@ |
*/ |
#include "gm.h" |
+#include "SkSurface.h" |
-static void make_bitmap(SkBitmap* bitmap, SkIRect* center) { |
+static SkSurface* make_surface(SkCanvas* root, int N) { |
+ SkImageInfo info = SkImageInfo::MakeN32Premul(N, N); |
+ SkSurface* surface = root->newSurface(info); |
+ if (!surface) { |
+ surface = SkSurface::NewRaster(info); |
+ } |
+ return surface; |
+} |
+ |
+static SkImage* make_image(SkCanvas* root, SkIRect* center) { |
const int kFixed = 28; |
const int kStretchy = 8; |
const int kSize = 2*kFixed + kStretchy; |
- bitmap->allocN32Pixels(kSize, kSize); |
- SkCanvas canvas(*bitmap); |
- canvas.clear(SK_ColorTRANSPARENT); |
+ SkAutoTUnref<SkSurface> surface(make_surface(root, kSize)); |
+ SkCanvas* canvas = surface->getCanvas(); |
SkRect r = SkRect::MakeWH(SkIntToScalar(kSize), SkIntToScalar(kSize)); |
const SkScalar strokeWidth = SkIntToScalar(6); |
@@ -26,39 +35,48 @@ static void make_bitmap(SkBitmap* bitmap, SkIRect* center) { |
paint.setAntiAlias(true); |
paint.setColor(0xFFFF0000); |
- canvas.drawRoundRect(r, radius, radius, paint); |
+ canvas->drawRoundRect(r, radius, radius, paint); |
r.setXYWH(SkIntToScalar(kFixed), 0, SkIntToScalar(kStretchy), SkIntToScalar(kSize)); |
paint.setColor(0x8800FF00); |
- canvas.drawRect(r, paint); |
+ canvas->drawRect(r, paint); |
r.setXYWH(0, SkIntToScalar(kFixed), SkIntToScalar(kSize), SkIntToScalar(kStretchy)); |
paint.setColor(0x880000FF); |
- canvas.drawRect(r, paint); |
+ canvas->drawRect(r, paint); |
+ |
+ return surface->newImageSnapshot(); |
} |
-namespace skiagm { |
+static void image_to_bitmap(const SkImage* image, SkBitmap* bm) { |
+ SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height()); |
+ bm->allocPixels(info); |
+ image->readPixels(info, bm->getPixels(), bm->rowBytes(), 0, 0); |
+} |
-class NinePatchStretchGM : public GM { |
+class NinePatchStretchGM : public skiagm::GM { |
public: |
- SkBitmap fBM; |
+ SkAutoTUnref<SkImage> fImage; |
+ SkBitmap fBitmap; |
+ SkIRect fCenter; |
NinePatchStretchGM() {} |
protected: |
- virtual SkString onShortName() { |
+ SkString onShortName() override { |
return SkString("ninepatch-stretch"); |
} |
- virtual SkISize onISize() { |
- return SkISize::Make(400, 400); |
+ SkISize onISize() override { |
+ return SkISize::Make(760, 400); |
} |
- virtual void onDraw(SkCanvas* canvas) { |
- SkBitmap bm; |
- SkIRect center; |
- make_bitmap(&bm, ¢er); |
+ void onDraw(SkCanvas* canvas) override { |
+ if (NULL == fBitmap.pixelRef()) { |
+ fImage.reset(make_image(canvas, &fCenter)); |
+ image_to_bitmap(fImage, &fBitmap); |
+ } |
// amount of bm that should not be stretched (unless we have to) |
- const SkScalar fixed = SkIntToScalar(bm.width() - center.width()); |
+ const SkScalar fixed = SkIntToScalar(fBitmap.width() - fCenter.width()); |
const SkTSize<SkScalar> size[] = { |
{ fixed * 4 / 5, fixed * 4 / 5 }, // shrink in both axes |
@@ -67,7 +85,7 @@ protected: |
{ fixed * 4, fixed * 4 } |
}; |
- canvas->drawBitmap(bm, SkIntToScalar(10), SkIntToScalar(10), NULL); |
+ canvas->drawBitmap(fBitmap, 10, 10, NULL); |
SkScalar x = SkIntToScalar(100); |
SkScalar y = SkIntToScalar(100); |
@@ -80,18 +98,15 @@ protected: |
int i = ix * 2 + iy; |
SkRect r = SkRect::MakeXYWH(x + ix * fixed, y + iy * fixed, |
size[i].width(), size[i].height()); |
- canvas->drawBitmapNine(bm, center, r, &paint); |
+ canvas->drawBitmapNine(fBitmap, fCenter, r, &paint); |
+ canvas->drawImageNine(fImage, fCenter, r.makeOffset(360, 0), &paint); |
+ |
} |
} |
} |
private: |
- typedef GM INHERITED; |
+ typedef skiagm::GM INHERITED; |
}; |
+DEF_GM( return new NinePatchStretchGM; ) |
-////////////////////////////////////////////////////////////////////////////// |
- |
-static GM* MyFactory(void*) { return new NinePatchStretchGM; } |
-static GMRegistry reg(MyFactory); |
- |
-} |