Separate out natively-texture image/bmp draws from cached-as-texture image/bmp draws

This makes texture-backed images and bitmaps down a new code path. It adds a pinch point via the texture adjuster that will be used to handle copied necessary for different texture targets. It also fixes bugs in the existing code exhibited by recent updates to the bleed GM. The plan is to move the the sw/generator-backed imgs/bmps on to this code path with future changes.

Review URL: https://codereview.chromium.org/1424313010
diff --git a/src/gpu/GrImageIDTextureAdjuster.cpp b/src/gpu/GrImageIDTextureAdjuster.cpp
new file mode 100644
index 0000000..525223c
--- /dev/null
+++ b/src/gpu/GrImageIDTextureAdjuster.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "GrImageIDTextureAdjuster.h"
+
+#include "SkBitmap.h"
+#include "SkGrPriv.h"
+#include "SkImage_Base.h"
+
+
+GrBitmapTextureAdjuster::GrBitmapTextureAdjuster(const SkBitmap* bmp)
+    : INHERITED(bmp->getTexture(), SkIRect::MakeWH(bmp->width(), bmp->height()))
+    , fBmp(bmp) {}
+
+void GrBitmapTextureAdjuster::makeCopyKey(const CopyParams& params, GrUniqueKey* copyKey) {
+    if (fBmp->isVolatile()) {
+        return;
+    }
+    // The content area must represent the whole bitmap. Texture-backed bitmaps don't support
+    // extractSubset(). Therefore, either the bitmap and the texture are the same size or the
+    // content's dimensions are the bitmap's dimensions which is pinned to the upper left
+    // of the texture.
+    GrUniqueKey baseKey;
+    GrMakeKeyFromImageID(&baseKey, fBmp->getGenerationID(),
+                         SkIRect::MakeWH(fBmp->width(), fBmp->height()));
+    MakeCopyKeyFromOrigKey(baseKey, params, copyKey);
+}
+
+void GrBitmapTextureAdjuster::didCacheCopy(const GrUniqueKey& copyKey) {
+    GrInstallBitmapUniqueKeyInvalidator(copyKey, fBmp->pixelRef());
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+GrImageTextureAdjuster::GrImageTextureAdjuster(const SkImage_Base* img)
+    : INHERITED(img->peekTexture(), SkIRect::MakeWH(img->width(), img->height()))
+    , fImageBase(img) {}
+
+void GrImageTextureAdjuster::makeCopyKey(const CopyParams& params, GrUniqueKey* copyKey) {
+    // By construction this texture adjuster always represents an entire SkImage, so use the
+    // image's width and height for the key's rectangle.
+    GrUniqueKey baseKey;
+    GrMakeKeyFromImageID(&baseKey, fImageBase->uniqueID(),
+                         SkIRect::MakeWH(fImageBase->width(), fImageBase->height()));
+    MakeCopyKeyFromOrigKey(baseKey, params, copyKey);
+}
+
+void GrImageTextureAdjuster::didCacheCopy(const GrUniqueKey& copyKey) {
+    // We don't currently have a mechanism for notifications on Images!
+}