| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include <cstddef> | 8 #include <cstddef> |
| 9 #include <cstring> | 9 #include <cstring> |
| 10 #include <type_traits> | 10 #include <type_traits> |
| 11 | 11 |
| 12 #include "SkAutoPixmapStorage.h" | 12 #include "SkAutoPixmapStorage.h" |
| 13 #include "GrCaps.h" | 13 #include "GrCaps.h" |
| 14 #include "GrContext.h" | 14 #include "GrContext.h" |
| 15 #include "GrDrawContext.h" | 15 #include "GrDrawContext.h" |
| 16 #include "GrImageIDTextureAdjuster.h" | 16 #include "GrImageIDTextureAdjuster.h" |
| 17 #include "GrTexturePriv.h" | 17 #include "GrTexturePriv.h" |
| 18 #include "effects/GrYUVEffect.h" | 18 #include "effects/GrYUVEffect.h" |
| 19 #include "SkCanvas.h" | 19 #include "SkCanvas.h" |
| 20 #include "SkBitmapCache.h" | 20 #include "SkBitmapCache.h" |
| 21 #include "SkGrPriv.h" | 21 #include "SkGrPriv.h" |
| 22 #include "SkImage_Gpu.h" | 22 #include "SkImage_Gpu.h" |
| 23 #include "SkMipMap.h" | 23 #include "SkMipMap.h" |
| 24 #include "SkPixelRef.h" | 24 #include "SkPixelRef.h" |
| 25 | 25 |
| 26 SkImage_Gpu::SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType at, GrText
ure* tex, | 26 SkImage_Gpu::SkImage_Gpu(int w, int h, uint32_t uniqueID, SkAlphaType at, sk_sp<
GrTexture> tex, |
| 27 sk_sp<SkColorSpace> colorSpace, SkBudgeted budgeted) | 27 sk_sp<SkColorSpace> colorSpace, SkBudgeted budgeted) |
| 28 : INHERITED(w, h, uniqueID) | 28 : INHERITED(w, h, uniqueID) |
| 29 , fTexture(SkRef(tex)) | 29 , fTexture(std::move(tex)) |
| 30 , fAlphaType(at) | 30 , fAlphaType(at) |
| 31 , fBudgeted(budgeted) | 31 , fBudgeted(budgeted) |
| 32 , fColorSpace(std::move(colorSpace)) | 32 , fColorSpace(std::move(colorSpace)) |
| 33 , fAddedRasterVersionToCache(false) | 33 , fAddedRasterVersionToCache(false) |
| 34 { | 34 { |
| 35 SkASSERT(tex->width() == w); | 35 SkASSERT(fTexture->width() == w); |
| 36 SkASSERT(tex->height() == h); | 36 SkASSERT(fTexture->height() == h); |
| 37 } | 37 } |
| 38 | 38 |
| 39 SkImage_Gpu::~SkImage_Gpu() { | 39 SkImage_Gpu::~SkImage_Gpu() { |
| 40 if (fAddedRasterVersionToCache.load()) { | 40 if (fAddedRasterVersionToCache.load()) { |
| 41 SkNotifyBitmapGenIDIsStale(this->uniqueID()); | 41 SkNotifyBitmapGenIDIsStale(this->uniqueID()); |
| 42 } | 42 } |
| 43 } | 43 } |
| 44 | 44 |
| 45 extern void SkTextureImageApplyBudgetedDecision(SkImage* image) { | 45 extern void SkTextureImageApplyBudgetedDecision(SkImage* image) { |
| 46 if (image->isTextureBacked()) { | 46 if (image->isTextureBacked()) { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 sk_sp<SkImage> SkImage_Gpu::onMakeSubset(const SkIRect& subset) const { | 142 sk_sp<SkImage> SkImage_Gpu::onMakeSubset(const SkIRect& subset) const { |
| 143 GrContext* ctx = fTexture->getContext(); | 143 GrContext* ctx = fTexture->getContext(); |
| 144 GrSurfaceDesc desc = fTexture->desc(); | 144 GrSurfaceDesc desc = fTexture->desc(); |
| 145 desc.fWidth = subset.width(); | 145 desc.fWidth = subset.width(); |
| 146 desc.fHeight = subset.height(); | 146 desc.fHeight = subset.height(); |
| 147 | 147 |
| 148 sk_sp<GrTexture> subTx(ctx->textureProvider()->createTexture(desc, fBudgeted
)); | 148 sk_sp<GrTexture> subTx(ctx->textureProvider()->createTexture(desc, fBudgeted
)); |
| 149 if (!subTx) { | 149 if (!subTx) { |
| 150 return nullptr; | 150 return nullptr; |
| 151 } | 151 } |
| 152 ctx->copySurface(subTx.get(), fTexture, subset, SkIPoint::Make(0, 0)); | 152 ctx->copySurface(subTx.get(), fTexture.get(), subset, SkIPoint::Make(0, 0)); |
| 153 return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqu
eID, | 153 return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqu
eID, |
| 154 fAlphaType, subTx.get(), fColorSpace, fBudget
ed); | 154 fAlphaType, std::move(subTx), fColorSpace, fB
udgeted); |
| 155 } | 155 } |
| 156 | 156 |
| 157 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 157 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 158 | 158 |
| 159 static sk_sp<SkImage> new_wrapped_texture_common(GrContext* ctx, const GrBackend
TextureDesc& desc, | 159 static sk_sp<SkImage> new_wrapped_texture_common(GrContext* ctx, const GrBackend
TextureDesc& desc, |
| 160 SkAlphaType at, sk_sp<SkColorSp
ace> colorSpace, | 160 SkAlphaType at, sk_sp<SkColorSp
ace> colorSpace, |
| 161 GrWrapOwnership ownership, | 161 GrWrapOwnership ownership, |
| 162 SkImage::TextureReleaseProc rel
easeProc, | 162 SkImage::TextureReleaseProc rel
easeProc, |
| 163 SkImage::ReleaseContext release
Ctx) { | 163 SkImage::ReleaseContext release
Ctx) { |
| 164 if (desc.fWidth <= 0 || desc.fHeight <= 0) { | 164 if (desc.fWidth <= 0 || desc.fHeight <= 0) { |
| 165 return nullptr; | 165 return nullptr; |
| 166 } | 166 } |
| 167 SkAutoTUnref<GrTexture> tex(ctx->textureProvider()->wrapBackendTexture(desc,
ownership)); | 167 sk_sp<GrTexture> tex = ctx->textureProvider()->wrapBackendTexture(desc, owne
rship); |
| 168 if (!tex) { | 168 if (!tex) { |
| 169 return nullptr; | 169 return nullptr; |
| 170 } | 170 } |
| 171 if (releaseProc) { | 171 if (releaseProc) { |
| 172 tex->setRelease(releaseProc, releaseCtx); | 172 tex->setRelease(releaseProc, releaseCtx); |
| 173 } | 173 } |
| 174 | 174 |
| 175 const SkBudgeted budgeted = SkBudgeted::kNo; | 175 const SkBudgeted budgeted = SkBudgeted::kNo; |
| 176 return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqu
eID, | 176 return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageUniqu
eID, |
| 177 at, tex, colorSpace, budgeted); | 177 at, std::move(tex), std::move(colorSpace), bu
dgeted); |
| 178 } | 178 } |
| 179 | 179 |
| 180 sk_sp<SkImage> SkImage::MakeFromTexture(GrContext* ctx, const GrBackendTextureDe
sc& desc, | 180 sk_sp<SkImage> SkImage::MakeFromTexture(GrContext* ctx, const GrBackendTextureDe
sc& desc, |
| 181 SkAlphaType at, sk_sp<SkColorSpace> cs, | 181 SkAlphaType at, sk_sp<SkColorSpace> cs, |
| 182 TextureReleaseProc releaseP, ReleaseCont
ext releaseC) { | 182 TextureReleaseProc releaseP, ReleaseCont
ext releaseC) { |
| 183 return new_wrapped_texture_common(ctx, desc, at, std::move(cs), kBorrow_GrWr
apOwnership, | 183 return new_wrapped_texture_common(ctx, desc, at, std::move(cs), kBorrow_GrWr
apOwnership, |
| 184 releaseP, releaseC); | 184 releaseP, releaseC); |
| 185 } | 185 } |
| 186 | 186 |
| 187 sk_sp<SkImage> SkImage::MakeFromAdoptedTexture(GrContext* ctx, const GrBackendTe
xtureDesc& desc, | 187 sk_sp<SkImage> SkImage::MakeFromAdoptedTexture(GrContext* ctx, const GrBackendTe
xtureDesc& desc, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 GrPaint paint; | 264 GrPaint paint; |
| 265 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); | 265 paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); |
| 266 paint.addColorFragmentProcessor( | 266 paint.addColorFragmentProcessor( |
| 267 GrYUVEffect::MakeYUVToRGB(yTex.get(), uTex.get(), vTex.get(), yuvSizes,
colorSpace, nv12)); | 267 GrYUVEffect::MakeYUVToRGB(yTex.get(), uTex.get(), vTex.get(), yuvSizes,
colorSpace, nv12)); |
| 268 | 268 |
| 269 const SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(heigh
t)); | 269 const SkRect rect = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(heigh
t)); |
| 270 | 270 |
| 271 drawContext->drawRect(GrNoClip(), paint, SkMatrix::I(), rect); | 271 drawContext->drawRect(GrNoClip(), paint, SkMatrix::I(), rect); |
| 272 ctx->flushSurfaceWrites(drawContext->accessRenderTarget()); | 272 ctx->flushSurfaceWrites(drawContext->accessRenderTarget()); |
| 273 return sk_make_sp<SkImage_Gpu>(width, height, kNeedNewImageUniqueID, | 273 return sk_make_sp<SkImage_Gpu>(width, height, kNeedNewImageUniqueID, |
| 274 kOpaque_SkAlphaType, drawContext->asTexture()
.get(), | 274 kOpaque_SkAlphaType, drawContext->asTexture()
, |
| 275 sk_ref_sp(drawContext->getColorSpace()), budg
eted); | 275 sk_ref_sp(drawContext->getColorSpace()), budg
eted); |
| 276 } | 276 } |
| 277 | 277 |
| 278 sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace
colorSpace, | 278 sk_sp<SkImage> SkImage::MakeFromYUVTexturesCopy(GrContext* ctx, SkYUVColorSpace
colorSpace, |
| 279 const GrBackendObject yuvTexture
Handles[3], | 279 const GrBackendObject yuvTexture
Handles[3], |
| 280 const SkISize yuvSizes[3], GrSur
faceOrigin origin, | 280 const SkISize yuvSizes[3], GrSur
faceOrigin origin, |
| 281 sk_sp<SkColorSpace> imageColorSp
ace) { | 281 sk_sp<SkColorSpace> imageColorSp
ace) { |
| 282 return make_from_yuv_textures_copy(ctx, colorSpace, false, yuvTextureHandles
, yuvSizes, origin, | 282 return make_from_yuv_textures_copy(ctx, colorSpace, false, yuvTextureHandles
, yuvSizes, origin, |
| 283 std::move(imageColorSpace)); | 283 std::move(imageColorSpace)); |
| 284 } | 284 } |
| 285 | 285 |
| 286 sk_sp<SkImage> SkImage::MakeFromNV12TexturesCopy(GrContext* ctx, SkYUVColorSpace
colorSpace, | 286 sk_sp<SkImage> SkImage::MakeFromNV12TexturesCopy(GrContext* ctx, SkYUVColorSpace
colorSpace, |
| 287 const GrBackendObject yuvTextur
eHandles[2], | 287 const GrBackendObject yuvTextur
eHandles[2], |
| 288 const SkISize yuvSizes[2], | 288 const SkISize yuvSizes[2], |
| 289 GrSurfaceOrigin origin, | 289 GrSurfaceOrigin origin, |
| 290 sk_sp<SkColorSpace> imageColorS
pace) { | 290 sk_sp<SkColorSpace> imageColorS
pace) { |
| 291 return make_from_yuv_textures_copy(ctx, colorSpace, true, yuvTextureHandles,
yuvSizes, origin, | 291 return make_from_yuv_textures_copy(ctx, colorSpace, true, yuvTextureHandles,
yuvSizes, origin, |
| 292 std::move(imageColorSpace)); | 292 std::move(imageColorSpace)); |
| 293 } | 293 } |
| 294 | 294 |
| 295 static sk_sp<SkImage> create_image_from_maker(GrTextureMaker* maker, SkAlphaType
at, uint32_t id) { | 295 static sk_sp<SkImage> create_image_from_maker(GrTextureMaker* maker, SkAlphaType
at, uint32_t id) { |
| 296 SkAutoTUnref<GrTexture> texture(maker->refTextureForParams(GrTextureParams::
ClampNoFilter(), | 296 sk_sp<GrTexture> texture(maker->refTextureForParams(GrTextureParams::ClampNo
Filter(), |
| 297 SkSourceGammaTrea
tment::kRespect)); | 297 SkSourceGammaTreatment::
kRespect)); |
| 298 if (!texture) { | 298 if (!texture) { |
| 299 return nullptr; | 299 return nullptr; |
| 300 } | 300 } |
| 301 return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), id, at,
texture, | 301 return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), id, at,
std::move(texture), |
| 302 sk_ref_sp(maker->getColorSpace()), SkBudgeted
::kNo); | 302 sk_ref_sp(maker->getColorSpace()), SkBudgeted
::kNo); |
| 303 } | 303 } |
| 304 | 304 |
| 305 sk_sp<SkImage> SkImage::makeTextureImage(GrContext *context) const { | 305 sk_sp<SkImage> SkImage::makeTextureImage(GrContext *context) const { |
| 306 if (!context) { | 306 if (!context) { |
| 307 return nullptr; | 307 return nullptr; |
| 308 } | 308 } |
| 309 if (GrTexture* peek = as_IB(this)->peekTexture()) { | 309 if (GrTexture* peek = as_IB(this)->peekTexture()) { |
| 310 return peek->getContext() == context ? sk_ref_sp(const_cast<SkImage*>(th
is)) : nullptr; | 310 return peek->getContext() == context ? sk_ref_sp(const_cast<SkImage*>(th
is)) : nullptr; |
| 311 } | 311 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 338 return nullptr; | 338 return nullptr; |
| 339 } | 339 } |
| 340 return MakeRasterData(info, data, rowBytes); | 340 return MakeRasterData(info, data, rowBytes); |
| 341 } | 341 } |
| 342 | 342 |
| 343 sk_sp<SkImage> SkImage::MakeTextureFromPixmap(GrContext* ctx, const SkPixmap& pi
xmap, | 343 sk_sp<SkImage> SkImage::MakeTextureFromPixmap(GrContext* ctx, const SkPixmap& pi
xmap, |
| 344 SkBudgeted budgeted) { | 344 SkBudgeted budgeted) { |
| 345 if (!ctx) { | 345 if (!ctx) { |
| 346 return nullptr; | 346 return nullptr; |
| 347 } | 347 } |
| 348 SkAutoTUnref<GrTexture> texture(GrUploadPixmapToTexture(ctx, pixmap, budgete
d)); | 348 sk_sp<GrTexture> texture(GrUploadPixmapToTexture(ctx, pixmap, budgeted)); |
| 349 if (!texture) { | 349 if (!texture) { |
| 350 return nullptr; | 350 return nullptr; |
| 351 } | 351 } |
| 352 return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNew
ImageUniqueID, | 352 return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNew
ImageUniqueID, |
| 353 pixmap.alphaType(), texture, | 353 pixmap.alphaType(), std::move(texture), |
| 354 sk_ref_sp(pixmap.info().colorSpace()), budget
ed); | 354 sk_ref_sp(pixmap.info().colorSpace()), budget
ed); |
| 355 } | 355 } |
| 356 | 356 |
| 357 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 357 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 358 | 358 |
| 359 namespace { | 359 namespace { |
| 360 struct MipMapLevelData { | 360 struct MipMapLevelData { |
| 361 void* fPixelData; | 361 void* fPixelData; |
| 362 size_t fRowBytes; | 362 size_t fRowBytes; |
| 363 }; | 363 }; |
| (...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 695 | 695 |
| 696 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 696 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 697 | 697 |
| 698 sk_sp<SkImage> SkImage::MakeTextureFromMipMap(GrContext* ctx, const SkImageInfo&
info, | 698 sk_sp<SkImage> SkImage::MakeTextureFromMipMap(GrContext* ctx, const SkImageInfo&
info, |
| 699 const GrMipLevel* texels, int mipL
evelCount, | 699 const GrMipLevel* texels, int mipL
evelCount, |
| 700 SkBudgeted budgeted, | 700 SkBudgeted budgeted, |
| 701 SkSourceGammaTreatment gammaTreatm
ent) { | 701 SkSourceGammaTreatment gammaTreatm
ent) { |
| 702 if (!ctx) { | 702 if (!ctx) { |
| 703 return nullptr; | 703 return nullptr; |
| 704 } | 704 } |
| 705 SkAutoTUnref<GrTexture> texture(GrUploadMipMapToTexture(ctx, info, texels, m
ipLevelCount)); | 705 sk_sp<GrTexture> texture(GrUploadMipMapToTexture(ctx, info, texels, mipLevel
Count)); |
| 706 if (!texture) { | 706 if (!texture) { |
| 707 return nullptr; | 707 return nullptr; |
| 708 } | 708 } |
| 709 texture->texturePriv().setGammaTreatment(gammaTreatment); | 709 texture->texturePriv().setGammaTreatment(gammaTreatment); |
| 710 return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNew
ImageUniqueID, | 710 return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNew
ImageUniqueID, |
| 711 info.alphaType(), texture, sk_ref_sp(info.col
orSpace()), | 711 info.alphaType(), std::move(texture), |
| 712 budgeted); | 712 sk_ref_sp(info.colorSpace()), budgeted); |
| 713 } | 713 } |
| OLD | NEW |