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
diff --git a/gyp/gpu.gyp b/gyp/gpu.gyp
index f61a515..6fbd05a 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 504f5a0..697500f 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 @@
     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 @@
                                                  const SkIRect& resultBounds,
                                                  bool antiAlias,
                                                  SkMatrix* matrix) {
-    GrAutoScratchTexture ast;
-
     GrSWMaskHelper helper(context);
 
     if (!helper.init(resultBounds, matrix)) {
@@ -168,6 +186,16 @@
 
     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 697d6f3..894f49c 100644
--- a/src/gpu/GrSWMaskHelper.h
+++ b/src/gpu/GrSWMaskHelper.h
@@ -65,6 +65,8 @@
     // 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));