diff options
author | 2016-08-01 11:12:58 -0700 | |
---|---|---|
committer | 2016-08-01 11:12:58 -0700 | |
commit | 2dad769dc9e6a2974c4a7de1ffa945706274fab8 (patch) | |
tree | d6b585cff5e6c61b5a50a2a1ef67994d30698ccc /src/image | |
parent | 9b03e7b29d963ea333a66dc5353e94f6391eb899 (diff) |
make an image from a mutable bitmap
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2199813002
Review-Url: https://codereview.chromium.org/2199813002
Diffstat (limited to 'src/image')
-rw-r--r-- | src/image/SkImagePriv.h | 3 | ||||
-rw-r--r-- | src/image/SkImage_Raster.cpp | 10 |
2 files changed, 8 insertions, 5 deletions
diff --git a/src/image/SkImagePriv.h b/src/image/SkImagePriv.h index a625472eaa..9cdcbb6f93 100644 --- a/src/image/SkImagePriv.h +++ b/src/image/SkImagePriv.h @@ -36,7 +36,8 @@ extern sk_sp<SkImage> SkMakeImageFromPixelRef(const SkImageInfo&, SkPixelRef*, */ enum ForceCopyMode { kNo_ForceCopyMode, - kYes_ForceCopyMode, // must copy the pixels even if the bitmap is immutable + kYes_ForceCopyMode, // must copy the pixels even if the bitmap is immutable + kNever_ForceCopyMode, // don't ever copy, even if the bitmap is mutable }; extern sk_sp<SkImage> SkMakeImageFromRasterBitmap(const SkBitmap&, ForceCopyMode = kNo_ForceCopyMode); diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index a8ef21d1da..df82c3f302 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -94,7 +94,7 @@ public: bool isOpaque() const override; bool onAsLegacyBitmap(SkBitmap*, LegacyBitmapMode) const override; - SkImage_Raster(const SkBitmap& bm) + SkImage_Raster(const SkBitmap& bm, bool bitmapMayBeMutable = false) : INHERITED(bm.width(), bm.height(), is_not_subset(bm) ? bm.getGenerationID() : (uint32_t)kNeedNewImageUniqueID) @@ -105,7 +105,7 @@ public: // like a lazy decode or imagegenerator. PreLocked means it is flat pixels already. fBitmap.lockPixels(); } - SkASSERT(fBitmap.isImmutable()); + SkASSERT(bitmapMayBeMutable || fBitmap.isImmutable()); } bool onIsLazyGenerated() const override { @@ -264,7 +264,9 @@ sk_sp<SkImage> SkMakeImageFromRasterBitmap(const SkBitmap& bm, ForceCopyMode for } sk_sp<SkImage> image; - if (kYes_ForceCopyMode == forceCopy || !bm.isImmutable()) { + if (kYes_ForceCopyMode == forceCopy || + (!bm.isImmutable() && kNever_ForceCopyMode != forceCopy)) + { SkBitmap tmp(bm); tmp.lockPixels(); SkPixmap pmap; @@ -272,7 +274,7 @@ sk_sp<SkImage> SkMakeImageFromRasterBitmap(const SkBitmap& bm, ForceCopyMode for image = SkImage::MakeRasterCopy(pmap); } } else { - image = sk_make_sp<SkImage_Raster>(bm); + image = sk_make_sp<SkImage_Raster>(bm, kNever_ForceCopyMode == forceCopy); } return image; } |