Support drag-n-drop image in viewer
diff --git a/skia/viewer/src/main.cpp b/skia/viewer/src/main.cpp
index 204e539..7901254 100644
--- a/skia/viewer/src/main.cpp
+++ b/skia/viewer/src/main.cpp
@@ -40,12 +40,19 @@
std::unique_ptr<rive::File> currentFile;
std::unique_ptr<rive::ArtboardInstance> artboardInstance;
std::unique_ptr<rive::Scene> currentScene;
+int animationIndex = 0;
+int stateMachineIndex = -1;
+
+sk_sp<SkImage> gImage;
static void delete_file() {
+ stateMachineIndex = -1;
+ animationIndex = -1;
currentScene = nullptr;
artboardInstance = nullptr;
currentFile = nullptr;
+ // this is just fun, to see our memory usage... not required
rive::RenderCounter::globalCounter().dump("After deleting file");
}
@@ -84,8 +91,6 @@
// it.
std::vector<uint8_t> fileBytes;
-int animationIndex = 0;
-int stateMachineIndex = -1;
static void loadNames(const rive::Artboard* ab) {
animationNames.clear();
@@ -104,16 +109,20 @@
assert(fileBytes.size() != 0);
auto file = rive::File::import(rive::toSpan(fileBytes), &skiaFactory);
if (!file) {
- fileBytes.clear();
fprintf(stderr, "failed to import file\n");
+
+ auto data = SkData::MakeWithCopy(fileBytes.data(), fileBytes.size());
+ gImage = SkImage::MakeFromEncoded(data);
+ if (gImage) {
+ fprintf(stderr, "interpreted as image\n");
+ delete_file();
+ }
+
+ fileBytes.clear();
return;
}
- stateMachineIndex = -1;
- animationIndex = -1;
- currentScene = nullptr;
- artboardInstance = nullptr;
-
+ delete_file();
currentFile = std::move(file);
artboardInstance = currentFile->artboardDefault();
artboardInstance->advance(0.0f);
@@ -144,8 +153,6 @@
}
void initAnimation(int index) {
- animationIndex = index;
- stateMachineIndex = -1;
assert(fileBytes.size() != 0);
auto file = rive::File::import(rive::toSpan(fileBytes), &skiaFactory);
if (!file) {
@@ -153,8 +160,8 @@
fprintf(stderr, "failed to import file\n");
return;
}
- currentScene = nullptr;
- artboardInstance = nullptr;
+
+ delete_file();
currentFile = std::move(file);
artboardInstance = currentFile->artboardDefault();
@@ -162,6 +169,7 @@
loadNames(artboardInstance.get());
if (index >= 0 && index < artboardInstance->animationCount()) {
+ animationIndex = index;
currentScene = artboardInstance->animationAt(index);
currentScene->inputCount();
}
@@ -333,6 +341,11 @@
currentScene->draw(&renderer);
renderer.restore();
+ } else {
+ // no scene ...
+ if (gImage) {
+ canvas->drawImage(gImage, 0, 0);
+ }
}
context->flush();