aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gn/android_framework_defines.gni1
-rw-r--r--include/core/SkMallocPixelRef.h2
-rw-r--r--include/core/SkPixelRef.h59
-rw-r--r--public.bzl2
-rw-r--r--src/core/SkBitmap.cpp32
-rw-r--r--src/core/SkMallocPixelRef.cpp6
-rw-r--r--src/core/SkPixelRef.cpp55
-rw-r--r--src/core/SkSpecialSurface.cpp11
-rw-r--r--src/image/SkImage_Raster.cpp2
-rw-r--r--src/image/SkSurface_Raster.cpp11
-rw-r--r--src/pdf/SkPDFDevice.cpp4
11 files changed, 80 insertions, 105 deletions
diff --git a/gn/android_framework_defines.gni b/gn/android_framework_defines.gni
index bc49f4be45..67c6a2d5e2 100644
--- a/gn/android_framework_defines.gni
+++ b/gn/android_framework_defines.gni
@@ -9,7 +9,6 @@ android_framework_defines = [
"SK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS",
"SK_SUPPORT_LEGACY_GRADIENT_DITHERING",
"SK_SUPPORT_LEGACY_DRAWFILTER",
- "SK_SUPPORT_LEGACY_PIXELREF_API",
"SK_IGNORE_GPU_DITHER",
"SK_SUPPORT_LEGACY_SHADER_ISABITMAP",
"SK_SUPPORT_LEGACY_EMBOSSMASKFILTER",
diff --git a/include/core/SkMallocPixelRef.h b/include/core/SkMallocPixelRef.h
index e6d9727952..45ab6547f4 100644
--- a/include/core/SkMallocPixelRef.h
+++ b/include/core/SkMallocPixelRef.h
@@ -78,6 +78,8 @@ public:
protected:
~SkMallocPixelRef() override;
+ size_t getAllocatedSizeInBytes() const override;
+
private:
// Uses alloc to implement NewAllocate or NewZeroed.
static sk_sp<SkPixelRef> MakeUsing(void*(*alloc)(size_t),
diff --git a/include/core/SkPixelRef.h b/include/core/SkPixelRef.h
index 535c6e10e0..6a86e59a86 100644
--- a/include/core/SkPixelRef.h
+++ b/include/core/SkPixelRef.h
@@ -32,42 +32,13 @@ class SkDiscardableMemory;
*/
class SK_API SkPixelRef : public SkRefCnt {
public:
-#ifdef SK_SUPPORT_LEGACY_PIXELREF_API
SkPixelRef(const SkImageInfo&, void* addr, size_t rowBytes, sk_sp<SkColorTable> = nullptr);
+ ~SkPixelRef() override;
const SkImageInfo& info() const {
return fInfo;
}
-#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
- // This is undefined if there are clients in-flight trying to use us
- void android_only_reset(const SkImageInfo&, size_t rowBytes, sk_sp<SkColorTable>);
-#endif
-
- /**
- * Change the info's AlphaType. Note that this does not automatically
- * invalidate the generation ID. If the pixel values themselves have
- * changed, then you must explicitly call notifyPixelsChanged() as well.
- */
- void changeAlphaType(SkAlphaType at);
-
- /**
- * Returns the size (in bytes) of the internally allocated memory.
- * This should be implemented in all serializable SkPixelRef derived classes.
- * SkBitmap::fPixelRefOffset + SkBitmap::getSafeSize() should never overflow this value,
- * otherwise the rendering code may attempt to read memory out of bounds.
- *
- * @return default impl returns 0.
- */
- virtual size_t getAllocatedSizeInBytes() const { return 0; }
-
-#endif
- SkPixelRef(int width, int height, void* addr, size_t rowBytes, sk_sp<SkColorTable> = nullptr);
-
- ~SkPixelRef() override;
-
- int width() const { return fInfo.width(); }
- int height() const { return fInfo.height(); }
void* pixels() const { return fPixels; }
SkColorTable* colorTable() const { return fCTable.get(); }
size_t rowBytes() const { return fRowBytes; }
@@ -97,6 +68,13 @@ public:
*/
void notifyPixelsChanged();
+ /**
+ * Change the info's AlphaType. Note that this does not automatically
+ * invalidate the generation ID. If the pixel values themselves have
+ * changed, then you must explicitly call notifyPixelsChanged() as well.
+ */
+ void changeAlphaType(SkAlphaType at);
+
/** Returns true if this pixelref is marked as immutable, meaning that the
contents of its pixels will not change for the lifetime of the pixelref.
*/
@@ -136,18 +114,27 @@ protected:
// default impl does nothing.
virtual void onNotifyPixelsChanged();
+ /**
+ * Returns the size (in bytes) of the internally allocated memory.
+ * This should be implemented in all serializable SkPixelRef derived classes.
+ * SkBitmap::fPixelRefOffset + SkBitmap::getSafeSize() should never overflow this value,
+ * otherwise the rendering code may attempt to read memory out of bounds.
+ *
+ * @return default impl returns 0.
+ */
+ virtual size_t getAllocatedSizeInBytes() const;
+
#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
// This is undefined if there are clients in-flight trying to use us
- void android_only_reset(int width, int height, size_t rowBytes, sk_sp<SkColorTable>);
+ void android_only_reset(const SkImageInfo&, size_t rowBytes, sk_sp<SkColorTable>);
#endif
private:
- // TODO (msarett): After we remove legacy APIs, we should replace |fInfo| with just a width
- // and height.
- const SkImageInfo fInfo;
+ // mostly const. fInfo.fAlpahType can be changed at runtime.
+ const SkImageInfo fInfo;
sk_sp<SkColorTable> fCTable;
- void* fPixels;
- size_t fRowBytes;
+ void* fPixels;
+ size_t fRowBytes;
// Bottom bit indicates the Gen ID is unique.
bool genIDIsUnique() const { return SkToBool(fTaggedGenID.load() & 1); }
diff --git a/public.bzl b/public.bzl
index f0ac995dfa..9c41cdb2d5 100644
--- a/public.bzl
+++ b/public.bzl
@@ -655,10 +655,8 @@ DEFINES_ALL = [
# Turn on a few Google3-specific build fixes.
"GOOGLE3",
# Staging flags for API changes
- "SK_SUPPORT_LEGACY_PIXELREF_API",
# Temporarily Disable analytic AA for Google3
"SK_NO_ANALYTIC_AA",
-
]
################################################################################
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
index 8bd268476e..1ba2968466 100644
--- a/src/core/SkBitmap.cpp
+++ b/src/core/SkBitmap.cpp
@@ -171,6 +171,9 @@ bool SkBitmap::setAlphaType(SkAlphaType newAlphaType) {
}
if (fInfo.alphaType() != newAlphaType) {
fInfo = fInfo.makeAlphaType(newAlphaType);
+ if (fPixelRef) {
+ fPixelRef->changeAlphaType(newAlphaType);
+ }
}
SkDEBUGCODE(this->validate();)
return true;
@@ -195,15 +198,32 @@ void SkBitmap::setPixelRef(sk_sp<SkPixelRef> pr, int dx, int dy) {
#ifdef SK_DEBUG
if (pr) {
if (kUnknown_SkColorType != fInfo.colorType()) {
- SkASSERT(fInfo.width() <= pr->width());
- SkASSERT(fInfo.height() <= pr->height());
+ const SkImageInfo& prInfo = pr->info();
+ SkASSERT(fInfo.width() <= prInfo.width());
+ SkASSERT(fInfo.height() <= prInfo.height());
+ SkASSERT(fInfo.colorType() == prInfo.colorType());
+ switch (prInfo.alphaType()) {
+ case kUnknown_SkAlphaType:
+ SkASSERT(fInfo.alphaType() == kUnknown_SkAlphaType);
+ break;
+ case kOpaque_SkAlphaType:
+ case kPremul_SkAlphaType:
+ SkASSERT(fInfo.alphaType() == kOpaque_SkAlphaType ||
+ fInfo.alphaType() == kPremul_SkAlphaType);
+ break;
+ case kUnpremul_SkAlphaType:
+ SkASSERT(fInfo.alphaType() == kOpaque_SkAlphaType ||
+ fInfo.alphaType() == kUnpremul_SkAlphaType);
+ break;
+ }
}
}
#endif
fPixelRef = std::move(pr);
if (fPixelRef) {
- fPixelRefOrigin.set(SkTPin(dx, 0, fPixelRef->width()), SkTPin(dy, 0, fPixelRef->height()));
+ const SkImageInfo& info = fPixelRef->info();
+ fPixelRefOrigin.set(SkTPin(dx, 0, info.width()), SkTPin(dy, 0, info.height()));
this->updatePixelsFromRef();
} else {
// ignore dx,dy if there is no pixelref
@@ -823,7 +843,7 @@ bool SkBitmap::ReadRawPixels(SkReadBuffer* buffer, SkBitmap* bitmap) {
if (!pr) {
return false;
}
- bitmap->setInfo(info);
+ bitmap->setInfo(pr->info());
bitmap->setPixelRef(std::move(pr), 0, 0);
return true;
}
@@ -863,8 +883,8 @@ void SkBitmap::validate() const {
SkASSERT(fPixelRef->rowBytes() == fRowBytes);
SkASSERT(fPixelRefOrigin.fX >= 0);
SkASSERT(fPixelRefOrigin.fY >= 0);
- SkASSERT(fPixelRef->width() >= (int)this->width() + fPixelRefOrigin.fX);
- SkASSERT(fPixelRef->height() >= (int)this->height() + fPixelRefOrigin.fY);
+ SkASSERT(fPixelRef->info().width() >= (int)this->width() + fPixelRefOrigin.fX);
+ SkASSERT(fPixelRef->info().height() >= (int)this->height() + fPixelRefOrigin.fY);
SkASSERT(fPixelRef->rowBytes() >= fInfo.minRowBytes());
}
}
diff --git a/src/core/SkMallocPixelRef.cpp b/src/core/SkMallocPixelRef.cpp
index cf4fac7929..cdc555b748 100644
--- a/src/core/SkMallocPixelRef.cpp
+++ b/src/core/SkMallocPixelRef.cpp
@@ -156,7 +156,7 @@ SkMallocPixelRef::SkMallocPixelRef(const SkImageInfo& info, void* storage,
size_t rowBytes, sk_sp<SkColorTable> ctable,
SkMallocPixelRef::ReleaseProc proc,
void* context)
- : INHERITED(info.width(), info.height(), storage, rowBytes, sanitize(info, std::move(ctable)))
+ : INHERITED(info, storage, rowBytes, sanitize(info, std::move(ctable)))
, fReleaseProc(proc)
, fReleaseProcContext(context)
{}
@@ -167,3 +167,7 @@ SkMallocPixelRef::~SkMallocPixelRef() {
fReleaseProc(this->pixels(), fReleaseProcContext);
}
}
+
+size_t SkMallocPixelRef::getAllocatedSizeInBytes() const {
+ return this->info().getSafeSize(this->rowBytes());
+}
diff --git a/src/core/SkPixelRef.cpp b/src/core/SkPixelRef.cpp
index 487779c67f..c6d59eab19 100644
--- a/src/core/SkPixelRef.cpp
+++ b/src/core/SkPixelRef.cpp
@@ -26,12 +26,6 @@ uint32_t SkNextID::ImageID() {
///////////////////////////////////////////////////////////////////////////////
-#ifdef SK_TRACE_PIXELREF_LIFETIME
- static int32_t gInstCounter;
-#endif
-
-#ifdef SK_SUPPORT_LEGACY_PIXELREF_API
-
static SkImageInfo validate_info(const SkImageInfo& info) {
SkAlphaType newAlphaType = info.alphaType();
SkAssertResult(SkColorTypeValidateAlphaType(info.colorType(), info.alphaType(), &newAlphaType));
@@ -49,6 +43,10 @@ static void validate_pixels_ctable(const SkImageInfo& info, const SkColorTable*
}
}
+#ifdef SK_TRACE_PIXELREF_LIFETIME
+ static int32_t gInstCounter;
+#endif
+
SkPixelRef::SkPixelRef(const SkImageInfo& info, void* pixels, size_t rowBytes,
sk_sp<SkColorTable> ctable)
: fInfo(validate_info(info))
@@ -70,27 +68,6 @@ SkPixelRef::SkPixelRef(const SkImageInfo& info, void* pixels, size_t rowBytes,
fAddedToCache.store(false);
}
-#endif
-
-SkPixelRef::SkPixelRef(int width, int height, void* pixels, size_t rowBytes,
- sk_sp<SkColorTable> ctable)
- : fInfo(SkImageInfo::MakeUnknown(width, height))
- , fCTable(std::move(ctable))
- , fPixels(pixels)
- , fRowBytes(rowBytes)
-#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
- , fStableID(SkNextID::ImageID())
-#endif
-{
-#ifdef SK_TRACE_PIXELREF_LIFETIME
- SkDebugf(" pixelref %d\n", sk_atomic_inc(&gInstCounter));
-#endif
-
- this->needsNewGenID();
- fMutability = kMutable;
- fAddedToCache.store(false);
-}
-
SkPixelRef::~SkPixelRef() {
#ifdef SK_TRACE_PIXELREF_LIFETIME
SkDebugf("~pixelref %d\n", sk_atomic_dec(&gInstCounter) - 1);
@@ -99,25 +76,12 @@ SkPixelRef::~SkPixelRef() {
}
#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
-
-#ifdef SK_SUPPORT_LEGACY_PIXELREF_API
// This is undefined if there are clients in-flight trying to use us
void SkPixelRef::android_only_reset(const SkImageInfo& info, size_t rowBytes,
sk_sp<SkColorTable> ctable) {
- *const_cast<SkImageInfo*>(&fInfo) = info;
- fRowBytes = rowBytes;
- fCTable = std::move(ctable);
- // note: we do not change fPixels
-
- // conservative, since its possible the "new" settings are the same as the old.
- this->notifyPixelsChanged();
-}
-#endif
+ validate_pixels_ctable(info, ctable.get());
-// This is undefined if there are clients in-flight trying to use us
-void SkPixelRef::android_only_reset(int width, int height, size_t rowBytes,
- sk_sp<SkColorTable> ctable) {
- *const_cast<SkImageInfo*>(&fInfo) = fInfo.makeWH(width, height);
+ *const_cast<SkImageInfo*>(&fInfo) = info;
fRowBytes = rowBytes;
fCTable = std::move(ctable);
// note: we do not change fPixels
@@ -125,7 +89,6 @@ void SkPixelRef::android_only_reset(int width, int height, size_t rowBytes,
// conservative, since its possible the "new" settings are the same as the old.
this->notifyPixelsChanged();
}
-
#endif
void SkPixelRef::needsNewGenID() {
@@ -186,11 +149,9 @@ void SkPixelRef::notifyPixelsChanged() {
this->onNotifyPixelsChanged();
}
-#ifdef SK_SUPPORT_LEGACY_PIXELREF_API
void SkPixelRef::changeAlphaType(SkAlphaType at) {
*const_cast<SkImageInfo*>(&fInfo) = fInfo.makeAlphaType(at);
}
-#endif
void SkPixelRef::setImmutable() {
fMutability = kImmutable;
@@ -218,3 +179,7 @@ void SkPixelRef::restoreMutability() {
}
void SkPixelRef::onNotifyPixelsChanged() { }
+
+size_t SkPixelRef::getAllocatedSizeInBytes() const {
+ return 0;
+}
diff --git a/src/core/SkSpecialSurface.cpp b/src/core/SkSpecialSurface.cpp
index 9564a14f48..33ef97e5bd 100644
--- a/src/core/SkSpecialSurface.cpp
+++ b/src/core/SkSpecialSurface.cpp
@@ -63,11 +63,12 @@ sk_sp<SkSpecialImage> SkSpecialSurface::makeImageSnapshot() {
class SkSpecialSurface_Raster : public SkSpecialSurface_Base {
public:
- SkSpecialSurface_Raster(const SkImageInfo& info,
- sk_sp<SkPixelRef> pr,
+ SkSpecialSurface_Raster(sk_sp<SkPixelRef> pr,
const SkIRect& subset,
const SkSurfaceProps* props)
: INHERITED(subset, props) {
+ const SkImageInfo& info = pr->info();
+
fBitmap.setInfo(info, info.minRowBytes());
fBitmap.setPixelRef(std::move(pr), 0, 0);
@@ -92,7 +93,7 @@ private:
sk_sp<SkSpecialSurface> SkSpecialSurface::MakeFromBitmap(const SkIRect& subset, SkBitmap& bm,
const SkSurfaceProps* props) {
- return sk_make_sp<SkSpecialSurface_Raster>(bm.info(), sk_ref_sp(bm.pixelRef()), subset, props);
+ return sk_make_sp<SkSpecialSurface_Raster>(sk_ref_sp(bm.pixelRef()), subset, props);
}
sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRaster(const SkImageInfo& info,
@@ -102,9 +103,9 @@ sk_sp<SkSpecialSurface> SkSpecialSurface::MakeRaster(const SkImageInfo& info,
return nullptr;
}
- const SkIRect subset = SkIRect::MakeWH(info.width(), info.height());
+ const SkIRect subset = SkIRect::MakeWH(pr->info().width(), pr->info().height());
- return sk_make_sp<SkSpecialSurface_Raster>(info, std::move(pr), subset, props);
+ return sk_make_sp<SkSpecialSurface_Raster>(std::move(pr), subset, props);
}
#if SK_SUPPORT_GPU
diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp
index 88847551d1..91de4c5b0b 100644
--- a/src/image/SkImage_Raster.cpp
+++ b/src/image/SkImage_Raster.cpp
@@ -28,7 +28,7 @@
// fixes https://bug.skia.org/5096
static bool is_not_subset(const SkBitmap& bm) {
SkASSERT(bm.pixelRef());
- SkISize dim = SkISize::Make(bm.pixelRef()->width(), bm.pixelRef()->height());
+ SkISize dim = bm.pixelRef()->info().dimensions();
SkASSERT(dim != bm.dimensions() || bm.pixelRefOrigin().isZero());
return dim == bm.dimensions();
}
diff --git a/src/image/SkSurface_Raster.cpp b/src/image/SkSurface_Raster.cpp
index c4796c402f..2de1ed70d3 100644
--- a/src/image/SkSurface_Raster.cpp
+++ b/src/image/SkSurface_Raster.cpp
@@ -20,7 +20,7 @@ public:
SkSurface_Raster(const SkImageInfo&, void*, size_t rb,
void (*releaseProc)(void* pixels, void* context), void* context,
const SkSurfaceProps*);
- SkSurface_Raster(const SkImageInfo& info, sk_sp<SkPixelRef>, const SkSurfaceProps*);
+ SkSurface_Raster(sk_sp<SkPixelRef>, const SkSurfaceProps*);
SkCanvas* onNewCanvas() override;
sk_sp<SkSurface> onNewSurface(const SkImageInfo&) override;
@@ -108,10 +108,11 @@ SkSurface_Raster::SkSurface_Raster(const SkImageInfo& info, void* pixels, size_t
fWeOwnThePixels = false; // We are "Direct"
}
-SkSurface_Raster::SkSurface_Raster(const SkImageInfo& info, sk_sp<SkPixelRef> pr,
- const SkSurfaceProps* props)
- : INHERITED(pr->width(), pr->height(), props)
+SkSurface_Raster::SkSurface_Raster(sk_sp<SkPixelRef> pr, const SkSurfaceProps* props)
+ : INHERITED(pr->info().width(), pr->info().height(), props)
{
+ const SkImageInfo& info = pr->info();
+
fBitmap.setInfo(info, pr->rowBytes());
fRowBytes = pr->rowBytes(); // we track this, so that subsequent re-allocs will match
fBitmap.setPixelRef(std::move(pr), 0, 0);
@@ -214,5 +215,5 @@ sk_sp<SkSurface> SkSurface::MakeRaster(const SkImageInfo& info, size_t rowBytes,
if (rowBytes) {
SkASSERT(pr->rowBytes() == rowBytes);
}
- return sk_make_sp<SkSurface_Raster>(info, std::move(pr), props);
+ return sk_make_sp<SkSurface_Raster>(std::move(pr), props);
}
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index 768277a7b9..358ba1638f 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -106,9 +106,7 @@ static SkImageSubset make_image_subset(const SkBitmap& bitmap) {
SkIRect subset = bitmap.getSubset();
SkASSERT(bitmap.pixelRef());
SkBitmap tmp;
- SkImageInfo pixelRefInfo =
- bitmap.info().makeWH(bitmap.pixelRef()->width(), bitmap.pixelRef()->height());
- tmp.setInfo(pixelRefInfo, bitmap.rowBytes());
+ tmp.setInfo(bitmap.pixelRef()->info(), bitmap.rowBytes());
tmp.setPixelRef(sk_ref_sp(bitmap.pixelRef()), 0, 0);
auto img = SkImage::MakeFromBitmap(tmp);
if (img) {