Wrap all GrCustomStage textures in GrTextureAccess, remove StageDesc::fInConfigFlags

Review URL: https://codereview.appspot.com/6494114



git-svn-id: http://skia.googlecode.com/svn/trunk@5485 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrTextureAccess.cpp b/src/gpu/GrTextureAccess.cpp
index 155f682..c3c8038 100644
--- a/src/gpu/GrTextureAccess.cpp
+++ b/src/gpu/GrTextureAccess.cpp
@@ -6,16 +6,62 @@
  */
 
 #include "GrTextureAccess.h"
-#include "SkString.h"
 
-GrTextureAccess::GrTextureAccess(const GrTexture* texture, const SkString& swizzle)
-    : fTexture(texture) {
-    GrAssert(swizzle.size() <= 4);
-    for (unsigned int offset = 0; offset < swizzle.size(); ++offset) {
-        fSwizzle[offset] = swizzle[offset];
-    }
-    if (swizzle.size() < 4) {
-      fSwizzle[swizzle.size()] = 0;
-    }
+#include "GrTexture.h"
+
+GrTextureAccess::GrTextureAccess() {
+#if GR_DEBUG
+    memcpy(fSwizzle, "void", 5);
+    fSwizzleMask = 0xbeeffeed;
+#endif
 }
 
+GrTextureAccess::GrTextureAccess(GrTexture* texture, const char* swizzle) {
+    this->reset(texture, swizzle);
+}
+
+GrTextureAccess::GrTextureAccess(GrTexture* texture) {
+    this->reset(texture);
+}
+
+void GrTextureAccess::reset(GrTexture* texture, const char* swizzle) {
+    GrAssert(NULL != texture);
+    GrAssert(strlen(swizzle) >= 1 && strlen(swizzle) <= 4);
+
+    texture->ref();
+    fTexture.reset(texture);
+
+    fSwizzleMask = 0;
+    fSwizzle[4] = '\0';
+    int i = 0;
+    do {
+        fSwizzle[i] = swizzle[i];
+        switch (swizzle[i]) {
+            case 'r':
+                fSwizzleMask |= kR_SwizzleFlag;
+                break;
+            case 'g':
+                fSwizzleMask |= kG_SwizzleFlag;
+                break;
+            case 'b':
+                fSwizzleMask |= kB_SwizzleFlag;
+                break;
+            case 'a':
+                fSwizzleMask |= kA_SwizzleFlag;
+                break;
+            case '\0':
+                break;
+            default:
+                GrCrash("Unexpected swizzle string character.");
+                break;
+        }
+    } while ('\0' != swizzle[i] && ++i < 4);
+}
+
+void GrTextureAccess::reset(GrTexture* texture) {
+    GrAssert(NULL != texture);
+    texture->ref();
+    fTexture.reset(texture);
+    memcpy(fSwizzle, "rgba", 5);
+    fSwizzleMask = (kRGB_SwizzleMask | kA_SwizzleFlag);
+}