| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 #include "SkSpecialImage.h" | 7 #include "SkSpecialImage.h" |
| 8 | 8 |
| 9 #if SK_SUPPORT_GPU | 9 #if SK_SUPPORT_GPU |
| 10 #include "GrTexture.h" | 10 #include "GrTexture.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 : INHERITED(subset, uniqueID, props) { | 32 : INHERITED(subset, uniqueID, props) { |
| 33 } | 33 } |
| 34 ~SkSpecialImage_Base() override { } | 34 ~SkSpecialImage_Base() override { } |
| 35 | 35 |
| 36 virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const
= 0; | 36 virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const
= 0; |
| 37 | 37 |
| 38 virtual bool onGetROPixels(SkBitmap*) const = 0; | 38 virtual bool onGetROPixels(SkBitmap*) const = 0; |
| 39 | 39 |
| 40 virtual GrTexture* onPeekTexture() const { return nullptr; } | 40 virtual GrTexture* onPeekTexture() const { return nullptr; } |
| 41 | 41 |
| 42 virtual SkColorSpace* onGetColorSpace() const = 0; |
| 43 |
| 42 #if SK_SUPPORT_GPU | 44 #if SK_SUPPORT_GPU |
| 43 virtual sk_sp<GrTexture> onAsTextureRef(GrContext* context) const = 0; | 45 virtual sk_sp<GrTexture> onAsTextureRef(GrContext* context) const = 0; |
| 44 #endif | 46 #endif |
| 45 | 47 |
| 46 // Delete this entry point ASAP (see skbug.com/4965) | 48 // Delete this entry point ASAP (see skbug.com/4965) |
| 47 virtual bool getBitmapDeprecated(SkBitmap* result) const = 0; | 49 virtual bool getBitmapDeprecated(SkBitmap* result) const = 0; |
| 48 | 50 |
| 49 virtual sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const = 0; | 51 virtual sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const = 0; |
| 50 | 52 |
| 51 virtual sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const
= 0; | 53 virtual sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const
= 0; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 GrTextureParams::ClampNo
Filter(), | 96 GrTextureParams::ClampNo
Filter(), |
| 95 SkSourceGammaTreatment::
kRespect)); | 97 SkSourceGammaTreatment::
kRespect)); |
| 96 if (!resultTex) { | 98 if (!resultTex) { |
| 97 return nullptr; | 99 return nullptr; |
| 98 } | 100 } |
| 99 | 101 |
| 100 SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaTyp
e; | 102 SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaTyp
e; |
| 101 | 103 |
| 102 return SkSpecialImage::MakeFromGpu(SkIRect::MakeWH(resultTex->width(), resul
tTex->height()), | 104 return SkSpecialImage::MakeFromGpu(SkIRect::MakeWH(resultTex->width(), resul
tTex->height()), |
| 103 this->uniqueID(), | 105 this->uniqueID(), |
| 104 resultTex, &this->props(), at); | 106 resultTex, sk_ref_sp(this->getColorSpace(
)), &this->props(), |
| 107 at); |
| 105 #else | 108 #else |
| 106 return nullptr; | 109 return nullptr; |
| 107 #endif | 110 #endif |
| 108 } | 111 } |
| 109 | 112 |
| 110 void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPain
t* paint) const { | 113 void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPain
t* paint) const { |
| 111 return as_SIB(this)->onDraw(canvas, x, y, paint); | 114 return as_SIB(this)->onDraw(canvas, x, y, paint); |
| 112 } | 115 } |
| 113 | 116 |
| 114 bool SkSpecialImage::getROPixels(SkBitmap* bm) const { | 117 bool SkSpecialImage::getROPixels(SkBitmap* bm) const { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 127 #if SK_SUPPORT_GPU | 130 #if SK_SUPPORT_GPU |
| 128 GrTexture* texture = as_SIB(this)->onPeekTexture(); | 131 GrTexture* texture = as_SIB(this)->onPeekTexture(); |
| 129 | 132 |
| 130 if (texture) { | 133 if (texture) { |
| 131 return texture->getContext(); | 134 return texture->getContext(); |
| 132 } | 135 } |
| 133 #endif | 136 #endif |
| 134 return nullptr; | 137 return nullptr; |
| 135 } | 138 } |
| 136 | 139 |
| 140 SkColorSpace* SkSpecialImage::getColorSpace() const { |
| 141 return as_SIB(this)->onGetColorSpace(); |
| 142 } |
| 143 |
| 137 #if SK_SUPPORT_GPU | 144 #if SK_SUPPORT_GPU |
| 138 sk_sp<GrTexture> SkSpecialImage::asTextureRef(GrContext* context) const { | 145 sk_sp<GrTexture> SkSpecialImage::asTextureRef(GrContext* context) const { |
| 139 return as_SIB(this)->onAsTextureRef(context); | 146 return as_SIB(this)->onAsTextureRef(context); |
| 140 } | 147 } |
| 141 #endif | 148 #endif |
| 142 | 149 |
| 143 sk_sp<SkSpecialSurface> SkSpecialImage::makeSurface(const SkImageInfo& info) con
st { | 150 sk_sp<SkSpecialSurface> SkSpecialImage::makeSurface(const SkImageInfo& info) con
st { |
| 144 return as_SIB(this)->onMakeSurface(info); | 151 return as_SIB(this)->onMakeSurface(info); |
| 145 } | 152 } |
| 146 | 153 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 162 #endif | 169 #endif |
| 163 | 170 |
| 164 sk_sp<SkSpecialImage> SkSpecialImage::internal_fromBM(const SkBitmap& src, | 171 sk_sp<SkSpecialImage> SkSpecialImage::internal_fromBM(const SkBitmap& src, |
| 165 const SkSurfaceProps* prop
s) { | 172 const SkSurfaceProps* prop
s) { |
| 166 #if SK_SUPPORT_GPU | 173 #if SK_SUPPORT_GPU |
| 167 // Need to test offset case! (see skbug.com/4967) | 174 // Need to test offset case! (see skbug.com/4967) |
| 168 if (src.getTexture()) { | 175 if (src.getTexture()) { |
| 169 return SkSpecialImage::MakeFromGpu(src.bounds(), | 176 return SkSpecialImage::MakeFromGpu(src.bounds(), |
| 170 src.getGenerationID(), | 177 src.getGenerationID(), |
| 171 sk_ref_sp(src.getTexture()), | 178 sk_ref_sp(src.getTexture()), |
| 179 sk_ref_sp(src.colorSpace()), |
| 172 props); | 180 props); |
| 173 } | 181 } |
| 174 #endif | 182 #endif |
| 175 | 183 |
| 176 return SkSpecialImage::MakeFromRaster(src.bounds(), src, props); | 184 return SkSpecialImage::MakeFromRaster(src.bounds(), src, props); |
| 177 } | 185 } |
| 178 | 186 |
| 179 bool SkSpecialImage::internal_getBM(SkBitmap* result) { | 187 bool SkSpecialImage::internal_getBM(SkBitmap* result) { |
| 180 const SkSpecialImage_Base* ib = as_SIB(this); | 188 const SkSpecialImage_Base* ib = as_SIB(this); |
| 181 | 189 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 SkRect dst = SkRect::MakeXYWH(x, y, this->subset().width(), this->subset
().height()); | 230 SkRect dst = SkRect::MakeXYWH(x, y, this->subset().width(), this->subset
().height()); |
| 223 | 231 |
| 224 canvas->drawImageRect(fImage.get(), this->subset(), | 232 canvas->drawImageRect(fImage.get(), this->subset(), |
| 225 dst, paint, SkCanvas::kStrict_SrcRectConstraint); | 233 dst, paint, SkCanvas::kStrict_SrcRectConstraint); |
| 226 } | 234 } |
| 227 | 235 |
| 228 bool onGetROPixels(SkBitmap* bm) const override { | 236 bool onGetROPixels(SkBitmap* bm) const override { |
| 229 return as_IB(fImage)->getROPixels(bm); | 237 return as_IB(fImage)->getROPixels(bm); |
| 230 } | 238 } |
| 231 | 239 |
| 240 SkColorSpace* onGetColorSpace() const override { |
| 241 return as_IB(fImage)->onImageInfo().colorSpace(); |
| 242 } |
| 243 |
| 232 GrTexture* onPeekTexture() const override { return as_IB(fImage)->peekTextur
e(); } | 244 GrTexture* onPeekTexture() const override { return as_IB(fImage)->peekTextur
e(); } |
| 233 | 245 |
| 234 #if SK_SUPPORT_GPU | 246 #if SK_SUPPORT_GPU |
| 235 sk_sp<GrTexture> onAsTextureRef(GrContext* context) const override { | 247 sk_sp<GrTexture> onAsTextureRef(GrContext* context) const override { |
| 236 return sk_sp<GrTexture>(as_IB(fImage)->asTextureRef(context, | 248 return sk_sp<GrTexture>(as_IB(fImage)->asTextureRef(context, |
| 237 GrTextureParams::Cla
mpNoFilter(), | 249 GrTextureParams::Cla
mpNoFilter(), |
| 238 SkSourceGammaTreatme
nt::kRespect)); | 250 SkSourceGammaTreatme
nt::kRespect)); |
| 239 } | 251 } |
| 240 #endif | 252 #endif |
| 241 | 253 |
| 242 bool getBitmapDeprecated(SkBitmap* result) const override { | 254 bool getBitmapDeprecated(SkBitmap* result) const override { |
| 243 #if SK_SUPPORT_GPU | 255 #if SK_SUPPORT_GPU |
| 244 if (GrTexture* texture = as_IB(fImage.get())->peekTexture()) { | 256 if (GrTexture* texture = as_IB(fImage.get())->peekTexture()) { |
| 245 const SkImageInfo info = GrMakeInfoFromTexture(texture, | 257 const SkImageInfo info = GrMakeInfoFromTexture(texture, |
| 246 fImage->width(), fIma
ge->height(), | 258 fImage->width(), fIma
ge->height(), |
| 247 fImage->isOpaque()); | 259 fImage->isOpaque(), |
| 260 sk_ref_sp(this->onGet
ColorSpace())); |
| 248 if (!result->setInfo(info)) { | 261 if (!result->setInfo(info)) { |
| 249 return false; | 262 return false; |
| 250 } | 263 } |
| 251 | 264 |
| 252 result->setPixelRef(new SkGrPixelRef(info, texture))->unref(); | 265 result->setPixelRef(new SkGrPixelRef(info, texture))->unref(); |
| 253 return true; | 266 return true; |
| 254 } | 267 } |
| 255 #endif | 268 #endif |
| 256 | 269 |
| 257 return as_IB(fImage.get())->asBitmapForImageFilters(result); | 270 return as_IB(fImage.get())->asBitmapForImageFilters(result); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 | 369 |
| 357 canvas->drawBitmapRect(fBitmap, this->subset(), | 370 canvas->drawBitmapRect(fBitmap, this->subset(), |
| 358 dst, paint, SkCanvas::kStrict_SrcRectConstraint); | 371 dst, paint, SkCanvas::kStrict_SrcRectConstraint); |
| 359 } | 372 } |
| 360 | 373 |
| 361 bool onGetROPixels(SkBitmap* bm) const override { | 374 bool onGetROPixels(SkBitmap* bm) const override { |
| 362 *bm = fBitmap; | 375 *bm = fBitmap; |
| 363 return true; | 376 return true; |
| 364 } | 377 } |
| 365 | 378 |
| 379 SkColorSpace* onGetColorSpace() const override { |
| 380 return fBitmap.colorSpace(); |
| 381 } |
| 382 |
| 366 #if SK_SUPPORT_GPU | 383 #if SK_SUPPORT_GPU |
| 367 sk_sp<GrTexture> onAsTextureRef(GrContext* context) const override { | 384 sk_sp<GrTexture> onAsTextureRef(GrContext* context) const override { |
| 368 if (context) { | 385 if (context) { |
| 369 return sk_ref_sp(GrRefCachedBitmapTexture(context, | 386 return sk_ref_sp(GrRefCachedBitmapTexture(context, |
| 370 fBitmap, | 387 fBitmap, |
| 371 GrTextureParams::ClampNoFi
lter(), | 388 GrTextureParams::ClampNoFi
lter(), |
| 372 SkSourceGammaTreatment::kR
espect)); | 389 SkSourceGammaTreatment::kR
espect)); |
| 373 } | 390 } |
| 374 | 391 |
| 375 return nullptr; | 392 return nullptr; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 | 454 |
| 438 #if SK_SUPPORT_GPU | 455 #if SK_SUPPORT_GPU |
| 439 /////////////////////////////////////////////////////////////////////////////// | 456 /////////////////////////////////////////////////////////////////////////////// |
| 440 #include "GrTexture.h" | 457 #include "GrTexture.h" |
| 441 #include "SkImage_Gpu.h" | 458 #include "SkImage_Gpu.h" |
| 442 | 459 |
| 443 class SkSpecialImage_Gpu : public SkSpecialImage_Base { | 460 class SkSpecialImage_Gpu : public SkSpecialImage_Base { |
| 444 public: | 461 public: |
| 445 SkSpecialImage_Gpu(const SkIRect& subset, | 462 SkSpecialImage_Gpu(const SkIRect& subset, |
| 446 uint32_t uniqueID, sk_sp<GrTexture> tex, SkAlphaType at, | 463 uint32_t uniqueID, sk_sp<GrTexture> tex, SkAlphaType at, |
| 447 const SkSurfaceProps* props) | 464 sk_sp<SkColorSpace> colorSpace, const SkSurfaceProps* pro
ps) |
| 448 : INHERITED(subset, uniqueID, props) | 465 : INHERITED(subset, uniqueID, props) |
| 449 , fTexture(std::move(tex)) | 466 , fTexture(std::move(tex)) |
| 450 , fAlphaType(at) | 467 , fAlphaType(at) |
| 468 , fColorSpace(std::move(colorSpace)) |
| 451 , fAddedRasterVersionToCache(false) { | 469 , fAddedRasterVersionToCache(false) { |
| 452 } | 470 } |
| 453 | 471 |
| 454 ~SkSpecialImage_Gpu() override { | 472 ~SkSpecialImage_Gpu() override { |
| 455 if (fAddedRasterVersionToCache.load()) { | 473 if (fAddedRasterVersionToCache.load()) { |
| 456 SkNotifyBitmapGenIDIsStale(this->uniqueID()); | 474 SkNotifyBitmapGenIDIsStale(this->uniqueID()); |
| 457 } | 475 } |
| 458 } | 476 } |
| 459 | 477 |
| 460 bool isOpaque() const override { | 478 bool isOpaque() const override { |
| 461 return GrPixelConfigIsOpaque(fTexture->config()) || fAlphaType == kOpaqu
e_SkAlphaType; | 479 return GrPixelConfigIsOpaque(fTexture->config()) || fAlphaType == kOpaqu
e_SkAlphaType; |
| 462 } | 480 } |
| 463 | 481 |
| 464 size_t getSize() const override { return fTexture->gpuMemorySize(); } | 482 size_t getSize() const override { return fTexture->gpuMemorySize(); } |
| 465 | 483 |
| 466 void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint)
const override { | 484 void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint)
const override { |
| 467 SkRect dst = SkRect::MakeXYWH(x, y, | 485 SkRect dst = SkRect::MakeXYWH(x, y, |
| 468 this->subset().width(), this->subset().hei
ght()); | 486 this->subset().width(), this->subset().hei
ght()); |
| 469 | 487 |
| 470 // TODO: Supply correct color space after we're storing it here | |
| 471 auto img = sk_sp<SkImage>(new SkImage_Gpu(fTexture->width(), fTexture->h
eight(), | 488 auto img = sk_sp<SkImage>(new SkImage_Gpu(fTexture->width(), fTexture->h
eight(), |
| 472 this->uniqueID(), fAlphaType,
fTexture.get(), | 489 this->uniqueID(), fAlphaType,
fTexture.get(), |
| 473 nullptr, SkBudgeted::kNo)); | 490 fColorSpace, SkBudgeted::kNo))
; |
| 474 | 491 |
| 475 canvas->drawImageRect(img, this->subset(), | 492 canvas->drawImageRect(img, this->subset(), |
| 476 dst, paint, SkCanvas::kStrict_SrcRectConstraint); | 493 dst, paint, SkCanvas::kStrict_SrcRectConstraint); |
| 477 } | 494 } |
| 478 | 495 |
| 479 GrTexture* onPeekTexture() const override { return fTexture.get(); } | 496 GrTexture* onPeekTexture() const override { return fTexture.get(); } |
| 480 | 497 |
| 481 sk_sp<GrTexture> onAsTextureRef(GrContext*) const override { return fTexture
; } | 498 sk_sp<GrTexture> onAsTextureRef(GrContext*) const override { return fTexture
; } |
| 482 | 499 |
| 483 bool onGetROPixels(SkBitmap* dst) const override { | 500 bool onGetROPixels(SkBitmap* dst) const override { |
| 484 if (SkBitmapCache::Find(this->uniqueID(), dst)) { | 501 if (SkBitmapCache::Find(this->uniqueID(), dst)) { |
| 485 SkASSERT(dst->getGenerationID() == this->uniqueID()); | 502 SkASSERT(dst->getGenerationID() == this->uniqueID()); |
| 486 SkASSERT(dst->isImmutable()); | 503 SkASSERT(dst->isImmutable()); |
| 487 SkASSERT(dst->getPixels()); | 504 SkASSERT(dst->getPixels()); |
| 488 return true; | 505 return true; |
| 489 } | 506 } |
| 490 | 507 |
| 491 SkImageInfo info = SkImageInfo::MakeN32(this->width(), this->height(), | 508 SkImageInfo info = SkImageInfo::MakeN32(this->width(), this->height(), |
| 492 this->isOpaque() ? kOpaque_SkAlp
haType | 509 this->isOpaque() ? kOpaque_SkAlp
haType |
| 493 : kPremul_SkAlp
haType); | 510 : kPremul_SkAlp
haType, |
| 511 fColorSpace); |
| 494 | 512 |
| 495 if (!dst->tryAllocPixels(info)) { | 513 if (!dst->tryAllocPixels(info)) { |
| 496 return false; | 514 return false; |
| 497 } | 515 } |
| 498 | 516 |
| 499 if (!fTexture->readPixels(0, 0, dst->width(), dst->height(), kSkia8888_G
rPixelConfig, | 517 if (!fTexture->readPixels(0, 0, dst->width(), dst->height(), kSkia8888_G
rPixelConfig, |
| 500 dst->getPixels(), dst->rowBytes())) { | 518 dst->getPixels(), dst->rowBytes())) { |
| 501 return false; | 519 return false; |
| 502 } | 520 } |
| 503 | 521 |
| 504 dst->pixelRef()->setImmutableWithID(this->uniqueID()); | 522 dst->pixelRef()->setImmutableWithID(this->uniqueID()); |
| 505 SkBitmapCache::Add(this->uniqueID(), *dst); | 523 SkBitmapCache::Add(this->uniqueID(), *dst); |
| 506 fAddedRasterVersionToCache.store(true); | 524 fAddedRasterVersionToCache.store(true); |
| 507 return true; | 525 return true; |
| 508 } | 526 } |
| 509 | 527 |
| 528 SkColorSpace* onGetColorSpace() const override { |
| 529 return fColorSpace.get(); |
| 530 } |
| 531 |
| 510 bool getBitmapDeprecated(SkBitmap* result) const override { | 532 bool getBitmapDeprecated(SkBitmap* result) const override { |
| 511 const SkImageInfo info = GrMakeInfoFromTexture(fTexture.get(), | 533 const SkImageInfo info = GrMakeInfoFromTexture(fTexture.get(), |
| 512 this->width(), this->heig
ht(), | 534 this->width(), this->heig
ht(), |
| 513 this->isOpaque()); | 535 this->isOpaque(), fColorS
pace); |
| 514 if (!result->setInfo(info)) { | 536 if (!result->setInfo(info)) { |
| 515 return false; | 537 return false; |
| 516 } | 538 } |
| 517 | 539 |
| 518 const SkImageInfo prInfo = info.makeWH(fTexture->width(), fTexture->heig
ht()); | 540 const SkImageInfo prInfo = info.makeWH(fTexture->width(), fTexture->heig
ht()); |
| 519 | 541 |
| 520 SkAutoTUnref<SkGrPixelRef> pixelRef(new SkGrPixelRef(prInfo, fTexture.ge
t())); | 542 SkAutoTUnref<SkGrPixelRef> pixelRef(new SkGrPixelRef(prInfo, fTexture.ge
t())); |
| 521 result->setPixelRef(pixelRef, this->subset().fLeft, this->subset().fTop)
; | 543 result->setPixelRef(pixelRef, this->subset().fLeft, this->subset().fTop)
; |
| 522 return true; | 544 return true; |
| 523 } | 545 } |
| 524 | 546 |
| 525 sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const overrid
e { | 547 sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const overrid
e { |
| 526 if (!fTexture->getContext()) { | 548 if (!fTexture->getContext()) { |
| 527 return nullptr; | 549 return nullptr; |
| 528 } | 550 } |
| 529 | 551 |
| 530 GrPixelConfig config = SkImageInfo2GrPixelConfig(info, *fTexture->getCon
text()->caps()); | 552 GrPixelConfig config = SkImageInfo2GrPixelConfig(info, *fTexture->getCon
text()->caps()); |
| 531 | 553 |
| 532 return SkSpecialSurface::MakeRenderTarget(fTexture->getContext(), | 554 return SkSpecialSurface::MakeRenderTarget(fTexture->getContext(), |
| 533 info.width(), info.height(), | 555 info.width(), info.height(), |
| 534 config); | 556 config); |
| 535 } | 557 } |
| 536 | 558 |
| 537 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { | 559 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { |
| 538 return SkSpecialImage::MakeFromGpu(subset, | 560 return SkSpecialImage::MakeFromGpu(subset, |
| 539 this->uniqueID(), | 561 this->uniqueID(), |
| 540 fTexture, | 562 fTexture, |
| 563 fColorSpace, |
| 541 &this->props(), | 564 &this->props(), |
| 542 fAlphaType); | 565 fAlphaType); |
| 543 } | 566 } |
| 544 | 567 |
| 545 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { | 568 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { |
| 546 if (0 == subset.fLeft && 0 == subset.fTop && | 569 if (0 == subset.fLeft && 0 == subset.fTop && |
| 547 fTexture->width() == subset.width() && | 570 fTexture->width() == subset.width() && |
| 548 fTexture->height() == subset.height()) { | 571 fTexture->height() == subset.height()) { |
| 549 // The existing GrTexture is already tight so reuse it in the SkImag
e | 572 // The existing GrTexture is already tight so reuse it in the SkImag
e |
| 550 // TODO: Supply correct color space after we're storing it here | |
| 551 return sk_make_sp<SkImage_Gpu>(fTexture->width(), fTexture->height()
, | 573 return sk_make_sp<SkImage_Gpu>(fTexture->width(), fTexture->height()
, |
| 552 kNeedNewImageUniqueID, | 574 kNeedNewImageUniqueID, |
| 553 fAlphaType, fTexture.get(), nullptr,
SkBudgeted::kYes); | 575 fAlphaType, fTexture.get(), fColorSpa
ce, |
| 576 SkBudgeted::kYes); |
| 554 } | 577 } |
| 555 | 578 |
| 556 GrContext* ctx = fTexture->getContext(); | 579 GrContext* ctx = fTexture->getContext(); |
| 557 GrSurfaceDesc desc = fTexture->desc(); | 580 GrSurfaceDesc desc = fTexture->desc(); |
| 558 desc.fWidth = subset.width(); | 581 desc.fWidth = subset.width(); |
| 559 desc.fHeight = subset.height(); | 582 desc.fHeight = subset.height(); |
| 560 | 583 |
| 561 sk_sp<GrTexture> subTx(ctx->textureProvider()->createTexture(desc, SkBud
geted::kYes)); | 584 sk_sp<GrTexture> subTx(ctx->textureProvider()->createTexture(desc, SkBud
geted::kYes)); |
| 562 if (!subTx) { | 585 if (!subTx) { |
| 563 return nullptr; | 586 return nullptr; |
| 564 } | 587 } |
| 565 ctx->copySurface(subTx.get(), fTexture.get(), subset, SkIPoint::Make(0,
0)); | 588 ctx->copySurface(subTx.get(), fTexture.get(), subset, SkIPoint::Make(0,
0)); |
| 566 // TODO: Supply correct color space after we're storing it here | |
| 567 return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageU
niqueID, | 589 return sk_make_sp<SkImage_Gpu>(desc.fWidth, desc.fHeight, kNeedNewImageU
niqueID, |
| 568 fAlphaType, subTx.get(), nullptr, SkBudge
ted::kYes); | 590 fAlphaType, subTx.get(), fColorSpace, SkB
udgeted::kYes); |
| 569 } | 591 } |
| 570 | 592 |
| 571 sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override
{ | 593 sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override
{ |
| 572 return SkSurface::MakeRenderTarget(fTexture->getContext(), SkBudgeted::k
Yes, info); | 594 return SkSurface::MakeRenderTarget(fTexture->getContext(), SkBudgeted::k
Yes, info); |
| 573 } | 595 } |
| 574 | 596 |
| 575 private: | 597 private: |
| 576 sk_sp<GrTexture> fTexture; | 598 sk_sp<GrTexture> fTexture; |
| 577 const SkAlphaType fAlphaType; | 599 const SkAlphaType fAlphaType; |
| 600 sk_sp<SkColorSpace> fColorSpace; |
| 578 mutable SkAtomic<bool> fAddedRasterVersionToCache; | 601 mutable SkAtomic<bool> fAddedRasterVersionToCache; |
| 579 | 602 |
| 580 typedef SkSpecialImage_Base INHERITED; | 603 typedef SkSpecialImage_Base INHERITED; |
| 581 }; | 604 }; |
| 582 | 605 |
| 583 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(const SkIRect& subset, | 606 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(const SkIRect& subset, |
| 584 uint32_t uniqueID, | 607 uint32_t uniqueID, |
| 585 sk_sp<GrTexture> tex, | 608 sk_sp<GrTexture> tex, |
| 609 sk_sp<SkColorSpace> colorSpace
, |
| 586 const SkSurfaceProps* props, | 610 const SkSurfaceProps* props, |
| 587 SkAlphaType at) { | 611 SkAlphaType at) { |
| 588 SkASSERT(rect_fits(subset, tex->width(), tex->height())); | 612 SkASSERT(rect_fits(subset, tex->width(), tex->height())); |
| 589 return sk_make_sp<SkSpecialImage_Gpu>(subset, uniqueID, std::move(tex), at,
props); | 613 return sk_make_sp<SkSpecialImage_Gpu>(subset, uniqueID, std::move(tex), at, |
| 614 std::move(colorSpace), props); |
| 590 } | 615 } |
| 591 | 616 |
| 592 #endif | 617 #endif |
| OLD | NEW |