OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 | 10 |
11 #include "SkGr.h" | 11 #include "SkGr.h" |
12 | 12 |
13 /* Fill out buffer with the compressed format Ganesh expects from a colortable | 13 /* Fill out buffer with the compressed format Ganesh expects from a colortable |
14 based bitmap. [palette (colortable) + indices]. | 14 based bitmap. [palette (colortable) + indices]. |
15 | 15 |
16 At the moment Ganesh only supports 8bit version. If Ganesh allowed we others | 16 At the moment Ganesh only supports 8bit version. If Ganesh allowed we others |
17 we could detect that the colortable.count is <= 16, and then repack the | 17 we could detect that the colortable.count is <= 16, and then repack the |
18 indices as nibbles to save RAM, but it would take more time (i.e. a lot | 18 indices as nibbles to save RAM, but it would take more time (i.e. a lot |
19 slower than memcpy), so skipping that for now. | 19 slower than memcpy), so skipping that for now. |
20 | 20 |
21 Ganesh wants a full 256 palette entry, even though Skia's ctable is only as big | 21 Ganesh wants a full 256 palette entry, even though Skia's ctable is only as big |
22 as the colortable.count says it is. | 22 as the colortable.count says it is. |
23 */ | 23 */ |
24 static void build_compressed_data(void* buffer, const SkBitmap& bitmap) { | 24 static void build_compressed_data(void* buffer, const SkBitmap& bitmap) { |
25 SkASSERT(SkBitmap::kIndex8_Config == bitmap.config()); | 25 SkASSERT(SkBitmap::kIndex8_Config == bitmap.config()); |
26 | 26 |
27 SkAutoLockPixels apl(bitmap); | 27 SkAutoLockPixels alp(bitmap); |
28 if (!bitmap.readyToDraw()) { | 28 if (!bitmap.readyToDraw()) { |
29 SkDEBUGFAIL("bitmap not ready to draw!"); | 29 SkDEBUGFAIL("bitmap not ready to draw!"); |
30 return; | 30 return; |
31 } | 31 } |
32 | 32 |
33 SkColorTable* ctable = bitmap.getColorTable(); | 33 SkColorTable* ctable = bitmap.getColorTable(); |
34 char* dst = (char*)buffer; | 34 char* dst = (char*)buffer; |
35 | 35 |
36 memcpy(dst, ctable->lockColors(), ctable->count() * sizeof(SkPMColor)); | 36 memcpy(dst, ctable->lockColors(), ctable->count() * sizeof(SkPMColor)); |
37 ctable->unlockColors(false); | 37 ctable->unlockColors(false); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 return result; | 128 return result; |
129 } | 129 } |
130 } else { | 130 } else { |
131 origBitmap.copyTo(&tmpBitmap, SkBitmap::kARGB_8888_Config); | 131 origBitmap.copyTo(&tmpBitmap, SkBitmap::kARGB_8888_Config); |
132 // now bitmap points to our temp, which has been promoted to 32bits | 132 // now bitmap points to our temp, which has been promoted to 32bits |
133 bitmap = &tmpBitmap; | 133 bitmap = &tmpBitmap; |
134 desc.fConfig = SkBitmapConfig2GrPixelConfig(bitmap->config()); | 134 desc.fConfig = SkBitmapConfig2GrPixelConfig(bitmap->config()); |
135 } | 135 } |
136 } | 136 } |
137 | 137 |
| 138 SkAutoLockPixels alp(*bitmap); |
| 139 if (!bitmap->readyToDraw()) { |
| 140 return NULL; |
| 141 } |
138 if (cache) { | 142 if (cache) { |
139 // This texture is likely to be used again so leave it in the cache | 143 // This texture is likely to be used again so leave it in the cache |
140 GrCacheID cacheID; | 144 GrCacheID cacheID; |
141 generate_bitmap_cache_id(origBitmap, &cacheID); | 145 generate_bitmap_cache_id(origBitmap, &cacheID); |
142 return ctx->createTexture(params, desc, cacheID, bitmap->getPixels(), bi
tmap->rowBytes()); | 146 return ctx->createTexture(params, desc, cacheID, bitmap->getPixels(), bi
tmap->rowBytes()); |
143 } else { | 147 } else { |
144 // This texture is unlikely to be used again (in its present form) so | 148 // This texture is unlikely to be used again (in its present form) so |
145 // just use a scratch texture. This will remove the texture from the | 149 // just use a scratch texture. This will remove the texture from the |
146 // cache so no one else can find it. Additionally, once unlocked, the | 150 // cache so no one else can find it. Additionally, once unlocked, the |
147 // scratch texture will go to the end of the list for purging so will | 151 // scratch texture will go to the end of the list for purging so will |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 return kRGB_565_GrPixelConfig; | 218 return kRGB_565_GrPixelConfig; |
215 case SkBitmap::kARGB_4444_Config: | 219 case SkBitmap::kARGB_4444_Config: |
216 return kRGBA_4444_GrPixelConfig; | 220 return kRGBA_4444_GrPixelConfig; |
217 case SkBitmap::kARGB_8888_Config: | 221 case SkBitmap::kARGB_8888_Config: |
218 return kSkia8888_GrPixelConfig; | 222 return kSkia8888_GrPixelConfig; |
219 default: | 223 default: |
220 // kNo_Config, kA1_Config missing, and kRLE_Index8_Config | 224 // kNo_Config, kA1_Config missing, and kRLE_Index8_Config |
221 return kUnknown_GrPixelConfig; | 225 return kUnknown_GrPixelConfig; |
222 } | 226 } |
223 } | 227 } |
OLD | NEW |