add SkCanvas::NewRaster factory -- a very common use-case in chrome
BUG=skia:
R=scroggo@google.com
Author: reed@google.com
Review URL: https://codereview.chromium.org/183533004
git-svn-id: http://skia.googlecode.com/svn/trunk@13617 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index a67891e..bc14974 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -2314,3 +2314,43 @@
///////////////////////////////////////////////////////////////////////////////
SkCanvas::ClipVisitor::~ClipVisitor() { }
+
+///////////////////////////////////////////////////////////////////////////////
+
+static bool supported_for_raster_canvas(const SkImageInfo& info) {
+ switch (info.alphaType()) {
+ case kPremul_SkAlphaType:
+ case kOpaque_SkAlphaType:
+ break;
+ default:
+ return false;
+ }
+
+ switch (info.colorType()) {
+ case kAlpha_8_SkColorType:
+ case kRGB_565_SkColorType:
+ case kPMColor_SkColorType:
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+}
+
+SkCanvas* SkCanvas::NewRaster(const SkImageInfo& info) {
+ if (!supported_for_raster_canvas(info)) {
+ return NULL;
+ }
+
+ SkBitmap bitmap;
+ if (!bitmap.allocPixels(info)) {
+ return NULL;
+ }
+
+ // should this functionality be moved into allocPixels()?
+ if (!bitmap.info().isOpaque()) {
+ bitmap.eraseColor(0);
+ }
+ return SkNEW_ARGS(SkCanvas, (bitmap));
+}