diff options
author | halcanary <halcanary@google.com> | 2016-03-24 09:18:14 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-24 09:18:14 -0700 |
commit | 8d3ad5a1223551927a34f72b35f9dbf5c1f5bc93 (patch) | |
tree | efe547f16b283246cf15ca940620e876836755fb | |
parent | d98120e44703814c29fc76c732a2db8faae9774b (diff) |
images with offset bitmap don't share genid
BUG=skia:5096
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1813793002
Review URL: https://codereview.chromium.org/1813793002
-rw-r--r-- | src/image/SkImage_Raster.cpp | 12 | ||||
-rw-r--r-- | tests/image-bitmap.cpp | 34 |
2 files changed, 45 insertions, 1 deletions
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index 83daab7c44..892183a7c7 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -20,6 +20,14 @@ #include "SkGrPriv.h" #endif +// fixes https://bug.skia.org/5096 +static bool is_not_subset(const SkBitmap& bm) { + SkASSERT(bm.pixelRef()); + SkISize dim = bm.pixelRef()->info().dimensions(); + SkASSERT(dim != bm.dimensions() || bm.pixelRefOrigin().isZero()); + return dim == bm.dimensions(); +} + class SkImage_Raster : public SkImage_Base { public: static bool ValidArgs(const Info& info, size_t rowBytes, bool hasColorTable, @@ -82,7 +90,9 @@ public: bool onAsLegacyBitmap(SkBitmap*, LegacyBitmapMode) const override; SkImage_Raster(const SkBitmap& bm) - : INHERITED(bm.width(), bm.height(), bm.getGenerationID()) + : INHERITED(bm.width(), bm.height(), + is_not_subset(bm) ? bm.getGenerationID() + : (uint32_t)kNeedNewImageUniqueID) , fBitmap(bm) { if (bm.pixelRef()->isPreLocked()) { diff --git a/tests/image-bitmap.cpp b/tests/image-bitmap.cpp new file mode 100644 index 0000000000..59ab3f72be --- /dev/null +++ b/tests/image-bitmap.cpp @@ -0,0 +1,34 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "Test.h" + +#include "SkBitmap.h" +#include "SkImage.h" + +// https://bug.skia.org/5096 +// Test that when we make an image from a subset of a bitmap, that it +// has a diff (ID, dimensions) from an image made from the entire +// bitmap or a different subset of the image. +DEF_TEST(ImageBitmapIdentity, r) { + SkBitmap bm, a, b; + bm.allocN32Pixels(32, 64); + bm.eraseColor(SK_ColorBLACK); + bm.setImmutable(); + (void)bm.extractSubset(&a, SkIRect::MakeXYWH(0, 0, 32, 32)); + (void)bm.extractSubset(&b, SkIRect::MakeXYWH(0, 32, 32, 32)); + REPORTER_ASSERT(r, a.getGenerationID() == b.getGenerationID()); + auto img = SkImage::MakeFromBitmap(bm); + auto imgA = SkImage::MakeFromBitmap(a); + auto imgB = SkImage::MakeFromBitmap(b); + REPORTER_ASSERT(r, img->uniqueID() == bm.getGenerationID()); + REPORTER_ASSERT(r, img->uniqueID() != imgA->uniqueID()); + REPORTER_ASSERT(r, img->uniqueID() != imgB->uniqueID()); + REPORTER_ASSERT(r, imgA->uniqueID() != imgB->uniqueID()); + REPORTER_ASSERT(r, imgA->uniqueID() != a.getGenerationID()); + REPORTER_ASSERT(r, imgB->uniqueID() != b.getGenerationID()); +} |