diff options
author | 2016-07-20 13:55:39 -0700 | |
---|---|---|
committer | 2016-07-20 13:55:39 -0700 | |
commit | dddbe380b0e6b690041a4e020aefe57f1b21691a (patch) | |
tree | 4a2afaa3617f174558fdd544dac7d8205646facd /src | |
parent | 7d46f4af7dc759002537a172af121f2bfe200981 (diff) |
Adding an SkColorSpace to SkImage_Gpu
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2165703003
Review-Url: https://codereview.chromium.org/2165703003
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkSpecialImage.cpp | 9 | ||||
-rw-r--r-- | src/gpu/GrTextureParamsAdjuster.h | 3 | ||||
-rw-r--r-- | src/gpu/SkGr.cpp | 5 | ||||
-rw-r--r-- | src/image/SkImage.cpp | 10 | ||||
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 59 | ||||
-rw-r--r-- | src/image/SkImage_Gpu.h | 7 | ||||
-rw-r--r-- | src/image/SkSurface_Gpu.cpp | 3 |
7 files changed, 59 insertions, 37 deletions
diff --git a/src/core/SkSpecialImage.cpp b/src/core/SkSpecialImage.cpp index a4ffa198d5..4a3e46e117 100644 --- a/src/core/SkSpecialImage.cpp +++ b/src/core/SkSpecialImage.cpp @@ -449,9 +449,10 @@ public: SkRect dst = SkRect::MakeXYWH(x, y, this->subset().width(), this->subset().height()); + // TODO: Supply correct color space after we're storing it here auto img = sk_sp<SkImage>(new SkImage_Gpu(fTexture->width(), fTexture->height(), this->uniqueID(), fAlphaType, fTexture.get(), - SkBudgeted::kNo)); + nullptr, SkBudgeted::kNo)); canvas->drawImageRect(img, this->subset(), dst, paint, SkCanvas::kStrict_SrcRectConstraint); @@ -528,9 +529,10 @@ public: fTexture->width() == subset.width() && fTexture->height() == subset.height()) { // The existing GrTexture is already tight so reuse it in the SkImage + // TODO: Supply correct color space after we're storing it here return sk_make_sp<SkImage_Gpu>(fTexture->width(), fTexture->height(), kNeedNewImageUniqueID, - fAlphaType, fTexture.get(), SkBudgeted::kYes); + fAlphaType, fTexture.get(), nullptr, SkBudgeted::kYes); } GrContext* ctx = fTexture->getContext(); @@ -543,8 +545,9 @@ public: return nullptr; } ctx->copySurface(subTx.get(), fTexture.get(), subset, SkIPoint::Make(0, 0)); + // TODO: Supply correct color space after we're storing it here return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, - fAlphaType, subTx.get(), SkBudgeted::kYes); + fAlphaType, subTx.get(), nullptr, SkBudgeted::kYes); } sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override { diff --git a/src/gpu/GrTextureParamsAdjuster.h b/src/gpu/GrTextureParamsAdjuster.h index 7513eb4d2f..eee761fbbe 100644 --- a/src/gpu/GrTextureParamsAdjuster.h +++ b/src/gpu/GrTextureParamsAdjuster.h @@ -72,6 +72,7 @@ public: int width() const { return fWidth; } int height() const { return fHeight; } bool isAlphaOnly() const { return fIsAlphaOnly; } + virtual SkColorSpace* getColorSpace() = 0; protected: GrTextureProducer(int width, int height, bool isAlphaOnly) @@ -108,8 +109,6 @@ protected: */ virtual void didCacheCopy(const GrUniqueKey& copyKey) = 0; - virtual SkColorSpace* getColorSpace() = 0; - private: const int fWidth; const int fHeight; diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp index 26947182f8..3b3783ad35 100644 --- a/src/gpu/SkGr.cpp +++ b/src/gpu/SkGr.cpp @@ -742,7 +742,8 @@ bool SkPaintToGrPaintWithTexture(GrContext* context, //////////////////////////////////////////////////////////////////////////////////////////////// -SkImageInfo GrMakeInfoFromTexture(GrTexture* tex, int w, int h, bool isOpaque) { +SkImageInfo GrMakeInfoFromTexture(GrTexture* tex, int w, int h, bool isOpaque, + sk_sp<SkColorSpace> colorSpace) { #ifdef SK_DEBUG const GrSurfaceDesc& desc = tex->desc(); SkASSERT(w <= desc.fWidth); @@ -754,7 +755,7 @@ SkImageInfo GrMakeInfoFromTexture(GrTexture* tex, int w, int h, bool isOpaque) { if (!GrPixelConfigToColorAndColorSpace(config, &ct, nullptr)) { ct = kUnknown_SkColorType; } - return SkImageInfo::Make(w, h, ct, at); + return SkImageInfo::Make(w, h, ct, at, std::move(colorSpace)); } diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp index e6d66a1d32..8e4640755c 100644 --- a/src/image/SkImage.cpp +++ b/src/image/SkImage.cpp @@ -304,7 +304,8 @@ sk_sp<SkImage> SkImage::MakeFromBitmap(const SkBitmap& bm) { } const SkImageInfo info = bm.info(); return sk_make_sp<SkImage_Gpu>(info.width(), info.height(), bm.getGenerationID(), - info.alphaType(), tex, SkBudgeted::kNo); + info.alphaType(), tex, sk_ref_sp(info.colorSpace()), + SkBudgeted::kNo); } #endif @@ -396,7 +397,7 @@ sk_sp<SkImage> SkImage::MakeTextureFromPixmap(GrContext*, const SkPixmap&, SkBud } sk_sp<SkImage> SkImage::MakeFromTexture(GrContext*, const GrBackendTextureDesc&, SkAlphaType, - TextureReleaseProc, ReleaseContext) { + sk_sp<SkColorSpace>, TextureReleaseProc, ReleaseContext) { return nullptr; } @@ -412,14 +413,15 @@ sk_sp<SkImage> SkImage::MakeFromDeferredTextureImageData(GrContext* context, con } sk_sp<SkImage> SkImage::MakeFromAdoptedTexture(GrContext*, const GrBackendTextureDesc&, - SkAlphaType) { + SkAlphaType, sk_sp<SkColorSpace>) { return nullptr; } sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace space, const GrBackendObject yuvTextureHandles[3], const SkISize yuvSizes[3], - GrSurfaceOrigin origin) { + GrSurfaceOrigin origin, + sk_sp<SkColorSpace> imageColorSpace) { return nullptr; } diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index de67d6ca9e..b3604b999b 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -20,11 +20,12 @@ #include "SkPixelRef.h" SkImage_Gpu::SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType at, GrTexture* tex, - SkBudgeted budgeted) + sk_sp<SkColorSpace> colorSpace, SkBudgeted budgeted) : INHERITED(w, h, uniqueID) , fTexture(SkRef(tex)) , fAlphaType(at) , fBudgeted(budgeted) + , fColorSpace(std::move(colorSpace)) , fAddedRasterVersionToCache(false) { SkASSERT(tex->width() == w); @@ -43,8 +44,9 @@ extern void SkTextureImageApplyBudgetedDecision(SkImage* image) { } } -static SkImageInfo make_info(int w, int h, bool isOpaque) { - return SkImageInfo::MakeN32(w, h, isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); +static SkImageInfo make_info(int w, int h, bool isOpaque, sk_sp<SkColorSpace> colorSpace) { + return SkImageInfo::MakeN32(w, h, isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType, + std::move(colorSpace)); } bool SkImage_Gpu::getROPixels(SkBitmap* dst, CachingHint chint) const { @@ -55,7 +57,8 @@ bool SkImage_Gpu::getROPixels(SkBitmap* dst, CachingHint chint) const { return true; } - if (!dst->tryAllocPixels(make_info(this->width(), this->height(), this->isOpaque()))) { + if (!dst->tryAllocPixels(make_info(this->width(), this->height(), this->isOpaque(), + this->fColorSpace))) { return false; } if (!fTexture->readPixels(0, 0, dst->width(), dst->height(), kSkia8888_GrPixelConfig, @@ -72,7 +75,7 @@ bool SkImage_Gpu::getROPixels(SkBitmap* dst, CachingHint chint) const { } bool SkImage_Gpu::asBitmapForImageFilters(SkBitmap* bitmap) const { - bitmap->setInfo(make_info(this->width(), this->height(), this->isOpaque())); + bitmap->setInfo(make_info(this->width(), this->height(), this->isOpaque(), fColorSpace)); bitmap->setPixelRef(new SkGrPixelRef(bitmap->info(), fTexture))->unref(); bitmap->pixelRef()->setImmutableWithID(this->uniqueID()); return true; @@ -147,13 +150,14 @@ sk_sp<SkImage> SkImage_Gpu::onMakeSubset(const SkIRect& subset) const { } ctx->copySurface(subTx.get(), fTexture, subset, SkIPoint::Make(0, 0)); return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, - fAlphaType, subTx.get(), fBudgeted); + fAlphaType, subTx.get(), fColorSpace, fBudgeted); } /////////////////////////////////////////////////////////////////////////////////////////////////// static sk_sp<SkImage> new_wrapped_texture_common(GrContext* ctx, const GrBackendTextureDesc& desc, - SkAlphaType at, GrWrapOwnership ownership, + SkAlphaType at, sk_sp<SkColorSpace> colorSpace, + GrWrapOwnership ownership, SkImage::TextureReleaseProc releaseProc, SkImage::ReleaseContext releaseCtx) { if (desc.fWidth <= 0 || desc.fHeight <= 0) { @@ -169,25 +173,28 @@ static sk_sp<SkImage> new_wrapped_texture_common(GrContext* ctx, const GrBackend const SkBudgeted budgeted = SkBudgeted::kNo; return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqueID, - at, tex, budgeted); + at, tex, colorSpace, budgeted); } sk_sp<SkImage> SkImage::MakeFromTexture(GrContext* ctx, const GrBackendTextureDesc& desc, - SkAlphaType at, TextureReleaseProc releaseP, - ReleaseContext releaseC) { - return new_wrapped_texture_common(ctx, desc, at, kBorrow_GrWrapOwnership, releaseP, releaseC); + SkAlphaType at, sk_sp<SkColorSpace> cs, + TextureReleaseProc releaseP, ReleaseContext releaseC) { + return new_wrapped_texture_common(ctx, desc, at, std::move(cs), kBorrow_GrWrapOwnership, + releaseP, releaseC); } sk_sp<SkImage> SkImage::MakeFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDesc& desc, - SkAlphaType at) { - return new_wrapped_texture_common(ctx, desc, at, kAdopt_GrWrapOwnership, nullptr, nullptr); + SkAlphaType at, sk_sp<SkColorSpace> cs) { + return new_wrapped_texture_common(ctx, desc, at, std::move(cs), kAdopt_GrWrapOwnership, + nullptr, nullptr); } static sk_sp<SkImage> make_from_yuv_textures_copy(GrContext* ctx, SkYUVColorSpace colorSpace, bool nv12, const GrBackendObject yuvTextureHandles[], const SkISize yuvSizes[], - GrSurfaceOrigin origin) { + GrSurfaceOrigin origin, + sk_sp<SkColorSpace> imageColorSpace) { const SkBudgeted budgeted = SkBudgeted::kYes; if (yuvSizes[0].fWidth <= 0 || yuvSizes[0].fHeight <= 0 || yuvSizes[1].fWidth <= 0 || @@ -262,21 +269,25 @@ static sk_sp<SkImage> make_from_yuv_textures_copy(GrContext* ctx, SkYUVColorSpac drawContext->drawRect(GrNoClip(), paint, SkMatrix::I(), rect); ctx->flushSurfaceWrites(drawContext->accessRenderTarget()); return sk_make_sp<SkImage_Gpu>(width, height, kNeedNewImageUniqueID, - kOpaque_SkAlphaType, - drawContext->asTexture().get(), budgeted); + kOpaque_SkAlphaType, drawContext->asTexture().get(), + std::move(imageColorSpace), budgeted); } sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace colorSpace, const GrBackendObject yuvTextureHandles[3], - const SkISize yuvSizes[3], GrSurfaceOrigin origin) { - return make_from_yuv_textures_copy(ctx, colorSpace, false, yuvTextureHandles, yuvSizes, origin); + const SkISize yuvSizes[3], GrSurfaceOrigin origin, + sk_sp<SkColorSpace> imageColorSpace) { + return make_from_yuv_textures_copy(ctx, colorSpace, false, yuvTextureHandles, yuvSizes, origin, + std::move(imageColorSpace)); } sk_sp<SkImage> SkImage::MakeFromNV12TexturesCopy(GrContext* ctx, SkYUVColorSpace colorSpace, const GrBackendObject yuvTextureHandles[2], const SkISize yuvSizes[2], - GrSurfaceOrigin origin) { - return make_from_yuv_textures_copy(ctx, colorSpace, true, yuvTextureHandles, yuvSizes, origin); + GrSurfaceOrigin origin, + sk_sp<SkColorSpace> imageColorSpace) { + return make_from_yuv_textures_copy(ctx, colorSpace, true, yuvTextureHandles, yuvSizes, origin, + std::move(imageColorSpace)); } static sk_sp<SkImage> create_image_from_maker(GrTextureMaker* maker, SkAlphaType at, uint32_t id) { @@ -286,7 +297,7 @@ static sk_sp<SkImage> create_image_from_maker(GrTextureMaker* maker, SkAlphaType return nullptr; } return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), id, at, texture, - SkBudgeted::kNo); + sk_ref_sp(maker->getColorSpace()), SkBudgeted::kNo); } sk_sp<SkImage> SkImage::makeTextureImage(GrContext *context) const { @@ -346,7 +357,8 @@ sk_sp<SkImage> SkImage::MakeTextureFromPixmap(GrContext* ctx, const SkPixmap& pi return nullptr; } return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNewImageUniqueID, - pixmap.alphaType(), texture, budgeted); + pixmap.alphaType(), texture, + sk_ref_sp(pixmap.info().colorSpace()), budgeted); } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -544,5 +556,6 @@ sk_sp<SkImage> SkImage::MakeTextureFromMipMap(GrContext* ctx, const SkImageInfo& return nullptr; } return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNewImageUniqueID, - info.alphaType(), texture, budgeted); + info.alphaType(), texture, sk_ref_sp(info.colorSpace()), + budgeted); } diff --git a/src/image/SkImage_Gpu.h b/src/image/SkImage_Gpu.h index 3cef934032..6206416bce 100644 --- a/src/image/SkImage_Gpu.h +++ b/src/image/SkImage_Gpu.h @@ -23,11 +23,13 @@ public: * An "image" can be a subset/window into a larger texture, so we explicit take the * width and height. */ - SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType, GrTexture*, SkBudgeted); + SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType, GrTexture*, sk_sp<SkColorSpace>, + SkBudgeted); ~SkImage_Gpu() override; SkImageInfo onImageInfo() const override { - return GrMakeInfoFromTexture(fTexture, fTexture->width(), fTexture->height(), isOpaque()); + return GrMakeInfoFromTexture(fTexture, fTexture->width(), fTexture->height(), isOpaque(), + fColorSpace); } void applyBudgetDecision() const { @@ -58,6 +60,7 @@ private: SkAutoTUnref<GrTexture> fTexture; const SkAlphaType fAlphaType; const SkBudgeted fBudgeted; + sk_sp<SkColorSpace> fColorSpace; mutable SkAtomic<bool> fAddedRasterVersionToCache; diff --git a/src/image/SkSurface_Gpu.cpp b/src/image/SkSurface_Gpu.cpp index 5d1555f323..fa3781476f 100644 --- a/src/image/SkSurface_Gpu.cpp +++ b/src/image/SkSurface_Gpu.cpp @@ -100,7 +100,8 @@ sk_sp<SkImage> SkSurface_Gpu::onNewImageSnapshot(SkBudgeted budgeted, ForceCopyM sk_sp<SkImage> image; if (tex) { image = sk_make_sp<SkImage_Gpu>(info.width(), info.height(), kNeedNewImageUniqueID, - info.alphaType(), tex, budgeted); + info.alphaType(), tex, sk_ref_sp(info.colorSpace()), + budgeted); } return image; } |