Index: src/gpu/SkGr.cpp |
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp |
index 81a3502455765c78ffff32b11c2132d78e208a75..a3848c77e01de508f9c22a96e8c4b2d0f69d8454 100644 |
--- a/src/gpu/SkGr.cpp |
+++ b/src/gpu/SkGr.cpp |
@@ -7,7 +7,6 @@ |
#include "SkGr.h" |
-#include "SkGrPriv.h" |
#include "GrCaps.h" |
#include "GrContext.h" |
@@ -122,10 +121,16 @@ GrPixelConfig GrIsCompressedTextureDataSupported(GrContext* ctx, SkData* data, |
* Ganesh wants a full 256 palette entry, even though Skia's ctable is only as big |
* as the colortable.count says it is. |
*/ |
-static void build_index8_data(void* buffer, const SkPixmap& pixmap) { |
- SkASSERT(kIndex_8_SkColorType == pixmap.colorType()); |
+static void build_index8_data(void* buffer, const SkBitmap& bitmap) { |
+ SkASSERT(kIndex_8_SkColorType == bitmap.colorType()); |
- const SkColorTable* ctable = pixmap.ctable(); |
+ SkAutoLockPixels alp(bitmap); |
+ if (!bitmap.readyToDraw()) { |
+ SkDEBUGFAIL("bitmap not ready to draw!"); |
+ return; |
+ } |
+ |
+ SkColorTable* ctable = bitmap.getColorTable(); |
char* dst = (char*)buffer; |
const int count = ctable->count(); |
@@ -147,14 +152,14 @@ static void build_index8_data(void* buffer, const SkPixmap& pixmap) { |
// always skip a full 256 number of entries, even if we memcpy'd fewer |
dst += 256 * sizeof(GrColor); |
- if ((unsigned)pixmap.width() == pixmap.rowBytes()) { |
- memcpy(dst, pixmap.addr(), pixmap.getSafeSize()); |
+ if ((unsigned)bitmap.width() == bitmap.rowBytes()) { |
+ memcpy(dst, bitmap.getPixels(), bitmap.getSize()); |
} else { |
// need to trim off the extra bytes per row |
- size_t width = pixmap.width(); |
- size_t rowBytes = pixmap.rowBytes(); |
- const uint8_t* src = pixmap.addr8(); |
- for (int y = 0; y < pixmap.height(); y++) { |
+ size_t width = bitmap.width(); |
+ size_t rowBytes = bitmap.rowBytes(); |
+ const char* src = (const char*)bitmap.getPixels(); |
+ for (int y = 0; y < bitmap.height(); y++) { |
memcpy(dst, src, width); |
src += rowBytes; |
dst += width; |
@@ -213,63 +218,58 @@ static GrTexture* load_etc1_texture(GrContext* ctx, const SkBitmap &bm, GrSurfac |
return ctx->textureProvider()->createTexture(desc, SkBudgeted::kYes, startOfTexData, 0); |
} |
-GrTexture* GrUploadBitmapToTexture(GrContext* ctx, const SkBitmap& bitmap) { |
- GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(bitmap.info()); |
- if (GrTexture *texture = load_etc1_texture(ctx, bitmap, desc)) { |
- return texture; |
- } |
- |
- if (GrTexture* texture = create_texture_from_yuv(ctx, bitmap, desc)) { |
- return texture; |
- } |
- |
- SkAutoLockPixels alp(bitmap); |
- if (!bitmap.readyToDraw()) { |
- return nullptr; |
- } |
- SkPixmap pixmap; |
- if (!bitmap.peekPixels(&pixmap)) { |
- return nullptr; |
- } |
- return GrUploadPixmapToTexture(ctx, pixmap); |
-} |
+GrTexture* GrUploadBitmapToTexture(GrContext* ctx, const SkBitmap& bmp) { |
+ SkASSERT(!bmp.getTexture()); |
-GrTexture* GrUploadPixmapToTexture(GrContext* ctx, const SkPixmap& pixmap) { |
- const SkPixmap* pmap = &pixmap; |
- SkPixmap tmpPixmap; |
SkBitmap tmpBitmap; |
+ const SkBitmap* bitmap = &bmp; |
- GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(pixmap.info()); |
+ GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(bitmap->info()); |
const GrCaps* caps = ctx->caps(); |
- if (kIndex_8_SkColorType == pixmap.colorType()) { |
+ if (kIndex_8_SkColorType == bitmap->colorType()) { |
if (caps->isConfigTexturable(kIndex_8_GrPixelConfig)) { |
size_t imageSize = GrCompressedFormatDataSize(kIndex_8_GrPixelConfig, |
- pixmap.width(), pixmap.height()); |
+ bitmap->width(), bitmap->height()); |
SkAutoMalloc storage(imageSize); |
- build_index8_data(storage.get(), pixmap); |
+ build_index8_data(storage.get(), bmp); |
// our compressed data will be trimmed, so pass width() for its |
// "rowBytes", since they are the same now. |
return ctx->textureProvider()->createTexture(desc, SkBudgeted::kYes, storage.get(), |
- pixmap.width()); |
+ bitmap->width()); |
} else { |
- SkImageInfo info = SkImageInfo::MakeN32Premul(pixmap.width(), pixmap.height()); |
- tmpBitmap.allocPixels(info); |
- if (!pixmap.readPixels(info, tmpBitmap.getPixels(), tmpBitmap.rowBytes())) { |
- return nullptr; |
- } |
- if (!tmpBitmap.peekPixels(&tmpPixmap)) { |
- return nullptr; |
- } |
- pmap = &tmpPixmap; |
- // must rebuild desc, since we've forced the info to be N32 |
- desc = GrImageInfoToSurfaceDesc(pmap->info()); |
+ bmp.copyTo(&tmpBitmap, kN32_SkColorType); |
+ // now bitmap points to our temp, which has been promoted to 32bits |
+ bitmap = &tmpBitmap; |
+ desc.fConfig = SkImageInfo2GrPixelConfig(bitmap->info()); |
+ } |
+ } else if (!bitmap->readyToDraw()) { |
+ // If the bitmap had compressed data and was then uncompressed, it'll still return |
+ // compressed data on 'refEncodedData' and upload it. Probably not good, since if |
+ // the bitmap has available pixels, then they might not be what the decompressed |
+ // data is. |
+ |
+ // Really?? We aren't doing this with YUV. |
+ |
+ GrTexture *texture = load_etc1_texture(ctx, *bitmap, desc); |
+ if (texture) { |
+ return texture; |
} |
} |
- return ctx->textureProvider()->createTexture(desc, SkBudgeted::kYes, pmap->addr(), |
- pmap->rowBytes()); |
+ GrTexture *texture = create_texture_from_yuv(ctx, *bitmap, desc); |
+ if (texture) { |
+ return texture; |
+ } |
+ |
+ SkAutoLockPixels alp(*bitmap); |
+ if (!bitmap->readyToDraw()) { |
+ return nullptr; |
+ } |
+ |
+ return ctx->textureProvider()->createTexture(desc, SkBudgeted::kYes, bitmap->getPixels(), |
+ bitmap->rowBytes()); |
} |