Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: src/image/SkImage_Gpu.cpp

Issue 2250663002: Add alphaType() to SkImage (Closed) Base URL: https://skia.googlesource.com/skia.git@special-image-alpha-type
Patch Set: Remove virtuals from SkImage, slight cleanup Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/image/SkImage_Gpu.h ('k') | src/image/SkImage_Raster.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « src/image/SkImage_Gpu.h ('k') | src/image/SkImage_Raster.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698