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 | 7 |
8 #include "SkSpecialImage.h" | 8 #include "SkSpecialImage.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkImage.h" | 10 #include "SkImage.h" |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 } | 98 } |
99 | 99 |
100 sk_sp<GrTexture> resultTex(GrRefCachedBitmapTexture(context, | 100 sk_sp<GrTexture> resultTex(GrRefCachedBitmapTexture(context, |
101 bmp, | 101 bmp, |
102 GrTextureParams::ClampNo
Filter(), | 102 GrTextureParams::ClampNo
Filter(), |
103 SkSourceGammaTreatment::
kRespect)); | 103 SkSourceGammaTreatment::
kRespect)); |
104 if (!resultTex) { | 104 if (!resultTex) { |
105 return nullptr; | 105 return nullptr; |
106 } | 106 } |
107 | 107 |
108 SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaTyp
e; | |
109 | |
110 return SkSpecialImage::MakeFromGpu(SkIRect::MakeWH(resultTex->width(), resul
tTex->height()), | 108 return SkSpecialImage::MakeFromGpu(SkIRect::MakeWH(resultTex->width(), resul
tTex->height()), |
111 this->uniqueID(), | 109 this->uniqueID(), |
112 resultTex, sk_ref_sp(this->getColorSpace(
)), &this->props(), | 110 resultTex, sk_ref_sp(this->getColorSpace(
)), &this->props(), |
113 at); | 111 this->alphaType()); |
114 #else | 112 #else |
115 return nullptr; | 113 return nullptr; |
116 #endif | 114 #endif |
117 } | 115 } |
118 | 116 |
119 void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPain
t* paint) const { | 117 void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPain
t* paint) const { |
120 return as_SIB(this)->onDraw(canvas, x, y, paint); | 118 return as_SIB(this)->onDraw(canvas, x, y, paint); |
121 } | 119 } |
122 | 120 |
123 bool SkSpecialImage::getROPixels(SkBitmap* bm) const { | 121 bool SkSpecialImage::getROPixels(SkBitmap* bm) const { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 { | 211 { |
214 SkASSERT(bm.pixelRef()); | 212 SkASSERT(bm.pixelRef()); |
215 | 213 |
216 // We have to lock now, while bm is still in scope, since it may have co
me from our | 214 // We have to lock now, while bm is still in scope, since it may have co
me from our |
217 // cache, which means we need to keep it locked until we (the special) a
re done, since | 215 // cache, which means we need to keep it locked until we (the special) a
re done, since |
218 // we cannot re-generate the cache entry (if bm came from a generator). | 216 // we cannot re-generate the cache entry (if bm came from a generator). |
219 fBitmap.lockPixels(); | 217 fBitmap.lockPixels(); |
220 SkASSERT(fBitmap.getPixels()); | 218 SkASSERT(fBitmap.getPixels()); |
221 } | 219 } |
222 | 220 |
223 bool isOpaque() const override { return fBitmap.isOpaque(); } | 221 SkAlphaType alphaType() const override { return fBitmap.alphaType(); } |
224 | 222 |
225 size_t getSize() const override { return fBitmap.getSize(); } | 223 size_t getSize() const override { return fBitmap.getSize(); } |
226 | 224 |
227 void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint)
const override { | 225 void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint)
const override { |
228 SkRect dst = SkRect::MakeXYWH(x, y, | 226 SkRect dst = SkRect::MakeXYWH(x, y, |
229 this->subset().width(), this->subset().hei
ght()); | 227 this->subset().width(), this->subset().hei
ght()); |
230 | 228 |
231 canvas->drawBitmapRect(fBitmap, this->subset(), | 229 canvas->drawBitmapRect(fBitmap, this->subset(), |
232 dst, paint, SkCanvas::kStrict_SrcRectConstraint); | 230 dst, paint, SkCanvas::kStrict_SrcRectConstraint); |
233 } | 231 } |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 , fColorSpace(std::move(colorSpace)) | 325 , fColorSpace(std::move(colorSpace)) |
328 , fAddedRasterVersionToCache(false) { | 326 , fAddedRasterVersionToCache(false) { |
329 } | 327 } |
330 | 328 |
331 ~SkSpecialImage_Gpu() override { | 329 ~SkSpecialImage_Gpu() override { |
332 if (fAddedRasterVersionToCache.load()) { | 330 if (fAddedRasterVersionToCache.load()) { |
333 SkNotifyBitmapGenIDIsStale(this->uniqueID()); | 331 SkNotifyBitmapGenIDIsStale(this->uniqueID()); |
334 } | 332 } |
335 } | 333 } |
336 | 334 |
337 bool isOpaque() const override { | 335 SkAlphaType alphaType() const override { return fAlphaType; } |
338 return GrPixelConfigIsOpaque(fTexture->config()) || fAlphaType == kOpaqu
e_SkAlphaType; | |
339 } | |
340 | 336 |
341 size_t getSize() const override { return fTexture->gpuMemorySize(); } | 337 size_t getSize() const override { return fTexture->gpuMemorySize(); } |
342 | 338 |
343 void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint)
const override { | 339 void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint)
const override { |
344 SkRect dst = SkRect::MakeXYWH(x, y, | 340 SkRect dst = SkRect::MakeXYWH(x, y, |
345 this->subset().width(), this->subset().hei
ght()); | 341 this->subset().width(), this->subset().hei
ght()); |
346 | 342 |
347 auto img = sk_sp<SkImage>(new SkImage_Gpu(fTexture->width(), fTexture->h
eight(), | 343 auto img = sk_sp<SkImage>(new SkImage_Gpu(fTexture->width(), fTexture->h
eight(), |
348 this->uniqueID(), fAlphaType,
fTexture.get(), | 344 this->uniqueID(), fAlphaType,
fTexture.get(), |
349 fColorSpace, SkBudgeted::kNo))
; | 345 fColorSpace, SkBudgeted::kNo))
; |
350 | 346 |
351 canvas->drawImageRect(img, this->subset(), | 347 canvas->drawImageRect(img, this->subset(), |
352 dst, paint, SkCanvas::kStrict_SrcRectConstraint); | 348 dst, paint, SkCanvas::kStrict_SrcRectConstraint); |
353 } | 349 } |
354 | 350 |
355 GrTexture* onPeekTexture() const override { return fTexture.get(); } | 351 GrTexture* onPeekTexture() const override { return fTexture.get(); } |
356 | 352 |
357 sk_sp<GrTexture> onAsTextureRef(GrContext*) const override { return fTexture
; } | 353 sk_sp<GrTexture> onAsTextureRef(GrContext*) const override { return fTexture
; } |
358 | 354 |
359 bool onGetROPixels(SkBitmap* dst) const override { | 355 bool onGetROPixels(SkBitmap* dst) const override { |
360 if (SkBitmapCache::Find(this->uniqueID(), dst)) { | 356 if (SkBitmapCache::Find(this->uniqueID(), dst)) { |
361 SkASSERT(dst->getGenerationID() == this->uniqueID()); | 357 SkASSERT(dst->getGenerationID() == this->uniqueID()); |
362 SkASSERT(dst->isImmutable()); | 358 SkASSERT(dst->isImmutable()); |
363 SkASSERT(dst->getPixels()); | 359 SkASSERT(dst->getPixels()); |
364 return true; | 360 return true; |
365 } | 361 } |
366 | 362 |
367 SkImageInfo info = SkImageInfo::MakeN32(this->width(), this->height(), | 363 SkImageInfo info = SkImageInfo::MakeN32(this->width(), this->height(), |
368 this->isOpaque() ? kOpaque_SkAlp
haType | 364 this->alphaType(), fColorSpace); |
369 : kPremul_SkAlp
haType, | |
370 fColorSpace); | |
371 | 365 |
372 if (!dst->tryAllocPixels(info)) { | 366 if (!dst->tryAllocPixels(info)) { |
373 return false; | 367 return false; |
374 } | 368 } |
375 | 369 |
376 if (!fTexture->readPixels(0, 0, dst->width(), dst->height(), kSkia8888_G
rPixelConfig, | 370 if (!fTexture->readPixels(0, 0, dst->width(), dst->height(), kSkia8888_G
rPixelConfig, |
377 dst->getPixels(), dst->rowBytes())) { | 371 dst->getPixels(), dst->rowBytes())) { |
378 return false; | 372 return false; |
379 } | 373 } |
380 | 374 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 sk_sp<GrTexture> tex, | 446 sk_sp<GrTexture> tex, |
453 sk_sp<SkColorSpace> colorSpace
, | 447 sk_sp<SkColorSpace> colorSpace
, |
454 const SkSurfaceProps* props, | 448 const SkSurfaceProps* props, |
455 SkAlphaType at) { | 449 SkAlphaType at) { |
456 SkASSERT(rect_fits(subset, tex->width(), tex->height())); | 450 SkASSERT(rect_fits(subset, tex->width(), tex->height())); |
457 return sk_make_sp<SkSpecialImage_Gpu>(subset, uniqueID, std::move(tex), at, | 451 return sk_make_sp<SkSpecialImage_Gpu>(subset, uniqueID, std::move(tex), at, |
458 std::move(colorSpace), props); | 452 std::move(colorSpace), props); |
459 } | 453 } |
460 | 454 |
461 #endif | 455 #endif |
OLD | NEW |