Chromium Code Reviews| 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 #include "SkGr.h" | 8 #include "SkGr.h" |
| 9 | 9 |
| 10 #include "GrCaps.h" | 10 #include "GrCaps.h" |
| (...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 496 break; | 496 break; |
| 497 case Stretch::kNone_Type: | 497 case Stretch::kNone_Type: |
| 498 SkDEBUGFAIL("Shouldn't get here."); | 498 SkDEBUGFAIL("Shouldn't get here."); |
| 499 break; | 499 break; |
| 500 } | 500 } |
| 501 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(stretch.fWidth), SkIntToScalar (stretch.fHeight)); | 501 SkRect dstRect = SkRect::MakeWH(SkIntToScalar(stretch.fWidth), SkIntToScalar (stretch.fHeight)); |
| 502 canvas.drawBitmapRect(bmp, dstRect, &paint); | 502 canvas.drawBitmapRect(bmp, dstRect, &paint); |
| 503 return stretched; | 503 return stretched; |
| 504 } | 504 } |
| 505 | 505 |
| 506 static GrTexture* create_bitmap_texture(GrContext* ctx, | |
| 507 const SkBitmap& bmp, | |
| 508 const Stretch& stretch, | |
| 509 const GrUniqueKey& unstretchedKey, | |
| 510 const GrUniqueKey& stretchedKey) { | |
| 511 if (Stretch::kNone_Type != stretch.fType) { | |
| 512 SkAutoTUnref<GrTexture> unstretched; | |
| 513 // Check if we have the unstretched version in the cache, if not create it. | |
| 514 if (unstretchedKey.isValid()) { | |
| 515 unstretched.reset(ctx->textureProvider()->findAndRefTextureByUniqueK ey(unstretchedKey)); | |
| 516 } | |
| 517 if (!unstretched) { | |
| 518 unstretched.reset(create_unstretched_bitmap_texture(ctx, bmp, unstre tchedKey)); | |
| 519 if (!unstretched) { | |
| 520 // We might not have been able to create a unstrecthed texture b ecause it is smaller | |
| 521 // than the min texture size. In that case do cpu stretching. | |
| 522 SkBitmap stretchedBmp = stretch_on_cpu(bmp, stretch); | |
| 523 return create_unstretched_bitmap_texture(ctx, stretchedBmp, stre tchedKey); | |
| 524 } | |
| 525 } | |
| 526 return stretch_texture(unstretched, stretch, bmp.pixelRef(), stretchedKe y); | |
| 527 } | |
| 528 return create_unstretched_bitmap_texture(ctx, bmp, unstretchedKey); | |
| 529 } | |
| 530 | |
| 531 bool GrIsImageInCache(const GrContext* ctx, uint32_t imageID, const SkIRect& sub set, | 506 bool GrIsImageInCache(const GrContext* ctx, uint32_t imageID, const SkIRect& sub set, |
| 532 GrTexture* nativeTexture, const GrTextureParams* params) { | 507 GrTexture* nativeTexture, const GrTextureParams* params) { |
| 533 Stretch stretch; | 508 Stretch stretch; |
| 534 get_stretch(ctx, subset.width(), subset.height(), params, &stretch); | 509 get_stretch(ctx, subset.width(), subset.height(), params, &stretch); |
| 535 | 510 |
| 536 // Handle the case where the bitmap/image is explicitly texture backed. | 511 // Handle the case where the bitmap/image is explicitly texture backed. |
| 537 if (nativeTexture) { | 512 if (nativeTexture) { |
| 538 if (Stretch::kNone_Type == stretch.fType) { | 513 if (Stretch::kNone_Type == stretch.fType) { |
| 539 return true; | 514 return true; |
| 540 } | 515 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 555 | 530 |
| 556 bool GrIsBitmapInCache(const GrContext* ctx, const SkBitmap& bitmap, | 531 bool GrIsBitmapInCache(const GrContext* ctx, const SkBitmap& bitmap, |
| 557 const GrTextureParams* params) { | 532 const GrTextureParams* params) { |
| 558 if (bitmap.isVolatile()) { | 533 if (bitmap.isVolatile()) { |
| 559 return false; // we don't cache volatile bitmaps. | 534 return false; // we don't cache volatile bitmaps. |
| 560 } | 535 } |
| 561 return GrIsImageInCache(ctx, bitmap.getGenerationID(), bitmap.getSubset(), b itmap.getTexture(), | 536 return GrIsImageInCache(ctx, bitmap.getGenerationID(), bitmap.getSubset(), b itmap.getTexture(), |
| 562 params); | 537 params); |
| 563 } | 538 } |
| 564 | 539 |
| 565 GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, | 540 class GrTextureMaker { |
|
bsalomon
2015/09/29 13:23:24
Is this going to be exposed outside of this cpp? J
reed1
2015/09/29 17:41:17
Not sure, but likely (for generators, etc.) so I w
| |
| 566 const SkBitmap& bitmap, | 541 public: |
| 567 const GrTextureParams* params) { | 542 GrTextureMaker(int width, int height) : fWidth(width), fHeight(height) {} |
| 568 | 543 |
| 544 int width() const { return fWidth; } | |
| 545 int height() const { return fHeight; } | |
| 546 | |
| 547 GrTexture* refCachedTexture(GrContext*, const GrTextureParams*); | |
| 548 | |
| 549 protected: | |
| 550 virtual GrTexture* peekTexture() = 0; | |
|
bsalomon
2015/09/29 13:23:24
wonder about all these virtuals... this guy can ge
reed1
2015/09/29 17:41:17
Agree to all concerns. Will start with trying to r
| |
| 551 virtual void notifyStretchCached(const GrUniqueKey& stretchedKey) = 0; | |
| 552 virtual bool isVolatile() = 0; | |
| 553 virtual uint32_t imageID() = 0; | |
| 554 virtual SkIRect subset() = 0; | |
| 555 virtual GrTexture* onRefCachedTexture(GrContext*, const GrUniqueKey& unstret chedKey) = 0; | |
| 556 virtual bool getROBitmap(SkBitmap*) = 0; | |
| 557 | |
| 558 private: | |
| 559 const int fWidth; | |
| 560 const int fHeight; | |
| 561 | |
| 562 GrTexture* stretchTexture(GrTexture* tex, const Stretch& stretch, | |
| 563 const GrUniqueKey& stretchedKey) { | |
| 564 GrTexture* result = stretch_texture(tex, stretch, nullptr, stretchedKey) ; | |
| 565 if (result && stretchedKey.isValid()) { | |
| 566 this->notifyStretchCached(stretchedKey); | |
| 567 } | |
| 568 return result; | |
| 569 } | |
| 570 }; | |
| 571 | |
| 572 GrTexture* GrTextureMaker::refCachedTexture(GrContext* ctx, const GrTextureParam s* params) { | |
| 569 Stretch stretch; | 573 Stretch stretch; |
| 570 get_stretch(ctx, bitmap.width(), bitmap.height(), params, &stretch); | 574 get_stretch(ctx, this->width(), this->height(), params, &stretch); |
| 571 | 575 |
| 572 GrTexture* result = bitmap.getTexture(); | 576 GrTexture* result = this->peekTexture(); |
| 573 if (result) { | 577 if (result) { |
| 574 if (Stretch::kNone_Type == stretch.fType) { | 578 if (Stretch::kNone_Type == stretch.fType) { |
| 575 return SkRef(result); | 579 return SkRef(result); |
| 576 } | 580 } |
| 577 GrUniqueKey stretchedKey; | 581 GrUniqueKey stretchedKey; |
| 578 // Don't create a key for the resized version if the bmp is volatile. | 582 // Don't create a key for the resized version if the bmp is volatile. |
| 579 if (!bitmap.isVolatile()) { | 583 if (!this->isVolatile()) { |
| 580 const GrUniqueKey& key = result->getUniqueKey(); | 584 const GrUniqueKey& key = result->getUniqueKey(); |
| 581 if (key.isValid()) { | 585 if (key.isValid()) { |
| 582 make_stretched_key(key, stretch, &stretchedKey); | 586 make_stretched_key(key, stretch, &stretchedKey); |
| 583 GrTexture* stretched = | 587 GrTexture* stretched = |
| 584 ctx->textureProvider()->findAndRefTextureByUniqueKey(stretch edKey); | 588 ctx->textureProvider()->findAndRefTextureByUniqueKey(stretch edKey); |
| 585 if (stretched) { | 589 if (stretched) { |
| 586 return stretched; | 590 return stretched; |
| 587 } | 591 } |
| 588 } | 592 } |
| 589 } | 593 } |
| 590 return stretch_texture(result, stretch, bitmap.pixelRef(), stretchedKey) ; | 594 return this->stretchTexture(result, stretch, stretchedKey); |
| 591 } | 595 } |
| 592 | 596 |
| 593 GrUniqueKey key, resizedKey; | 597 GrUniqueKey key, stretchedKey; |
| 594 | 598 |
| 595 if (!bitmap.isVolatile()) { | 599 if (!this->isVolatile()) { |
| 596 // If the bitmap isn't changing try to find a cached copy first. | 600 // If the bitmap isn't changing try to find a cached copy first. |
| 597 make_image_keys(bitmap.getGenerationID(), bitmap.getSubset(), stretch, & key, &resizedKey); | 601 make_image_keys(this->imageID(), this->subset(), stretch, &key, &stretch edKey); |
| 598 | 602 |
| 599 result = ctx->textureProvider()->findAndRefTextureByUniqueKey( | 603 result = ctx->textureProvider()->findAndRefTextureByUniqueKey( |
| 600 resizedKey.isValid() ? resizedKey : key); | 604 stretchedKey.isValid() ? stretchedKey : key); |
| 601 if (result) { | 605 if (result) { |
| 602 return result; | 606 return result; |
| 603 } | 607 } |
| 604 } | 608 } |
| 605 | 609 |
| 606 result = create_bitmap_texture(ctx, bitmap, stretch, key, resizedKey); | 610 if (Stretch::kNone_Type != stretch.fType) { |
| 607 if (result) { | 611 SkAutoTUnref<GrTexture> unstretched; |
| 608 return result; | 612 // Check if we have the unstretched version in the cache, if not create it. |
| 613 if (key.isValid()) { | |
| 614 unstretched.reset(ctx->textureProvider()->findAndRefTextureByUniqueK ey(key)); | |
| 615 } | |
| 616 if (!unstretched) { | |
| 617 if (this->width() < ctx->caps()->minTextureSize() || | |
| 618 this->height() < ctx->caps()->minTextureSize()) { | |
| 619 SkBitmap bitmap; | |
| 620 if (!this->getROBitmap(&bitmap)) { | |
| 621 return nullptr; | |
| 622 } | |
| 623 SkBitmap stretchedBmp = stretch_on_cpu(bitmap, stretch); | |
| 624 return create_unstretched_bitmap_texture(ctx, stretchedBmp, stre tchedKey); | |
| 625 } else { | |
| 626 unstretched.reset(this->onRefCachedTexture(ctx, key)); | |
| 627 if (!unstretched) { | |
| 628 return nullptr; | |
| 629 } | |
| 630 } | |
| 631 } | |
| 632 return this->stretchTexture(unstretched, stretch, stretchedKey); | |
| 633 } else { | |
| 634 return this->onRefCachedTexture(ctx, key); | |
| 609 } | 635 } |
| 636 } | |
| 610 | 637 |
| 611 SkErrorInternals::SetError( kInternalError_SkError, | 638 class Bitmap_GrTextureMaker : public GrTextureMaker { |
| 612 "---- failed to create texture for cache [%d %d] \n", | 639 public: |
| 613 bitmap.width(), bitmap.height()); | 640 Bitmap_GrTextureMaker(const SkBitmap& bitmap) |
| 641 : INHERITED(bitmap.width(), bitmap.height()) | |
| 642 , fBitmap(bitmap) | |
| 643 {} | |
| 614 | 644 |
| 615 return nullptr; | 645 protected: |
| 646 bool isVolatile() override { return fBitmap.isVolatile(); } | |
| 647 uint32_t imageID() override { return fBitmap.getGenerationID(); } | |
| 648 SkIRect subset() override { return fBitmap.getSubset(); } | |
| 649 GrTexture* peekTexture() override { | |
| 650 return fBitmap.getTexture(); | |
| 651 } | |
| 652 void notifyStretchCached(const GrUniqueKey& stretchedKey) override { | |
| 653 fBitmap.pixelRef()->addGenIDChangeListener(new BitmapInvalidator(stretch edKey)); | |
| 654 } | |
| 655 GrTexture* onRefCachedTexture(GrContext* ctx, const GrUniqueKey& unstretched Key) override { | |
| 656 return create_unstretched_bitmap_texture(ctx, fBitmap, unstretchedKey); | |
| 657 } | |
| 658 bool getROBitmap(SkBitmap* bitmap) override { | |
| 659 *bitmap = fBitmap; | |
| 660 return true; | |
| 661 } | |
| 662 private: | |
| 663 const SkBitmap fBitmap; | |
| 664 | |
| 665 typedef GrTextureMaker INHERITED; | |
| 666 }; | |
| 667 | |
| 668 GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, const SkBitmap& bitmap, | |
| 669 const GrTextureParams* params) { | |
| 670 return Bitmap_GrTextureMaker(bitmap).refCachedTexture(ctx, params); | |
| 616 } | 671 } |
| 617 | 672 |
| 618 // TODO: make this be the canonical signature, and turn the version that takes G rTextureParams* | 673 // TODO: make this be the canonical signature, and turn the version that takes G rTextureParams* |
| 619 // into a wrapper that contains the inverse of these tables. | 674 // into a wrapper that contains the inverse of these tables. |
| 620 GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, | 675 GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, |
| 621 const SkBitmap& bitmap, | 676 const SkBitmap& bitmap, |
| 622 SkImageUsageType usage) { | 677 SkImageUsageType usage) { |
| 623 // Just need a params that will trigger the correct cache key / etc, since t he usage doesn't | 678 // Just need a params that will trigger the correct cache key / etc, since t he usage doesn't |
| 624 // tell us the specifics about filter level or specific tiling. | 679 // tell us the specifics about filter level or specific tiling. |
| 625 | 680 |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 941 SkErrorInternals::SetError( kInvalidPaint_SkError, | 996 SkErrorInternals::SetError( kInvalidPaint_SkError, |
| 942 "Sorry, I don't understand the filtering " | 997 "Sorry, I don't understand the filtering " |
| 943 "mode you asked for. Falling back to " | 998 "mode you asked for. Falling back to " |
| 944 "MIPMaps."); | 999 "MIPMaps."); |
| 945 textureFilterMode = GrTextureParams::kMipMap_FilterMode; | 1000 textureFilterMode = GrTextureParams::kMipMap_FilterMode; |
| 946 break; | 1001 break; |
| 947 | 1002 |
| 948 } | 1003 } |
| 949 return textureFilterMode; | 1004 return textureFilterMode; |
| 950 } | 1005 } |
| OLD | NEW |