diff options
author | 2014-06-10 17:25:28 -0700 | |
---|---|---|
committer | 2014-06-10 17:25:28 -0700 | |
commit | 5c2fca040ec74617644554a46c39ab038afe2f1b (patch) | |
tree | d3146c27cdec69454a86fd36deab7172a01292b9 | |
parent | 5a220a1f479f02676bc1a92fea0b2cc2556ec4f9 (diff) |
Add an LATC compressor to the A8 masks, and hide it behind an ifdef.
R=robertphillips@google.com
Author: krajcevski@google.com
Review URL: https://codereview.chromium.org/326223002
-rw-r--r-- | gyp/gpu.gyp | 3 | ||||
-rw-r--r-- | src/gpu/GrSWMaskHelper.cpp | 32 | ||||
-rw-r--r-- | src/gpu/GrSWMaskHelper.h | 2 |
3 files changed, 35 insertions, 2 deletions
diff --git a/gyp/gpu.gyp b/gyp/gpu.gyp index f61a5159c1..6fbd05aefc 100644 --- a/gyp/gpu.gyp +++ b/gyp/gpu.gyp @@ -74,6 +74,9 @@ '../include/gpu', ], }, + 'defines': [ + 'GR_COMPRESS_ALPHA_MASK=0', + ], }, 'targets': [ { diff --git a/src/gpu/GrSWMaskHelper.cpp b/src/gpu/GrSWMaskHelper.cpp index 504f5a0a35..697500f329 100644 --- a/src/gpu/GrSWMaskHelper.cpp +++ b/src/gpu/GrSWMaskHelper.cpp @@ -6,16 +6,20 @@ */ #include "GrSWMaskHelper.h" + #include "GrDrawState.h" #include "GrDrawTargetCaps.h" #include "GrGpu.h" +#include "SkData.h" #include "SkStrokeRec.h" +#include "SkTextureCompressor.h" // TODO: try to remove this #include #include "GrContext.h" namespace { + /* * Convert a boolean operation into a transfer mode code */ @@ -127,6 +131,22 @@ bool GrSWMaskHelper::getTexture(GrAutoScratchTexture* texture) { return NULL != texture->texture(); } +GrTexture* GrSWMaskHelper::toLATCTexture(GrContext* ctx) { + // Encode the BM into LATC data: + SkAutoLockPixels alp(fBM); + SkTextureCompressor::Format format = SkTextureCompressor::kLATC_Format; + SkAutoDataUnref latcData(SkTextureCompressor::CompressBitmapToFormat(fBM, format)); + if (NULL == latcData) { + return NULL; + } + + GrTextureDesc desc; + desc.fWidth = fBM.width(); + desc.fHeight = fBM.height(); + desc.fConfig = kLATC_GrPixelConfig; + return ctx->getGpu()->createTexture(desc, latcData->bytes(), 0); +} + /** * Move the result of the software mask generation back to the gpu */ @@ -158,8 +178,6 @@ GrTexture* GrSWMaskHelper::DrawPathMaskToTexture(GrContext* context, const SkIRect& resultBounds, bool antiAlias, SkMatrix* matrix) { - GrAutoScratchTexture ast; - GrSWMaskHelper helper(context); if (!helper.init(resultBounds, matrix)) { @@ -168,6 +186,16 @@ GrTexture* GrSWMaskHelper::DrawPathMaskToTexture(GrContext* context, helper.draw(path, stroke, SkRegion::kReplace_Op, antiAlias, 0xFF); +#if GR_COMPRESS_ALPHA_MASK + // Can we create an LATC texture? + GrTexture *latc = helper.toLATCTexture(context); + if (NULL != latc) { + return latc; + } +#endif + + // Looks like we have to send a full A8 texture. + GrAutoScratchTexture ast; if (!helper.getTexture(&ast)) { return NULL; } diff --git a/src/gpu/GrSWMaskHelper.h b/src/gpu/GrSWMaskHelper.h index 697d6f3a49..894f49c9cd 100644 --- a/src/gpu/GrSWMaskHelper.h +++ b/src/gpu/GrSWMaskHelper.h @@ -65,6 +65,8 @@ public: // Move the mask generation results from the internal bitmap to the gpu. void toTexture(GrTexture* texture); + GrTexture* toLATCTexture(GrContext* ctx); + // Reset the internal bitmap void clear(uint8_t alpha) { fBM.eraseColor(SkColorSetARGB(alpha, alpha, alpha, alpha)); |