aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-08-01 11:12:58 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-01 11:12:58 -0700
commit2dad769dc9e6a2974c4a7de1ffa945706274fab8 (patch)
treed6b585cff5e6c61b5a50a2a1ef67994d30698ccc /src/image
parent9b03e7b29d963ea333a66dc5353e94f6391eb899 (diff)
make an image from a mutable bitmap
Diffstat (limited to 'src/image')
-rw-r--r--src/image/SkImagePriv.h3
-rw-r--r--src/image/SkImage_Raster.cpp10
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;
}