Revert "Revert "Revert "guard old apis for querying byte-size of a bitmap/imageinfo/pixmap"""
This reverts commitcd284c5323
. Reason for revert: assert fired in SkMallocPixelRef.cpp:61: fatal error: "assert(info.computeByteSize(rowBytes) == info.getSafeSize(rowBytes))" google3 thinks it was from surface_rowbytes Original change's description: > Revert "Revert "guard old apis for querying byte-size of a bitmap/imageinfo/pixmap"" > > This reverts commit809cbedd4b
. > > Bug: skia: > Change-Id: I680d8daeeeeb15526b44c1305d8fb0c6bfa38e1d > Reviewed-on: https://skia-review.googlesource.com/52665 > Commit-Queue: Mike Reed <reed@google.com> > Reviewed-by: Florin Malita <fmalita@chromium.org> TBR=fmalita@chromium.org,reed@google.com Change-Id: I41e3f7a3f791cc8183291847e783ed8a53bc91d2 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: skia: Reviewed-on: https://skia-review.googlesource.com/53802 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com>
This commit is contained in:
parent
cd284c5323
commit
5a2e50edc5
@ -38,7 +38,7 @@ void AndroidCodecBench::onDelayedSetup() {
|
||||
fInfo = fInfo.makeAlphaType(kPremul_SkAlphaType);
|
||||
}
|
||||
|
||||
fPixelStorage.reset(fInfo.computeMinByteSize());
|
||||
fPixelStorage.reset(fInfo.getSafeSize(fInfo.minRowBytes()));
|
||||
}
|
||||
|
||||
void AndroidCodecBench::onDraw(int n, SkCanvas* canvas) {
|
||||
|
@ -43,7 +43,7 @@ void CodecBench::onDelayedSetup() {
|
||||
.makeAlphaType(fAlphaType)
|
||||
.makeColorSpace(nullptr);
|
||||
|
||||
fPixelStorage.reset(fInfo.computeMinByteSize());
|
||||
fPixelStorage.reset(fInfo.getSafeSize(fInfo.minRowBytes()));
|
||||
}
|
||||
|
||||
void CodecBench::onDraw(int n, SkCanvas* canvas) {
|
||||
|
@ -88,10 +88,10 @@ void ColorCodecBench::onDelayedSetup() {
|
||||
fDstSpace = static_cast<SkColorSpace_XYZ*>(fDstSpace.get())->makeLinearGamma();
|
||||
}
|
||||
|
||||
fDst.reset(fDstInfo.computeMinByteSize());
|
||||
fDst.reset(fDstInfo.getSafeSize(fDstInfo.minRowBytes()));
|
||||
|
||||
if (FLAGS_xform_only) {
|
||||
fSrc.reset(fSrcInfo.computeMinByteSize());
|
||||
fSrc.reset(fSrcInfo.getSafeSize(fSrcInfo.minRowBytes()));
|
||||
fSrcSpace = codec->getInfo().refColorSpace();
|
||||
codec->getPixels(fSrcInfo, fSrc.get(), fSrcInfo.minRowBytes());
|
||||
}
|
||||
|
@ -887,7 +887,7 @@ public:
|
||||
SkImageInfo info =
|
||||
codec->getInfo().makeColorType(colorType).makeAlphaType(alphaType);
|
||||
const size_t rowBytes = info.minRowBytes();
|
||||
SkAutoMalloc storage(info.computeByteSize(rowBytes));
|
||||
SkAutoMalloc storage(info.getSafeSize(rowBytes));
|
||||
|
||||
const SkCodec::Result result = codec->getPixels(
|
||||
info, storage.get(), rowBytes);
|
||||
|
@ -1128,9 +1128,9 @@ struct Task {
|
||||
SkBitmap swizzle;
|
||||
SkAssertResult(sk_tool_utils::copy_to(&swizzle, kRGBA_8888_SkColorType,
|
||||
bitmap));
|
||||
hash.write(swizzle.getPixels(), swizzle.computeByteSize());
|
||||
hash.write(swizzle.getPixels(), swizzle.getSize());
|
||||
} else {
|
||||
hash.write(bitmap.getPixels(), bitmap.computeByteSize());
|
||||
hash.write(bitmap.getPixels(), bitmap.getSize());
|
||||
}
|
||||
}
|
||||
SkMD5::Digest digest;
|
||||
|
@ -454,7 +454,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
||||
|
||||
const int bpp = SkColorTypeBytesPerPixel(decodeInfo.colorType());
|
||||
const size_t rowBytes = size.width() * bpp;
|
||||
const size_t safeSize = decodeInfo.computeByteSize(rowBytes);
|
||||
const size_t safeSize = decodeInfo.getSafeSize(rowBytes);
|
||||
SkAutoMalloc pixels(safeSize);
|
||||
|
||||
SkCodec::Options options;
|
||||
@ -1468,12 +1468,12 @@ static bool encode_png_base64(const SkBitmap& bitmap, SkString* dst) {
|
||||
|
||||
static Error compare_bitmaps(const SkBitmap& reference, const SkBitmap& bitmap) {
|
||||
// The dimensions are a property of the Src only, and so should be identical.
|
||||
SkASSERT(reference.computeByteSize() == bitmap.computeByteSize());
|
||||
if (reference.computeByteSize() != bitmap.computeByteSize()) {
|
||||
SkASSERT(reference.getSize() == bitmap.getSize());
|
||||
if (reference.getSize() != bitmap.getSize()) {
|
||||
return "Dimensions don't match reference";
|
||||
}
|
||||
// All SkBitmaps in DM are tight, so this comparison is easy.
|
||||
if (0 != memcmp(reference.getPixels(), bitmap.getPixels(), reference.computeByteSize())) {
|
||||
if (0 != memcmp(reference.getPixels(), bitmap.getPixels(), reference.getSize())) {
|
||||
SkString encoded;
|
||||
SkString errString("Pixels don't match reference");
|
||||
if (encode_png_base64(reference, &encoded)) {
|
||||
|
@ -5,5 +5,4 @@
|
||||
flutter_defines = [
|
||||
"SK_SUPPORT_LEGACY_IMAGE_ENCODE_API",
|
||||
"SK_SUPPORT_LEGACY_FONTMGR_API",
|
||||
"SK_SUPPORT_LEGACY_SAFESIZE64",
|
||||
]
|
||||
|
@ -147,7 +147,10 @@ public:
|
||||
*/
|
||||
size_t computeByteSize() const { return fInfo.computeByteSize(fRowBytes); }
|
||||
|
||||
#ifdef SK_SUPPORT_LEGACY_SAFESIZE64
|
||||
/** Return the byte size of the pixels, based on the height and rowBytes.
|
||||
Note this truncates the result to 32bits. Call getSize64() to detect
|
||||
if the real size exceeds 32bits.
|
||||
*/
|
||||
size_t getSize() const { return fInfo.height() * fRowBytes; }
|
||||
|
||||
/** Return the number of bytes from the pointer returned by getPixels()
|
||||
@ -171,7 +174,6 @@ public:
|
||||
int64_t computeSafeSize64() const {
|
||||
return fInfo.getSafeSize64(fRowBytes);
|
||||
}
|
||||
#endif
|
||||
|
||||
/** Returns true if this bitmap is marked as immutable, meaning that the
|
||||
contents of its pixels will not change for the lifetime of the bitmap.
|
||||
|
@ -300,7 +300,6 @@ public:
|
||||
void unflatten(SkReadBuffer&);
|
||||
void flatten(SkWriteBuffer&) const;
|
||||
|
||||
#ifdef SK_SUPPORT_LEGACY_SAFESIZE64
|
||||
int64_t getSafeSize64(size_t rowBytes) const {
|
||||
if (0 == fHeight) {
|
||||
return 0;
|
||||
@ -315,7 +314,6 @@ public:
|
||||
}
|
||||
return sk_64_asS32(size);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Returns the size (in bytes) of the image buffer that this info needs, given the specified
|
||||
@ -333,8 +331,8 @@ public:
|
||||
}
|
||||
|
||||
bool validRowBytes(size_t rowBytes) const {
|
||||
uint64_t minRB = sk_64_mul(fWidth, this->bytesPerPixel());
|
||||
return rowBytes >= minRB;
|
||||
uint64_t rb = sk_64_mul(fWidth, this->bytesPerPixel());
|
||||
return rowBytes >= rb;
|
||||
}
|
||||
|
||||
void reset() {
|
||||
|
@ -206,7 +206,6 @@ public:
|
||||
*/
|
||||
int shiftPerPixel() const { return fInfo.shiftPerPixel(); }
|
||||
|
||||
#ifdef SK_SUPPORT_LEGACY_SAFESIZE64
|
||||
/** Returns conservative memory required for pixel storage.
|
||||
Includes unused memory on last row when rowBytesAsPixels() exceeds width().
|
||||
|
||||
@ -229,7 +228,6 @@ public:
|
||||
@return exact pixel storage size if size fits in signed 32 bits
|
||||
*/
|
||||
size_t getSafeSize() const { return fInfo.getSafeSize(fRowBytes); }
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Returns the size (in bytes) of the pixmap's image buffer.
|
||||
|
@ -656,7 +656,6 @@ DEFINES_ALL = [
|
||||
# Required for building dm.
|
||||
"GR_TEST_UTILS",
|
||||
# Staging flags for API changes
|
||||
"SK_SUPPORT_LEGACY_SAFESIZE64",
|
||||
# Should remove after we update golden images
|
||||
"SK_WEBP_ENCODER_USE_DEFAULT_METHOD",
|
||||
# Experiment to diagnose image diffs in Google3
|
||||
|
@ -344,7 +344,7 @@ public:
|
||||
// We made/have an off-screen surface. Extract the pixels exactly as we rendered them:
|
||||
SkImageInfo info = win->info();
|
||||
size_t rowBytes = info.minRowBytes();
|
||||
size_t size = info.computeByteSize(rowBytes);
|
||||
size_t size = info.getSafeSize(rowBytes);
|
||||
auto data = SkData::MakeUninitialized(size);
|
||||
SkASSERT(data);
|
||||
|
||||
|
@ -96,7 +96,7 @@ bool SkBitmapRegionCodec::decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocat
|
||||
if (SubsetType::kPartiallyInside_SubsetType == type &&
|
||||
SkCodec::kNo_ZeroInitialized == zeroInit) {
|
||||
void* pixels = bitmap->getPixels();
|
||||
size_t bytes = outInfo.computeByteSize(bitmap->rowBytes());
|
||||
size_t bytes = outInfo.getSafeSize(bitmap->rowBytes());
|
||||
memset(pixels, 0, bytes);
|
||||
}
|
||||
|
||||
|
@ -173,7 +173,7 @@ std::unique_ptr<SkCodec> SkIcoCodec::MakeFromStream(std::unique_ptr<SkStream> st
|
||||
int maxIndex = 0;
|
||||
for (int i = 0; i < codecs->count(); i++) {
|
||||
SkImageInfo info = codecs->operator[](i)->getInfo();
|
||||
size_t size = info.computeMinByteSize();
|
||||
size_t size = info.getSafeSize(info.minRowBytes());
|
||||
|
||||
if (size > maxSize) {
|
||||
maxSize = size;
|
||||
|
@ -14,8 +14,8 @@ void SkSampler::Fill(const SkImageInfo& info, void* dst, size_t rowBytes,
|
||||
uint64_t colorOrIndex, SkCodec::ZeroInitialized zeroInit) {
|
||||
SkASSERT(dst != nullptr);
|
||||
|
||||
// Calculate bytes to fill.
|
||||
const size_t bytesToFill = info.computeByteSize(rowBytes);
|
||||
// Calculate bytes to fill. We use getSafeSize since the last row may not be padded.
|
||||
const size_t bytesToFill = info.getSafeSize(rowBytes);
|
||||
const int width = info.width();
|
||||
const int numRows = info.height();
|
||||
|
||||
|
@ -542,7 +542,7 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst,
|
||||
|
||||
config.output.u.RGBA.rgba = reinterpret_cast<uint8_t*>(webpDst.getAddr(dstX, dstY));
|
||||
config.output.u.RGBA.stride = static_cast<int>(webpDst.rowBytes());
|
||||
config.output.u.RGBA.size = webpDst.computeByteSize();
|
||||
config.output.u.RGBA.size = webpDst.getSafeSize();
|
||||
|
||||
SkAutoTCallVProc<WebPIDecoder, WebPIDelete> idec(WebPIDecode(nullptr, 0, &config));
|
||||
if (!idec) {
|
||||
|
@ -29,7 +29,7 @@ size_t SkAutoPixmapStorage::AllocSize(const SkImageInfo& info, size_t* rowBytes)
|
||||
if (rowBytes) {
|
||||
*rowBytes = rb;
|
||||
}
|
||||
return info.computeByteSize(rb);
|
||||
return info.getSafeSize(rb);
|
||||
}
|
||||
|
||||
bool SkAutoPixmapStorage::tryAlloc(const SkImageInfo& info) {
|
||||
@ -58,7 +58,7 @@ const SkData* SkAutoPixmapStorage::detachPixelsAsData() {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto data = SkData::MakeFromMalloc(fStorage, this->computeByteSize());
|
||||
auto data = SkData::MakeFromMalloc(fStorage, this->getSafeSize());
|
||||
fStorage = nullptr;
|
||||
this->INHERITED::reset();
|
||||
|
||||
|
@ -678,7 +678,7 @@ bool SkBitmap::ReadRawPixels(SkReadBuffer* buffer, SkBitmap* bitmap) {
|
||||
}
|
||||
|
||||
// write_raw_pixels() always writes snug buffers with rowBytes == minRowBytes().
|
||||
size_t bytes = info.computeMinByteSize();
|
||||
size_t bytes = info.getSafeSize(info.minRowBytes());
|
||||
if (!buffer->validate(bytes != 0)) {
|
||||
return false;
|
||||
}
|
||||
|
@ -160,7 +160,7 @@ public:
|
||||
|
||||
const Key& getKey() const override { return fKey; }
|
||||
size_t bytesUsed() const override {
|
||||
return sizeof(fKey) + fInfo.computeByteSize(fRowBytes);
|
||||
return sizeof(fKey) + fInfo.getSafeSize(fRowBytes);
|
||||
}
|
||||
bool canBePurged() override {
|
||||
SkAutoMutexAcquire ama(fMutex);
|
||||
@ -289,7 +289,7 @@ SkBitmapCache::RecPtr SkBitmapCache::Alloc(const SkBitmapCacheDesc& desc, const
|
||||
}
|
||||
|
||||
const size_t rb = info.minRowBytes();
|
||||
size_t size = info.computeByteSize(rb);
|
||||
size_t size = info.getSafeSize(rb);
|
||||
if (0 == size) {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -35,39 +35,38 @@ sk_sp<SkPixelRef> SkMallocPixelRef::MakeDirect(const SkImageInfo& info,
|
||||
}
|
||||
|
||||
|
||||
sk_sp<SkPixelRef> SkMallocPixelRef::MakeUsing(void*(*allocProc)(size_t),
|
||||
const SkImageInfo& info,
|
||||
size_t rowBytes) {
|
||||
if (rowBytes == 0) {
|
||||
rowBytes = info.minRowBytes();
|
||||
}
|
||||
|
||||
if (!is_valid(info) || !info.validRowBytes(rowBytes)) {
|
||||
sk_sp<SkPixelRef> SkMallocPixelRef::MakeUsing(void*(*alloc)(size_t),
|
||||
const SkImageInfo& info,
|
||||
size_t requestedRowBytes) {
|
||||
if (!is_valid(info)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
size_t size = 0;
|
||||
// if the info is empty, or rowBytes is 0 (which can be valid), then we don't need to compute
|
||||
// a size.
|
||||
if (!info.isEmpty() && rowBytes > 0) {
|
||||
#ifdef SK_SUPPORT_LEGACY_SAFESIZE64
|
||||
int64_t bigSize = (int64_t)info.height() * rowBytes;
|
||||
if (!sk_64_isS32(bigSize)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
size = sk_64_asS32(bigSize);
|
||||
SkASSERT(size >= info.getSafeSize(rowBytes));
|
||||
SkASSERT(info.computeByteSize(rowBytes) == info.getSafeSize(rowBytes));
|
||||
#else
|
||||
size = info.computeByteSize(rowBytes);
|
||||
#endif
|
||||
if (size == 0) {
|
||||
return nullptr; // overflow
|
||||
}
|
||||
// only want to permit 31bits of rowBytes
|
||||
int64_t minRB = (int64_t)info.minRowBytes64();
|
||||
if (minRB < 0 || !sk_64_isS32(minRB)) {
|
||||
return nullptr; // allocation will be too large
|
||||
}
|
||||
if (requestedRowBytes > 0 && (int32_t)requestedRowBytes < minRB) {
|
||||
return nullptr; // cannot meet requested rowbytes
|
||||
}
|
||||
|
||||
void* addr = allocProc(size);
|
||||
int32_t rowBytes;
|
||||
if (requestedRowBytes) {
|
||||
rowBytes = SkToS32(requestedRowBytes);
|
||||
} else {
|
||||
rowBytes = minRB;
|
||||
}
|
||||
|
||||
int64_t bigSize = (int64_t)info.height() * rowBytes;
|
||||
if (!sk_64_isS32(bigSize)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
size_t size = sk_64_asS32(bigSize);
|
||||
SkASSERT(size >= info.getSafeSize(rowBytes));
|
||||
SkASSERT(info.getSafeSize(rowBytes) == info.computeByteSize(rowBytes));
|
||||
void* addr = alloc(size);
|
||||
if (nullptr == addr) {
|
||||
return nullptr;
|
||||
}
|
||||
@ -109,11 +108,10 @@ sk_sp<SkPixelRef> SkMallocPixelRef::MakeWithData(const SkImageInfo& info,
|
||||
size_t rowBytes,
|
||||
sk_sp<SkData> data) {
|
||||
SkASSERT(data != nullptr);
|
||||
if (!is_valid(info) || !info.validRowBytes(rowBytes)) {
|
||||
if (!is_valid(info)) {
|
||||
return nullptr;
|
||||
}
|
||||
size_t sizeNeeded = info.computeByteSize(rowBytes);
|
||||
if (!info.isEmpty() && (sizeNeeded == 0 || data->size() < sizeNeeded)) {
|
||||
if ((rowBytes < info.minRowBytes()) || (data->size() < info.getSafeSize(rowBytes))) {
|
||||
return nullptr;
|
||||
}
|
||||
// must get this address before we call release
|
||||
|
@ -400,7 +400,7 @@ static void generateMask(const SkMask& mask, const SkPath& path,
|
||||
} else {
|
||||
dst.reset(info, mask.fImage, dstRB);
|
||||
}
|
||||
sk_bzero(dst.writable_addr(), dst.computeByteSize());
|
||||
sk_bzero(dst.writable_addr(), dst.getSafeSize());
|
||||
|
||||
SkDraw draw;
|
||||
draw.fDst = dst;
|
||||
|
@ -219,7 +219,7 @@ public:
|
||||
|
||||
SkAlphaType alphaType() const override { return fBitmap.alphaType(); }
|
||||
|
||||
size_t getSize() const override { return fBitmap.computeByteSize(); }
|
||||
size_t getSize() const override { return fBitmap.getSize(); }
|
||||
|
||||
void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const override {
|
||||
SkRect dst = SkRect::MakeXYWH(x, y,
|
||||
|
@ -455,7 +455,7 @@ private:
|
||||
devPathBounds.height()))) {
|
||||
return false;
|
||||
}
|
||||
sk_bzero(dst.writable_addr(), dst.computeByteSize());
|
||||
sk_bzero(dst.writable_addr(), dst.getSafeSize());
|
||||
|
||||
// rasterize path
|
||||
SkPaint paint;
|
||||
@ -562,7 +562,7 @@ private:
|
||||
devPathBounds.height()))) {
|
||||
return false;
|
||||
}
|
||||
sk_bzero(dst.writable_addr(), dst.computeByteSize());
|
||||
sk_bzero(dst.writable_addr(), dst.getSafeSize());
|
||||
|
||||
// rasterize path
|
||||
SkPaint paint;
|
||||
|
@ -422,10 +422,7 @@ sk_sp<SkImage> SkImageMakeRasterCopyAndAssignColorSpace(const SkImage* src,
|
||||
}
|
||||
|
||||
size_t rowBytes = info.minRowBytes();
|
||||
size_t size = info.computeByteSize(rowBytes);
|
||||
if (size == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
size_t size = info.getSafeSize(rowBytes);
|
||||
auto data = SkData::MakeUninitialized(size);
|
||||
if (!data) {
|
||||
return nullptr;
|
||||
|
@ -518,7 +518,7 @@ sk_sp<SkImage> SkImage::makeNonTextureImage() const {
|
||||
}
|
||||
SkImageInfo info = as_IB(this)->onImageInfo();
|
||||
size_t rowBytes = info.minRowBytes();
|
||||
size_t size = info.computeByteSize(rowBytes);
|
||||
size_t size = info.getSafeSize(rowBytes);
|
||||
auto data = SkData::MakeUninitialized(size);
|
||||
if (!data) {
|
||||
return nullptr;
|
||||
@ -667,7 +667,7 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
|
||||
size_t pixelSize = 0;
|
||||
if (!isScaled && this->peekPixels(&pixmap) && pixmap.info().colorType() == dstColorType) {
|
||||
info = pixmap.info();
|
||||
pixelSize = SkAlign8(pixmap.computeByteSize());
|
||||
pixelSize = SkAlign8(pixmap.getSafeSize());
|
||||
if (!dstColorSpace) {
|
||||
pixmap.setColorSpace(nullptr);
|
||||
info = info.makeColorSpace(nullptr);
|
||||
@ -773,7 +773,7 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
|
||||
void* pixels = pixelsAsCharPtr;
|
||||
|
||||
memcpy(reinterpret_cast<void*>(SkAlign8(reinterpret_cast<uintptr_t>(pixelsAsCharPtr))),
|
||||
pixmap.addr(), pixmap.computeByteSize());
|
||||
pixmap.addr(), pixmap.getSafeSize());
|
||||
|
||||
// If the context has sRGB support, and we're intending to render to a surface with an attached
|
||||
// color space, and the image has an sRGB-like color space attached, then use our gamma (sRGB)
|
||||
@ -824,7 +824,7 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
|
||||
}
|
||||
|
||||
// Fill in the mipmap levels if they exist
|
||||
char* mipLevelPtr = pixelsAsCharPtr + SkAlign8(pixmap.computeByteSize());
|
||||
char* mipLevelPtr = pixelsAsCharPtr + SkAlign8(pixmap.getSafeSize());
|
||||
|
||||
if (useMipMaps) {
|
||||
static_assert(std::is_standard_layout<MipMapLevelData>::value,
|
||||
@ -845,10 +845,13 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
|
||||
// Make sure the mipmap data starts before the end of the buffer
|
||||
SkASSERT(mipLevelPtr < bufferAsCharPtr + pixelOffset + pixelSize);
|
||||
// Make sure the mipmap data ends before the end of the buffer
|
||||
SkASSERT(mipLevelPtr + mipLevel.fPixmap.computeByteSize() <=
|
||||
SkASSERT(mipLevelPtr + mipLevel.fPixmap.getSafeSize() <=
|
||||
bufferAsCharPtr + pixelOffset + pixelSize);
|
||||
|
||||
memcpy(mipLevelPtr, mipLevel.fPixmap.addr(), mipLevel.fPixmap.computeByteSize());
|
||||
// getSafeSize includes rowbyte padding except for the last row,
|
||||
// right?
|
||||
|
||||
memcpy(mipLevelPtr, mipLevel.fPixmap.addr(), mipLevel.fPixmap.getSafeSize());
|
||||
|
||||
memcpy(bufferAsCharPtr + offsetof(DeferredTextureImage, fMipMapLevelData) +
|
||||
sizeof(MipMapLevelData) * (generatedMipLevelIndex + 1) +
|
||||
@ -858,7 +861,7 @@ size_t SkImage::getDeferredTextureImageData(const GrContextThreadSafeProxy& prox
|
||||
sizeof(MipMapLevelData) * (generatedMipLevelIndex + 1) +
|
||||
offsetof(MipMapLevelData, fRowBytes), &rowBytes, sizeof(rowBytes));
|
||||
|
||||
mipLevelPtr += SkAlign8(mipLevel.fPixmap.computeByteSize());
|
||||
mipLevelPtr += SkAlign8(mipLevel.fPixmap.getSafeSize());
|
||||
}
|
||||
}
|
||||
return size;
|
||||
|
@ -57,11 +57,11 @@ public:
|
||||
if (kUnknown_SkColorType == info.colorType()) {
|
||||
return false;
|
||||
}
|
||||
if (!info.validRowBytes(rowBytes)) {
|
||||
if (rowBytes < info.minRowBytes()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t size = info.computeByteSize(rowBytes);
|
||||
size_t size = info.getSafeSize(rowBytes);
|
||||
if (0 == size) {
|
||||
return false;
|
||||
}
|
||||
|
@ -162,7 +162,7 @@ void SkSurface_Raster::onCopyOnWrite(ContentChangeMode mode) {
|
||||
fBitmap.allocPixels();
|
||||
SkASSERT(prev.info() == fBitmap.info());
|
||||
SkASSERT(prev.rowBytes() == fBitmap.rowBytes());
|
||||
memcpy(fBitmap.getPixels(), prev.getPixels(), fBitmap.computeByteSize());
|
||||
memcpy(fBitmap.getPixels(), prev.getPixels(), fBitmap.getSafeSize());
|
||||
}
|
||||
SkASSERT(fBitmap.rowBytes() == fRowBytes); // be sure we always use the same value
|
||||
|
||||
|
@ -132,7 +132,7 @@ CGImageRef SkCreateCGImageRefWithColorspace(const SkBitmap& bm,
|
||||
|
||||
const int w = bitmap->width();
|
||||
const int h = bitmap->height();
|
||||
const size_t s = bitmap->computeByteSize();
|
||||
const size_t s = bitmap->getSize();
|
||||
|
||||
// our provider "owns" the bitmap*, and will take care of deleting it
|
||||
CGDataProviderRef dataRef = CGDataProviderCreateWithData(bitmap, bitmap->getPixels(), s,
|
||||
|
@ -573,7 +573,7 @@ static void TestOverrideStateConsistency(skiatest::Reporter* reporter, const Tes
|
||||
static void test_newraster(skiatest::Reporter* reporter) {
|
||||
SkImageInfo info = SkImageInfo::MakeN32Premul(10, 10);
|
||||
const size_t minRowBytes = info.minRowBytes();
|
||||
const size_t size = info.computeByteSize(minRowBytes);
|
||||
const size_t size = info.getSafeSize(minRowBytes);
|
||||
SkAutoTMalloc<SkPMColor> storage(size);
|
||||
SkPMColor* baseAddr = storage.get();
|
||||
sk_bzero(baseAddr, size);
|
||||
|
@ -584,7 +584,7 @@ static void test_dimensions(skiatest::Reporter* r, const char path[]) {
|
||||
|
||||
// Set up for the decode
|
||||
size_t rowBytes = scaledDims.width() * sizeof(SkPMColor);
|
||||
size_t totalBytes = scaledInfo.computeByteSize(rowBytes);
|
||||
size_t totalBytes = scaledInfo.getSafeSize(rowBytes);
|
||||
SkAutoTMalloc<SkPMColor> pixels(totalBytes);
|
||||
|
||||
SkAndroidCodec::AndroidOptions options;
|
||||
@ -1011,7 +1011,7 @@ static void check_color_xform(skiatest::Reporter* r, const char* path) {
|
||||
.makeColorSpace(colorSpace);
|
||||
|
||||
size_t rowBytes = dstInfo.minRowBytes();
|
||||
SkAutoMalloc pixelStorage(dstInfo.computeByteSize(rowBytes));
|
||||
SkAutoMalloc pixelStorage(dstInfo.getSafeSize(rowBytes));
|
||||
SkCodec::Result result = codec->getAndroidPixels(dstInfo, pixelStorage.get(), rowBytes, &opts);
|
||||
REPORTER_ASSERT(r, SkCodec::kSuccess == result);
|
||||
}
|
||||
|
@ -144,10 +144,9 @@ static void test_wacky_bitmapshader(skiatest::Reporter* reporter,
|
||||
|
||||
SkBitmap bm;
|
||||
if (bm.tryAllocN32Pixels(width, height)) {
|
||||
bm.eraseColor(SK_ColorRED);
|
||||
} else {
|
||||
shouldBeDrawn = false;
|
||||
// allow this to fail silently, to test the code downstream
|
||||
}
|
||||
bm.eraseColor(SK_ColorRED);
|
||||
|
||||
matrix.setAll(0.0078740157f,
|
||||
0,
|
||||
@ -180,7 +179,7 @@ static void test_wacky_bitmapshader(skiatest::Reporter* reporter,
|
||||
* sign-extension bleed when packing the two values (X,Y) into our 32bit
|
||||
* slot.
|
||||
*
|
||||
* This tests exercises the original setup, plus 2 more to ensure that we can,
|
||||
* This tests exercises the original setup, plus 3 more to ensure that we can,
|
||||
* in fact, handle bitmaps at 64K-1 (assuming we don't exceed the total
|
||||
* memory allocation limit).
|
||||
*/
|
||||
@ -193,6 +192,7 @@ static void test_giantrepeat_crbug118018(skiatest::Reporter* reporter) {
|
||||
{ 0x1b294, 0x7f, false }, // crbug 118018 (width exceeds 64K)
|
||||
{ 0xFFFF, 0x7f, true }, // should draw, test max width
|
||||
{ 0x7f, 0xFFFF, true }, // should draw, test max height
|
||||
{ 0xFFFF, 0xFFFF, false }, // allocation fails (too much RAM)
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < SK_ARRAY_COUNT(gTests); ++i) {
|
||||
|
@ -43,7 +43,7 @@ DEF_TEST(color_half_float, reporter) {
|
||||
|
||||
SkAutoPixmapStorage pm;
|
||||
pm.alloc(info);
|
||||
REPORTER_ASSERT(reporter, pm.computeByteSize() == SkToSizeT(w * h * sizeof(uint64_t)));
|
||||
REPORTER_ASSERT(reporter, pm.getSafeSize() == SkToSizeT(w * h * sizeof(uint64_t)));
|
||||
|
||||
SkColor4f c4 { 1, 0.5f, 0.25f, 0.5f };
|
||||
pm.erase(c4);
|
||||
|
@ -17,8 +17,8 @@
|
||||
#endif
|
||||
|
||||
static void test_bitmap_equality(skiatest::Reporter* reporter, SkBitmap& bm1, SkBitmap& bm2) {
|
||||
REPORTER_ASSERT(reporter, bm1.computeByteSize() == bm2.computeByteSize());
|
||||
REPORTER_ASSERT(reporter, 0 == memcmp(bm1.getPixels(), bm2.getPixels(), bm1.computeByteSize()));
|
||||
REPORTER_ASSERT(reporter, bm1.getSize() == bm2.getSize());
|
||||
REPORTER_ASSERT(reporter, 0 == memcmp(bm1.getPixels(), bm2.getPixels(), bm1.getSize()));
|
||||
}
|
||||
|
||||
static void paint_source(SkSurface* sourceSurface) {
|
||||
|
@ -549,7 +549,7 @@ DEF_TEST(ImageEmpty, reporter) {
|
||||
DEF_TEST(ImageDataRef, reporter) {
|
||||
SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1);
|
||||
size_t rowBytes = info.minRowBytes();
|
||||
size_t size = info.computeByteSize(rowBytes);
|
||||
size_t size = info.getSafeSize(rowBytes);
|
||||
sk_sp<SkData> data = SkData::MakeUninitialized(size);
|
||||
REPORTER_ASSERT(reporter, data->unique());
|
||||
sk_sp<SkImage> image = SkImage::MakeRasterData(info, data, rowBytes);
|
||||
|
@ -32,7 +32,7 @@ DEF_TEST(MallocPixelRef, reporter) {
|
||||
}
|
||||
{
|
||||
size_t rowBytes = info.minRowBytes() - 1;
|
||||
size_t size = info.computeByteSize(rowBytes);
|
||||
size_t size = info.getSafeSize(rowBytes);
|
||||
sk_sp<SkData> data(SkData::MakeUninitialized(size));
|
||||
sk_sp<SkPixelRef> pr(
|
||||
SkMallocPixelRef::MakeWithData(info, rowBytes, data));
|
||||
@ -41,7 +41,7 @@ DEF_TEST(MallocPixelRef, reporter) {
|
||||
}
|
||||
{
|
||||
size_t rowBytes = info.minRowBytes() + 2;
|
||||
size_t size = info.computeByteSize(rowBytes) - 1;
|
||||
size_t size = info.getSafeSize(rowBytes) - 1;
|
||||
sk_sp<SkData> data(SkData::MakeUninitialized(size));
|
||||
sk_sp<SkPixelRef> pr(
|
||||
SkMallocPixelRef::MakeWithData(info, rowBytes, data));
|
||||
@ -49,7 +49,7 @@ DEF_TEST(MallocPixelRef, reporter) {
|
||||
REPORTER_ASSERT(reporter, nullptr == pr.get());
|
||||
}
|
||||
size_t rowBytes = info.minRowBytes() + 7;
|
||||
size_t size = info.computeByteSize(rowBytes) + 9;
|
||||
size_t size = info.getSafeSize(rowBytes) + 9;
|
||||
{
|
||||
SkAutoMalloc memory(size);
|
||||
sk_sp<SkPixelRef> pr(
|
||||
|
@ -151,8 +151,8 @@ DEF_TEST(SkRecordingAccuracyXfermode, reporter) {
|
||||
const SkBitmap& goldenBM = golden.recordAndReplay(drawer, clip, mode);
|
||||
const SkBitmap& pictureBM = picture.recordAndReplay(drawer, clip, mode);
|
||||
|
||||
size_t pixelsSize = goldenBM.computeByteSize();
|
||||
REPORTER_ASSERT(reporter, pixelsSize == pictureBM.computeByteSize());
|
||||
size_t pixelsSize = goldenBM.getSize();
|
||||
REPORTER_ASSERT(reporter, pixelsSize == pictureBM.getSize());
|
||||
|
||||
// The pixel arrays should match.
|
||||
#if FINEGRAIN
|
||||
|
@ -49,7 +49,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ResourceCacheCache, reporter, ctxInfo) {
|
||||
SkBitmap src;
|
||||
src.allocN32Pixels(size.width(), size.height());
|
||||
src.eraseColor(SK_ColorBLACK);
|
||||
size_t srcSize = src.computeByteSize();
|
||||
size_t srcSize = src.getSize();
|
||||
|
||||
size_t initialCacheSize;
|
||||
context->getResourceCacheUsage(nullptr, &initialCacheSize);
|
||||
|
@ -50,7 +50,7 @@ static sk_sp<SkSurface> create_direct_surface(SkAlphaType at = kPremul_SkAlphaTy
|
||||
*requestedInfo = info;
|
||||
}
|
||||
const size_t rowBytes = info.minRowBytes();
|
||||
void* storage = sk_malloc_throw(info.computeByteSize(rowBytes));
|
||||
void* storage = sk_malloc_throw(info.getSafeSize(rowBytes));
|
||||
return SkSurface::MakeRasterDirectReleaseProc(info, storage, rowBytes,
|
||||
release_direct_surface_storage,
|
||||
storage);
|
||||
@ -565,7 +565,7 @@ DEF_TEST(surface_rowbytes, reporter) {
|
||||
// Try some illegal rowByte values
|
||||
auto s = SkSurface::MakeRaster(info, 396, nullptr); // needs to be at least 400
|
||||
REPORTER_ASSERT(reporter, nullptr == s);
|
||||
s = SkSurface::MakeRaster(info, std::numeric_limits<size_t>::max(), nullptr);
|
||||
s = SkSurface::MakeRaster(info, 1 << 30, nullptr); // allocation to large
|
||||
REPORTER_ASSERT(reporter, nullptr == s);
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@ static void check_fill(skiatest::Reporter* r,
|
||||
// to test on different memory alignments. If offset is nonzero, we need to increase the
|
||||
// size of the memory we allocate in order to make sure that we have enough. We are
|
||||
// still allocating the smallest possible size.
|
||||
const size_t totalBytes = imageInfo.computeByteSize(rowBytes) + offset;
|
||||
const size_t totalBytes = imageInfo.getSafeSize(rowBytes) + offset;
|
||||
|
||||
// Create fake image data where every byte has a value of 0
|
||||
std::unique_ptr<uint8_t[]> storage(new uint8_t[totalBytes]);
|
||||
|
@ -394,7 +394,7 @@ DEF_TEST(WritePixels, reporter) {
|
||||
const SkImageInfo info = SkImageInfo::MakeN32Premul(DEV_W, DEV_H);
|
||||
for (auto& tightRowBytes : { true, false }) {
|
||||
const size_t rowBytes = tightRowBytes ? info.minRowBytes() : 4 * DEV_W + 100;
|
||||
const size_t size = info.computeByteSize(rowBytes);
|
||||
const size_t size = info.getSafeSize(rowBytes);
|
||||
void* pixels = sk_malloc_throw(size);
|
||||
// if rowBytes isn't tight then set the padding to a known value
|
||||
if (!tightRowBytes) {
|
||||
|
Loading…
Reference in New Issue
Block a user