[skottie] Pass asset IDs to ResourceProvider::loadImageAsset

Also use explicit IDs as keys for the image asset cache.

Change-Id: I359ff026063318ace524d1205b4f0b3e7a6e1d5d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/227783
Commit-Queue: Florin Malita <fmalita@google.com>
Reviewed-by: Isabel Ren <isabelren@google.com>
diff --git a/modules/canvaskit/skottie_bindings.cpp b/modules/canvaskit/skottie_bindings.cpp
index abdaf43..bfce156 100644
--- a/modules/canvaskit/skottie_bindings.cpp
+++ b/modules/canvaskit/skottie_bindings.cpp
@@ -48,8 +48,9 @@
     }
 
     sk_sp<skottie::ImageAsset> loadImageAsset(const char[] /* path */,
-                                              const char name[]) const override {
-        // For CK/Skottie we ignore paths and identify images based solely on name.
+                                              const char name[],
+                                              const char[] /* id */) const override {
+        // For CK/Skottie we ignore paths & IDs, and identify images based solely on name.
         if (auto data = this->findAsset(name)) {
             return skottie_utils::MultiFrameImageAsset::Make(std::move(data), true /* predecode */);
         }
diff --git a/modules/skottie/gm/SkottieGM.cpp b/modules/skottie/gm/SkottieGM.cpp
index 627f367..f95ee1c 100644
--- a/modules/skottie/gm/SkottieGM.cpp
+++ b/modules/skottie/gm/SkottieGM.cpp
@@ -210,7 +210,7 @@
 private:
     class MultiFrameResourceProvider final : public skottie::ResourceProvider {
     public:
-        sk_sp<ImageAsset> loadImageAsset(const char[], const char[]) const override {
+        sk_sp<ImageAsset> loadImageAsset(const char[], const char[], const char[]) const override {
             return skottie_utils::MultiFrameImageAsset::Make(
                         GetResourceAsData("images/flightAnim.gif"));
         }
diff --git a/modules/skottie/include/Skottie.h b/modules/skottie/include/Skottie.h
index 538e5f3..689b2e0 100644
--- a/modules/skottie/include/Skottie.h
+++ b/modules/skottie/include/Skottie.h
@@ -72,6 +72,11 @@
      * ImageAsset proxy.
      */
     virtual sk_sp<ImageAsset> loadImageAsset(const char resource_path[],
+                                             const char resource_name[],
+                                             const char resource_id[]) const;
+
+    // DEPRECATED - to be removed
+    virtual sk_sp<ImageAsset> loadImageAsset(const char resource_path[],
                                              const char resource_name[]) const;
 
     /**
diff --git a/modules/skottie/src/Skottie.cpp b/modules/skottie/src/Skottie.cpp
index 3f958e8..208e1da 100644
--- a/modules/skottie/src/Skottie.cpp
+++ b/modules/skottie/src/Skottie.cpp
@@ -398,6 +398,12 @@
     return nullptr;
 }
 
+sk_sp<ImageAsset> ResourceProvider::loadImageAsset(const char path[], const char name[],
+                                                   const char id[]) const {
+    // temporary redirect for legacy clients.
+    return this->loadImageAsset(path, name);
+}
+
 sk_sp<ImageAsset> ResourceProvider::loadImageAsset(const char path[], const char name[]) const {
     return nullptr;
 }
diff --git a/modules/skottie/src/layers/ImageLayer.cpp b/modules/skottie/src/layers/ImageLayer.cpp
index 0b6df2d..32f8ed4 100644
--- a/modules/skottie/src/layers/ImageLayer.cpp
+++ b/modules/skottie/src/layers/ImageLayer.cpp
@@ -21,21 +21,20 @@
 AnimationBuilder::loadImageAsset(const skjson::ObjectValue& jimage) const {
     const skjson::StringValue* name = jimage["p"];
     const skjson::StringValue* path = jimage["u"];
-    if (!name) {
+    const skjson::StringValue* id   = jimage["id"];
+    if (!name || !path || !id) {
         return nullptr;
     }
 
-    const auto name_cstr = name->begin(),
-               path_cstr = path ? path->begin() : "";
-    const auto res_id = SkStringPrintf("%s|%s", path_cstr, name_cstr);
+    const SkString res_id(id->begin());
     if (auto* cached_info = fImageAssetCache.find(res_id)) {
         return cached_info;
     }
 
-    auto asset = fResourceProvider->loadImageAsset(path_cstr, name_cstr);
+    auto asset = fResourceProvider->loadImageAsset(path->begin(), name->begin(), id->begin());
     if (!asset) {
-        this->log(Logger::Level::kError, nullptr,
-                  "Could not load image asset: %s/%s.", path_cstr, name_cstr);
+        this->log(Logger::Level::kError, nullptr, "Could not load image asset: %s/%s (id: '%s').",
+                  path->begin(), name->begin(), id->begin());
         return nullptr;
     }
 
diff --git a/modules/skottie/utils/SkottieUtils.cpp b/modules/skottie/utils/SkottieUtils.cpp
index 191d834..980d84f 100644
--- a/modules/skottie/utils/SkottieUtils.cpp
+++ b/modules/skottie/utils/SkottieUtils.cpp
@@ -93,7 +93,8 @@
 }
 
 sk_sp<skottie::ImageAsset> FileResourceProvider::loadImageAsset(const char resource_path[],
-                                                                const char resource_name[]) const {
+                                                                const char resource_name[],
+                                                                const char[]) const {
     return MultiFrameImageAsset::Make(this->load(resource_path, resource_name));
 }
 
diff --git a/modules/skottie/utils/SkottieUtils.h b/modules/skottie/utils/SkottieUtils.h
index 0783888..7d26d1e 100644
--- a/modules/skottie/utils/SkottieUtils.h
+++ b/modules/skottie/utils/SkottieUtils.h
@@ -55,7 +55,8 @@
 
     sk_sp<SkData> load(const char resource_path[], const char resource_name[]) const override;
 
-    sk_sp<skottie::ImageAsset> loadImageAsset(const char[], const char []) const override;
+    sk_sp<skottie::ImageAsset> loadImageAsset(const char[], const char[],
+                                              const char[]) const override;
 
 private:
     explicit FileResourceProvider(SkString);