[canvaskit] Add createPattern support to canvasAPI

Add Changelog to start tracking API changes (in preparation
for NPM)

Simplify globalAlpha passing.

API change:
 - Make ImageShader take an SkImage instead of encoded bytes.

Bug: skia:
Change-Id: I716f001b54ed58da3f40ae4e060b7098b550af9f
Reviewed-on: https://skia-review.googlesource.com/c/175260
Reviewed-by: Florin Malita <fmalita@chromium.org>
diff --git a/experimental/canvaskit/canvaskit_bindings.cpp b/experimental/canvaskit/canvaskit_bindings.cpp
index abd9260..52932e9 100644
--- a/experimental/canvaskit/canvaskit_bindings.cpp
+++ b/experimental/canvaskit/canvaskit_bindings.cpp
@@ -489,21 +489,19 @@
 
         return SkImage::MakeRasterData(info, pixelData, rowBytes);
     }), allow_raw_pointers());
-    function("_MakeImageShader", optional_override([](uintptr_t /* uint8_t*  */ iPtr, int ilen,
-                                SkShader::TileMode tx, SkShader::TileMode ty)->sk_sp<SkShader> {
-        // See comment above for uintptr_t explanation
-        const uint8_t* imgBytes = reinterpret_cast<const uint8_t*>(iPtr);
-
-        auto imgData = SkData::MakeFromMalloc(imgBytes, ilen);
-        auto img = SkImage::MakeFromEncoded(imgData);
-        if (!img) {
-            SkDebugf("Could not decode image\n");
-            return nullptr;
-        }
-
-        return SkImageShader::Make(img, tx, ty, nullptr);
+    // Allow localMatrix to be optional, so we have 2 declarations of these shaders
+    function("_MakeImageShader", optional_override([](sk_sp<SkImage> img,
+                                SkShader::TileMode tx, SkShader::TileMode ty,
+                                bool clampAsIfUnpremul)->sk_sp<SkShader> {
+        return SkImageShader::Make(img, tx, ty, nullptr, clampAsIfUnpremul);
     }), allow_raw_pointers());
-    // Allow localMatrix to be optional, so we have 2 declarations of these gradients
+    function("_MakeImageShader", optional_override([](sk_sp<SkImage> img,
+                                SkShader::TileMode tx, SkShader::TileMode ty,
+                                bool clampAsIfUnpremul, const SimpleMatrix& lm)->sk_sp<SkShader> {
+        SkMatrix localMatrix = toSkMatrix(lm);
+
+        return SkImageShader::Make(img, tx, ty, &localMatrix, clampAsIfUnpremul);
+    }), allow_raw_pointers());
     function("_MakeLinearGradientShader", optional_override([](SkPoint start, SkPoint end,
                                 uintptr_t /* SkColor*  */ cPtr, uintptr_t /* SkScalar*  */ pPtr,
                                 int count, SkShader::TileMode mode, uint32_t flags)->sk_sp<SkShader> {
@@ -901,7 +899,9 @@
     enum_<SkShader::TileMode>("TileMode")
         .value("Clamp",    SkShader::TileMode::kClamp_TileMode)
         .value("Repeat",   SkShader::TileMode::kRepeat_TileMode)
-        .value("Mirror",   SkShader::TileMode::kMirror_TileMode);
+        .value("Mirror",   SkShader::TileMode::kMirror_TileMode)
+        // Decal mode only works in the SW backend, not WebGl (yet).
+        .value("Decal",    SkShader::TileMode::kDecal_TileMode);
 
     enum_<SkVertices::VertexMode>("VertexMode")
         .value("Triangles",       SkVertices::VertexMode::kTriangles_VertexMode)