| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2010 Google Inc. | 2 * Copyright 2010 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 | 8 |
| 9 #include "SkGr.h" | 9 #include "SkGr.h" |
| 10 | 10 |
| 11 #include "GrCaps.h" | 11 #include "GrCaps.h" |
| 12 #include "GrContext.h" | 12 #include "GrContext.h" |
| 13 #include "GrTextureParamsAdjuster.h" | 13 #include "GrTextureParamsAdjuster.h" |
| 14 #include "GrGpuResourcePriv.h" | 14 #include "GrGpuResourcePriv.h" |
| 15 #include "GrImageIDTextureAdjuster.h" |
| 15 #include "GrXferProcessor.h" | 16 #include "GrXferProcessor.h" |
| 16 #include "GrYUVProvider.h" | 17 #include "GrYUVProvider.h" |
| 17 | 18 |
| 18 #include "SkColorFilter.h" | 19 #include "SkColorFilter.h" |
| 19 #include "SkConfig8888.h" | 20 #include "SkConfig8888.h" |
| 20 #include "SkCanvas.h" | 21 #include "SkCanvas.h" |
| 21 #include "SkData.h" | 22 #include "SkData.h" |
| 22 #include "SkErrorInternals.h" | 23 #include "SkErrorInternals.h" |
| 23 #include "SkGrPixelRef.h" | 24 #include "SkGrPixelRef.h" |
| 24 #include "SkMessageBus.h" | 25 #include "SkMessageBus.h" |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 return nullptr; | 265 return nullptr; |
| 265 } | 266 } |
| 266 | 267 |
| 267 return ctx->textureProvider()->createTexture(desc, true, bitmap->getPixels()
, | 268 return ctx->textureProvider()->createTexture(desc, true, bitmap->getPixels()
, |
| 268 bitmap->rowBytes()); | 269 bitmap->rowBytes()); |
| 269 } | 270 } |
| 270 | 271 |
| 271 | 272 |
| 272 //////////////////////////////////////////////////////////////////////////////// | 273 //////////////////////////////////////////////////////////////////////////////// |
| 273 | 274 |
| 274 static void install_bmp_key_invalidator(const GrUniqueKey& key, SkPixelRef* pixe
lRef) { | 275 void GrInstallBitmapUniqueKeyInvalidator(const GrUniqueKey& key, SkPixelRef* pix
elRef) { |
| 275 class Invalidator : public SkPixelRef::GenIDChangeListener { | 276 class Invalidator : public SkPixelRef::GenIDChangeListener { |
| 276 public: | 277 public: |
| 277 explicit Invalidator(const GrUniqueKey& key) : fMsg(key) {} | 278 explicit Invalidator(const GrUniqueKey& key) : fMsg(key) {} |
| 278 private: | 279 private: |
| 279 GrUniqueKeyInvalidatedMessage fMsg; | 280 GrUniqueKeyInvalidatedMessage fMsg; |
| 280 | 281 |
| 281 void onChange() override { SkMessageBus<GrUniqueKeyInvalidatedMessage>::
Post(fMsg); } | 282 void onChange() override { SkMessageBus<GrUniqueKeyInvalidatedMessage>::
Post(fMsg); } |
| 282 }; | 283 }; |
| 283 | 284 |
| 284 pixelRef->addGenIDChangeListener(new Invalidator(key)); | 285 pixelRef->addGenIDChangeListener(new Invalidator(key)); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 306 if (fOriginalKey.isValid()) { | 307 if (fOriginalKey.isValid()) { |
| 307 tex = ctx->textureProvider()->findAndRefTextureByUniqueKey(fOriginal
Key); | 308 tex = ctx->textureProvider()->findAndRefTextureByUniqueKey(fOriginal
Key); |
| 308 if (tex) { | 309 if (tex) { |
| 309 return tex; | 310 return tex; |
| 310 } | 311 } |
| 311 } | 312 } |
| 312 | 313 |
| 313 tex = GrUploadBitmapToTexture(ctx, fBitmap); | 314 tex = GrUploadBitmapToTexture(ctx, fBitmap); |
| 314 if (tex && fOriginalKey.isValid()) { | 315 if (tex && fOriginalKey.isValid()) { |
| 315 tex->resourcePriv().setUniqueKey(fOriginalKey); | 316 tex->resourcePriv().setUniqueKey(fOriginalKey); |
| 316 install_bmp_key_invalidator(fOriginalKey, fBitmap.pixelRef()); | 317 GrInstallBitmapUniqueKeyInvalidator(fOriginalKey, fBitmap.pixelRef()
); |
| 317 } | 318 } |
| 318 return tex; | 319 return tex; |
| 319 } | 320 } |
| 320 | 321 |
| 321 void makeCopyKey(const CopyParams& copyParams, GrUniqueKey* copyKey) overrid
e { | 322 void makeCopyKey(const CopyParams& copyParams, GrUniqueKey* copyKey) overrid
e { |
| 322 if (fOriginalKey.isValid()) { | 323 if (fOriginalKey.isValid()) { |
| 323 MakeCopyKeyFromOrigKey(fOriginalKey, copyParams, copyKey); | 324 MakeCopyKeyFromOrigKey(fOriginalKey, copyParams, copyKey); |
| 324 } | 325 } |
| 325 } | 326 } |
| 326 | 327 |
| 327 void didCacheCopy(const GrUniqueKey& copyKey) override { | 328 void didCacheCopy(const GrUniqueKey& copyKey) override { |
| 328 install_bmp_key_invalidator(copyKey, fBitmap.pixelRef()); | 329 GrInstallBitmapUniqueKeyInvalidator(copyKey, fBitmap.pixelRef()); |
| 329 } | 330 } |
| 330 | 331 |
| 331 private: | 332 private: |
| 332 const SkBitmap fBitmap; | 333 const SkBitmap fBitmap; |
| 333 GrUniqueKey fOriginalKey; | 334 GrUniqueKey fOriginalKey; |
| 334 | 335 |
| 335 typedef GrTextureMaker INHERITED; | 336 typedef GrTextureMaker INHERITED; |
| 336 }; | 337 }; |
| 337 | 338 |
| 338 class TextureBitmap_GrTextureAdjuster : public GrTextureAdjuster { | |
| 339 public: | |
| 340 explicit TextureBitmap_GrTextureAdjuster(const SkBitmap* bmp) | |
| 341 : INHERITED(bmp->getTexture(), SkIRect::MakeWH(bmp->width(), bmp->height
())) | |
| 342 , fBmp(bmp) {} | |
| 343 | |
| 344 private: | |
| 345 void makeCopyKey(const CopyParams& params, GrUniqueKey* copyKey) override { | |
| 346 if (fBmp->isVolatile()) { | |
| 347 return; | |
| 348 } | |
| 349 // The content area must represent the whole bitmap. Texture-backed bitm
aps don't support | |
| 350 // extractSubset(). Therefore, either the bitmap and the texture are the
same size or the | |
| 351 // content's dimensions are the bitmap's dimensions which is pinned to t
he upper left | |
| 352 // of the texture. | |
| 353 GrUniqueKey baseKey; | |
| 354 GrMakeKeyFromImageID(&baseKey, fBmp->getGenerationID(), | |
| 355 SkIRect::MakeWH(fBmp->width(), fBmp->height())); | |
| 356 MakeCopyKeyFromOrigKey(baseKey, params, copyKey); | |
| 357 } | |
| 358 | |
| 359 void didCacheCopy(const GrUniqueKey& copyKey) override { | |
| 360 install_bmp_key_invalidator(copyKey, fBmp->pixelRef()); | |
| 361 } | |
| 362 | |
| 363 const SkBitmap* fBmp; | |
| 364 | |
| 365 typedef GrTextureAdjuster INHERITED; | |
| 366 }; | |
| 367 | |
| 368 GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, const SkBitmap& bitmap, | 339 GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, const SkBitmap& bitmap, |
| 369 const GrTextureParams& params) { | 340 const GrTextureParams& params) { |
| 370 if (bitmap.getTexture()) { | 341 if (bitmap.getTexture()) { |
| 371 return TextureBitmap_GrTextureAdjuster(&bitmap).refTextureSafeForParams(
params, nullptr); | 342 return GrBitmapTextureAdjuster(&bitmap).refTextureSafeForParams(params,
nullptr); |
| 372 } | 343 } |
| 373 return RasterBitmap_GrTextureMaker(bitmap).refTextureForParams(ctx, params); | 344 return RasterBitmap_GrTextureMaker(bitmap).refTextureForParams(ctx, params); |
| 374 } | 345 } |
| 375 | 346 |
| 376 /////////////////////////////////////////////////////////////////////////////// | 347 /////////////////////////////////////////////////////////////////////////////// |
| 377 | 348 |
| 378 // alphatype is ignore for now, but if GrPixelConfig is expanded to encompass | 349 // alphatype is ignore for now, but if GrPixelConfig is expanded to encompass |
| 379 // alpha info, that will be considered. | 350 // alpha info, that will be considered. |
| 380 GrPixelConfig SkImageInfo2GrPixelConfig(SkColorType ct, SkAlphaType, SkColorProf
ileType pt) { | 351 GrPixelConfig SkImageInfo2GrPixelConfig(SkColorType ct, SkAlphaType, SkColorProf
ileType pt) { |
| 381 switch (ct) { | 352 switch (ct) { |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 SkErrorInternals::SetError( kInvalidPaint_SkError, | 655 SkErrorInternals::SetError( kInvalidPaint_SkError, |
| 685 "Sorry, I don't understand the filtering
" | 656 "Sorry, I don't understand the filtering
" |
| 686 "mode you asked for. Falling back to " | 657 "mode you asked for. Falling back to " |
| 687 "MIPMaps."); | 658 "MIPMaps."); |
| 688 textureFilterMode = GrTextureParams::kMipMap_FilterMode; | 659 textureFilterMode = GrTextureParams::kMipMap_FilterMode; |
| 689 break; | 660 break; |
| 690 | 661 |
| 691 } | 662 } |
| 692 return textureFilterMode; | 663 return textureFilterMode; |
| 693 } | 664 } |
| OLD | NEW |