aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image/SkImage_Raster.cpp
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-06-20 09:35:51 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-20 14:03:01 +0000
commite53120754b358e950ff417d864f80004697b5a91 (patch)
tree5da230f1cc3b404bb9aea0098095d6d0e7924595 /src/image/SkImage_Raster.cpp
parent151b6ff29593093e409f7f4f24129a6f7fde2467 (diff)
Add SkCopyPixelsMode argument to SkMakeImageInColorSpace
Deferred rendering in Android will need the ability to use this in kIfMutable mode. Bug: skia: Change-Id: I5194f2c50f9d17351fdab49373ca9bc1e80cf586 Reviewed-on: https://skia-review.googlesource.com/20157 Commit-Queue: Brian Osman <brianosman@google.com> Reviewed-by: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src/image/SkImage_Raster.cpp')
-rw-r--r--src/image/SkImage_Raster.cpp41
1 files changed, 27 insertions, 14 deletions
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp
index fcdfce2371..fc2e030ec8 100644
--- a/src/image/SkImage_Raster.cpp
+++ b/src/image/SkImage_Raster.cpp
@@ -78,7 +78,8 @@ public:
return true;
}
- SkImage_Raster(const SkImageInfo&, sk_sp<SkData>, size_t rb, SkColorTable*);
+ SkImage_Raster(const SkImageInfo&, sk_sp<SkData>, size_t rb, SkColorTable*,
+ uint32_t id = kNeedNewImageUniqueID);
~SkImage_Raster() override;
SkImageInfo onImageInfo() const override {
@@ -145,8 +146,8 @@ static void release_data(void* addr, void* context) {
}
SkImage_Raster::SkImage_Raster(const Info& info, sk_sp<SkData> data, size_t rowBytes,
- SkColorTable* ctable)
- : INHERITED(info.width(), info.height(), kNeedNewImageUniqueID)
+ SkColorTable* ctable, uint32_t id)
+ : INHERITED(info.width(), info.height(), id)
{
void* addr = const_cast<void*>(data->data());
@@ -261,18 +262,22 @@ sk_sp<SkImage> SkImage_Raster::onMakeSubset(const SkIRect& subset) const {
///////////////////////////////////////////////////////////////////////////////
-sk_sp<SkImage> SkImage::MakeRasterCopy(const SkPixmap& pmap) {
+sk_sp<SkImage> MakeRasterCopyPriv(const SkPixmap& pmap, uint32_t id) {
size_t size;
if (!SkImage_Raster::ValidArgs(pmap.info(), pmap.rowBytes(),
- pmap.ctable() != nullptr, &size) || !pmap.addr()) {
+ pmap.ctable() != nullptr, &size) || !pmap.addr()) {
return nullptr;
}
// Here we actually make a copy of the caller's pixel data
sk_sp<SkData> data(SkData::MakeWithCopy(pmap.addr(), size));
- return sk_make_sp<SkImage_Raster>(pmap.info(), std::move(data), pmap.rowBytes(), pmap.ctable());
+ return sk_make_sp<SkImage_Raster>(pmap.info(), std::move(data), pmap.rowBytes(), pmap.ctable(),
+ id);
}
+sk_sp<SkImage> SkImage::MakeRasterCopy(const SkPixmap& pmap) {
+ return MakeRasterCopyPriv(pmap, kNeedNewImageUniqueID);
+}
sk_sp<SkImage> SkImage::MakeRasterData(const SkImageInfo& info, sk_sp<SkData> data,
size_t rowBytes) {
@@ -303,11 +308,12 @@ sk_sp<SkImage> SkImage::MakeFromRaster(const SkPixmap& pmap, RasterReleaseProc p
return sk_make_sp<SkImage_Raster>(pmap.info(), std::move(data), pmap.rowBytes(), pmap.ctable());
}
-sk_sp<SkImage> SkMakeImageFromRasterBitmapPriv(const SkBitmap& bm, SkCopyPixelsMode cpm) {
+sk_sp<SkImage> SkMakeImageFromRasterBitmapPriv(const SkBitmap& bm, SkCopyPixelsMode cpm,
+ uint32_t idForCopy) {
if (kAlways_SkCopyPixelsMode == cpm || (!bm.isImmutable() && kNever_SkCopyPixelsMode != cpm)) {
SkPixmap pmap;
if (bm.peekPixels(&pmap)) {
- return SkImage::MakeRasterCopy(pmap);
+ return MakeRasterCopyPriv(pmap, idForCopy);
} else {
return sk_sp<SkImage>();
}
@@ -321,10 +327,11 @@ sk_sp<SkImage> SkMakeImageFromRasterBitmap(const SkBitmap& bm, SkCopyPixelsMode
return nullptr;
}
- return SkMakeImageFromRasterBitmapPriv(bm, cpm);
+ return SkMakeImageFromRasterBitmapPriv(bm, cpm, kNeedNewImageUniqueID);
}
-sk_sp<SkImage> SkMakeImageInColorSpace(const SkBitmap& bm, sk_sp<SkColorSpace> dstCS, uint32_t id) {
+sk_sp<SkImage> SkMakeImageInColorSpace(const SkBitmap& bm, sk_sp<SkColorSpace> dstCS, uint32_t id,
+ SkCopyPixelsMode cpm) {
if (!SkImageInfoIsValidAllowNumericalCS(bm.info()) || !bm.getPixels() ||
bm.rowBytes() < bm.info().minRowBytes() || !dstCS) {
return nullptr;
@@ -336,14 +343,20 @@ sk_sp<SkImage> SkMakeImageInColorSpace(const SkBitmap& bm, sk_sp<SkColorSpace> d
srcCS = SkColorSpace::MakeSRGB();
}
+ sk_sp<SkImage> image = nullptr;
+
// For the Android use case, this is very likely to be true.
if (SkColorSpace::Equals(srcCS.get(), dstCS.get())) {
- SkASSERT(0 == id || bm.getGenerationID() == id);
- return SkMakeImageFromRasterBitmapPriv(bm, kNever_SkCopyPixelsMode);
+ SkASSERT(kNeedNewImageUniqueID == id || bm.getGenerationID() == id);
+ image = SkMakeImageFromRasterBitmapPriv(bm, cpm, id);
+ } else {
+ image = SkImage::MakeFromGenerator(SkColorSpaceXformImageGenerator::Make(bm, dstCS, cpm,
+ id));
}
- return SkImage::MakeFromGenerator(SkColorSpaceXformImageGenerator::Make(
- bm, dstCS, kNever_SkCopyPixelsMode, id));
+ // If the caller suplied an id, we must propagate that to the image we return
+ SkASSERT(kNeedNewImageUniqueID == id || image->uniqueID() == id);
+ return image;
}
const SkPixelRef* SkBitmapImageGetPixelRef(const SkImage* image) {