Rewrite GrTextureMaker to disentangle bitmap case from base class and give GPU object a say in what copying needs to be done.

Committed: https://skia.googlesource.com/skia/+/fcffaf22d697f06f903c3193308f9dc54a959f79

Committed: https://skia.googlesource.com/skia/+/1a197ea31e0aac7ea312e9a6c0d9f5df626b0350

Review URL: https://codereview.chromium.org/1409163002
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp
index 96728f3..48fc740 100644
--- a/src/gpu/GrGpu.cpp
+++ b/src/gpu/GrGpu.cpp
@@ -55,6 +55,37 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
+bool GrGpu::makeCopyForTextureParams(int width, int height, const GrTextureParams& textureParams,
+                                     GrTextureParamsAdjuster::CopyParams* copyParams) const {
+    bool doCopy = false;
+    const GrCaps& caps = *this->caps();
+    if (textureParams.isTiled() && !caps.npotTextureTileSupport() &&
+        (!SkIsPow2(width) || !SkIsPow2(height))) {
+        doCopy = true;
+        copyParams->fWidth = GrNextPow2(SkTMax(width, caps.minTextureSize()));
+        copyParams->fHeight = GrNextPow2(SkTMax(height, caps.minTextureSize()));
+    } else if (width < caps.minTextureSize() || height < caps.minTextureSize()) {
+        // The small texture issues appear to be with tiling. Hence it seems ok to scale
+        // them up using the GPU. If issues persist we may need to CPU-stretch.
+        doCopy = true;
+        copyParams->fWidth = SkTMax(width, caps.minTextureSize());
+        copyParams->fHeight = SkTMax(height, caps.minTextureSize());
+    }
+    if (doCopy) {
+        switch (textureParams.filterMode()) {
+            case GrTextureParams::kNone_FilterMode:
+                copyParams->fFilter = GrTextureParams::kNone_FilterMode;
+                break;
+            case GrTextureParams::kBilerp_FilterMode:
+            case GrTextureParams::kMipMap_FilterMode:
+                // We are only ever scaling up so no reason to ever indicate kMipMap.
+                copyParams->fFilter = GrTextureParams::kBilerp_FilterMode;
+                break;
+        }
+    }
+    return doCopy;
+}
+
 static GrSurfaceOrigin resolve_origin(GrSurfaceOrigin origin, bool renderTarget) {
     // By default, GrRenderTargets are GL's normal orientation so that they
     // can be drawn to by the outside world without the client having