| 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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 for (int y = 0; y < bitmap.height(); y++) { | 81 for (int y = 0; y < bitmap.height(); y++) { |
| 82 memcpy(dst, src, width); | 82 memcpy(dst, src, width); |
| 83 src += rowBytes; | 83 src += rowBytes; |
| 84 dst += width; | 84 dst += width; |
| 85 } | 85 } |
| 86 } | 86 } |
| 87 } | 87 } |
| 88 | 88 |
| 89 //////////////////////////////////////////////////////////////////////////////// | 89 //////////////////////////////////////////////////////////////////////////////// |
| 90 | 90 |
| 91 enum Stretch { | 91 struct Stretch { |
| 92 kNo_Stretch, | 92 enum Type { |
| 93 kBilerp_Stretch, | 93 kNone_Type, |
| 94 kNearest_Stretch | 94 kBilerp_Type, |
| 95 kNearest_Type |
| 96 } fType; |
| 97 int fWidth; |
| 98 int fHeight; |
| 95 }; | 99 }; |
| 96 | 100 |
| 97 static Stretch get_stretch_type(const GrContext* ctx, int width, int height, | 101 static void get_stretch(const GrContext* ctx, int width, int height, |
| 98 const GrTextureParams* params) { | 102 const GrTextureParams* params, Stretch* stretch) { |
| 99 if (params && params->isTiled()) { | 103 stretch->fType = Stretch::kNone_Type; |
| 100 if (!ctx->caps()->npotTextureTileSupport() && (!SkIsPow2(width) || !SkIs
Pow2(height))) { | 104 bool doStretch = false; |
| 101 switch(params->filterMode()) { | 105 if (params && params->isTiled() && !ctx->caps()->npotTextureTileSupport() && |
| 102 case GrTextureParams::kNone_FilterMode: | 106 (!SkIsPow2(width) || !SkIsPow2(height))) { |
| 103 return kNearest_Stretch; | 107 doStretch = true; |
| 104 case GrTextureParams::kBilerp_FilterMode: | 108 stretch->fWidth = GrNextPow2(width); |
| 105 case GrTextureParams::kMipMap_FilterMode: | 109 stretch->fHeight = GrNextPow2(height); |
| 106 return kBilerp_Stretch; | 110 } else if (width < ctx->caps()->minTextureSize() || |
| 107 } | 111 height < ctx->caps()->minTextureSize()) { |
| 112 // The small texture issues appear to be with tiling. Hence it seems ok
to scale them |
| 113 // up using the GPU. If issues persist we may need to CPU-stretch. |
| 114 doStretch = true; |
| 115 stretch->fWidth = SkTMax(width, ctx->caps()->minTextureSize()); |
| 116 stretch->fHeight = SkTMax(height, ctx->caps()->minTextureSize()); |
| 117 } |
| 118 if (doStretch) { |
| 119 switch(params->filterMode()) { |
| 120 case GrTextureParams::kNone_FilterMode: |
| 121 stretch->fType = Stretch::kNearest_Type; |
| 122 break; |
| 123 case GrTextureParams::kBilerp_FilterMode: |
| 124 case GrTextureParams::kMipMap_FilterMode: |
| 125 stretch->fType = Stretch::kBilerp_Type; |
| 126 break; |
| 108 } | 127 } |
| 128 } else { |
| 129 stretch->fWidth = -1; |
| 130 stretch->fHeight = -1; |
| 131 stretch->fType = Stretch::kNone_Type; |
| 109 } | 132 } |
| 110 return kNo_Stretch; | |
| 111 } | 133 } |
| 112 | 134 |
| 113 static bool make_stretched_key(const GrUniqueKey& origKey, Stretch stretch, | 135 static bool make_stretched_key(const GrUniqueKey& origKey, const Stretch& stretc
h, |
| 114 GrUniqueKey* stretchedKey) { | 136 GrUniqueKey* stretchedKey) { |
| 115 if (origKey.isValid() && kNo_Stretch != stretch) { | 137 if (origKey.isValid() && Stretch::kNone_Type != stretch.fType) { |
| 138 uint32_t width = SkToU16(stretch.fWidth); |
| 139 uint32_t height = SkToU16(stretch.fHeight); |
| 116 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain()
; | 140 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain()
; |
| 117 GrUniqueKey::Builder builder(stretchedKey, origKey, kDomain, 1); | 141 GrUniqueKey::Builder builder(stretchedKey, origKey, kDomain, 3); |
| 118 builder[0] = stretch; | 142 builder[0] = stretch.fType; |
| 143 builder[1] = width | (height << 16); |
| 119 builder.finish(); | 144 builder.finish(); |
| 120 return true; | 145 return true; |
| 121 } | 146 } |
| 122 SkASSERT(!stretchedKey->isValid()); | 147 SkASSERT(!stretchedKey->isValid()); |
| 123 return false; | 148 return false; |
| 124 } | 149 } |
| 125 | 150 |
| 126 static void make_unstretched_key(const SkBitmap& bitmap, GrUniqueKey* key) { | 151 static void make_unstretched_key(const SkBitmap& bitmap, GrUniqueKey* key) { |
| 127 // Our id includes the offset, width, and height so that bitmaps created by
extractSubset() | 152 // Our id includes the offset, width, and height so that bitmaps created by
extractSubset() |
| 128 // are unique. | 153 // are unique. |
| 129 uint32_t genID = bitmap.getGenerationID(); | 154 uint32_t genID = bitmap.getGenerationID(); |
| 130 SkIPoint origin = bitmap.pixelRefOrigin(); | 155 SkIPoint origin = bitmap.pixelRefOrigin(); |
| 131 uint32_t width = SkToU16(bitmap.width()); | 156 uint32_t width = SkToU16(bitmap.width()); |
| 132 uint32_t height = SkToU16(bitmap.height()); | 157 uint32_t height = SkToU16(bitmap.height()); |
| 133 | 158 |
| 134 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); | 159 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); |
| 135 GrUniqueKey::Builder builder(key, kDomain, 4); | 160 GrUniqueKey::Builder builder(key, kDomain, 4); |
| 136 builder[0] = genID; | 161 builder[0] = genID; |
| 137 builder[1] = origin.fX; | 162 builder[1] = origin.fX; |
| 138 builder[2] = origin.fY; | 163 builder[2] = origin.fY; |
| 139 builder[3] = width | (height << 16); | 164 builder[3] = width | (height << 16); |
| 140 } | 165 } |
| 141 | 166 |
| 142 static void make_bitmap_keys(const SkBitmap& bitmap, | 167 static void make_bitmap_keys(const SkBitmap& bitmap, |
| 143 Stretch stretch, | 168 const Stretch& stretch, |
| 144 GrUniqueKey* key, | 169 GrUniqueKey* key, |
| 145 GrUniqueKey* stretchedKey) { | 170 GrUniqueKey* stretchedKey) { |
| 146 make_unstretched_key(bitmap, key); | 171 make_unstretched_key(bitmap, key); |
| 147 if (kNo_Stretch != stretch) { | 172 if (Stretch::kNone_Type != stretch.fType) { |
| 148 make_stretched_key(*key, stretch, stretchedKey); | 173 make_stretched_key(*key, stretch, stretchedKey); |
| 149 } | 174 } |
| 150 } | 175 } |
| 151 | 176 |
| 152 static void generate_bitmap_texture_desc(const SkBitmap& bitmap, GrSurfaceDesc*
desc) { | 177 static void generate_bitmap_texture_desc(const SkBitmap& bitmap, GrSurfaceDesc*
desc) { |
| 153 desc->fFlags = kNone_GrSurfaceFlags; | 178 desc->fFlags = kNone_GrSurfaceFlags; |
| 154 desc->fWidth = bitmap.width(); | 179 desc->fWidth = bitmap.width(); |
| 155 desc->fHeight = bitmap.height(); | 180 desc->fHeight = bitmap.height(); |
| 156 desc->fConfig = SkImageInfo2GrPixelConfig(bitmap.info()); | 181 desc->fConfig = SkImageInfo2GrPixelConfig(bitmap.info()); |
| 157 desc->fSampleCnt = 0; | 182 desc->fSampleCnt = 0; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 182 size_t rowBytes) { | 207 size_t rowBytes) { |
| 183 GrTexture* result = ctx->textureProvider()->createTexture(desc, true, pixels
, rowBytes); | 208 GrTexture* result = ctx->textureProvider()->createTexture(desc, true, pixels
, rowBytes); |
| 184 if (result && optionalKey.isValid()) { | 209 if (result && optionalKey.isValid()) { |
| 185 BitmapInvalidator* listener = SkNEW_ARGS(BitmapInvalidator, (optionalKey
)); | 210 BitmapInvalidator* listener = SkNEW_ARGS(BitmapInvalidator, (optionalKey
)); |
| 186 pixelRefForInvalidationNotification->addGenIDChangeListener(listener); | 211 pixelRefForInvalidationNotification->addGenIDChangeListener(listener); |
| 187 ctx->textureProvider()->assignUniqueKeyToTexture(optionalKey, result); | 212 ctx->textureProvider()->assignUniqueKeyToTexture(optionalKey, result); |
| 188 } | 213 } |
| 189 return result; | 214 return result; |
| 190 } | 215 } |
| 191 | 216 |
| 192 // creates a new texture that is the input texture scaled up to the next power o
f two in | 217 // creates a new texture that is the input texture scaled up. If optionalKey is
valid it will be |
| 193 // width or height. If optionalKey is valid it will be set on the new texture. s
tretch | 218 // set on the new texture. stretch controls whether the scaling is done using ne
arest or bilerp |
| 194 // controls whether the scaling is done using nearest or bilerp filtering. | 219 // filtering and the size to stretch the texture to. |
| 195 GrTexture* stretch_texture_to_next_pot(GrTexture* inputTexture, Stretch stretch, | 220 GrTexture* stretch_texture(GrTexture* inputTexture, const Stretch& stretch, |
| 196 SkPixelRef* pixelRef, | 221 SkPixelRef* pixelRef, |
| 197 const GrUniqueKey& optionalKey) { | 222 const GrUniqueKey& optionalKey) { |
| 198 SkASSERT(kNo_Stretch != stretch); | 223 SkASSERT(Stretch::kNone_Type != stretch.fType); |
| 199 | 224 |
| 200 GrContext* context = inputTexture->getContext(); | 225 GrContext* context = inputTexture->getContext(); |
| 201 SkASSERT(context); | 226 SkASSERT(context); |
| 202 const GrCaps* caps = context->caps(); | 227 const GrCaps* caps = context->caps(); |
| 203 | 228 |
| 204 // Either it's a cache miss or the original wasn't cached to begin with. | 229 // Either it's a cache miss or the original wasn't cached to begin with. |
| 205 GrSurfaceDesc rtDesc = inputTexture->desc(); | 230 GrSurfaceDesc rtDesc = inputTexture->desc(); |
| 206 rtDesc.fFlags = rtDesc.fFlags | kRenderTarget_GrSurfaceFlag; | 231 rtDesc.fFlags = rtDesc.fFlags | kRenderTarget_GrSurfaceFlag; |
| 207 rtDesc.fWidth = GrNextPow2(rtDesc.fWidth); | 232 rtDesc.fWidth = stretch.fWidth; |
| 208 rtDesc.fHeight = GrNextPow2(rtDesc.fHeight); | 233 rtDesc.fHeight = stretch.fHeight; |
| 209 rtDesc.fConfig = GrMakePixelConfigUncompressed(rtDesc.fConfig); | 234 rtDesc.fConfig = GrMakePixelConfigUncompressed(rtDesc.fConfig); |
| 210 | 235 |
| 211 // If the config isn't renderable try converting to either A8 or an 32 bit c
onfig. Otherwise, | 236 // If the config isn't renderable try converting to either A8 or an 32 bit c
onfig. Otherwise, |
| 212 // fail. | 237 // fail. |
| 213 if (!caps->isConfigRenderable(rtDesc.fConfig, false)) { | 238 if (!caps->isConfigRenderable(rtDesc.fConfig, false)) { |
| 214 if (GrPixelConfigIsAlphaOnly(rtDesc.fConfig)) { | 239 if (GrPixelConfigIsAlphaOnly(rtDesc.fConfig)) { |
| 215 if (caps->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) { | 240 if (caps->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) { |
| 216 rtDesc.fConfig = kAlpha_8_GrPixelConfig; | 241 rtDesc.fConfig = kAlpha_8_GrPixelConfig; |
| 217 } else if (caps->isConfigRenderable(kSkia8888_GrPixelConfig, false))
{ | 242 } else if (caps->isConfigRenderable(kSkia8888_GrPixelConfig, false))
{ |
| 218 rtDesc.fConfig = kSkia8888_GrPixelConfig; | 243 rtDesc.fConfig = kSkia8888_GrPixelConfig; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 234 GrTexture* stretched = create_texture_for_bmp(context, optionalKey, rtDesc,
pixelRef, NULL, 0); | 259 GrTexture* stretched = create_texture_for_bmp(context, optionalKey, rtDesc,
pixelRef, NULL, 0); |
| 235 | 260 |
| 236 if (!stretched) { | 261 if (!stretched) { |
| 237 return NULL; | 262 return NULL; |
| 238 } | 263 } |
| 239 GrPaint paint; | 264 GrPaint paint; |
| 240 | 265 |
| 241 // If filtering is not desired then we want to ensure all texels in the resa
mpled image are | 266 // If filtering is not desired then we want to ensure all texels in the resa
mpled image are |
| 242 // copies of texels from the original. | 267 // copies of texels from the original. |
| 243 GrTextureParams params(SkShader::kClamp_TileMode, | 268 GrTextureParams params(SkShader::kClamp_TileMode, |
| 244 kBilerp_Stretch == stretch ? GrTextureParams::kBilerp
_FilterMode : | 269 Stretch::kBilerp_Type == stretch.fType ? |
| 245 GrTextureParams::kNone_F
ilterMode); | 270 GrTextureParams::kBilerp_FilterMode : |
| 271 GrTextureParams::kNone_FilterMode); |
| 246 paint.addColorTextureProcessor(inputTexture, SkMatrix::I(), params); | 272 paint.addColorTextureProcessor(inputTexture, SkMatrix::I(), params); |
| 247 | 273 |
| 248 SkRect rect = SkRect::MakeWH(SkIntToScalar(rtDesc.fWidth), SkIntToScalar(rtD
esc.fHeight)); | 274 SkRect rect = SkRect::MakeWH(SkIntToScalar(rtDesc.fWidth), SkIntToScalar(rtD
esc.fHeight)); |
| 249 SkRect localRect = SkRect::MakeWH(1.f, 1.f); | 275 SkRect localRect = SkRect::MakeWH(1.f, 1.f); |
| 250 | 276 |
| 251 GrDrawContext* drawContext = context->drawContext(); | 277 GrDrawContext* drawContext = context->drawContext(); |
| 252 if (!drawContext) { | 278 if (!drawContext) { |
| 253 return NULL; | 279 return NULL; |
| 254 } | 280 } |
| 255 | 281 |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 if (!bitmap->readyToDraw()) { | 498 if (!bitmap->readyToDraw()) { |
| 473 return NULL; | 499 return NULL; |
| 474 } | 500 } |
| 475 | 501 |
| 476 return create_texture_for_bmp(ctx, optionalKey, desc, origBitmap.pixelRef(), | 502 return create_texture_for_bmp(ctx, optionalKey, desc, origBitmap.pixelRef(), |
| 477 bitmap->getPixels(), bitmap->rowBytes()); | 503 bitmap->getPixels(), bitmap->rowBytes()); |
| 478 } | 504 } |
| 479 | 505 |
| 480 static GrTexture* create_bitmap_texture(GrContext* ctx, | 506 static GrTexture* create_bitmap_texture(GrContext* ctx, |
| 481 const SkBitmap& bmp, | 507 const SkBitmap& bmp, |
| 482 Stretch stretch, | 508 const Stretch& stretch, |
| 483 const GrUniqueKey& unstretchedKey, | 509 const GrUniqueKey& unstretchedKey, |
| 484 const GrUniqueKey& stretchedKey) { | 510 const GrUniqueKey& stretchedKey) { |
| 485 if (kNo_Stretch != stretch) { | 511 if (Stretch::kNone_Type != stretch.fType) { |
| 486 SkAutoTUnref<GrTexture> unstretched; | 512 SkAutoTUnref<GrTexture> unstretched; |
| 487 // Check if we have the unstretched version in the cache, if not create
it. | 513 // Check if we have the unstretched version in the cache, if not create
it. |
| 488 if (unstretchedKey.isValid()) { | 514 if (unstretchedKey.isValid()) { |
| 489 unstretched.reset(ctx->textureProvider()->findAndRefTextureByUniqueK
ey(unstretchedKey)); | 515 unstretched.reset(ctx->textureProvider()->findAndRefTextureByUniqueK
ey(unstretchedKey)); |
| 490 } | 516 } |
| 491 if (!unstretched) { | 517 if (!unstretched) { |
| 492 unstretched.reset(create_unstretched_bitmap_texture(ctx, bmp, unstre
tchedKey)); | 518 unstretched.reset(create_unstretched_bitmap_texture(ctx, bmp, unstre
tchedKey)); |
| 493 if (!unstretched) { | 519 if (!unstretched) { |
| 494 return NULL; | 520 return NULL; |
| 495 } | 521 } |
| 496 } | 522 } |
| 497 GrTexture* stretched = stretch_texture_to_next_pot(unstretched, stretch,
bmp.pixelRef(), | 523 GrTexture* stretched = stretch_texture(unstretched, stretch, bmp.pixelRe
f(), stretchedKey); |
| 498 stretchedKey); | |
| 499 return stretched; | 524 return stretched; |
| 500 } | 525 } |
| 501 | 526 |
| 502 return create_unstretched_bitmap_texture(ctx, bmp, unstretchedKey); | 527 return create_unstretched_bitmap_texture(ctx, bmp, unstretchedKey); |
| 503 | 528 |
| 504 } | 529 } |
| 505 | 530 |
| 506 bool GrIsBitmapInCache(const GrContext* ctx, | 531 bool GrIsBitmapInCache(const GrContext* ctx, |
| 507 const SkBitmap& bitmap, | 532 const SkBitmap& bitmap, |
| 508 const GrTextureParams* params) { | 533 const GrTextureParams* params) { |
| 509 Stretch stretch = get_stretch_type(ctx, bitmap.width(), bitmap.height(), par
ams); | 534 Stretch stretch; |
| 535 get_stretch(ctx, bitmap.width(), bitmap.height(), params, &stretch); |
| 510 | 536 |
| 511 // Handle the case where the bitmap is explicitly texture backed. | 537 // Handle the case where the bitmap is explicitly texture backed. |
| 512 GrTexture* texture = bitmap.getTexture(); | 538 GrTexture* texture = bitmap.getTexture(); |
| 513 if (texture) { | 539 if (texture) { |
| 514 if (kNo_Stretch == stretch) { | 540 if (Stretch::kNone_Type == stretch.fType) { |
| 515 return true; | 541 return true; |
| 516 } | 542 } |
| 517 // No keys for volatile bitmaps. | 543 // No keys for volatile bitmaps. |
| 518 if (bitmap.isVolatile()) { | 544 if (bitmap.isVolatile()) { |
| 519 return false; | 545 return false; |
| 520 } | 546 } |
| 521 const GrUniqueKey& key = texture->getUniqueKey(); | 547 const GrUniqueKey& key = texture->getUniqueKey(); |
| 522 if (!key.isValid()) { | 548 if (!key.isValid()) { |
| 523 return false; | 549 return false; |
| 524 } | 550 } |
| 525 GrUniqueKey stretchedKey; | 551 GrUniqueKey stretchedKey; |
| 526 make_stretched_key(key, stretch, &stretchedKey); | 552 make_stretched_key(key, stretch, &stretchedKey); |
| 527 return ctx->textureProvider()->existsTextureWithUniqueKey(stretchedKey); | 553 return ctx->textureProvider()->existsTextureWithUniqueKey(stretchedKey); |
| 528 } | 554 } |
| 529 | 555 |
| 530 // We don't cache volatile bitmaps | 556 // We don't cache volatile bitmaps |
| 531 if (bitmap.isVolatile()) { | 557 if (bitmap.isVolatile()) { |
| 532 return false; | 558 return false; |
| 533 } | 559 } |
| 534 | 560 |
| 535 GrUniqueKey key, stretchedKey; | 561 GrUniqueKey key, stretchedKey; |
| 536 make_bitmap_keys(bitmap, stretch, &key, &stretchedKey); | 562 make_bitmap_keys(bitmap, stretch, &key, &stretchedKey); |
| 537 return ctx->textureProvider()->existsTextureWithUniqueKey( | 563 return ctx->textureProvider()->existsTextureWithUniqueKey( |
| 538 (kNo_Stretch == stretch) ? key : stretchedKey); | 564 (Stretch::kNone_Type == stretch.fType) ? key : stretchedKey); |
| 539 } | 565 } |
| 540 | 566 |
| 541 GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, | 567 GrTexture* GrRefCachedBitmapTexture(GrContext* ctx, |
| 542 const SkBitmap& bitmap, | 568 const SkBitmap& bitmap, |
| 543 const GrTextureParams* params) { | 569 const GrTextureParams* params) { |
| 544 | 570 |
| 545 Stretch stretch = get_stretch_type(ctx, bitmap.width(), bitmap.height(), par
ams); | 571 Stretch stretch; |
| 572 get_stretch(ctx, bitmap.width(), bitmap.height(), params, &stretch); |
| 546 | 573 |
| 547 GrTexture* result = bitmap.getTexture(); | 574 GrTexture* result = bitmap.getTexture(); |
| 548 if (result) { | 575 if (result) { |
| 549 if (kNo_Stretch == stretch) { | 576 if (Stretch::kNone_Type == stretch.fType) { |
| 550 return SkRef(result); | 577 return SkRef(result); |
| 551 } | 578 } |
| 552 GrUniqueKey stretchedKey; | 579 GrUniqueKey stretchedKey; |
| 553 // Don't create a key for the resized version if the bmp is volatile. | 580 // Don't create a key for the resized version if the bmp is volatile. |
| 554 if (!bitmap.isVolatile()) { | 581 if (!bitmap.isVolatile()) { |
| 555 const GrUniqueKey& key = result->getUniqueKey(); | 582 const GrUniqueKey& key = result->getUniqueKey(); |
| 556 if (key.isValid()) { | 583 if (key.isValid()) { |
| 557 make_stretched_key(key, stretch, &stretchedKey); | 584 make_stretched_key(key, stretch, &stretchedKey); |
| 558 GrTexture* stretched = | 585 GrTexture* stretched = |
| 559 ctx->textureProvider()->findAndRefTextureByUniqueKey(stretch
edKey); | 586 ctx->textureProvider()->findAndRefTextureByUniqueKey(stretch
edKey); |
| 560 if (stretched) { | 587 if (stretched) { |
| 561 return stretched; | 588 return stretched; |
| 562 } | 589 } |
| 563 } | 590 } |
| 564 } | 591 } |
| 565 return stretch_texture_to_next_pot(result, stretch, bitmap.pixelRef(), s
tretchedKey); | 592 return stretch_texture(result, stretch, bitmap.pixelRef(), stretchedKey)
; |
| 566 } | 593 } |
| 567 | 594 |
| 568 GrUniqueKey key, resizedKey; | 595 GrUniqueKey key, resizedKey; |
| 569 | 596 |
| 570 if (!bitmap.isVolatile()) { | 597 if (!bitmap.isVolatile()) { |
| 571 // If the bitmap isn't changing try to find a cached copy first. | 598 // If the bitmap isn't changing try to find a cached copy first. |
| 572 make_bitmap_keys(bitmap, stretch, &key, &resizedKey); | 599 make_bitmap_keys(bitmap, stretch, &key, &resizedKey); |
| 573 | 600 |
| 574 result = ctx->textureProvider()->findAndRefTextureByUniqueKey( | 601 result = ctx->textureProvider()->findAndRefTextureByUniqueKey( |
| 575 resizedKey.isValid() ? resizedKey : key); | 602 resizedKey.isValid() ? resizedKey : key); |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 767 } | 794 } |
| 768 return SkImageInfo::Make(w, h, ct, at); | 795 return SkImageInfo::Make(w, h, ct, at); |
| 769 } | 796 } |
| 770 | 797 |
| 771 | 798 |
| 772 void GrWrapTextureInBitmap(GrTexture* src, int w, int h, bool isOpaque, SkBitmap
* dst) { | 799 void GrWrapTextureInBitmap(GrTexture* src, int w, int h, bool isOpaque, SkBitmap
* dst) { |
| 773 const SkImageInfo info = GrMakeInfoFromTexture(src, w, h, isOpaque); | 800 const SkImageInfo info = GrMakeInfoFromTexture(src, w, h, isOpaque); |
| 774 dst->setInfo(info); | 801 dst->setInfo(info); |
| 775 dst->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, src)))->unref(); | 802 dst->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, src)))->unref(); |
| 776 } | 803 } |
| OLD | NEW |