| 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 "SkAutoPixmapStorage.h" | 8 #include "SkAutoPixmapStorage.h" |
| 9 #include "GrCaps.h" | 9 #include "GrCaps.h" |
| 10 #include "GrContext.h" | 10 #include "GrContext.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 } | 44 } |
| 45 | 45 |
| 46 SkImageInfo SkImage_Gpu::onImageInfo() const { | 46 SkImageInfo SkImage_Gpu::onImageInfo() const { |
| 47 SkColorType ct; | 47 SkColorType ct; |
| 48 if (!GrPixelConfigToColorType(fTexture->config(), &ct)) { | 48 if (!GrPixelConfigToColorType(fTexture->config(), &ct)) { |
| 49 ct = kUnknown_SkColorType; | 49 ct = kUnknown_SkColorType; |
| 50 } | 50 } |
| 51 return SkImageInfo::Make(fTexture->width(), fTexture->height(), ct, fAlphaTy
pe, fColorSpace); | 51 return SkImageInfo::Make(fTexture->width(), fTexture->height(), ct, fAlphaTy
pe, fColorSpace); |
| 52 } | 52 } |
| 53 | 53 |
| 54 static SkImageInfo make_info(int w, int h, bool isOpaque, sk_sp<SkColorSpace> co
lorSpace) { | 54 static SkImageInfo make_info(int w, int h, SkAlphaType at, sk_sp<SkColorSpace> c
olorSpace) { |
| 55 return SkImageInfo::MakeN32(w, h, isOpaque ? kOpaque_SkAlphaType : kPremul_S
kAlphaType, | 55 return SkImageInfo::MakeN32(w, h, at, std::move(colorSpace)); |
| 56 std::move(colorSpace)); | |
| 57 } | 56 } |
| 58 | 57 |
| 59 bool SkImage_Gpu::getROPixels(SkBitmap* dst, CachingHint chint) const { | 58 bool SkImage_Gpu::getROPixels(SkBitmap* dst, CachingHint chint) const { |
| 60 if (SkBitmapCache::Find(this->uniqueID(), dst)) { | 59 if (SkBitmapCache::Find(this->uniqueID(), dst)) { |
| 61 SkASSERT(dst->getGenerationID() == this->uniqueID()); | 60 SkASSERT(dst->getGenerationID() == this->uniqueID()); |
| 62 SkASSERT(dst->isImmutable()); | 61 SkASSERT(dst->isImmutable()); |
| 63 SkASSERT(dst->getPixels()); | 62 SkASSERT(dst->getPixels()); |
| 64 return true; | 63 return true; |
| 65 } | 64 } |
| 66 | 65 |
| 67 if (!dst->tryAllocPixels(make_info(this->width(), this->height(), this->isOp
aque(), | 66 if (!dst->tryAllocPixels(make_info(this->width(), this->height(), this->alph
aType(), |
| 68 this->fColorSpace))) { | 67 this->fColorSpace))) { |
| 69 return false; | 68 return false; |
| 70 } | 69 } |
| 71 if (!fTexture->readPixels(0, 0, dst->width(), dst->height(), kSkia8888_GrPix
elConfig, | 70 if (!fTexture->readPixels(0, 0, dst->width(), dst->height(), kSkia8888_GrPix
elConfig, |
| 72 dst->getPixels(), dst->rowBytes())) { | 71 dst->getPixels(), dst->rowBytes())) { |
| 73 return false; | 72 return false; |
| 74 } | 73 } |
| 75 | 74 |
| 76 dst->pixelRef()->setImmutableWithID(this->uniqueID()); | 75 dst->pixelRef()->setImmutableWithID(this->uniqueID()); |
| 77 if (kAllow_CachingHint == chint) { | 76 if (kAllow_CachingHint == chint) { |
| 78 SkBitmapCache::Add(this->uniqueID(), *dst); | 77 SkBitmapCache::Add(this->uniqueID(), *dst); |
| 79 fAddedRasterVersionToCache.store(true); | 78 fAddedRasterVersionToCache.store(true); |
| 80 } | 79 } |
| 81 return true; | 80 return true; |
| 82 } | 81 } |
| 83 | 82 |
| 84 GrTexture* SkImage_Gpu::asTextureRef(GrContext* ctx, const GrTextureParams& para
ms, | 83 GrTexture* SkImage_Gpu::asTextureRef(GrContext* ctx, const GrTextureParams& para
ms, |
| 85 SkSourceGammaTreatment gammaTreatment) cons
t { | 84 SkSourceGammaTreatment gammaTreatment) cons
t { |
| 86 GrTextureAdjuster adjuster(this->peekTexture(), this->bounds(), this->unique
ID(), | 85 GrTextureAdjuster adjuster(this->peekTexture(), this->bounds(), this->unique
ID(), |
| 87 this->onImageInfo().colorSpace()); | 86 this->onImageInfo().colorSpace()); |
| 88 return adjuster.refTextureSafeForParams(params, gammaTreatment, nullptr); | 87 return adjuster.refTextureSafeForParams(params, gammaTreatment, nullptr); |
| 89 } | 88 } |
| 90 | 89 |
| 91 bool SkImage_Gpu::isOpaque() const { | |
| 92 return GrPixelConfigIsOpaque(fTexture->config()) || fAlphaType == kOpaque_Sk
AlphaType; | |
| 93 } | |
| 94 | |
| 95 static void apply_premul(const SkImageInfo& info, void* pixels, size_t rowBytes)
{ | 90 static void apply_premul(const SkImageInfo& info, void* pixels, size_t rowBytes)
{ |
| 96 switch (info.colorType()) { | 91 switch (info.colorType()) { |
| 97 case kRGBA_8888_SkColorType: | 92 case kRGBA_8888_SkColorType: |
| 98 case kBGRA_8888_SkColorType: | 93 case kBGRA_8888_SkColorType: |
| 99 break; | 94 break; |
| 100 default: | 95 default: |
| 101 return; // nothing to do | 96 return; // nothing to do |
| 102 } | 97 } |
| 103 | 98 |
| 104 // SkColor is not necesarily RGBA or BGRA, but it is one of them on little-e
ndian, | 99 // SkColor is not necesarily RGBA or BGRA, but it is one of them on little-e
ndian, |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 sk_ref_sp(maker->getColorSpace()), SkBudgeted
::kNo); | 297 sk_ref_sp(maker->getColorSpace()), SkBudgeted
::kNo); |
| 303 } | 298 } |
| 304 | 299 |
| 305 sk_sp<SkImage> SkImage::makeTextureImage(GrContext *context) const { | 300 sk_sp<SkImage> SkImage::makeTextureImage(GrContext *context) const { |
| 306 if (!context) { | 301 if (!context) { |
| 307 return nullptr; | 302 return nullptr; |
| 308 } | 303 } |
| 309 if (GrTexture* peek = as_IB(this)->peekTexture()) { | 304 if (GrTexture* peek = as_IB(this)->peekTexture()) { |
| 310 return peek->getContext() == context ? sk_ref_sp(const_cast<SkImage*>(th
is)) : nullptr; | 305 return peek->getContext() == context ? sk_ref_sp(const_cast<SkImage*>(th
is)) : nullptr; |
| 311 } | 306 } |
| 312 // No way to check whether a image is premul or not? | |
| 313 SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaTyp
e; | |
| 314 | 307 |
| 315 if (SkImageCacherator* cacher = as_IB(this)->peekCacherator()) { | 308 if (SkImageCacherator* cacher = as_IB(this)->peekCacherator()) { |
| 316 GrImageTextureMaker maker(context, cacher, this, kDisallow_CachingHint); | 309 GrImageTextureMaker maker(context, cacher, this, kDisallow_CachingHint); |
| 317 return create_image_from_maker(&maker, at, this->uniqueID()); | 310 return create_image_from_maker(&maker, this->alphaType(), this->uniqueID
()); |
| 318 } | 311 } |
| 319 | 312 |
| 320 if (const SkBitmap* bmp = as_IB(this)->onPeekBitmap()) { | 313 if (const SkBitmap* bmp = as_IB(this)->onPeekBitmap()) { |
| 321 GrBitmapTextureMaker maker(context, *bmp); | 314 GrBitmapTextureMaker maker(context, *bmp); |
| 322 return create_image_from_maker(&maker, at, this->uniqueID()); | 315 return create_image_from_maker(&maker, this->alphaType(), this->uniqueID
()); |
| 323 } | 316 } |
| 324 return nullptr; | 317 return nullptr; |
| 325 } | 318 } |
| 326 | 319 |
| 327 sk_sp<SkImage> SkImage::makeNonTextureImage() const { | 320 sk_sp<SkImage> SkImage::makeNonTextureImage() const { |
| 328 if (!this->isTextureBacked()) { | 321 if (!this->isTextureBacked()) { |
| 329 return sk_ref_sp(const_cast<SkImage*>(this)); | 322 return sk_ref_sp(const_cast<SkImage*>(this)); |
| 330 } | 323 } |
| 331 SkImageInfo info = as_IB(this)->onImageInfo(); | 324 SkImageInfo info = as_IB(this)->onImageInfo(); |
| 332 size_t rowBytes = info.minRowBytes(); | 325 size_t rowBytes = info.minRowBytes(); |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 ctSize = SkAlign8(pixmap.ctable()->count() * 4); | 431 ctSize = SkAlign8(pixmap.ctable()->count() * 4); |
| 439 } | 432 } |
| 440 } else { | 433 } else { |
| 441 // Here we're just using presence of data to know whether there is a cod
ec behind the image. | 434 // Here we're just using presence of data to know whether there is a cod
ec behind the image. |
| 442 // In the future we will access the cacherator and get the exact data th
at we want to (e.g. | 435 // In the future we will access the cacherator and get the exact data th
at we want to (e.g. |
| 443 // yuv planes) upload. | 436 // yuv planes) upload. |
| 444 sk_sp<SkData> data(this->refEncoded()); | 437 sk_sp<SkData> data(this->refEncoded()); |
| 445 if (!data && !this->peekPixels(nullptr)) { | 438 if (!data && !this->peekPixels(nullptr)) { |
| 446 return 0; | 439 return 0; |
| 447 } | 440 } |
| 448 SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlph
aType; | 441 info = SkImageInfo::MakeN32(scaledSize.width(), scaledSize.height(), thi
s->alphaType()); |
| 449 info = SkImageInfo::MakeN32(scaledSize.width(), scaledSize.height(), at)
; | |
| 450 pixelSize = SkAlign8(SkAutoPixmapStorage::AllocSize(info, nullptr)); | 442 pixelSize = SkAlign8(SkAutoPixmapStorage::AllocSize(info, nullptr)); |
| 451 if (fillMode) { | 443 if (fillMode) { |
| 452 pixmap.alloc(info); | 444 pixmap.alloc(info); |
| 453 if (isScaled) { | 445 if (isScaled) { |
| 454 if (!this->scalePixels(pixmap, scaleFilterQuality, | 446 if (!this->scalePixels(pixmap, scaleFilterQuality, |
| 455 SkImage::kDisallow_CachingHint)) { | 447 SkImage::kDisallow_CachingHint)) { |
| 456 return 0; | 448 return 0; |
| 457 } | 449 } |
| 458 } else { | 450 } else { |
| 459 if (!this->readPixels(pixmap, 0, 0, SkImage::kDisallow_CachingHi
nt)) { | 451 if (!this->readPixels(pixmap, 0, 0, SkImage::kDisallow_CachingHi
nt)) { |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 return nullptr; | 563 return nullptr; |
| 572 } | 564 } |
| 573 SkAutoTUnref<GrTexture> texture(GrUploadMipMapToTexture(ctx, info, texels, m
ipLevelCount)); | 565 SkAutoTUnref<GrTexture> texture(GrUploadMipMapToTexture(ctx, info, texels, m
ipLevelCount)); |
| 574 if (!texture) { | 566 if (!texture) { |
| 575 return nullptr; | 567 return nullptr; |
| 576 } | 568 } |
| 577 return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNew
ImageUniqueID, | 569 return sk_make_sp<SkImage_Gpu>(texture->width(), texture->height(), kNeedNew
ImageUniqueID, |
| 578 info.alphaType(), texture, sk_ref_sp(info.col
orSpace()), | 570 info.alphaType(), texture, sk_ref_sp(info.col
orSpace()), |
| 579 budgeted); | 571 budgeted); |
| 580 } | 572 } |
| OLD | NEW |