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" |
11 #include "GrTextureParams.h" | 11 #include "GrTextureParams.h" |
12 #include "SkGr.h" | 12 #include "SkGr.h" |
13 #endif | 13 #endif |
14 | 14 |
15 #include "SkCanvas.h" | 15 #include "SkCanvas.h" |
16 #include "SkImage_Base.h" | 16 #include "SkImage_Base.h" |
17 #include "SkSpecialSurface.h" | 17 #include "SkSpecialSurface.h" |
| 18 #include "SkSurfacePriv.h" |
18 | 19 |
19 /////////////////////////////////////////////////////////////////////////////// | 20 /////////////////////////////////////////////////////////////////////////////// |
20 class SkSpecialImage_Base : public SkSpecialImage { | 21 class SkSpecialImage_Base : public SkSpecialImage { |
21 public: | 22 public: |
22 SkSpecialImage_Base(SkImageFilter::Proxy* proxy, const SkIRect& subset, uint
32_t uniqueID) | 23 SkSpecialImage_Base(SkImageFilter::Proxy* proxy, const SkIRect& subset, uint
32_t uniqueID, |
23 : INHERITED(proxy, subset, uniqueID) { | 24 const SkSurfaceProps* props) |
| 25 : INHERITED(proxy, subset, uniqueID, props) { |
24 } | 26 } |
25 virtual ~SkSpecialImage_Base() { } | 27 virtual ~SkSpecialImage_Base() { } |
26 | 28 |
27 virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const
= 0; | 29 virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const
= 0; |
28 | 30 |
29 virtual bool onPeekPixels(SkPixmap*) const { return false; } | 31 virtual bool onPeekPixels(SkPixmap*) const { return false; } |
30 | 32 |
31 virtual GrTexture* onPeekTexture() const { return nullptr; } | 33 virtual GrTexture* onPeekTexture() const { return nullptr; } |
32 | 34 |
33 virtual bool testingOnlyOnGetROPixels(SkBitmap*) const = 0; | 35 virtual bool testingOnlyOnGetROPixels(SkBitmap*) const = 0; |
(...skipping 11 matching lines...) Expand all Loading... |
45 | 47 |
46 private: | 48 private: |
47 typedef SkSpecialImage INHERITED; | 49 typedef SkSpecialImage INHERITED; |
48 }; | 50 }; |
49 | 51 |
50 /////////////////////////////////////////////////////////////////////////////// | 52 /////////////////////////////////////////////////////////////////////////////// |
51 static inline const SkSpecialImage_Base* as_SIB(const SkSpecialImage* image) { | 53 static inline const SkSpecialImage_Base* as_SIB(const SkSpecialImage* image) { |
52 return static_cast<const SkSpecialImage_Base*>(image); | 54 return static_cast<const SkSpecialImage_Base*>(image); |
53 } | 55 } |
54 | 56 |
| 57 SkSpecialImage::SkSpecialImage(SkImageFilter::Proxy* proxy, |
| 58 const SkIRect& subset, |
| 59 uint32_t uniqueID, |
| 60 const SkSurfaceProps* props) |
| 61 : fProps(SkSurfacePropsCopyOrDefault(props)) |
| 62 , fSubset(subset) |
| 63 , fUniqueID(kNeedNewImageUniqueID_SpecialImage == uniqueID ? SkNextID::Image
ID() : uniqueID) |
| 64 , fProxy(proxy) { |
| 65 } |
| 66 |
55 sk_sp<SkSpecialImage> SkSpecialImage::makeTextureImage(SkImageFilter::Proxy* pro
xy, | 67 sk_sp<SkSpecialImage> SkSpecialImage::makeTextureImage(SkImageFilter::Proxy* pro
xy, |
56 GrContext* context) { | 68 GrContext* context) { |
57 #if SK_SUPPORT_GPU | 69 #if SK_SUPPORT_GPU |
58 if (!context) { | 70 if (!context) { |
59 return nullptr; | 71 return nullptr; |
60 } | 72 } |
61 if (GrTexture* peek = as_SIB(this)->peekTexture()) { | 73 if (GrTexture* peek = as_SIB(this)->peekTexture()) { |
62 return peek->getContext() == context ? sk_sp<SkSpecialImage>(SkRef(this)
) : nullptr; | 74 return peek->getContext() == context ? sk_sp<SkSpecialImage>(SkRef(this)
) : nullptr; |
63 } | 75 } |
64 | 76 |
65 SkBitmap bmp; | 77 SkBitmap bmp; |
66 if (!this->internal_getBM(&bmp)) { | 78 if (!this->internal_getBM(&bmp)) { |
67 return nullptr; | 79 return nullptr; |
68 } | 80 } |
69 | 81 |
70 if (bmp.empty()) { | 82 if (bmp.empty()) { |
71 return SkSpecialImage::MakeFromRaster(proxy, SkIRect::MakeEmpty(), bmp); | 83 return SkSpecialImage::MakeFromRaster(proxy, SkIRect::MakeEmpty(), bmp,
&this->props()); |
72 } | 84 } |
73 | 85 |
74 SkAutoTUnref<GrTexture> resultTex( | 86 SkAutoTUnref<GrTexture> resultTex( |
75 GrRefCachedBitmapTexture(context, bmp, GrTextureParams::ClampNoFilter())
); | 87 GrRefCachedBitmapTexture(context, bmp, GrTextureParams::ClampNoFilter())
); |
76 if (!resultTex) { | 88 if (!resultTex) { |
77 return nullptr; | 89 return nullptr; |
78 } | 90 } |
79 | 91 |
80 SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaTyp
e; | 92 SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaTyp
e; |
81 | 93 |
82 return SkSpecialImage::MakeFromGpu(proxy, | 94 return SkSpecialImage::MakeFromGpu(proxy, |
83 SkIRect::MakeWH(resultTex->width(), resul
tTex->height()), | 95 SkIRect::MakeWH(resultTex->width(), resul
tTex->height()), |
84 this->uniqueID(), | 96 this->uniqueID(), |
85 resultTex, at); | 97 resultTex, &this->props(), at); |
86 #else | 98 #else |
87 return nullptr; | 99 return nullptr; |
88 #endif | 100 #endif |
89 } | 101 } |
90 | 102 |
91 void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPain
t* paint) const { | 103 void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPain
t* paint) const { |
92 return as_SIB(this)->onDraw(canvas, x, y, paint); | 104 return as_SIB(this)->onDraw(canvas, x, y, paint); |
93 } | 105 } |
94 | 106 |
95 bool SkSpecialImage::peekPixels(SkPixmap* pixmap) const { | 107 bool SkSpecialImage::peekPixels(SkPixmap* pixmap) const { |
(...skipping 23 matching lines...) Expand all Loading... |
119 sk_sp<SkImage> SkSpecialImage::makeTightSubset(const SkIRect& subset) const { | 131 sk_sp<SkImage> SkSpecialImage::makeTightSubset(const SkIRect& subset) const { |
120 return as_SIB(this)->onMakeTightSubset(subset); | 132 return as_SIB(this)->onMakeTightSubset(subset); |
121 } | 133 } |
122 | 134 |
123 #if SK_SUPPORT_GPU | 135 #if SK_SUPPORT_GPU |
124 #include "SkGr.h" | 136 #include "SkGr.h" |
125 #include "SkGrPixelRef.h" | 137 #include "SkGrPixelRef.h" |
126 #endif | 138 #endif |
127 | 139 |
128 sk_sp<SkSpecialImage> SkSpecialImage::internal_fromBM(SkImageFilter::Proxy* prox
y, | 140 sk_sp<SkSpecialImage> SkSpecialImage::internal_fromBM(SkImageFilter::Proxy* prox
y, |
129 const SkBitmap& src) { | 141 const SkBitmap& src, |
| 142 const SkSurfaceProps* prop
s) { |
130 // Need to test offset case! (see skbug.com/4967) | 143 // Need to test offset case! (see skbug.com/4967) |
131 if (src.getTexture()) { | 144 if (src.getTexture()) { |
132 return SkSpecialImage::MakeFromGpu(proxy, | 145 return SkSpecialImage::MakeFromGpu(proxy, |
133 src.bounds(), | 146 src.bounds(), |
134 src.getGenerationID(), | 147 src.getGenerationID(), |
135 src.getTexture()); | 148 src.getTexture(), |
| 149 props); |
136 } | 150 } |
137 | 151 |
138 return SkSpecialImage::MakeFromRaster(proxy, src.bounds(), src); | 152 return SkSpecialImage::MakeFromRaster(proxy, src.bounds(), src, props); |
139 } | 153 } |
140 | 154 |
141 bool SkSpecialImage::internal_getBM(SkBitmap* result) { | 155 bool SkSpecialImage::internal_getBM(SkBitmap* result) { |
142 const SkSpecialImage_Base* ib = as_SIB(this); | 156 const SkSpecialImage_Base* ib = as_SIB(this); |
143 | 157 |
144 // TODO: need to test offset case! (see skbug.com/4967) | 158 // TODO: need to test offset case! (see skbug.com/4967) |
145 return ib->getBitmapDeprecated(result); | 159 return ib->getBitmapDeprecated(result); |
146 } | 160 } |
147 | 161 |
148 SkImageFilter::Proxy* SkSpecialImage::internal_getProxy() const { | 162 SkImageFilter::Proxy* SkSpecialImage::internal_getProxy() const { |
149 return fProxy; | 163 return fProxy; |
150 } | 164 } |
151 | 165 |
152 /////////////////////////////////////////////////////////////////////////////// | 166 /////////////////////////////////////////////////////////////////////////////// |
153 #include "SkImage.h" | 167 #include "SkImage.h" |
154 #if SK_SUPPORT_GPU | 168 #if SK_SUPPORT_GPU |
155 #include "GrContext.h" | 169 #include "GrContext.h" |
156 #include "SkGrPriv.h" | 170 #include "SkGrPriv.h" |
157 #endif | 171 #endif |
158 | 172 |
159 class SkSpecialImage_Image : public SkSpecialImage_Base { | 173 class SkSpecialImage_Image : public SkSpecialImage_Base { |
160 public: | 174 public: |
161 SkSpecialImage_Image(SkImageFilter::Proxy* proxy, | 175 SkSpecialImage_Image(SkImageFilter::Proxy* proxy, |
162 const SkIRect& subset, | 176 const SkIRect& subset, |
163 sk_sp<SkImage> image) | 177 sk_sp<SkImage> image, |
164 : INHERITED(proxy, subset, image->uniqueID()) | 178 const SkSurfaceProps* props) |
| 179 : INHERITED(proxy, subset, image->uniqueID(), props) |
165 , fImage(image) { | 180 , fImage(image) { |
166 } | 181 } |
167 | 182 |
168 ~SkSpecialImage_Image() override { } | 183 ~SkSpecialImage_Image() override { } |
169 | 184 |
170 bool isOpaque() const override { return fImage->isOpaque(); } | 185 bool isOpaque() const override { return fImage->isOpaque(); } |
171 | 186 |
172 size_t getSize() const override { | 187 size_t getSize() const override { |
173 #if SK_SUPPORT_GPU | 188 #if SK_SUPPORT_GPU |
174 if (GrTexture* texture = as_IB(fImage.get())->peekTexture()) { | 189 if (GrTexture* texture = as_IB(fImage.get())->peekTexture()) { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 } | 248 } |
234 | 249 |
235 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { | 250 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { |
236 sk_sp<SkImage> subsetImg(fImage->makeSubset(subset)); | 251 sk_sp<SkImage> subsetImg(fImage->makeSubset(subset)); |
237 if (!subsetImg) { | 252 if (!subsetImg) { |
238 return nullptr; | 253 return nullptr; |
239 } | 254 } |
240 | 255 |
241 return SkSpecialImage::MakeFromImage(this->internal_getProxy(), | 256 return SkSpecialImage::MakeFromImage(this->internal_getProxy(), |
242 SkIRect::MakeWH(subset.width(), sub
set.height()), | 257 SkIRect::MakeWH(subset.width(), sub
set.height()), |
243 subsetImg); | 258 subsetImg, |
| 259 &this->props()); |
244 } | 260 } |
245 | 261 |
246 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { | 262 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { |
247 return fImage->makeSubset(subset); | 263 return fImage->makeSubset(subset); |
248 } | 264 } |
249 | 265 |
250 sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override
{ | 266 sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override
{ |
251 #if SK_SUPPORT_GPU | 267 #if SK_SUPPORT_GPU |
252 GrTexture* texture = as_IB(fImage.get())->peekTexture(); | 268 GrTexture* texture = as_IB(fImage.get())->peekTexture(); |
253 if (texture) { | 269 if (texture) { |
(...skipping 18 matching lines...) Expand all Loading... |
272 | 288 |
273 return rect.fLeft >= 0 && rect.fLeft < width && rect.fLeft < rect.fRight && | 289 return rect.fLeft >= 0 && rect.fLeft < width && rect.fLeft < rect.fRight && |
274 rect.fRight >= 0 && rect.fRight <= width && | 290 rect.fRight >= 0 && rect.fRight <= width && |
275 rect.fTop >= 0 && rect.fTop < height && rect.fTop < rect.fBottom && | 291 rect.fTop >= 0 && rect.fTop < height && rect.fTop < rect.fBottom && |
276 rect.fBottom >= 0 && rect.fBottom <= height; | 292 rect.fBottom >= 0 && rect.fBottom <= height; |
277 } | 293 } |
278 #endif | 294 #endif |
279 | 295 |
280 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromImage(SkImageFilter::Proxy* proxy, | 296 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromImage(SkImageFilter::Proxy* proxy, |
281 const SkIRect& subset, | 297 const SkIRect& subset, |
282 sk_sp<SkImage> image) { | 298 sk_sp<SkImage> image, |
| 299 const SkSurfaceProps* props)
{ |
283 SkASSERT(rect_fits(subset, image->width(), image->height())); | 300 SkASSERT(rect_fits(subset, image->width(), image->height())); |
284 | 301 |
285 return sk_make_sp<SkSpecialImage_Image>(proxy, subset, image); | 302 return sk_make_sp<SkSpecialImage_Image>(proxy, subset, image, props); |
286 } | 303 } |
287 | 304 |
288 /////////////////////////////////////////////////////////////////////////////// | 305 /////////////////////////////////////////////////////////////////////////////// |
289 #include "SkBitmap.h" | 306 #include "SkBitmap.h" |
290 #include "SkImageInfo.h" | 307 #include "SkImageInfo.h" |
291 #include "SkPixelRef.h" | 308 #include "SkPixelRef.h" |
292 | 309 |
293 class SkSpecialImage_Raster : public SkSpecialImage_Base { | 310 class SkSpecialImage_Raster : public SkSpecialImage_Base { |
294 public: | 311 public: |
295 SkSpecialImage_Raster(SkImageFilter::Proxy* proxy, const SkIRect& subset, co
nst SkBitmap& bm) | 312 SkSpecialImage_Raster(SkImageFilter::Proxy* proxy, const SkIRect& subset, co
nst SkBitmap& bm, |
296 : INHERITED(proxy, subset, bm.getGenerationID()) | 313 const SkSurfaceProps* props) |
| 314 : INHERITED(proxy, subset, bm.getGenerationID(), props) |
297 , fBitmap(bm) { | 315 , fBitmap(bm) { |
298 if (bm.pixelRef() && bm.pixelRef()->isPreLocked()) { | 316 if (bm.pixelRef() && bm.pixelRef()->isPreLocked()) { |
299 // we only preemptively lock if there is no chance of triggering som
ething expensive | 317 // we only preemptively lock if there is no chance of triggering som
ething expensive |
300 // like a lazy decode or imagegenerator. PreLocked means it is flat
pixels already. | 318 // like a lazy decode or imagegenerator. PreLocked means it is flat
pixels already. |
301 fBitmap.lockPixels(); | 319 fBitmap.lockPixels(); |
302 } | 320 } |
303 } | 321 } |
304 | 322 |
305 SkSpecialImage_Raster(SkImageFilter::Proxy* proxy, | 323 SkSpecialImage_Raster(SkImageFilter::Proxy* proxy, |
306 const SkIRect& subset, | 324 const SkIRect& subset, |
307 const SkPixmap& pixmap, | 325 const SkPixmap& pixmap, |
308 RasterReleaseProc releaseProc, | 326 RasterReleaseProc releaseProc, |
309 ReleaseContext context) | 327 ReleaseContext context, |
310 : INHERITED(proxy, subset, kNeedNewImageUniqueID_SpecialImage) { | 328 const SkSurfaceProps* props) |
| 329 : INHERITED(proxy, subset, kNeedNewImageUniqueID_SpecialImage, props) { |
311 fBitmap.installPixels(pixmap.info(), pixmap.writable_addr(), | 330 fBitmap.installPixels(pixmap.info(), pixmap.writable_addr(), |
312 pixmap.rowBytes(), pixmap.ctable(), | 331 pixmap.rowBytes(), pixmap.ctable(), |
313 releaseProc, context); | 332 releaseProc, context); |
314 } | 333 } |
315 | 334 |
316 ~SkSpecialImage_Raster() override { } | 335 ~SkSpecialImage_Raster() override { } |
317 | 336 |
318 bool isOpaque() const override { return fBitmap.isOpaque(); } | 337 bool isOpaque() const override { return fBitmap.isOpaque(); } |
319 | 338 |
320 size_t getSize() const override { return fBitmap.getSize(); } | 339 size_t getSize() const override { return fBitmap.getSize(); } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 | 376 |
358 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { | 377 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { |
359 SkBitmap subsetBM; | 378 SkBitmap subsetBM; |
360 | 379 |
361 if (!fBitmap.extractSubset(&subsetBM, subset)) { | 380 if (!fBitmap.extractSubset(&subsetBM, subset)) { |
362 return nullptr; | 381 return nullptr; |
363 } | 382 } |
364 | 383 |
365 return SkSpecialImage::MakeFromRaster(this->internal_getProxy(), | 384 return SkSpecialImage::MakeFromRaster(this->internal_getProxy(), |
366 SkIRect::MakeWH(subset.width(), su
bset.height()), | 385 SkIRect::MakeWH(subset.width(), su
bset.height()), |
367 subsetBM); | 386 subsetBM, |
| 387 &this->props()); |
368 } | 388 } |
369 | 389 |
370 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { | 390 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { |
371 SkBitmap subsetBM; | 391 SkBitmap subsetBM; |
372 | 392 |
373 if (!fBitmap.extractSubset(&subsetBM, subset)) { | 393 if (!fBitmap.extractSubset(&subsetBM, subset)) { |
374 return nullptr; | 394 return nullptr; |
375 } | 395 } |
376 | 396 |
377 return SkImage::MakeFromBitmap(subsetBM); | 397 return SkImage::MakeFromBitmap(subsetBM); |
378 } | 398 } |
379 | 399 |
380 sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override
{ | 400 sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override
{ |
381 return SkSurface::MakeRaster(info); | 401 return SkSurface::MakeRaster(info); |
382 } | 402 } |
383 | 403 |
384 private: | 404 private: |
385 SkBitmap fBitmap; | 405 SkBitmap fBitmap; |
386 | 406 |
387 typedef SkSpecialImage_Base INHERITED; | 407 typedef SkSpecialImage_Base INHERITED; |
388 }; | 408 }; |
389 | 409 |
390 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromRaster(SkImageFilter::Proxy* proxy
, | 410 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromRaster(SkImageFilter::Proxy* proxy
, |
391 const SkIRect& subset, | 411 const SkIRect& subset, |
392 const SkBitmap& bm) { | 412 const SkBitmap& bm, |
| 413 const SkSurfaceProps* props
) { |
393 SkASSERT(nullptr == bm.getTexture()); | 414 SkASSERT(nullptr == bm.getTexture()); |
394 SkASSERT(rect_fits(subset, bm.width(), bm.height())); | 415 SkASSERT(rect_fits(subset, bm.width(), bm.height())); |
395 | 416 |
396 return sk_make_sp<SkSpecialImage_Raster>(proxy, subset, bm); | 417 return sk_make_sp<SkSpecialImage_Raster>(proxy, subset, bm, props); |
397 } | 418 } |
398 | 419 |
399 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromPixmap(SkImageFilter::Proxy* proxy
, | 420 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromPixmap(SkImageFilter::Proxy* proxy
, |
400 const SkIRect& subset, | 421 const SkIRect& subset, |
401 const SkPixmap& src, | 422 const SkPixmap& src, |
402 RasterReleaseProc releasePr
oc, | 423 RasterReleaseProc releasePr
oc, |
403 ReleaseContext context) { | 424 ReleaseContext context, |
| 425 const SkSurfaceProps* props
) { |
404 if (!src.addr()) { | 426 if (!src.addr()) { |
405 return nullptr; | 427 return nullptr; |
406 } | 428 } |
407 | 429 |
408 return sk_make_sp<SkSpecialImage_Raster>(proxy, subset, src, releaseProc, co
ntext); | 430 return sk_make_sp<SkSpecialImage_Raster>(proxy, subset, src, releaseProc, co
ntext, props); |
409 } | 431 } |
410 | 432 |
411 | 433 |
412 #if SK_SUPPORT_GPU | 434 #if SK_SUPPORT_GPU |
413 /////////////////////////////////////////////////////////////////////////////// | 435 /////////////////////////////////////////////////////////////////////////////// |
414 #include "GrTexture.h" | 436 #include "GrTexture.h" |
415 #include "SkImage_Gpu.h" | 437 #include "SkImage_Gpu.h" |
416 | 438 |
417 class SkSpecialImage_Gpu : public SkSpecialImage_Base { | 439 class SkSpecialImage_Gpu : public SkSpecialImage_Base { |
418 public: | 440 public: |
419 SkSpecialImage_Gpu(SkImageFilter::Proxy* proxy, const SkIRect& subset, | 441 SkSpecialImage_Gpu(SkImageFilter::Proxy* proxy, const SkIRect& subset, |
420 uint32_t uniqueID, GrTexture* tex, SkAlphaType at) | 442 uint32_t uniqueID, GrTexture* tex, SkAlphaType at, |
421 : INHERITED(proxy, subset, uniqueID) | 443 const SkSurfaceProps* props) |
| 444 : INHERITED(proxy, subset, uniqueID, props) |
422 , fTexture(SkRef(tex)) | 445 , fTexture(SkRef(tex)) |
423 , fAlphaType(at) { | 446 , fAlphaType(at) { |
424 } | 447 } |
425 | 448 |
426 ~SkSpecialImage_Gpu() override { } | 449 ~SkSpecialImage_Gpu() override { } |
427 | 450 |
428 bool isOpaque() const override { | 451 bool isOpaque() const override { |
429 return GrPixelConfigIsOpaque(fTexture->config()) || fAlphaType == kOpaqu
e_SkAlphaType; | 452 return GrPixelConfigIsOpaque(fTexture->config()) || fAlphaType == kOpaqu
e_SkAlphaType; |
430 } | 453 } |
431 | 454 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 512 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
490 | 513 |
491 return SkSpecialSurface::MakeRenderTarget(this->proxy(), fTexture->getCo
ntext(), desc); | 514 return SkSpecialSurface::MakeRenderTarget(this->proxy(), fTexture->getCo
ntext(), desc); |
492 } | 515 } |
493 | 516 |
494 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { | 517 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { |
495 return SkSpecialImage::MakeFromGpu(this->internal_getProxy(), | 518 return SkSpecialImage::MakeFromGpu(this->internal_getProxy(), |
496 subset, | 519 subset, |
497 this->uniqueID(), | 520 this->uniqueID(), |
498 fTexture, | 521 fTexture, |
| 522 &this->props(), |
499 fAlphaType); | 523 fAlphaType); |
500 } | 524 } |
501 | 525 |
502 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { | 526 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { |
503 if (0 == subset.fLeft && 0 == subset.fTop && | 527 if (0 == subset.fLeft && 0 == subset.fTop && |
504 fTexture->width() == subset.width() && | 528 fTexture->width() == subset.width() && |
505 fTexture->height() == subset.height()) { | 529 fTexture->height() == subset.height()) { |
506 // The existing GrTexture is already tight so reuse it in the SkImag
e | 530 // The existing GrTexture is already tight so reuse it in the SkImag
e |
507 return sk_make_sp<SkImage_Gpu>(fTexture->width(), fTexture->height()
, | 531 return sk_make_sp<SkImage_Gpu>(fTexture->width(), fTexture->height()
, |
508 kNeedNewImageUniqueID, | 532 kNeedNewImageUniqueID, |
(...skipping 23 matching lines...) Expand all Loading... |
532 SkAutoTUnref<GrTexture> fTexture; | 556 SkAutoTUnref<GrTexture> fTexture; |
533 const SkAlphaType fAlphaType; | 557 const SkAlphaType fAlphaType; |
534 | 558 |
535 typedef SkSpecialImage_Base INHERITED; | 559 typedef SkSpecialImage_Base INHERITED; |
536 }; | 560 }; |
537 | 561 |
538 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(SkImageFilter::Proxy* proxy, | 562 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(SkImageFilter::Proxy* proxy, |
539 const SkIRect& subset, | 563 const SkIRect& subset, |
540 uint32_t uniqueID, | 564 uint32_t uniqueID, |
541 GrTexture* tex, | 565 GrTexture* tex, |
| 566 const SkSurfaceProps* props, |
542 SkAlphaType at) { | 567 SkAlphaType at) { |
543 SkASSERT(rect_fits(subset, tex->width(), tex->height())); | 568 SkASSERT(rect_fits(subset, tex->width(), tex->height())); |
544 return sk_make_sp<SkSpecialImage_Gpu>(proxy, subset, uniqueID, tex, at); | 569 return sk_make_sp<SkSpecialImage_Gpu>(proxy, subset, uniqueID, tex, at, prop
s); |
545 } | 570 } |
546 | 571 |
547 #else | 572 #else |
548 | 573 |
549 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(SkImageFilter::Proxy* proxy, | 574 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(SkImageFilter::Proxy* proxy, |
550 const SkIRect& subset, | 575 const SkIRect& subset, |
551 uint32_t uniqueID, | 576 uint32_t uniqueID, |
552 GrTexture* tex, | 577 GrTexture* tex, |
| 578 const SkSurfaceProps* props, |
553 SkAlphaType at) { | 579 SkAlphaType at) { |
554 return nullptr; | 580 return nullptr; |
555 } | 581 } |
556 | 582 |
557 #endif | 583 #endif |
OLD | NEW |