| 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 "GrDrawTargetCaps.h" | 10 #include "GrDrawTargetCaps.h" |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 } | 485 } |
| 486 } | 486 } |
| 487 GrTexture* resized = resize_texture(unstretched, stretch, stretchedKey); | 487 GrTexture* resized = resize_texture(unstretched, stretch, stretchedKey); |
| 488 return resized; | 488 return resized; |
| 489 } | 489 } |
| 490 | 490 |
| 491 return create_unstretched_bitmap_texture(ctx, bmp, unstretchedKey); | 491 return create_unstretched_bitmap_texture(ctx, bmp, unstretchedKey); |
| 492 | 492 |
| 493 } | 493 } |
| 494 | 494 |
| 495 static GrTexture* get_texture_backing_bmp(const SkBitmap& bitmap, const GrContex
t* context, | |
| 496 const GrTextureParams* params) { | |
| 497 if (GrTexture* texture = bitmap.getTexture()) { | |
| 498 // Our texture-resizing-for-tiling used to upscale NPOT textures for til
ing only works with | |
| 499 // content-key cached resources. Rather than invest in that legacy code
path, we'll just | |
| 500 // take the horribly slow route of causing a cache miss which will cause
the pixels to be | |
| 501 // read and reuploaded to a texture with a content key. | |
| 502 if (params && !context->getGpu()->caps()->npotTextureTileSupport() && | |
| 503 (params->isTiled() || GrTextureParams::kMipMap_FilterMode == params-
>filterMode())) { | |
| 504 return NULL; | |
| 505 } | |
| 506 return texture; | |
| 507 } | |
| 508 return NULL; | |
| 509 } | |
| 510 | |
| 511 bool GrIsBitmapInCache(const GrContext* ctx, | 495 bool GrIsBitmapInCache(const GrContext* ctx, |
| 512 const SkBitmap& bitmap, | 496 const SkBitmap& bitmap, |
| 513 const GrTextureParams* params) { | 497 const GrTextureParams* params) { |
| 514 if (get_texture_backing_bmp(bitmap, ctx, params)) { | 498 Stretch stretch = get_stretch_type(ctx, bitmap.width(), bitmap.height(), par
ams); |
| 515 return true; | 499 |
| 500 // Handle the case where the bitmap is explicitly texture backed. |
| 501 GrTexture* texture = bitmap.getTexture(); |
| 502 if (texture) { |
| 503 if (kNo_Stretch == stretch) { |
| 504 return true; |
| 505 } |
| 506 // No keys for volatile bitmaps. |
| 507 if (bitmap.isVolatile()) { |
| 508 return false; |
| 509 } |
| 510 const GrContentKey& key = texture->getContentKey(); |
| 511 if (!key.isValid()) { |
| 512 return false; |
| 513 } |
| 514 GrContentKey resizedKey; |
| 515 make_resize_key(key, stretch, &resizedKey); |
| 516 return ctx->isResourceInCache(resizedKey); |
| 516 } | 517 } |
| 517 | 518 |
| 518 // We don't cache volatile bitmaps | 519 // We don't cache volatile bitmaps |
| 519 if (bitmap.isVolatile()) { | 520 if (bitmap.isVolatile()) { |
| 520 return false; | 521 return false; |
| 521 } | 522 } |
| 522 | 523 |
| 523 // If it is inherently texture backed, consider it in the cache | |
| 524 if (bitmap.getTexture()) { | |
| 525 return true; | |
| 526 } | |
| 527 | |
| 528 Stretch stretch = get_stretch_type(ctx, bitmap.width(), bitmap.height(), par
ams); | |
| 529 GrContentKey key, resizedKey; | 524 GrContentKey key, resizedKey; |
| 530 generate_bitmap_keys(bitmap, stretch, &key, &resizedKey); | 525 generate_bitmap_keys(bitmap, stretch, &key, &resizedKey); |
| 531 | |
| 532 GrSurfaceDesc desc; | |
| 533 generate_bitmap_texture_desc(bitmap, &desc); | |
| 534 return ctx->isResourceInCache((kNo_Stretch == stretch) ? key : resizedKey); | 526 return ctx->isResourceInCache((kNo_Stretch == stretch) ? key : resizedKey); |
| 535 } | 527 } |
| 536 | 528 |
| 537 GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, | 529 GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, |
| 538 const SkBitmap& bitmap, | 530 const SkBitmap& bitmap, |
| 539 const GrTextureParams* params) { | 531 const GrTextureParams* params) { |
| 540 GrTexture* result = get_texture_backing_bmp(bitmap, ctx, params); | 532 |
| 533 Stretch stretch = get_stretch_type(ctx, bitmap.width(), bitmap.height(), par
ams); |
| 534 |
| 535 GrTexture* result = bitmap.getTexture(); |
| 541 if (result) { | 536 if (result) { |
| 542 return SkRef(result); | 537 if (kNo_Stretch == stretch) { |
| 538 return SkRef(result); |
| 539 } |
| 540 GrContentKey resizedKey; |
| 541 // Don't create a key for the resized version if the bmp is volatile. |
| 542 if (!bitmap.isVolatile()) { |
| 543 const GrContentKey& key = result->getContentKey(); |
| 544 if (key.isValid()) { |
| 545 make_resize_key(key, stretch, &resizedKey); |
| 546 GrTexture* stretched = ctx->findAndRefCachedTexture(resizedKey); |
| 547 if (stretched) { |
| 548 return stretched; |
| 549 } |
| 550 } |
| 551 } |
| 552 return resize_texture(result, stretch, resizedKey); |
| 543 } | 553 } |
| 544 | 554 |
| 545 Stretch stretch = get_stretch_type(ctx, bitmap.width(), bitmap.height(), par
ams); | |
| 546 GrContentKey key, resizedKey; | 555 GrContentKey key, resizedKey; |
| 547 | 556 |
| 548 if (!bitmap.isVolatile()) { | 557 if (!bitmap.isVolatile()) { |
| 549 // If the bitmap isn't changing try to find a cached copy first. | 558 // If the bitmap isn't changing try to find a cached copy first. |
| 550 generate_bitmap_keys(bitmap, stretch, &key, &resizedKey); | 559 generate_bitmap_keys(bitmap, stretch, &key, &resizedKey); |
| 551 | 560 |
| 552 result = ctx->findAndRefCachedTexture(resizedKey.isValid() ? resizedKey
: key); | 561 result = ctx->findAndRefCachedTexture(resizedKey.isValid() ? resizedKey
: key); |
| 553 if (result) { | 562 if (result) { |
| 554 return result; | 563 return result; |
| 555 } | 564 } |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 if (shader->asFragmentProcessor(context, skPaint, viewM, NULL, &paintCol
or, &fp) && fp) { | 726 if (shader->asFragmentProcessor(context, skPaint, viewM, NULL, &paintCol
or, &fp) && fp) { |
| 718 grPaint->addColorProcessor(fp)->unref(); | 727 grPaint->addColorProcessor(fp)->unref(); |
| 719 constantColor = false; | 728 constantColor = false; |
| 720 } | 729 } |
| 721 } | 730 } |
| 722 | 731 |
| 723 // The grcolor is automatically set when calling asFragmentProcessor. | 732 // The grcolor is automatically set when calling asFragmentProcessor. |
| 724 // If the shader can be seen as an effect it returns true and adds its effec
t to the grpaint. | 733 // If the shader can be seen as an effect it returns true and adds its effec
t to the grpaint. |
| 725 SkPaint2GrPaintNoShader(context, skPaint, paintColor, constantColor, grPaint
); | 734 SkPaint2GrPaintNoShader(context, skPaint, paintColor, constantColor, grPaint
); |
| 726 } | 735 } |
| OLD | NEW |