| 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 "SkBitmapCache.h" | 15 #include "SkBitmapCache.h" |
| 16 #include "SkCanvas.h" | 16 #include "SkCanvas.h" |
| 17 #include "SkImage_Base.h" | 17 #include "SkImage_Base.h" |
| 18 #include "SkSpecialSurface.h" | 18 #include "SkSpecialSurface.h" |
| 19 #include "SkSurfacePriv.h" | 19 #include "SkSurfacePriv.h" |
| 20 | 20 |
| 21 /////////////////////////////////////////////////////////////////////////////// | 21 /////////////////////////////////////////////////////////////////////////////// |
| 22 class SkSpecialImage_Base : public SkSpecialImage { | 22 class SkSpecialImage_Base : public SkSpecialImage { |
| 23 public: | 23 public: |
| 24 SkSpecialImage_Base(SkImageFilter::Proxy* proxy, const SkIRect& subset, uint
32_t uniqueID, | 24 SkSpecialImage_Base(const SkIRect& subset, uint32_t uniqueID, const SkSurfac
eProps* props) |
| 25 const SkSurfaceProps* props) | 25 : INHERITED(subset, uniqueID, props) { |
| 26 : INHERITED(proxy, subset, uniqueID, props) { | |
| 27 } | 26 } |
| 28 virtual ~SkSpecialImage_Base() { } | 27 ~SkSpecialImage_Base() override { } |
| 29 | 28 |
| 30 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; |
| 31 | 30 |
| 32 virtual bool onGetROPixels(SkBitmap*) const = 0; | 31 virtual bool onGetROPixels(SkBitmap*) const = 0; |
| 33 | 32 |
| 34 virtual GrTexture* onPeekTexture() const { return nullptr; } | 33 virtual GrTexture* onPeekTexture() const { return nullptr; } |
| 35 | 34 |
| 36 virtual GrTexture* onAsTextureRef(GrContext* context) const = 0; | 35 virtual GrTexture* onAsTextureRef(GrContext* context) const = 0; |
| 37 | 36 |
| 38 // Delete this entry point ASAP (see skbug.com/4965) | 37 // Delete this entry point ASAP (see skbug.com/4965) |
| 39 virtual bool getBitmapDeprecated(SkBitmap* result) const = 0; | 38 virtual bool getBitmapDeprecated(SkBitmap* result) const = 0; |
| 40 | 39 |
| 41 virtual sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const = 0; | 40 virtual sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const = 0; |
| 42 | 41 |
| 43 virtual sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const
= 0; | 42 virtual sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const
= 0; |
| 44 | 43 |
| 45 virtual sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const = 0; | 44 virtual sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const = 0; |
| 46 | 45 |
| 47 virtual sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const =
0; | 46 virtual sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const =
0; |
| 48 | 47 |
| 49 private: | 48 private: |
| 50 typedef SkSpecialImage INHERITED; | 49 typedef SkSpecialImage INHERITED; |
| 51 }; | 50 }; |
| 52 | 51 |
| 53 /////////////////////////////////////////////////////////////////////////////// | 52 /////////////////////////////////////////////////////////////////////////////// |
| 54 static inline const SkSpecialImage_Base* as_SIB(const SkSpecialImage* image) { | 53 static inline const SkSpecialImage_Base* as_SIB(const SkSpecialImage* image) { |
| 55 return static_cast<const SkSpecialImage_Base*>(image); | 54 return static_cast<const SkSpecialImage_Base*>(image); |
| 56 } | 55 } |
| 57 | 56 |
| 58 SkSpecialImage::SkSpecialImage(SkImageFilter::Proxy* proxy, | 57 SkSpecialImage::SkSpecialImage(const SkIRect& subset, |
| 59 const SkIRect& subset, | |
| 60 uint32_t uniqueID, | 58 uint32_t uniqueID, |
| 61 const SkSurfaceProps* props) | 59 const SkSurfaceProps* props) |
| 62 : fProps(SkSurfacePropsCopyOrDefault(props)) | 60 : fProps(SkSurfacePropsCopyOrDefault(props)) |
| 63 , fSubset(subset) | 61 , fSubset(subset) |
| 64 , fUniqueID(kNeedNewImageUniqueID_SpecialImage == uniqueID ? SkNextID::Image
ID() : uniqueID) | 62 , fUniqueID(kNeedNewImageUniqueID_SpecialImage == uniqueID ? SkNextID::Image
ID() : uniqueID) { |
| 65 , fProxy(proxy) { | |
| 66 } | 63 } |
| 67 | 64 |
| 68 sk_sp<SkSpecialImage> SkSpecialImage::makeTextureImage(SkImageFilter::Proxy* pro
xy, | 65 sk_sp<SkSpecialImage> SkSpecialImage::makeTextureImage(GrContext* context) { |
| 69 GrContext* context) { | |
| 70 #if SK_SUPPORT_GPU | 66 #if SK_SUPPORT_GPU |
| 71 if (!context) { | 67 if (!context) { |
| 72 return nullptr; | 68 return nullptr; |
| 73 } | 69 } |
| 74 if (GrTexture* peek = as_SIB(this)->onPeekTexture()) { | 70 if (GrTexture* peek = as_SIB(this)->onPeekTexture()) { |
| 75 return peek->getContext() == context ? sk_sp<SkSpecialImage>(SkRef(this)
) : nullptr; | 71 return peek->getContext() == context ? sk_sp<SkSpecialImage>(SkRef(this)
) : nullptr; |
| 76 } | 72 } |
| 77 | 73 |
| 78 SkBitmap bmp; | 74 SkBitmap bmp; |
| 79 if (!this->internal_getBM(&bmp)) { | 75 if (!this->internal_getBM(&bmp)) { |
| 80 return nullptr; | 76 return nullptr; |
| 81 } | 77 } |
| 82 | 78 |
| 83 if (bmp.empty()) { | 79 if (bmp.empty()) { |
| 84 return SkSpecialImage::MakeFromRaster(proxy, SkIRect::MakeEmpty(), bmp,
&this->props()); | 80 return SkSpecialImage::MakeFromRaster(SkIRect::MakeEmpty(), bmp, &this->
props()); |
| 85 } | 81 } |
| 86 | 82 |
| 87 SkAutoTUnref<GrTexture> resultTex( | 83 SkAutoTUnref<GrTexture> resultTex( |
| 88 GrRefCachedBitmapTexture(context, bmp, GrTextureParams::ClampNoFilter())
); | 84 GrRefCachedBitmapTexture(context, bmp, GrTextureParams::ClampNoFilter())
); |
| 89 if (!resultTex) { | 85 if (!resultTex) { |
| 90 return nullptr; | 86 return nullptr; |
| 91 } | 87 } |
| 92 | 88 |
| 93 SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaTyp
e; | 89 SkAlphaType at = this->isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaTyp
e; |
| 94 | 90 |
| 95 return SkSpecialImage::MakeFromGpu(proxy, | 91 return SkSpecialImage::MakeFromGpu(SkIRect::MakeWH(resultTex->width(), resul
tTex->height()), |
| 96 SkIRect::MakeWH(resultTex->width(), resul
tTex->height()), | |
| 97 this->uniqueID(), | 92 this->uniqueID(), |
| 98 resultTex, &this->props(), at); | 93 resultTex, &this->props(), at); |
| 99 #else | 94 #else |
| 100 return nullptr; | 95 return nullptr; |
| 101 #endif | 96 #endif |
| 102 } | 97 } |
| 103 | 98 |
| 104 void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPain
t* paint) const { | 99 void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPain
t* paint) const { |
| 105 return as_SIB(this)->onDraw(canvas, x, y, paint); | 100 return as_SIB(this)->onDraw(canvas, x, y, paint); |
| 106 } | 101 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 | 142 |
| 148 sk_sp<SkImage> SkSpecialImage::makeTightSubset(const SkIRect& subset) const { | 143 sk_sp<SkImage> SkSpecialImage::makeTightSubset(const SkIRect& subset) const { |
| 149 return as_SIB(this)->onMakeTightSubset(subset); | 144 return as_SIB(this)->onMakeTightSubset(subset); |
| 150 } | 145 } |
| 151 | 146 |
| 152 #if SK_SUPPORT_GPU | 147 #if SK_SUPPORT_GPU |
| 153 #include "SkGr.h" | 148 #include "SkGr.h" |
| 154 #include "SkGrPixelRef.h" | 149 #include "SkGrPixelRef.h" |
| 155 #endif | 150 #endif |
| 156 | 151 |
| 157 sk_sp<SkSpecialImage> SkSpecialImage::internal_fromBM(SkImageFilter::Proxy* prox
y, | 152 sk_sp<SkSpecialImage> SkSpecialImage::internal_fromBM(const SkBitmap& src, |
| 158 const SkBitmap& src, | |
| 159 const SkSurfaceProps* prop
s) { | 153 const SkSurfaceProps* prop
s) { |
| 160 // Need to test offset case! (see skbug.com/4967) | 154 // Need to test offset case! (see skbug.com/4967) |
| 161 if (src.getTexture()) { | 155 if (src.getTexture()) { |
| 162 return SkSpecialImage::MakeFromGpu(proxy, | 156 return SkSpecialImage::MakeFromGpu(src.bounds(), |
| 163 src.bounds(), | |
| 164 src.getGenerationID(), | 157 src.getGenerationID(), |
| 165 src.getTexture(), | 158 src.getTexture(), |
| 166 props); | 159 props); |
| 167 } | 160 } |
| 168 | 161 |
| 169 return SkSpecialImage::MakeFromRaster(proxy, src.bounds(), src, props); | 162 return SkSpecialImage::MakeFromRaster(src.bounds(), src, props); |
| 170 } | 163 } |
| 171 | 164 |
| 172 bool SkSpecialImage::internal_getBM(SkBitmap* result) { | 165 bool SkSpecialImage::internal_getBM(SkBitmap* result) { |
| 173 const SkSpecialImage_Base* ib = as_SIB(this); | 166 const SkSpecialImage_Base* ib = as_SIB(this); |
| 174 | 167 |
| 175 // TODO: need to test offset case! (see skbug.com/4967) | 168 // TODO: need to test offset case! (see skbug.com/4967) |
| 176 return ib->getBitmapDeprecated(result); | 169 return ib->getBitmapDeprecated(result); |
| 177 } | 170 } |
| 178 | 171 |
| 179 SkImageFilter::Proxy* SkSpecialImage::internal_getProxy() const { | |
| 180 return fProxy; | |
| 181 } | |
| 182 | |
| 183 /////////////////////////////////////////////////////////////////////////////// | 172 /////////////////////////////////////////////////////////////////////////////// |
| 184 #include "SkImage.h" | 173 #include "SkImage.h" |
| 185 #if SK_SUPPORT_GPU | 174 #if SK_SUPPORT_GPU |
| 186 #include "GrContext.h" | 175 #include "GrContext.h" |
| 187 #include "SkGrPriv.h" | 176 #include "SkGrPriv.h" |
| 188 #endif | 177 #endif |
| 189 | 178 |
| 190 class SkSpecialImage_Image : public SkSpecialImage_Base { | 179 class SkSpecialImage_Image : public SkSpecialImage_Base { |
| 191 public: | 180 public: |
| 192 SkSpecialImage_Image(SkImageFilter::Proxy* proxy, | 181 SkSpecialImage_Image(const SkIRect& subset, |
| 193 const SkIRect& subset, | |
| 194 sk_sp<SkImage> image, | 182 sk_sp<SkImage> image, |
| 195 const SkSurfaceProps* props) | 183 const SkSurfaceProps* props) |
| 196 : INHERITED(proxy, subset, image->uniqueID(), props) | 184 : INHERITED(subset, image->uniqueID(), props) |
| 197 , fImage(image) { | 185 , fImage(image) { |
| 198 } | 186 } |
| 199 | 187 |
| 200 ~SkSpecialImage_Image() override { } | 188 ~SkSpecialImage_Image() override { } |
| 201 | 189 |
| 202 bool isOpaque() const override { return fImage->isOpaque(); } | 190 bool isOpaque() const override { return fImage->isOpaque(); } |
| 203 | 191 |
| 204 size_t getSize() const override { | 192 size_t getSize() const override { |
| 205 #if SK_SUPPORT_GPU | 193 #if SK_SUPPORT_GPU |
| 206 if (GrTexture* texture = as_IB(fImage.get())->peekTexture()) { | 194 if (GrTexture* texture = as_IB(fImage.get())->peekTexture()) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 return as_IB(fImage.get())->asBitmapForImageFilters(result); | 243 return as_IB(fImage.get())->asBitmapForImageFilters(result); |
| 256 } | 244 } |
| 257 | 245 |
| 258 sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const overrid
e { | 246 sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const overrid
e { |
| 259 #if SK_SUPPORT_GPU | 247 #if SK_SUPPORT_GPU |
| 260 GrTexture* texture = as_IB(fImage.get())->peekTexture(); | 248 GrTexture* texture = as_IB(fImage.get())->peekTexture(); |
| 261 if (texture) { | 249 if (texture) { |
| 262 GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(info, *texture->getCon
text()->caps()); | 250 GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(info, *texture->getCon
text()->caps()); |
| 263 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 251 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 264 | 252 |
| 265 return SkSpecialSurface::MakeRenderTarget(this->proxy(), texture->ge
tContext(), desc); | 253 return SkSpecialSurface::MakeRenderTarget(texture->getContext(), des
c); |
| 266 } | 254 } |
| 267 #endif | 255 #endif |
| 268 return SkSpecialSurface::MakeRaster(this->proxy(), info, nullptr); | 256 return SkSpecialSurface::MakeRaster(info, nullptr); |
| 269 } | 257 } |
| 270 | 258 |
| 271 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { | 259 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { |
| 272 sk_sp<SkImage> subsetImg(fImage->makeSubset(subset)); | 260 sk_sp<SkImage> subsetImg(fImage->makeSubset(subset)); |
| 273 if (!subsetImg) { | 261 if (!subsetImg) { |
| 274 return nullptr; | 262 return nullptr; |
| 275 } | 263 } |
| 276 | 264 |
| 277 return SkSpecialImage::MakeFromImage(this->internal_getProxy(), | 265 return SkSpecialImage::MakeFromImage(SkIRect::MakeWH(subset.width(), sub
set.height()), |
| 278 SkIRect::MakeWH(subset.width(), sub
set.height()), | |
| 279 subsetImg, | 266 subsetImg, |
| 280 &this->props()); | 267 &this->props()); |
| 281 } | 268 } |
| 282 | 269 |
| 283 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { | 270 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { |
| 284 return fImage->makeSubset(subset); | 271 return fImage->makeSubset(subset); |
| 285 } | 272 } |
| 286 | 273 |
| 287 sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override
{ | 274 sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override
{ |
| 288 #if SK_SUPPORT_GPU | 275 #if SK_SUPPORT_GPU |
| (...skipping 18 matching lines...) Expand all Loading... |
| 307 return true; | 294 return true; |
| 308 } | 295 } |
| 309 | 296 |
| 310 return rect.fLeft >= 0 && rect.fLeft < width && rect.fLeft < rect.fRight && | 297 return rect.fLeft >= 0 && rect.fLeft < width && rect.fLeft < rect.fRight && |
| 311 rect.fRight >= 0 && rect.fRight <= width && | 298 rect.fRight >= 0 && rect.fRight <= width && |
| 312 rect.fTop >= 0 && rect.fTop < height && rect.fTop < rect.fBottom && | 299 rect.fTop >= 0 && rect.fTop < height && rect.fTop < rect.fBottom && |
| 313 rect.fBottom >= 0 && rect.fBottom <= height; | 300 rect.fBottom >= 0 && rect.fBottom <= height; |
| 314 } | 301 } |
| 315 #endif | 302 #endif |
| 316 | 303 |
| 317 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromImage(SkImageFilter::Proxy* proxy, | 304 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromImage(const SkIRect& subset, |
| 318 const SkIRect& subset, | |
| 319 sk_sp<SkImage> image, | 305 sk_sp<SkImage> image, |
| 320 const SkSurfaceProps* props)
{ | 306 const SkSurfaceProps* props)
{ |
| 321 SkASSERT(rect_fits(subset, image->width(), image->height())); | 307 SkASSERT(rect_fits(subset, image->width(), image->height())); |
| 322 | 308 |
| 323 return sk_make_sp<SkSpecialImage_Image>(proxy, subset, image, props); | 309 return sk_make_sp<SkSpecialImage_Image>(subset, image, props); |
| 324 } | 310 } |
| 325 | 311 |
| 326 /////////////////////////////////////////////////////////////////////////////// | 312 /////////////////////////////////////////////////////////////////////////////// |
| 327 #include "SkBitmap.h" | 313 #include "SkBitmap.h" |
| 328 #include "SkImageInfo.h" | 314 #include "SkImageInfo.h" |
| 329 #include "SkPixelRef.h" | 315 #include "SkPixelRef.h" |
| 330 | 316 |
| 331 class SkSpecialImage_Raster : public SkSpecialImage_Base { | 317 class SkSpecialImage_Raster : public SkSpecialImage_Base { |
| 332 public: | 318 public: |
| 333 SkSpecialImage_Raster(SkImageFilter::Proxy* proxy, const SkIRect& subset, co
nst SkBitmap& bm, | 319 SkSpecialImage_Raster(const SkIRect& subset, const SkBitmap& bm, const SkSur
faceProps* props) |
| 334 const SkSurfaceProps* props) | 320 : INHERITED(subset, bm.getGenerationID(), props) |
| 335 : INHERITED(proxy, subset, bm.getGenerationID(), props) | |
| 336 , fBitmap(bm) { | 321 , fBitmap(bm) { |
| 337 if (bm.pixelRef() && bm.pixelRef()->isPreLocked()) { | 322 if (bm.pixelRef() && bm.pixelRef()->isPreLocked()) { |
| 338 // we only preemptively lock if there is no chance of triggering som
ething expensive | 323 // we only preemptively lock if there is no chance of triggering som
ething expensive |
| 339 // like a lazy decode or imagegenerator. PreLocked means it is flat
pixels already. | 324 // like a lazy decode or imagegenerator. PreLocked means it is flat
pixels already. |
| 340 fBitmap.lockPixels(); | 325 fBitmap.lockPixels(); |
| 341 } | 326 } |
| 342 } | 327 } |
| 343 | 328 |
| 344 SkSpecialImage_Raster(SkImageFilter::Proxy* proxy, | 329 SkSpecialImage_Raster(const SkIRect& subset, |
| 345 const SkIRect& subset, | |
| 346 const SkPixmap& pixmap, | 330 const SkPixmap& pixmap, |
| 347 RasterReleaseProc releaseProc, | 331 RasterReleaseProc releaseProc, |
| 348 ReleaseContext context, | 332 ReleaseContext context, |
| 349 const SkSurfaceProps* props) | 333 const SkSurfaceProps* props) |
| 350 : INHERITED(proxy, subset, kNeedNewImageUniqueID_SpecialImage, props) { | 334 : INHERITED(subset, kNeedNewImageUniqueID_SpecialImage, props) { |
| 351 fBitmap.installPixels(pixmap.info(), pixmap.writable_addr(), | 335 fBitmap.installPixels(pixmap.info(), pixmap.writable_addr(), |
| 352 pixmap.rowBytes(), pixmap.ctable(), | 336 pixmap.rowBytes(), pixmap.ctable(), |
| 353 releaseProc, context); | 337 releaseProc, context); |
| 354 } | 338 } |
| 355 | 339 |
| 356 ~SkSpecialImage_Raster() override { } | 340 ~SkSpecialImage_Raster() override { } |
| 357 | 341 |
| 358 bool isOpaque() const override { return fBitmap.isOpaque(); } | 342 bool isOpaque() const override { return fBitmap.isOpaque(); } |
| 359 | 343 |
| 360 size_t getSize() const override { return fBitmap.getSize(); } | 344 size_t getSize() const override { return fBitmap.getSize(); } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 381 | 365 |
| 382 return nullptr; | 366 return nullptr; |
| 383 } | 367 } |
| 384 | 368 |
| 385 bool getBitmapDeprecated(SkBitmap* result) const override { | 369 bool getBitmapDeprecated(SkBitmap* result) const override { |
| 386 *result = fBitmap; | 370 *result = fBitmap; |
| 387 return true; | 371 return true; |
| 388 } | 372 } |
| 389 | 373 |
| 390 sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const overrid
e { | 374 sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const overrid
e { |
| 391 return SkSpecialSurface::MakeRaster(this->proxy(), info, nullptr); | 375 return SkSpecialSurface::MakeRaster(info, nullptr); |
| 392 } | 376 } |
| 393 | 377 |
| 394 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { | 378 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { |
| 395 SkBitmap subsetBM; | 379 SkBitmap subsetBM; |
| 396 | 380 |
| 397 if (!fBitmap.extractSubset(&subsetBM, subset)) { | 381 if (!fBitmap.extractSubset(&subsetBM, subset)) { |
| 398 return nullptr; | 382 return nullptr; |
| 399 } | 383 } |
| 400 | 384 |
| 401 return SkSpecialImage::MakeFromRaster(this->internal_getProxy(), | 385 return SkSpecialImage::MakeFromRaster(SkIRect::MakeWH(subset.width(), su
bset.height()), |
| 402 SkIRect::MakeWH(subset.width(), su
bset.height()), | |
| 403 subsetBM, | 386 subsetBM, |
| 404 &this->props()); | 387 &this->props()); |
| 405 } | 388 } |
| 406 | 389 |
| 407 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { | 390 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { |
| 408 SkBitmap subsetBM; | 391 SkBitmap subsetBM; |
| 409 | 392 |
| 410 if (!fBitmap.extractSubset(&subsetBM, subset)) { | 393 if (!fBitmap.extractSubset(&subsetBM, subset)) { |
| 411 return nullptr; | 394 return nullptr; |
| 412 } | 395 } |
| 413 | 396 |
| 414 return SkImage::MakeFromBitmap(subsetBM); | 397 return SkImage::MakeFromBitmap(subsetBM); |
| 415 } | 398 } |
| 416 | 399 |
| 417 sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override
{ | 400 sk_sp<SkSurface> onMakeTightSurface(const SkImageInfo& info) const override
{ |
| 418 return SkSurface::MakeRaster(info); | 401 return SkSurface::MakeRaster(info); |
| 419 } | 402 } |
| 420 | 403 |
| 421 private: | 404 private: |
| 422 SkBitmap fBitmap; | 405 SkBitmap fBitmap; |
| 423 | 406 |
| 424 typedef SkSpecialImage_Base INHERITED; | 407 typedef SkSpecialImage_Base INHERITED; |
| 425 }; | 408 }; |
| 426 | 409 |
| 427 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromRaster(SkImageFilter::Proxy* proxy
, | 410 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromRaster(const SkIRect& subset, |
| 428 const SkIRect& subset, | |
| 429 const SkBitmap& bm, | 411 const SkBitmap& bm, |
| 430 const SkSurfaceProps* props
) { | 412 const SkSurfaceProps* props
) { |
| 431 SkASSERT(nullptr == bm.getTexture()); | 413 SkASSERT(nullptr == bm.getTexture()); |
| 432 SkASSERT(rect_fits(subset, bm.width(), bm.height())); | 414 SkASSERT(rect_fits(subset, bm.width(), bm.height())); |
| 433 | 415 |
| 434 return sk_make_sp<SkSpecialImage_Raster>(proxy, subset, bm, props); | 416 return sk_make_sp<SkSpecialImage_Raster>(subset, bm, props); |
| 435 } | 417 } |
| 436 | 418 |
| 437 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromPixmap(SkImageFilter::Proxy* proxy
, | 419 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromPixmap(const SkIRect& subset, |
| 438 const SkIRect& subset, | |
| 439 const SkPixmap& src, | 420 const SkPixmap& src, |
| 440 RasterReleaseProc releasePr
oc, | 421 RasterReleaseProc releasePr
oc, |
| 441 ReleaseContext context, | 422 ReleaseContext context, |
| 442 const SkSurfaceProps* props
) { | 423 const SkSurfaceProps* props
) { |
| 443 if (!src.addr()) { | 424 if (!src.addr()) { |
| 444 return nullptr; | 425 return nullptr; |
| 445 } | 426 } |
| 446 | 427 |
| 447 return sk_make_sp<SkSpecialImage_Raster>(proxy, subset, src, releaseProc, co
ntext, props); | 428 return sk_make_sp<SkSpecialImage_Raster>(subset, src, releaseProc, context,
props); |
| 448 } | 429 } |
| 449 | 430 |
| 450 | 431 |
| 451 #if SK_SUPPORT_GPU | 432 #if SK_SUPPORT_GPU |
| 452 /////////////////////////////////////////////////////////////////////////////// | 433 /////////////////////////////////////////////////////////////////////////////// |
| 453 #include "GrTexture.h" | 434 #include "GrTexture.h" |
| 454 #include "SkImage_Gpu.h" | 435 #include "SkImage_Gpu.h" |
| 455 | 436 |
| 456 class SkSpecialImage_Gpu : public SkSpecialImage_Base { | 437 class SkSpecialImage_Gpu : public SkSpecialImage_Base { |
| 457 public: | 438 public: |
| 458 SkSpecialImage_Gpu(SkImageFilter::Proxy* proxy, const SkIRect& subset, | 439 SkSpecialImage_Gpu(const SkIRect& subset, |
| 459 uint32_t uniqueID, GrTexture* tex, SkAlphaType at, | 440 uint32_t uniqueID, GrTexture* tex, SkAlphaType at, |
| 460 const SkSurfaceProps* props) | 441 const SkSurfaceProps* props) |
| 461 : INHERITED(proxy, subset, uniqueID, props) | 442 : INHERITED(subset, uniqueID, props) |
| 462 , fTexture(SkRef(tex)) | 443 , fTexture(SkRef(tex)) |
| 463 , fAlphaType(at) | 444 , fAlphaType(at) |
| 464 , fAddedRasterVersionToCache(false) { | 445 , fAddedRasterVersionToCache(false) { |
| 465 } | 446 } |
| 466 | 447 |
| 467 ~SkSpecialImage_Gpu() override { | 448 ~SkSpecialImage_Gpu() override { |
| 468 if (fAddedRasterVersionToCache.load()) { | 449 if (fAddedRasterVersionToCache.load()) { |
| 469 SkNotifyBitmapGenIDIsStale(this->uniqueID()); | 450 SkNotifyBitmapGenIDIsStale(this->uniqueID()); |
| 470 } | 451 } |
| 471 } | 452 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 } | 517 } |
| 537 | 518 |
| 538 sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const overrid
e { | 519 sk_sp<SkSpecialSurface> onMakeSurface(const SkImageInfo& info) const overrid
e { |
| 539 if (!fTexture->getContext()) { | 520 if (!fTexture->getContext()) { |
| 540 return nullptr; | 521 return nullptr; |
| 541 } | 522 } |
| 542 | 523 |
| 543 GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(info, *fTexture->getContex
t()->caps()); | 524 GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(info, *fTexture->getContex
t()->caps()); |
| 544 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 525 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 545 | 526 |
| 546 return SkSpecialSurface::MakeRenderTarget(this->proxy(), fTexture->getCo
ntext(), desc); | 527 return SkSpecialSurface::MakeRenderTarget(fTexture->getContext(), desc); |
| 547 } | 528 } |
| 548 | 529 |
| 549 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { | 530 sk_sp<SkSpecialImage> onMakeSubset(const SkIRect& subset) const override { |
| 550 return SkSpecialImage::MakeFromGpu(this->internal_getProxy(), | 531 return SkSpecialImage::MakeFromGpu(subset, |
| 551 subset, | |
| 552 this->uniqueID(), | 532 this->uniqueID(), |
| 553 fTexture, | 533 fTexture, |
| 554 &this->props(), | 534 &this->props(), |
| 555 fAlphaType); | 535 fAlphaType); |
| 556 } | 536 } |
| 557 | 537 |
| 558 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { | 538 sk_sp<SkImage> onMakeTightSubset(const SkIRect& subset) const override { |
| 559 if (0 == subset.fLeft && 0 == subset.fTop && | 539 if (0 == subset.fLeft && 0 == subset.fTop && |
| 560 fTexture->width() == subset.width() && | 540 fTexture->width() == subset.width() && |
| 561 fTexture->height() == subset.height()) { | 541 fTexture->height() == subset.height()) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 585 } | 565 } |
| 586 | 566 |
| 587 private: | 567 private: |
| 588 SkAutoTUnref<GrTexture> fTexture; | 568 SkAutoTUnref<GrTexture> fTexture; |
| 589 const SkAlphaType fAlphaType; | 569 const SkAlphaType fAlphaType; |
| 590 mutable SkAtomic<bool> fAddedRasterVersionToCache; | 570 mutable SkAtomic<bool> fAddedRasterVersionToCache; |
| 591 | 571 |
| 592 typedef SkSpecialImage_Base INHERITED; | 572 typedef SkSpecialImage_Base INHERITED; |
| 593 }; | 573 }; |
| 594 | 574 |
| 595 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(SkImageFilter::Proxy* proxy, | 575 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(const SkIRect& subset, |
| 596 const SkIRect& subset, | |
| 597 uint32_t uniqueID, | 576 uint32_t uniqueID, |
| 598 GrTexture* tex, | 577 GrTexture* tex, |
| 599 const SkSurfaceProps* props, | 578 const SkSurfaceProps* props, |
| 600 SkAlphaType at) { | 579 SkAlphaType at) { |
| 601 SkASSERT(rect_fits(subset, tex->width(), tex->height())); | 580 SkASSERT(rect_fits(subset, tex->width(), tex->height())); |
| 602 return sk_make_sp<SkSpecialImage_Gpu>(proxy, subset, uniqueID, tex, at, prop
s); | 581 return sk_make_sp<SkSpecialImage_Gpu>(subset, uniqueID, tex, at, props); |
| 603 } | 582 } |
| 604 | 583 |
| 605 #else | 584 #else |
| 606 | 585 |
| 607 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(SkImageFilter::Proxy* proxy, | 586 sk_sp<SkSpecialImage> SkSpecialImage::MakeFromGpu(const SkIRect& subset, |
| 608 const SkIRect& subset, | |
| 609 uint32_t uniqueID, | 587 uint32_t uniqueID, |
| 610 GrTexture* tex, | 588 GrTexture* tex, |
| 611 const SkSurfaceProps* props, | 589 const SkSurfaceProps* props, |
| 612 SkAlphaType at) { | 590 SkAlphaType at) { |
| 613 return nullptr; | 591 return nullptr; |
| 614 } | 592 } |
| 615 | 593 |
| 616 #endif | 594 #endif |
| OLD | NEW |