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:
parent
9b03e7b29d
commit
2dad769dc9
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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";
|
||||
|
Loading…
Reference in New Issue
Block a user