| 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());
|
| }
|
|
|
|
|
|
|