Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Unified Diff: src/gpu/SkGr.cpp

Issue 1495693003: Index8 GPU and CPU raster support. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: revert SkImageGenerator&SkImageCacherator changes. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkBitmapDevice.cpp ('k') | src/gpu/effects/GrIndex8toRGBEffect.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/SkGr.cpp
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 540edb6a38e728c6a5e1f018a2dc3840fda965a8..0cbf4a80acbd9b1c1069db1fd3d55013a7a0d2b7 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -10,6 +10,7 @@
#include "GrCaps.h"
#include "GrContext.h"
+#include "GrDrawContext.h"
#include "GrTextureParamsAdjuster.h"
#include "GrGpuResourcePriv.h"
#include "GrImageIDTextureAdjuster.h"
@@ -33,6 +34,7 @@
#include "effects/GrPorterDuffXferProcessor.h"
#include "effects/GrXfermodeFragmentProcessor.h"
#include "effects/GrYUVtoRGBEffect.h"
+#include "effects/GrIndex8toRGBEffect.h"
#ifndef SK_IGNORE_ETC1_SUPPORT
# include "ktx.h"
@@ -215,6 +217,79 @@ static GrTexture* load_etc1_texture(GrContext* ctx, const SkBitmap &bm, GrSurfac
return ctx->textureProvider()->createTexture(desc, true, startOfTexData, 0);
}
+static GrTexture* create_texture_from_index8(GrContext* ctx, const SkBitmap& bm,
+ const GrSurfaceDesc& desc) {
+ SkAutoLockPixels alp(bm);
+ if (!bm.readyToDraw()) {
+ return nullptr;
+ }
+
+ GrSurfaceDesc indicesDesc = desc;
+ indicesDesc.fConfig = kAlpha_8_GrPixelConfig;
+ SkAutoTUnref<GrTexture> tex(ctx->textureProvider()->
+ createTexture(indicesDesc, true, bm.getPixels(), bm.rowBytes()));
+
+ SkAutoTUnref<GrTexture> colorTableTexture;
+ const SkImageInfo info = SkImageInfo::Make(256, 1, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
+ GrSurfaceDesc colorTableDesc = GrImageInfoToSurfaceDesc(info);
+ SkColorTable* ctable = bm.getColorTable();
+ const int count = ctable->count();
+ if (count != 256 || kN32_SkColorType != kRGBA_8888_SkColorType) {
+ // Allocate 256 color array for palette and fill it with converted N32->RGBA colors.
+ SkPMColor fullTable[256] = { 0 };
+ SkDstPixelInfo dstPI;
+ dstPI.fColorType = kRGBA_8888_SkColorType;
+ dstPI.fAlphaType = kPremul_SkAlphaType;
+ dstPI.fPixels = fullTable;
+ dstPI.fRowBytes = count * sizeof(SkPMColor);
+
+ SkSrcPixelInfo srcPI;
+ srcPI.fColorType = kN32_SkColorType;
+ srcPI.fAlphaType = kPremul_SkAlphaType;
+ srcPI.fPixels = ctable->readColors();
+ srcPI.fRowBytes = count * sizeof(SkPMColor);
+
+ srcPI.convertPixelsTo(&dstPI, count, 1);
+
+ colorTableTexture.reset(ctx->textureProvider()->
+ createTexture(colorTableDesc, true, fullTable, sizeof(SkPMColor) * 256));
+ } else {
+ colorTableTexture.reset(ctx->textureProvider()->
+ createTexture(colorTableDesc, true, ctable->readColors(), sizeof(SkPMColor) * 256));
+ }
+
+
+ GrSurfaceDesc rDesc = desc;
+ rDesc.fFlags = rDesc.fFlags | kRenderTarget_GrSurfaceFlag;
+ rDesc.fConfig = kRGBA_8888_GrPixelConfig;
+
+ SkAutoTUnref<GrTexture> result(ctx->textureProvider()->createTexture(rDesc, true, nullptr, 0));
+ if (!result) {
+ return nullptr;
+ }
+
+ GrRenderTarget* renderTarget = result->asRenderTarget();
+ SkASSERT(renderTarget);
+
+ GrPaint paint;
+ SkMatrix textureMatrix;
+ textureMatrix.setTranslate(0, 0);
+ textureMatrix.postIDiv(bm.width(), bm.height());
+ SkAutoTUnref<GrFragmentProcessor> index8ToRgbProcessor(
+ GrIndex8toRGBEffect::Create(tex, colorTableTexture, textureMatrix));
+ paint.addColorFragmentProcessor(index8ToRgbProcessor);
+ const SkRect r = SkRect::MakeIWH(desc.fWidth, desc.fHeight);
+
+ SkAutoTUnref<GrDrawContext> drawContext(ctx->drawContext(renderTarget));
+ if (!drawContext) {
+ return nullptr;
+ }
+
+ drawContext->drawRect(GrClip::WideOpen(), paint, SkMatrix::I(), r);
+
+ return result.detach();
+}
+
GrTexture* GrUploadBitmapToTexture(GrContext* ctx, const SkBitmap& bmp) {
SkASSERT(!bmp.getTexture());
@@ -236,6 +311,8 @@ GrTexture* GrUploadBitmapToTexture(GrContext* ctx, const SkBitmap& bmp) {
return ctx->textureProvider()->createTexture(desc, true, storage.get(),
bitmap->width());
} else {
+ if (GrTexture* tex = create_texture_from_index8(ctx, bmp, desc))
+ return tex;
bmp.copyTo(&tmpBitmap, kN32_SkColorType);
// now bitmap points to our temp, which has been promoted to 32bits
bitmap = &tmpBitmap;
« no previous file with comments | « src/core/SkBitmapDevice.cpp ('k') | src/gpu/effects/GrIndex8toRGBEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698