diff options
-rw-r--r-- | include/core/SkBitmap.h | 9 | ||||
-rw-r--r-- | include/core/SkPixelRef.h | 14 | ||||
-rw-r--r-- | include/gpu/SkGr.h | 3 | ||||
-rw-r--r-- | src/core/SkBitmap.cpp | 54 | ||||
-rw-r--r-- | src/core/SkBitmapProvider.cpp | 4 | ||||
-rw-r--r-- | src/core/SkCanvas.cpp | 6 | ||||
-rw-r--r-- | src/core/SkSpecialImage.cpp | 1 | ||||
-rw-r--r-- | src/gpu/GrImageIDTextureAdjuster.cpp | 34 | ||||
-rw-r--r-- | src/gpu/GrImageIDTextureAdjuster.h | 19 | ||||
-rw-r--r-- | src/gpu/SkGpuDevice.cpp | 99 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 11 | ||||
-rw-r--r-- | src/image/SkImage_Raster.cpp | 2 | ||||
-rw-r--r-- | tools/picture_utils.cpp | 3 |
13 files changed, 40 insertions, 219 deletions
diff --git a/include/core/SkBitmap.h b/include/core/SkBitmap.h index 64ce60a0e2..53547f9123 100644 --- a/include/core/SkBitmap.h +++ b/include/core/SkBitmap.h @@ -23,7 +23,10 @@ class SkPixelRef; class SkPixelRefFactory; class SkRegion; class SkString; + +#ifdef SK_SUPPORT_LEGACY_BITMAP_GETTEXTURE class GrTexture; +#endif /** \class SkBitmap @@ -469,9 +472,9 @@ public: (this->colorType() != kIndex_8_SkColorType || fColorTable); } - /** Returns the pixelRef's texture, or NULL - */ - GrTexture* getTexture() const; +#ifdef SK_SUPPORT_LEGACY_BITMAP_GETTEXTURE + GrTexture* getTexture() const { return nullptr; } +#endif /** Return the bitmap's colortable, if it uses one (i.e. colorType is Index_8) and the pixels are locked. diff --git a/include/core/SkPixelRef.h b/include/core/SkPixelRef.h index da85863bdb..9aa1b71144 100644 --- a/include/core/SkPixelRef.h +++ b/include/core/SkPixelRef.h @@ -238,20 +238,6 @@ public: /** Populates dst with the pixels of this pixelRef, converting them to colorType. */ bool readPixels(SkBitmap* dst, SkColorType colorType, const SkIRect* subset = NULL); - /** - * Makes a deep copy of this PixelRef, respecting the requested config. - * @param colorType Desired colortype. - * @param profileType Desired colorprofiletype. - * @param subset Subset of this PixelRef to copy. Must be fully contained within the bounds of - * of this PixelRef. - * @return A new SkPixelRef, or NULL if either there is an error (e.g. the destination could - * not be created with the given config), or this PixelRef does not support deep - * copies. - */ - virtual SkPixelRef* deepCopy(SkColorType, SkColorSpace*, const SkIRect* /*subset*/) { - return NULL; - } - // Register a listener that may be called the next time our generation ID changes. // // We'll only call the listener if we're confident that we are the only SkPixelRef with this diff --git a/include/gpu/SkGr.h b/include/gpu/SkGr.h index 541881ddaf..70db775bfd 100644 --- a/include/gpu/SkGr.h +++ b/include/gpu/SkGr.h @@ -71,6 +71,9 @@ static inline GrColor SkPMColorToGrColor(SkPMColor c) { GrTexture* GrRefCachedBitmapTexture(GrContext*, const SkBitmap&, const GrTextureParams&, SkSourceGammaTreatment); +sk_sp<GrTexture> GrMakeCachedBitmapTexture(GrContext*, const SkBitmap&, const GrTextureParams&, + SkSourceGammaTreatment); + // TODO: Move SkImageInfo2GrPixelConfig to SkGrPriv.h (requires cleanup to SkWindow its subclasses). GrPixelConfig SkImageInfo2GrPixelConfig(SkColorType, SkAlphaType, const SkColorSpace*, const GrCaps&); diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp index fb7f691c93..a803c78227 100644 --- a/src/core/SkBitmap.cpp +++ b/src/core/SkBitmap.cpp @@ -424,10 +424,6 @@ void SkBitmap::notifyPixelsChanged() const { } } -GrTexture* SkBitmap::getTexture() const { - return fPixelRef ? fPixelRef->getTexture() : nullptr; -} - /////////////////////////////////////////////////////////////////////////////// /** We explicitly use the same allocator for our pixels that SkMask does, @@ -740,20 +736,6 @@ bool SkBitmap::extractSubset(SkBitmap* result, const SkIRect& subset) const { return false; // r is empty (i.e. no intersection) } - if (fPixelRef->getTexture() != nullptr) { - // Do a deep copy - SkPixelRef* pixelRef = fPixelRef->deepCopy(this->colorType(), this->colorSpace(), &subset); - if (pixelRef != nullptr) { - SkBitmap dst; - dst.setInfo(this->info().makeWH(subset.width(), subset.height())); - dst.setIsVolatile(this->isVolatile()); - dst.setPixelRef(pixelRef)->unref(); - SkDEBUGCODE(dst.validate()); - result->swap(dst); - return true; - } - } - // If the upper left of the rectangle was outside the bounds of this SkBitmap, we should have // exited above. SkASSERT(static_cast<unsigned>(r.fLeft) < static_cast<unsigned>(this->width())); @@ -909,46 +891,14 @@ bool SkBitmap::copyTo(SkBitmap* dst, SkColorType dstColorType, Allocator* alloc) return true; } +// TODO: can we merge this with copyTo? bool SkBitmap::deepCopyTo(SkBitmap* dst) const { const SkColorType dstCT = this->colorType(); - SkColorSpace* dstCS = this->colorSpace(); if (!this->canCopyTo(dstCT)) { return false; } - - // If we have a PixelRef, and it supports deep copy, use it. - // Currently supported only by texture-backed bitmaps. - if (fPixelRef) { - SkPixelRef* pixelRef = fPixelRef->deepCopy(dstCT, dstCS, nullptr); - if (pixelRef) { - uint32_t rowBytes; - if (this->colorType() == dstCT && this->colorSpace() == dstCS) { - // Since there is no subset to pass to deepCopy, and deepCopy - // succeeded, the new pixel ref must be identical. - SkASSERT(fPixelRef->info() == pixelRef->info()); - pixelRef->cloneGenID(*fPixelRef); - // Use the same rowBytes as the original. - rowBytes = fRowBytes; - } else { - // With the new config, an appropriate fRowBytes will be computed by setInfo. - rowBytes = 0; - } - - const SkImageInfo info = fInfo.makeColorType(dstCT); - if (!dst->setInfo(info, rowBytes)) { - return false; - } - dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref(); - return true; - } - } - - if (this->getTexture()) { - return false; - } else { - return this->copyTo(dst, dstCT, nullptr); - } + return this->copyTo(dst, dstCT, nullptr); } /////////////////////////////////////////////////////////////////////////////// diff --git a/src/core/SkBitmapProvider.cpp b/src/core/SkBitmapProvider.cpp index d2c5013a10..dd34fb04ab 100644 --- a/src/core/SkBitmapProvider.cpp +++ b/src/core/SkBitmapProvider.cpp @@ -29,10 +29,6 @@ bool SkBitmapProvider::validForDrawing() const { if (nullptr == fBitmap.pixelRef()) { return false; // no pixels to read } - if (fBitmap.getTexture()) { - // we can handle texture (ugh) since lockPixels will perform a read-back - return true; - } if (kIndex_8_SkColorType == fBitmap.colorType()) { SkAutoLockPixels alp(fBitmap); // but we need to call it before getColorTable() is safe. if (!fBitmap.getColorTable()) { diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index ffdcf9d5de..a86cd37cad 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -849,7 +849,7 @@ SkBaseDevice* SkCanvas::getTopDevice(bool updateMatrixClip) const { } bool SkCanvas::readPixels(SkBitmap* bitmap, int x, int y) { - if (kUnknown_SkColorType == bitmap->colorType() || bitmap->getTexture()) { + if (kUnknown_SkColorType == bitmap->colorType()) { return false; } @@ -911,10 +911,6 @@ bool SkCanvas::readPixels(const SkImageInfo& dstInfo, void* dstP, size_t rowByte } bool SkCanvas::writePixels(const SkBitmap& bitmap, int x, int y) { - if (bitmap.getTexture()) { - return false; - } - SkAutoPixmapUnlock unlocker; if (bitmap.requestLock(&unlocker)) { const SkPixmap& pm = unlocker.pixmap(); diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp index d01e485e83..fa7cbc6f6e 100644 --- a/src/core/SkSpecialImage.cpp +++ b/src/core/SkSpecialImage.cpp @@ -290,7 +290,6 @@ private: sk_sp<SkSpecialImage> SkSpecialImage::MakeFromRaster(const SkIRect& subset, const SkBitmap& bm, const SkSurfaceProps* props) { - SkASSERT(nullptr == bm.getTexture()); SkASSERT(rect_fits(subset, bm.width(), bm.height())); const SkBitmap* srcBM = &bm; diff --git a/src/gpu/GrImageIDTextureAdjuster.cpp b/src/gpu/GrImageIDTextureAdjuster.cpp index 4b57757da6..989102e740 100644 --- a/src/gpu/GrImageIDTextureAdjuster.cpp +++ b/src/gpu/GrImageIDTextureAdjuster.cpp @@ -17,36 +17,6 @@ static bool bmp_is_alpha_only(const SkBitmap& bm) { return kAlpha_8_SkColorType == bm.colorType(); } -GrBitmapTextureAdjuster::GrBitmapTextureAdjuster(const SkBitmap* bmp) - : INHERITED(bmp->getTexture(), - SkIRect::MakeWH(bmp->width(), bmp->height()), - bmp_is_alpha_only(*bmp)) - , fBmp(bmp) {} - -void GrBitmapTextureAdjuster::makeCopyKey(const CopyParams& params, GrUniqueKey* copyKey) { - if (fBmp->isVolatile()) { - return; - } - // The content area must represent the whole bitmap. Texture-backed bitmaps don't support - // extractSubset(). Therefore, either the bitmap and the texture are the same size or the - // content's dimensions are the bitmap's dimensions which is pinned to the upper left - // of the texture. - GrUniqueKey baseKey; - GrMakeKeyFromImageID(&baseKey, fBmp->getGenerationID(), - SkIRect::MakeWH(fBmp->width(), fBmp->height())); - MakeCopyKeyFromOrigKey(baseKey, params, copyKey); -} - -void GrBitmapTextureAdjuster::didCacheCopy(const GrUniqueKey& copyKey) { - GrInstallBitmapUniqueKeyInvalidator(copyKey, fBmp->pixelRef()); -} - -SkColorSpace* GrBitmapTextureAdjuster::getColorSpace() { - return fBmp->colorSpace(); -} - -////////////////////////////////////////////////////////////////////////////// - // SkImage's don't have a way of communicating whether they're alpha-only. So we fallback to // inspecting the texture. static bool tex_image_is_alpha_only(const SkImage_Base& img) { @@ -79,8 +49,8 @@ SkColorSpace* GrImageTextureAdjuster::getColorSpace() { GrBitmapTextureMaker::GrBitmapTextureMaker(GrContext* context, const SkBitmap& bitmap) : INHERITED(context, bitmap.width(), bitmap.height(), bmp_is_alpha_only(bitmap)) - , fBitmap(bitmap) { - SkASSERT(!bitmap.getTexture()); + , fBitmap(bitmap) +{ if (!bitmap.isVolatile()) { SkIPoint origin = bitmap.pixelRefOrigin(); SkIRect subset = SkIRect::MakeXYWH(origin.fX, origin.fY, bitmap.width(), diff --git a/src/gpu/GrImageIDTextureAdjuster.h b/src/gpu/GrImageIDTextureAdjuster.h index c32bdb18a0..6092fcf7bd 100644 --- a/src/gpu/GrImageIDTextureAdjuster.h +++ b/src/gpu/GrImageIDTextureAdjuster.h @@ -15,25 +15,6 @@ class SkBitmap; class SkImage_Base; class SkImageCacherator; -/** Implementation for texture-backed SkBitmaps. The bitmap must stay in scope and unmodified - while this object exists. */ -class GrBitmapTextureAdjuster : public GrTextureAdjuster { -public: - explicit GrBitmapTextureAdjuster(const SkBitmap* bmp); - -protected: - SkColorSpace* getColorSpace() override; - -private: - void makeCopyKey(const CopyParams& params, GrUniqueKey* copyKey) override; - - void didCacheCopy(const GrUniqueKey& copyKey) override; - - const SkBitmap* fBmp; - - typedef GrTextureAdjuster INHERITED; -}; - /** Implementation for texture-backed SkImages. The image must stay in scope and unmodified while this object exists. */ class GrImageTextureAdjuster : public GrTextureAdjuster { diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp index 602396fc21..5351f4bc3d 100644 --- a/src/gpu/SkGpuDevice.cpp +++ b/src/gpu/SkGpuDevice.cpp @@ -67,43 +67,6 @@ enum { kDefaultImageFilterCacheSize = 32 * 1024 * 1024 }; /////////////////////////////////////////////////////////////////////////////// -// Helper for turning a bitmap into a texture. If the bitmap is GrTexture backed this -// just accesses the backing GrTexture. Otherwise, it creates a cached texture -// representation and releases it in the destructor. -class AutoBitmapTexture : public SkNoncopyable { -public: - AutoBitmapTexture() {} - - AutoBitmapTexture(GrContext* context, - const SkBitmap& bitmap, - const GrTextureParams& params, - SkSourceGammaTreatment gammaTreatment, - GrTexture** texture) { - SkASSERT(texture); - *texture = this->set(context, bitmap, params, gammaTreatment); - } - - GrTexture* set(GrContext* context, - const SkBitmap& bitmap, - const GrTextureParams& params, - SkSourceGammaTreatment gammaTreatment) { - // Either get the texture directly from the bitmap, or else use the cache and - // remember to unref it. - if (GrTexture* bmpTexture = bitmap.getTexture()) { - fTexture.reset(nullptr); - return bmpTexture; - } else { - fTexture.reset(GrRefCachedBitmapTexture(context, bitmap, params, gammaTreatment)); - return fTexture.get(); - } - } - -private: - SkAutoTUnref<GrTexture> fTexture; -}; - -/////////////////////////////////////////////////////////////////////////////// - /** Checks that the alpha type is legal and gets constructor flags. Returns false if device creation should fail. */ bool SkGpuDevice::CheckAlphaTypeAndGetFlags( @@ -826,11 +789,6 @@ bool SkGpuDevice::shouldTileBitmap(const SkBitmap& bitmap, int* tileSize, SkIRect* clippedSrcRect) const { ASSERT_SINGLE_OWNER - // if bitmap is explictly texture backed then just use the texture - if (bitmap.getTexture()) { - return false; - } - return this->shouldTileImageID(bitmap.getGenerationID(), bitmap.getSubset(), viewMatrix, params, srcRectPtr, maxTileSize, tileSize, clippedSrcRect); } @@ -877,13 +835,7 @@ void SkGpuDevice::drawBitmap(const SkDraw& origDraw, CHECK_SHOULD_DRAW(origDraw); SkMatrix viewMatrix; viewMatrix.setConcat(*origDraw.fMatrix, m); - if (bitmap.getTexture()) { - GrBitmapTextureAdjuster adjuster(&bitmap); - // We can use kFast here because we know texture-backed bitmaps don't support extractSubset. - this->drawTextureProducer(&adjuster, nullptr, nullptr, SkCanvas::kFast_SrcRectConstraint, - viewMatrix, fClip, paint); - return; - } + int maxTileSize = fContext->caps()->maxTileSize(); // The tile code path doesn't currently support AA, so if the paint asked for aa and we could @@ -1080,16 +1032,13 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, // We should have already handled bitmaps larger than the max texture size. SkASSERT(bitmap.width() <= fContext->caps()->maxTextureSize() && bitmap.height() <= fContext->caps()->maxTextureSize()); - // Unless the bitmap is inherently texture-backed, we should be respecting the max tile size - // by the time we get here. - SkASSERT(bitmap.getTexture() || - (bitmap.width() <= fContext->caps()->maxTileSize() && - bitmap.height() <= fContext->caps()->maxTileSize())); + // We should be respecting the max tile size by the time we get here. + SkASSERT(bitmap.width() <= fContext->caps()->maxTileSize() && + bitmap.height() <= fContext->caps()->maxTileSize()); - GrTexture* texture; SkSourceGammaTreatment gammaTreatment = this->surfaceProps().isGammaCorrect() ? SkSourceGammaTreatment::kRespect : SkSourceGammaTreatment::kIgnore; - AutoBitmapTexture abt(fContext, bitmap, params, gammaTreatment, &texture); + sk_sp<GrTexture> texture = GrMakeCachedBitmapTexture(fContext, bitmap, params, gammaTreatment); if (nullptr == texture) { return; } @@ -1140,19 +1089,19 @@ void SkGpuDevice::internalDrawBitmap(const SkBitmap& bitmap, } textureDomain.setLTRB(left, top, right, bottom); if (bicubic) { - fp = GrBicubicEffect::Make(texture, std::move(colorSpaceXform), texMatrix, + fp = GrBicubicEffect::Make(texture.get(), std::move(colorSpaceXform), texMatrix, textureDomain); } else { - fp = GrTextureDomainEffect::Make(texture, std::move(colorSpaceXform), texMatrix, + fp = GrTextureDomainEffect::Make(texture.get(), std::move(colorSpaceXform), texMatrix, textureDomain, GrTextureDomain::kClamp_Mode, params.filterMode()); } } else if (bicubic) { SkASSERT(GrTextureParams::kNone_FilterMode == params.filterMode()); SkShader::TileMode tileModes[2] = { params.getTileModeX(), params.getTileModeY() }; - fp = GrBicubicEffect::Make(texture, std::move(colorSpaceXform), texMatrix, tileModes); + fp = GrBicubicEffect::Make(texture.get(), std::move(colorSpaceXform), texMatrix, tileModes); } else { - fp = GrSimpleTextureEffect::Make(texture, std::move(colorSpaceXform), texMatrix, params); + fp = GrSimpleTextureEffect::Make(texture.get(), std::move(colorSpaceXform), texMatrix, params); } GrPaint grPaint; @@ -1182,8 +1131,8 @@ void SkGpuDevice::drawSprite(const SkDraw& draw, const SkBitmap& bitmap, return; } - sk_sp<GrTexture> texture = sk_ref_sp(bitmap.getTexture()); - if (!texture) { + sk_sp<GrTexture> texture; + { SkAutoLockPixels alp(bitmap, true); if (!bitmap.readyToDraw()) { return; @@ -1273,12 +1222,7 @@ void SkGpuDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, const SkPaint& paint, SkCanvas::SrcRectConstraint constraint) { ASSERT_SINGLE_OWNER CHECK_SHOULD_DRAW(draw); - if (bitmap.getTexture()) { - GrBitmapTextureAdjuster adjuster(&bitmap); - this->drawTextureProducer(&adjuster, src, &origDst, constraint, *draw.fMatrix, fClip, - paint); - return; - } + // The src rect is inferred to be the bmp bounds if not provided. Otherwise, the src rect must // be clipped to the bmp bounds. To determine tiling parameters we need the filter mode which // in turn requires knowing the src-to-dst mapping. If the src was clipped to the bmp bounds @@ -1357,23 +1301,21 @@ void SkGpuDevice::drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap, } sk_sp<SkSpecialImage> SkGpuDevice::makeSpecial(const SkBitmap& bitmap) { - SkASSERT(!bitmap.getTexture()); - SkAutoLockPixels alp(bitmap, true); if (!bitmap.readyToDraw()) { return nullptr; } - GrTexture* texture; - AutoBitmapTexture abt(fContext, bitmap, GrTextureParams::ClampNoFilter(), - SkSourceGammaTreatment::kRespect, &texture); + sk_sp<GrTexture> texture = GrMakeCachedBitmapTexture(fContext, bitmap, + GrTextureParams::ClampNoFilter(), + SkSourceGammaTreatment::kRespect); if (!texture) { return nullptr; } return SkSpecialImage::MakeFromGpu(bitmap.bounds(), bitmap.getGenerationID(), - sk_ref_sp(texture), + texture, sk_ref_sp(bitmap.colorSpace()), &this->surfaceProps()); } @@ -1568,13 +1510,8 @@ void SkGpuDevice::drawImageNine(const SkDraw& draw, const SkImage* image, void SkGpuDevice::drawBitmapNine(const SkDraw& draw, const SkBitmap& bitmap, const SkIRect& center, const SkRect& dst, const SkPaint& paint) { ASSERT_SINGLE_OWNER - if (bitmap.getTexture()) { - GrBitmapTextureAdjuster adjuster(&bitmap); - this->drawProducerNine(draw, &adjuster, center, dst, paint); - } else { - GrBitmapTextureMaker maker(fContext, bitmap); - this->drawProducerNine(draw, &maker, center, dst, paint); - } + GrBitmapTextureMaker maker(fContext, bitmap); + this->drawProducerNine(draw, &maker, center, dst, paint); } /////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index cc05f7ac38..51eb91021d 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -421,13 +421,16 @@ GrTexture* GrUploadMipMapToTexture(GrContext* ctx, const SkImageInfo& info, GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, const SkBitmap& bitmap, const GrTextureParams& params, SkSourceGammaTreatment gammaTreatment) { - if (bitmap.getTexture()) { - return GrBitmapTextureAdjuster(&bitmap).refTextureSafeForParams(params, gammaTreatment, - nullptr); - } return GrBitmapTextureMaker(ctx, bitmap).refTextureForParams(params, gammaTreatment); } +sk_sp<GrTexture> GrMakeCachedBitmapTexture(GrContext* ctx, const SkBitmap& bitmap, + const GrTextureParams& params, + SkSourceGammaTreatment gammaTreatment) { + GrTexture* tex = GrBitmapTextureMaker(ctx, bitmap).refTextureForParams(params, gammaTreatment); + return sk_sp<GrTexture>(tex); +} + /////////////////////////////////////////////////////////////////////////////// // alphatype is ignore for now, but if GrPixelConfig is expanded to encompass diff --git a/src/image/SkImage_Raster.cpp b/src/image/SkImage_Raster.cpp index 338c778ad9..a8ef21d1da 100644 --- a/src/image/SkImage_Raster.cpp +++ b/src/image/SkImage_Raster.cpp @@ -253,8 +253,6 @@ sk_sp<SkImage> SkMakeImageFromPixelRef(const SkImageInfo& info, SkPixelRef* pr, } sk_sp<SkImage> SkMakeImageFromRasterBitmap(const SkBitmap& bm, ForceCopyMode forceCopy) { - SkASSERT(nullptr == bm.getTexture()); - bool hasColorTable = false; if (kIndex_8_SkColorType == bm.colorType()) { SkAutoLockPixels autoLockPixels(bm); diff --git a/tools/picture_utils.cpp b/tools/picture_utils.cpp index a6803c67db..453320122b 100644 --- a/tools/picture_utils.cpp +++ b/tools/picture_utils.cpp @@ -18,9 +18,8 @@ namespace sk_tools { void force_all_opaque(const SkBitmap& bitmap) { - SkASSERT(nullptr == bitmap.getTexture()); SkASSERT(kN32_SkColorType == bitmap.colorType()); - if (bitmap.getTexture() || kN32_SkColorType == bitmap.colorType()) { + if (kN32_SkColorType == bitmap.colorType()) { return; } |