diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkBitmap.cpp | 41 | ||||
-rw-r--r-- | src/core/SkBitmapController.cpp | 11 | ||||
-rw-r--r-- | src/core/SkBitmapDevice.cpp | 3 | ||||
-rw-r--r-- | src/core/SkBitmapScaler.cpp | 1 | ||||
-rw-r--r-- | src/core/SkBlurImageFilter.cpp | 2 | ||||
-rw-r--r-- | src/core/SkCanvas.cpp | 10 | ||||
-rw-r--r-- | src/core/SkDraw.cpp | 15 | ||||
-rw-r--r-- | src/core/SkImageCacherator.cpp | 1 | ||||
-rw-r--r-- | src/core/SkMipMap.cpp | 9 | ||||
-rw-r--r-- | src/core/SkPixelRef.cpp | 26 | ||||
-rw-r--r-- | src/core/SkPixmap.cpp | 2 | ||||
-rw-r--r-- | src/core/SkSpecialImage.cpp | 5 | ||||
-rw-r--r-- | src/core/SkWriteBuffer.cpp | 6 |
13 files changed, 52 insertions, 80 deletions
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp index 5c6efd49bd..7e3b2c97b3 100644 --- a/src/core/SkBitmap.cpp +++ b/src/core/SkBitmap.cpp @@ -478,12 +478,12 @@ void SkBitmap::erase(SkColor c, const SkIRect& area) const { break; } - SkAutoPixmapUnlock result; - if (!this->requestLock(&result)) { + SkPixmap result; + if (!this->peekPixels(&result)) { return; } - if (result.pixmap().erase(c, area)) { + if (result.erase(c, area)) { this->notifyPixelsChanged(); } } @@ -566,11 +566,11 @@ bool SkBitmap::canCopyTo(SkColorType dstCT) const { bool SkBitmap::readPixels(const SkImageInfo& requestedDstInfo, void* dstPixels, size_t dstRB, int x, int y) const { - SkAutoPixmapUnlock src; - if (!this->requestLock(&src)) { + SkPixmap src; + if (!this->peekPixels(&src)) { return false; } - return src.pixmap().readPixels(requestedDstInfo, dstPixels, dstRB, x, y); + return src.readPixels(requestedDstInfo, dstPixels, dstRB, x, y); } bool SkBitmap::readPixels(const SkPixmap& dst, int srcX, int srcY) const { @@ -579,11 +579,6 @@ bool SkBitmap::readPixels(const SkPixmap& dst, int srcX, int srcY) const { bool SkBitmap::writePixels(const SkPixmap& src, int dstX, int dstY, SkTransferFunctionBehavior behavior) { - SkAutoPixmapUnlock dst; - if (!this->requestLock(&dst)) { - return false; - } - if (!SkImageInfoValidConversion(fInfo, src.info())) { return false; } @@ -605,11 +600,10 @@ bool SkBitmap::internalCopyTo(SkBitmap* dst, SkColorType dstColorType, Allocator return false; } - SkAutoPixmapUnlock srcUnlocker; - if (!this->requestLock(&srcUnlocker)) { + SkPixmap srcPM; + if (!this->peekPixels(&srcPM)) { return false; } - SkPixmap srcPM = srcUnlocker.pixmap(); // Various Android specific compatibility modes. // TODO: @@ -654,13 +648,11 @@ bool SkBitmap::internalCopyTo(SkBitmap* dst, SkColorType dstColorType, Allocator return false; } - SkAutoPixmapUnlock dstUnlocker; - if (!tmpDst.requestLock(&dstUnlocker)) { + SkPixmap dstPM; + if (!tmpDst.peekPixels(&dstPM)) { return false; } - SkPixmap dstPM = dstUnlocker.pixmap(); - // We can't do a sane conversion from F16 without a src color space. Guess sRGB in this case. if (kRGBA_F16_SkColorType == srcPM.colorType() && !dstPM.colorSpace()) { dstPM.setColorSpace(SkColorSpace::MakeSRGB()); @@ -721,15 +713,14 @@ static bool GetBitmapAlpha(const SkBitmap& src, uint8_t* SK_RESTRICT alpha, int SkASSERT(alpha != nullptr); SkASSERT(alphaRowBytes >= src.width()); - SkAutoPixmapUnlock apl; - if (!src.requestLock(&apl)) { + SkPixmap pmap; + if (!src.peekPixels(&pmap)) { for (int y = 0; y < src.height(); ++y) { memset(alpha, 0, src.width()); alpha += alphaRowBytes; } return false; } - const SkPixmap& pmap = apl.pixmap(); SkConvertPixels(SkImageInfo::MakeA8(pmap.width(), pmap.height()), alpha, alphaRowBytes, pmap.info(), pmap.addr(), pmap.rowBytes(), pmap.ctable(), SkTransferFunctionBehavior::kRespect); @@ -841,13 +832,13 @@ void SkBitmap::WriteRawPixels(SkWriteBuffer* buffer, const SkBitmap& bitmap) { return; } - SkAutoPixmapUnlock result; - if (!bitmap.requestLock(&result)) { + SkPixmap result; + if (!bitmap.peekPixels(&result)) { buffer->writeUInt(0); // instead of snugRB, signaling no pixels return; } - write_raw_pixels(buffer, result.pixmap()); + write_raw_pixels(buffer, result); } bool SkBitmap::ReadRawPixels(SkReadBuffer* buffer, SkBitmap* bitmap) { @@ -1003,6 +994,7 @@ void SkBitmap::toString(SkString* str) const { /////////////////////////////////////////////////////////////////////////////// +#ifdef SK_SUPPORT_OBSOLETE_LOCKPIXELS bool SkBitmap::requestLock(SkAutoPixmapUnlock* result) const { SkASSERT(result); @@ -1031,6 +1023,7 @@ bool SkBitmap::requestLock(SkAutoPixmapUnlock* result) const { } return false; } +#endif bool SkBitmap::peekPixels(SkPixmap* pmap) const { if (fPixels) { diff --git a/src/core/SkBitmapController.cpp b/src/core/SkBitmapController.cpp index c72693fe88..ba287b584a 100644 --- a/src/core/SkBitmapController.cpp +++ b/src/core/SkBitmapController.cpp @@ -116,7 +116,6 @@ bool SkDefaultBitmapControllerState::processHQRequest(const SkBitmapProvider& pr if (fCanShadeHQ) { fQuality = kHigh_SkFilterQuality; SkAssertResult(provider.asBitmap(&fResultBitmap)); - fResultBitmap.lockPixels(); return true; } @@ -129,15 +128,15 @@ bool SkDefaultBitmapControllerState::processHQRequest(const SkBitmapProvider& pr if (!provider.asBitmap(&orig)) { return false; } - SkAutoPixmapUnlock src; - if (!orig.requestLock(&src)) { + SkPixmap src; + if (!orig.peekPixels(&src)) { return false; } SkPixmap dst; SkBitmapCache::RecPtr rec; const SkImageInfo info = SkImageInfo::MakeN32(desc.fScaledWidth, desc.fScaledHeight, - src.pixmap().alphaType()); + src.alphaType()); if (provider.isVolatile()) { if (!fResultBitmap.tryAllocPixels(info)) { return false; @@ -151,7 +150,7 @@ bool SkDefaultBitmapControllerState::processHQRequest(const SkBitmapProvider& pr return false; } } - if (!SkBitmapScaler::Resize(dst, src.pixmap(), kHQ_RESIZE_METHOD)) { + if (!SkBitmapScaler::Resize(dst, src, kHQ_RESIZE_METHOD)) { return false; // we failed to create fScaledBitmap } if (rec) { @@ -241,8 +240,6 @@ SkDefaultBitmapControllerState::SkDefaultBitmapControllerState(const SkBitmapPro SkASSERT(fResultBitmap.getPixels()); } else { (void)provider.asBitmap(&fResultBitmap); - fResultBitmap.lockPixels(); - // lock may fail to give us pixels } SkASSERT(fCanShadeHQ || fQuality <= kLow_SkFilterQuality); diff --git a/src/core/SkBitmapDevice.cpp b/src/core/SkBitmapDevice.cpp index fd387acb90..09f25fb332 100644 --- a/src/core/SkBitmapDevice.cpp +++ b/src/core/SkBitmapDevice.cpp @@ -74,7 +74,6 @@ SkBitmapDevice::SkBitmapDevice(const SkBitmap& bitmap) , fRCStack(bitmap.width(), bitmap.height()) { SkASSERT(valid_for_bitmap_device(bitmap.info(), nullptr)); - fBitmap.lockPixels(); } SkBitmapDevice* SkBitmapDevice::Create(const SkImageInfo& info) { @@ -89,7 +88,6 @@ SkBitmapDevice::SkBitmapDevice(const SkBitmap& bitmap, const SkSurfaceProps& sur , fRCStack(bitmap.width(), bitmap.height()) { SkASSERT(valid_for_bitmap_device(bitmap.info(), nullptr)); - fBitmap.lockPixels(); } SkBitmapDevice* SkBitmapDevice::Create(const SkImageInfo& origInfo, @@ -134,7 +132,6 @@ void SkBitmapDevice::replaceBitmapBackendForRasterSurface(const SkBitmap& bm) { SkASSERT(bm.width() == fBitmap.width()); SkASSERT(bm.height() == fBitmap.height()); fBitmap = bm; // intent is to use bm's pixelRef (and rowbytes/config) - fBitmap.lockPixels(); this->privateResize(fBitmap.info().width(), fBitmap.info().height()); } diff --git a/src/core/SkBitmapScaler.cpp b/src/core/SkBitmapScaler.cpp index b4ade85a75..c803da7e8e 100644 --- a/src/core/SkBitmapScaler.cpp +++ b/src/core/SkBitmapScaler.cpp @@ -249,7 +249,6 @@ bool SkBitmapScaler::Resize(SkBitmap* resultPtr, const SkPixmap& source, ResizeM } *resultPtr = result; - resultPtr->lockPixels(); SkASSERT(resultPtr->getPixels()); return true; } diff --git a/src/core/SkBlurImageFilter.cpp b/src/core/SkBlurImageFilter.cpp index 5e7f2a53ce..320097bdd0 100644 --- a/src/core/SkBlurImageFilter.cpp +++ b/src/core/SkBlurImageFilter.cpp @@ -214,8 +214,6 @@ sk_sp<SkSpecialImage> SkBlurImageFilterImpl::onFilterImage(SkSpecialImage* sourc return nullptr; } - SkAutoLockPixels inputLock(inputBM), tmpLock(tmp), dstLock(dst); - offset->fX = dstBounds.fLeft; offset->fY = dstBounds.fTop; SkPMColor* t = tmp.getAddr32(0, 0); diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 1b96f4934e..844de43b8a 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -841,9 +841,8 @@ bool SkCanvas::readPixels(SkBitmap* bitmap, int x, int y) { weAllocated = true; } - SkAutoPixmapUnlock unlocker; - if (bitmap->requestLock(&unlocker)) { - const SkPixmap& pm = unlocker.pixmap(); + SkPixmap pm; + if (bitmap->peekPixels(&pm)) { if (this->readPixels(pm.info(), pm.writable_addr(), pm.rowBytes(), x, y)) { return true; } @@ -894,9 +893,8 @@ bool SkCanvas::readPixels(const SkBitmap& bm, int x, int y) { } bool SkCanvas::writePixels(const SkBitmap& bitmap, int x, int y) { - SkAutoPixmapUnlock unlocker; - if (bitmap.requestLock(&unlocker)) { - const SkPixmap& pm = unlocker.pixmap(); + SkPixmap pm; + if (bitmap.peekPixels(&pm)) { return this->writePixels(pm.info(), pm.addr(), pm.rowBytes(), x, y); } return false; diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp index 07129f62b3..1e6c900ca7 100644 --- a/src/core/SkDraw.cpp +++ b/src/core/SkDraw.cpp @@ -1170,11 +1170,10 @@ void SkDraw::drawBitmapAsMask(const SkBitmap& bitmap, const SkPaint& paint) cons int ix = SkScalarRoundToInt(fMatrix->getTranslateX()); int iy = SkScalarRoundToInt(fMatrix->getTranslateY()); - SkAutoPixmapUnlock result; - if (!bitmap.requestLock(&result)) { + SkPixmap pmap; + if (!bitmap.peekPixels(&pmap)) { return; } - const SkPixmap& pmap = result.pixmap(); SkMask mask; mask.fBounds.set(ix, iy, ix + pmap.width(), iy + pmap.height()); mask.fFormat = SkMask::kA8_Format; @@ -1290,11 +1289,10 @@ void SkDraw::drawBitmap(const SkBitmap& bitmap, const SkMatrix& prematrix, // It is safe to call lock pixels now, since we know the matrix is // (more or less) identity. // - SkAutoPixmapUnlock unlocker; - if (!bitmap.requestLock(&unlocker)) { + SkPixmap pmap; + if (!bitmap.peekPixels(&pmap)) { return; } - const SkPixmap& pmap = unlocker.pixmap(); int ix = SkScalarRoundToInt(matrix.getTranslateX()); int iy = SkScalarRoundToInt(matrix.getTranslateY()); if (clipHandlesSprite(*fRC, ix, iy, pmap)) { @@ -1348,11 +1346,10 @@ void SkDraw::drawSprite(const SkBitmap& bitmap, int x, int y, const SkPaint& ori SkPaint paint(origPaint); paint.setStyle(SkPaint::kFill_Style); - SkAutoPixmapUnlock unlocker; - if (!bitmap.requestLock(&unlocker)) { + SkPixmap pmap; + if (!bitmap.peekPixels(&pmap)) { return; } - const SkPixmap& pmap = unlocker.pixmap(); if (nullptr == paint.getColorFilter() && clipHandlesSprite(*fRC, x, y, pmap)) { // blitter will be owned by the allocator. diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp index a31d31ff96..c755f5d4d2 100644 --- a/src/core/SkImageCacherator.cpp +++ b/src/core/SkImageCacherator.cpp @@ -241,7 +241,6 @@ bool SkImageCacherator::tryLockAsBitmap(SkBitmap* bitmap, const SkImage* client, } } else { *bitmap = tmpBitmap; - bitmap->lockPixels(); bitmap->pixelRef()->setImmutableWithID(uniqueID); } return true; diff --git a/src/core/SkMipMap.cpp b/src/core/SkMipMap.cpp index d15d2c96dd..b3766e5cc2 100644 --- a/src/core/SkMipMap.cpp +++ b/src/core/SkMipMap.cpp @@ -779,15 +779,10 @@ bool SkMipMap::extractLevel(const SkSize& scaleSize, Level* levelPtr) const { // SkMipMap* SkMipMap::Build(const SkBitmap& src, SkDestinationSurfaceColorMode colorMode, SkDiscardableFactoryProc fact) { - SkAutoPixmapUnlock srcUnlocker; - if (!src.requestLock(&srcUnlocker)) { + SkPixmap srcPixmap; + if (!src.peekPixels(&srcPixmap)) { return nullptr; } - const SkPixmap& srcPixmap = srcUnlocker.pixmap(); - // Try to catch where we might have returned nullptr for src crbug.com/492818 - if (nullptr == srcPixmap.addr()) { - sk_throw(); - } return Build(srcPixmap, colorMode, fact); } diff --git a/src/core/SkPixelRef.cpp b/src/core/SkPixelRef.cpp index 37a450d1fd..3bf20fa3f6 100644 --- a/src/core/SkPixelRef.cpp +++ b/src/core/SkPixelRef.cpp @@ -26,9 +26,6 @@ uint32_t SkNextID::ImageID() { /////////////////////////////////////////////////////////////////////////////// -// just need a > 0 value, so pick a funny one to aid in debugging -#define SKPIXELREF_PRELOCKED_LOCKCOUNT 123456789 - static SkImageInfo validate_info(const SkImageInfo& info) { SkAlphaType newAlphaType = info.alphaType(); SkAssertResult(SkColorTypeValidateAlphaType(info.colorType(), info.alphaType(), &newAlphaType)); @@ -54,6 +51,8 @@ SkPixelRef::SkPixelRef(const SkImageInfo& info, void* pixels, size_t rowBytes, sk_sp<SkColorTable> ctable) : fInfo(validate_info(info)) , fCTable(std::move(ctable)) + , fPixels(pixels) + , fRowBytes(rowBytes) #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK , fStableID(SkNextID::ImageID()) #endif @@ -63,13 +62,9 @@ SkPixelRef::SkPixelRef(const SkImageInfo& info, void* pixels, size_t rowBytes, #ifdef SK_TRACE_PIXELREF_LIFETIME SkDebugf(" pixelref %d\n", sk_atomic_inc(&gInstCounter)); #endif - fRec.fPixels = pixels; - fRec.fRowBytes = rowBytes; - fRec.fColorTable = fCTable.get(); this->needsNewGenID(); fMutability = kMutable; - fPreLocked = true; fAddedToCache.store(false); } @@ -116,9 +111,15 @@ void SkPixelRef::cloneGenID(const SkPixelRef& that) { SkASSERT(!that. genIDIsUnique()); } +#ifdef SK_SUPPORT_OBSOLETE_LOCKPIXELS bool SkPixelRef::lockPixels(LockRec* rec) { - *rec = fRec; - return true; + if (fPixels) { + rec->fPixels = fPixels; + rec->fRowBytes = fRowBytes; + rec->fColorTable = fCTable.get(); + return true; + } + return false; } bool SkPixelRef::requestLock(const LockRequest& request, LockResult* result) { @@ -133,12 +134,13 @@ bool SkPixelRef::requestLock(const LockRequest& request, LockResult* result) { result->fUnlockProc = nullptr; result->fUnlockContext = nullptr; - result->fCTable = fRec.fColorTable; - result->fPixels = fRec.fPixels; - result->fRowBytes = fRec.fRowBytes; + result->fCTable = fCTable.get(); + result->fPixels = fPixels; + result->fRowBytes = fRowBytes; result->fSize.set(fInfo.width(), fInfo.height()); return true; } +#endif uint32_t SkPixelRef::getGenerationID() const { uint32_t id = fTaggedGenID.load(); diff --git a/src/core/SkPixmap.cpp b/src/core/SkPixmap.cpp index 7eac6c4ed5..4d482181a5 100644 --- a/src/core/SkPixmap.cpp +++ b/src/core/SkPixmap.cpp @@ -20,6 +20,7 @@ #include "SkSurface.h" #include "SkUtils.h" +#ifdef SK_SUPPORT_OBSOLETE_LOCKPIXELS void SkAutoPixmapUnlock::reset(const SkPixmap& pm, void (*unlock)(void*), void* ctx) { SkASSERT(pm.addr() != nullptr); @@ -29,6 +30,7 @@ void SkAutoPixmapUnlock::reset(const SkPixmap& pm, void (*unlock)(void*), void* fUnlockContext = ctx; fIsLocked = true; } +#endif ///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp index 0853432d79..a142576c2e 100644 --- a/src/core/SkSpecialImage.cpp +++ b/src/core/SkSpecialImage.cpp @@ -218,11 +218,6 @@ public: , fBitmap(bm) { SkASSERT(bm.pixelRef()); - - // We have to lock now, while bm is still in scope, since it may have come from our - // cache, which means we need to keep it locked until we (the special) are done, since - // we cannot re-generate the cache entry (if bm came from a generator). - fBitmap.lockPixels(); SkASSERT(fBitmap.getPixels()); } diff --git a/src/core/SkWriteBuffer.cpp b/src/core/SkWriteBuffer.cpp index 79422abcea..3322e8a8c8 100644 --- a/src/core/SkWriteBuffer.cpp +++ b/src/core/SkWriteBuffer.cpp @@ -154,9 +154,9 @@ void SkBinaryWriteBuffer::writeBitmap(const SkBitmap& bitmap) { this->writeBool(false); // see if the caller wants to manually encode - SkAutoPixmapUnlock result; - if (fPixelSerializer && bitmap.requestLock(&result)) { - sk_sp<SkData> data(fPixelSerializer->encode(result.pixmap())); + SkPixmap result; + if (fPixelSerializer && bitmap.peekPixels(&result)) { + sk_sp<SkData> data(fPixelSerializer->encode(result)); if (data) { // if we have to "encode" the bitmap, then we assume there is no // offset to share, since we are effectively creating a new pixelref |