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" | |
11 #include "GrDrawContext.h" | 10 #include "GrDrawContext.h" |
12 #include "GrXferProcessor.h" | 11 #include "GrXferProcessor.h" |
13 #include "SkColorFilter.h" | 12 #include "SkColorFilter.h" |
14 #include "SkConfig8888.h" | 13 #include "SkConfig8888.h" |
15 #include "SkData.h" | 14 #include "SkData.h" |
16 #include "SkErrorInternals.h" | 15 #include "SkErrorInternals.h" |
17 #include "SkGrPixelRef.h" | 16 #include "SkGrPixelRef.h" |
18 #include "SkMessageBus.h" | 17 #include "SkMessageBus.h" |
19 #include "SkPixelRef.h" | 18 #include "SkPixelRef.h" |
20 #include "SkResourceCache.h" | 19 #include "SkResourceCache.h" |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 | 89 |
91 enum Stretch { | 90 enum Stretch { |
92 kNo_Stretch, | 91 kNo_Stretch, |
93 kBilerp_Stretch, | 92 kBilerp_Stretch, |
94 kNearest_Stretch | 93 kNearest_Stretch |
95 }; | 94 }; |
96 | 95 |
97 static Stretch get_stretch_type(const GrContext* ctx, int width, int height, | 96 static Stretch get_stretch_type(const GrContext* ctx, int width, int height, |
98 const GrTextureParams* params) { | 97 const GrTextureParams* params) { |
99 if (params && params->isTiled()) { | 98 if (params && params->isTiled()) { |
100 if (!ctx->caps()->npotTextureTileSupport() && (!SkIsPow2(width) || !SkIs
Pow2(height))) { | 99 if (!ctx->npotTextureTileSupport() && (!SkIsPow2(width) || !SkIsPow2(hei
ght))) { |
101 switch(params->filterMode()) { | 100 switch(params->filterMode()) { |
102 case GrTextureParams::kNone_FilterMode: | 101 case GrTextureParams::kNone_FilterMode: |
103 return kNearest_Stretch; | 102 return kNearest_Stretch; |
104 case GrTextureParams::kBilerp_FilterMode: | 103 case GrTextureParams::kBilerp_FilterMode: |
105 case GrTextureParams::kMipMap_FilterMode: | 104 case GrTextureParams::kMipMap_FilterMode: |
106 return kBilerp_Stretch; | 105 return kBilerp_Stretch; |
107 } | 106 } |
108 } | 107 } |
109 } | 108 } |
110 return kNo_Stretch; | 109 return kNo_Stretch; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 // creates a new texture that is the input texture scaled up to the next power o
f two in | 191 // creates a new texture that is the input texture scaled up to the next power o
f two in |
193 // width or height. If optionalKey is valid it will be set on the new texture. s
tretch | 192 // width or height. If optionalKey is valid it will be set on the new texture. s
tretch |
194 // controls whether the scaling is done using nearest or bilerp filtering. | 193 // controls whether the scaling is done using nearest or bilerp filtering. |
195 GrTexture* stretch_texture_to_next_pot(GrTexture* inputTexture, Stretch stretch, | 194 GrTexture* stretch_texture_to_next_pot(GrTexture* inputTexture, Stretch stretch, |
196 SkPixelRef* pixelRef, | 195 SkPixelRef* pixelRef, |
197 const GrUniqueKey& optionalKey) { | 196 const GrUniqueKey& optionalKey) { |
198 SkASSERT(kNo_Stretch != stretch); | 197 SkASSERT(kNo_Stretch != stretch); |
199 | 198 |
200 GrContext* context = inputTexture->getContext(); | 199 GrContext* context = inputTexture->getContext(); |
201 SkASSERT(context); | 200 SkASSERT(context); |
202 const GrCaps* caps = context->caps(); | |
203 | 201 |
204 // Either it's a cache miss or the original wasn't cached to begin with. | 202 // Either it's a cache miss or the original wasn't cached to begin with. |
205 GrSurfaceDesc rtDesc = inputTexture->desc(); | 203 GrSurfaceDesc rtDesc = inputTexture->desc(); |
206 rtDesc.fFlags = rtDesc.fFlags | kRenderTarget_GrSurfaceFlag; | 204 rtDesc.fFlags = rtDesc.fFlags | kRenderTarget_GrSurfaceFlag; |
207 rtDesc.fWidth = GrNextPow2(rtDesc.fWidth); | 205 rtDesc.fWidth = GrNextPow2(rtDesc.fWidth); |
208 rtDesc.fHeight = GrNextPow2(rtDesc.fHeight); | 206 rtDesc.fHeight = GrNextPow2(rtDesc.fHeight); |
209 rtDesc.fConfig = GrMakePixelConfigUncompressed(rtDesc.fConfig); | 207 rtDesc.fConfig = GrMakePixelConfigUncompressed(rtDesc.fConfig); |
210 | 208 |
211 // If the config isn't renderable try converting to either A8 or an 32 bit c
onfig. Otherwise, | 209 // If the config isn't renderable try converting to either A8 or an 32 bit c
onfig. Otherwise, |
212 // fail. | 210 // fail. |
213 if (!caps->isConfigRenderable(rtDesc.fConfig, false)) { | 211 if (!context->isConfigRenderable(rtDesc.fConfig, false)) { |
214 if (GrPixelConfigIsAlphaOnly(rtDesc.fConfig)) { | 212 if (GrPixelConfigIsAlphaOnly(rtDesc.fConfig)) { |
215 if (caps->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) { | 213 if (context->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) { |
216 rtDesc.fConfig = kAlpha_8_GrPixelConfig; | 214 rtDesc.fConfig = kAlpha_8_GrPixelConfig; |
217 } else if (caps->isConfigRenderable(kSkia8888_GrPixelConfig, false))
{ | 215 } else if (context->isConfigRenderable(kSkia8888_GrPixelConfig, fals
e)) { |
218 rtDesc.fConfig = kSkia8888_GrPixelConfig; | 216 rtDesc.fConfig = kSkia8888_GrPixelConfig; |
219 } else { | 217 } else { |
220 return NULL; | 218 return NULL; |
221 } | 219 } |
222 } else if (kRGB_GrColorComponentFlags == | 220 } else if (kRGB_GrColorComponentFlags == |
223 (kRGB_GrColorComponentFlags & GrPixelConfigComponentMask(rtDe
sc.fConfig))) { | 221 (kRGB_GrColorComponentFlags & GrPixelConfigComponentMask(rtDe
sc.fConfig))) { |
224 if (caps->isConfigRenderable(kSkia8888_GrPixelConfig, false)) { | 222 if (context->isConfigRenderable(kSkia8888_GrPixelConfig, false)) { |
225 rtDesc.fConfig = kSkia8888_GrPixelConfig; | 223 rtDesc.fConfig = kSkia8888_GrPixelConfig; |
226 } else { | 224 } else { |
227 return NULL; | 225 return NULL; |
228 } | 226 } |
229 } else { | 227 } else { |
230 return NULL; | 228 return NULL; |
231 } | 229 } |
232 } | 230 } |
233 | 231 |
234 GrTexture* stretched = create_texture_for_bmp(context, optionalKey, rtDesc,
pixelRef, NULL, 0); | 232 GrTexture* stretched = create_texture_for_bmp(context, optionalKey, rtDesc,
pixelRef, NULL, 0); |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 | 416 |
419 static GrTexture* create_unstretched_bitmap_texture(GrContext* ctx, | 417 static GrTexture* create_unstretched_bitmap_texture(GrContext* ctx, |
420 const SkBitmap& origBitmap, | 418 const SkBitmap& origBitmap, |
421 const GrUniqueKey& optionalK
ey) { | 419 const GrUniqueKey& optionalK
ey) { |
422 SkBitmap tmpBitmap; | 420 SkBitmap tmpBitmap; |
423 | 421 |
424 const SkBitmap* bitmap = &origBitmap; | 422 const SkBitmap* bitmap = &origBitmap; |
425 | 423 |
426 GrSurfaceDesc desc; | 424 GrSurfaceDesc desc; |
427 generate_bitmap_texture_desc(*bitmap, &desc); | 425 generate_bitmap_texture_desc(*bitmap, &desc); |
428 const GrCaps* caps = ctx->caps(); | |
429 | 426 |
430 if (kIndex_8_SkColorType == bitmap->colorType()) { | 427 if (kIndex_8_SkColorType == bitmap->colorType()) { |
431 if (caps->isConfigTexturable(kIndex_8_GrPixelConfig)) { | 428 if (ctx->isConfigTexturable(kIndex_8_GrPixelConfig)) { |
432 size_t imageSize = GrCompressedFormatDataSize(kIndex_8_GrPixelConfig
, | 429 size_t imageSize = GrCompressedFormatDataSize(kIndex_8_GrPixelConfig
, |
433 bitmap->width(), bitma
p->height()); | 430 bitmap->width(), bitma
p->height()); |
434 SkAutoMalloc storage(imageSize); | 431 SkAutoMalloc storage(imageSize); |
435 build_index8_data(storage.get(), origBitmap); | 432 build_index8_data(storage.get(), origBitmap); |
436 | 433 |
437 // our compressed data will be trimmed, so pass width() for its | 434 // our compressed data will be trimmed, so pass width() for its |
438 // "rowBytes", since they are the same now. | 435 // "rowBytes", since they are the same now. |
439 return create_texture_for_bmp(ctx, optionalKey, desc, origBitmap.pix
elRef(), | 436 return create_texture_for_bmp(ctx, optionalKey, desc, origBitmap.pix
elRef(), |
440 storage.get(), bitmap->width()); | 437 storage.get(), bitmap->width()); |
441 } else { | 438 } else { |
442 origBitmap.copyTo(&tmpBitmap, kN32_SkColorType); | 439 origBitmap.copyTo(&tmpBitmap, kN32_SkColorType); |
443 // now bitmap points to our temp, which has been promoted to 32bits | 440 // now bitmap points to our temp, which has been promoted to 32bits |
444 bitmap = &tmpBitmap; | 441 bitmap = &tmpBitmap; |
445 desc.fConfig = SkImageInfo2GrPixelConfig(bitmap->info()); | 442 desc.fConfig = SkImageInfo2GrPixelConfig(bitmap->info()); |
446 } | 443 } |
447 } | 444 } |
448 | 445 |
449 // Is this an ETC1 encoded texture? | 446 // Is this an ETC1 encoded texture? |
450 #ifndef SK_IGNORE_ETC1_SUPPORT | 447 #ifndef SK_IGNORE_ETC1_SUPPORT |
451 // Make sure that the underlying device supports ETC1 textures before we go
ahead | 448 // Make sure that the underlying device supports ETC1 textures before we go
ahead |
452 // and check the data. | 449 // and check the data. |
453 else if (caps->isConfigTexturable(kETC1_GrPixelConfig) | 450 else if (ctx->isConfigTexturable(kETC1_GrPixelConfig) |
454 // If the bitmap had compressed data and was then uncompressed, it'l
l still return | 451 // If the bitmap had compressed data and was then uncompressed, it'l
l still return |
455 // compressed data on 'refEncodedData' and upload it. Probably not g
ood, since if | 452 // compressed data on 'refEncodedData' and upload it. Probably not g
ood, since if |
456 // the bitmap has available pixels, then they might not be what the
decompressed | 453 // the bitmap has available pixels, then they might not be what the
decompressed |
457 // data is. | 454 // data is. |
458 && !(bitmap->readyToDraw())) { | 455 && !(bitmap->readyToDraw())) { |
459 GrTexture *texture = load_etc1_texture(ctx, optionalKey, *bitmap, desc); | 456 GrTexture *texture = load_etc1_texture(ctx, optionalKey, *bitmap, desc); |
460 if (texture) { | 457 if (texture) { |
461 return texture; | 458 return texture; |
462 } | 459 } |
463 } | 460 } |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 } | 764 } |
768 return SkImageInfo::Make(w, h, ct, at); | 765 return SkImageInfo::Make(w, h, ct, at); |
769 } | 766 } |
770 | 767 |
771 | 768 |
772 void GrWrapTextureInBitmap(GrTexture* src, int w, int h, bool isOpaque, SkBitmap
* dst) { | 769 void GrWrapTextureInBitmap(GrTexture* src, int w, int h, bool isOpaque, SkBitmap
* dst) { |
773 const SkImageInfo info = GrMakeInfoFromTexture(src, w, h, isOpaque); | 770 const SkImageInfo info = GrMakeInfoFromTexture(src, w, h, isOpaque); |
774 dst->setInfo(info); | 771 dst->setInfo(info); |
775 dst->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, src)))->unref(); | 772 dst->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (info, src)))->unref(); |
776 } | 773 } |
OLD | NEW |