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
This commit is contained in:
reed 2016-08-01 11:12:58 -07:00 committed by Commit bot
parent 9b03e7b29d
commit 2dad769dc9
3 changed files with 39 additions and 5 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -17,6 +17,7 @@
#include "SkImageEncoder.h"
#include "SkImageGenerator.h"
#include "SkImage_Base.h"
#include "SkImagePriv.h"
#include "SkPicture.h"
#include "SkPictureRecorder.h"
#include "SkPixelSerializer.h"
@ -194,6 +195,36 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageEncode_Gpu, reporter, ctxInfo) {
}
#endif
DEF_TEST(Image_MakeFromRasterBitmap, reporter) {
const struct {
ForceCopyMode fMode;
bool fExpectSameAsMutable;
bool fExpectSameAsImmutable;
} recs[] = {
{ kNo_ForceCopyMode, false, true },
{ kYes_ForceCopyMode, false, false },
{ kNever_ForceCopyMode, true, true },
};
for (auto rec : recs) {
SkPixmap pm;
SkBitmap bm;
bm.allocN32Pixels(100, 100);
auto img = SkMakeImageFromRasterBitmap(bm, rec.fMode);
REPORTER_ASSERT(reporter, img->peekPixels(&pm));
const bool sameMutable = pm.addr32(0, 0) == bm.getAddr32(0, 0);
REPORTER_ASSERT(reporter, rec.fExpectSameAsMutable == sameMutable);
bm.notifyPixelsChanged(); // force a new generation ID
bm.setImmutable();
img = SkMakeImageFromRasterBitmap(bm, rec.fMode);
REPORTER_ASSERT(reporter, img->peekPixels(&pm));
const bool sameImmutable = pm.addr32(0, 0) == bm.getAddr32(0, 0);
REPORTER_ASSERT(reporter, rec.fExpectSameAsImmutable == sameImmutable);
}
}
namespace {
const char* kSerializedData = "serialized";