Revert "remove kA1_Config, as it is no longer supported"

This reverts commit 2d72d8b242eac6e9d30228f5b0a407236491c369.

git-svn-id: http://skia.googlecode.com/svn/trunk@12387 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
index 38594f8..2fae75a 100644
--- a/src/core/SkBitmap.cpp
+++ b/src/core/SkBitmap.cpp
@@ -161,6 +161,7 @@
     int bpp;
     switch (config) {
         case kNo_Config:
+        case kA1_Config:
             bpp = 0;   // not applicable
             break;
         case kA8_Config:
@@ -193,6 +194,11 @@
     switch (c) {
         case kNo_Config:
             break;
+        case kA1_Config:
+            rowBytes.set(width);
+            rowBytes.add(7);
+            rowBytes.shiftRight(3);
+            break;
         case kA8_Config:
         case kIndex8_Config:
             rowBytes.set(width);
@@ -269,6 +275,7 @@
         case SkBitmap::kNo_Config:
             alphaType = kIgnore_SkAlphaType;
             break;
+        case SkBitmap::kA1_Config:
         case SkBitmap::kA8_Config:
             if (kUnpremul_SkAlphaType == alphaType) {
                 alphaType = kPremul_SkAlphaType;
@@ -284,8 +291,6 @@
         case SkBitmap::kRGB_565_Config:
             alphaType = kOpaque_SkAlphaType;
             break;
-        default:
-            return false;
     }
     if (canonical) {
         *canonical = alphaType;
@@ -601,6 +606,8 @@
             case SkBitmap::kIndex8_Config:
                 base += x;
                 break;
+            case SkBitmap::kA1_Config:
+                base += x >> 3;
                 break;
             default:
                 SkDEBUGFAIL("Can't return addr for config");
@@ -616,6 +623,15 @@
     SkASSERT((unsigned)y < (unsigned)this->height());
 
     switch (this->config()) {
+        case SkBitmap::kA1_Config: {
+            uint8_t* addr = this->getAddr1(x, y);
+            uint8_t mask = 1 << (7  - (x % 8));
+            if (addr[0] & mask) {
+                return SK_ColorBLACK;
+            } else {
+                return 0;
+            }
+        }
         case SkBitmap::kA8_Config: {
             uint8_t* addr = this->getAddr8(x, y);
             return SkColorSetA(0, addr[0]);
@@ -638,7 +654,6 @@
             return SkUnPreMultiply::PMColorToColor(addr[0]);
         }
         case kNo_Config:
-        default:
             SkASSERT(false);
             return 0;
     }
@@ -656,6 +671,9 @@
     const int width = bm.width();
 
     switch (bm.config()) {
+        case SkBitmap::kA1_Config: {
+            // TODO
+        } break;
         case SkBitmap::kA8_Config: {
             unsigned a = 0xFF;
             for (int y = 0; y < height; ++y) {
@@ -761,6 +779,38 @@
     }
 
     switch (fConfig) {
+        case kA1_Config: {
+            uint8_t* p = this->getAddr1(area.fLeft, area.fTop);
+            const int left = area.fLeft >> 3;
+            const int right = area.fRight >> 3;
+
+            int middle = right - left - 1;
+
+            uint8_t leftMask = 0xFF >> (area.fLeft & 7);
+            uint8_t rightMask = ~(0xFF >> (area.fRight & 7));
+            if (left == right) {
+                leftMask &= rightMask;
+                rightMask = 0;
+            }
+
+            a = (a >> 7) ? 0xFF : 0;
+            while (--height >= 0) {
+                uint8_t* startP = p;
+
+                *p = (*p & ~leftMask) | (a & leftMask);
+                p++;
+                if (middle > 0) {
+                    memset(p, a, middle);
+                    p += middle;
+                }
+                if (rightMask) {
+                    *p = (*p & ~rightMask) | (a & rightMask);
+                }
+
+                p = startP + rowBytes;
+            }
+            break;
+        }
         case kA8_Config: {
             uint8_t* p = this->getAddr8(area.fLeft, area.fTop);
             while (--height >= 0) {
@@ -846,6 +896,7 @@
             break;
 
         case SkBitmap::kNo_Config:
+        case SkBitmap::kA1_Config:
         default:
             return SUB_OFFSET_FAILURE;
     }
@@ -888,6 +939,8 @@
 
         case SkBitmap::kNo_Config:
             // Fall through.
+        case SkBitmap::kA1_Config:
+            // Fall through.
         default:
             return false;
     }
@@ -968,6 +1021,7 @@
         case kRGB_565_Config:
         case kARGB_8888_Config:
             break;
+        case kA1_Config:
         case kIndex8_Config:
             if (!sameConfigs) {
                 return false;
@@ -978,6 +1032,12 @@
         default:
             return false;
     }
+
+    // do not copy src if srcConfig == kA1_Config while dstConfig != kA1_Config
+    if (this->config() == kA1_Config && !sameConfigs) {
+        return false;
+    }
+
     return true;
 }
 
@@ -1621,7 +1681,7 @@
 void SkBitmap::toString(SkString* str) const {
 
     static const char* gConfigNames[kConfigCount] = {
-        "NONE", "A8", "INDEX8", "565", "4444", "8888"
+        "NONE", "A1", "A8", "INDEX8", "565", "4444", "8888"
     };
 
     str->appendf("bitmap: ((%d, %d) %s", this->width(), this->height(),