[aseprite] 44/51: Add forward compatibility in .ase decoder for layer groups

Tobias Hansen thansen at moszumanska.debian.org
Mon Jul 11 21:35:19 UTC 2016


This is an automated email from the git hooks/post-receive script.

thansen pushed a commit to branch master
in repository aseprite.

commit d91ca36eddc602493d87e4097685002ee965c081
Author: David Capello <davidcapello at gmail.com>
Date:   Tue Jul 5 18:17:16 2016 -0300

    Add forward compatibility in .ase decoder for layer groups
    
    As v1.2 can save .ase files with groups, we have added support to make
    flat the file and move all layers to the top level, removing all
    groups. (Just in case the user want to go back to v1.1 after using v1.2
    features.)
---
 src/app/file/ase_format.cpp | 80 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 78 insertions(+), 2 deletions(-)

diff --git a/src/app/file/ase_format.cpp b/src/app/file/ase_format.cpp
index 07c992f..aae4464 100644
--- a/src/app/file/ase_format.cpp
+++ b/src/app/file/ase_format.cpp
@@ -1,5 +1,5 @@
 // Aseprite
-// Copyright (C) 2001-2015  David Capello
+// Copyright (C) 2001-2016  David Capello
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License version 2 as
@@ -9,6 +9,7 @@
 #include "config.h"
 #endif
 
+#include "app/context.h"
 #include "app/document.h"
 #include "app/file/file.h"
 #include "app/file/file_format.h"
@@ -16,10 +17,12 @@
 #include "base/cfile.h"
 #include "base/exception.h"
 #include "base/file_handle.h"
+#include "base/path.h"
 #include "doc/doc.h"
+#include "ui/alert.h"
 #include "zlib.h"
 
-#include <stdio.h>
+#include <cstdio>
 
 #define ASE_FILE_MAGIC                      0xA5E0
 #define ASE_FILE_FRAME_MAGIC                0xF1FA
@@ -122,6 +125,8 @@ static void ase_file_read_frame_tags_chunk(FILE* f, FrameTags* frameTags);
 static void ase_file_write_frame_tags_chunk(FILE* f, ASE_FrameHeader* frame_header, const FrameTags* frameTags);
 static void ase_file_read_user_data_chunk(FILE* f, UserData* userData);
 static void ase_file_write_user_data_chunk(FILE* f, ASE_FrameHeader* frame_header, const UserData* userData);
+static bool ase_has_groups(LayerFolder* layer);
+static void ase_ungroup_all(LayerFolder* layer);
 
 class ChunkWriter {
 public:
@@ -159,6 +164,7 @@ class AseFormat : public FileFormat {
   }
 
   bool onLoad(FileOp* fop) override;
+  bool onPostLoad(FileOp* fop) override;
 #ifdef ENABLE_SAVE
   bool onSave(FileOp* fop) override;
 #endif
@@ -327,6 +333,34 @@ bool AseFormat::onLoad(FileOp* fop)
   }
 }
 
+bool AseFormat::onPostLoad(FileOp* fop)
+{
+  LayerFolder* folder = fop->document()->sprite()->folder();
+
+  // Forward Compatibility: In 1.1 we convert a file with layer groups
+  // (saved with 1.2) as top level layers
+  std::string ver = VERSION;
+  bool flat = (ver[0] == '1' &&
+               ver[1] == '.' &&
+               ver[2] == '1');
+  if (flat && ase_has_groups(folder)) {
+    if (fop->context() &&
+        fop->context()->isUIAvailable() &&
+        ui::Alert::show("Warning"
+                        "<<The selected file \"%s\" has layer groups."
+                        "<<Do you want to open it with \"%s %s\" anyway?"
+                        "<<"
+                        "<<Note: Layers inside groups will be converted to top level layers."
+                        "||&Yes||&No",
+                        base::get_file_name(fop->filename()).c_str(),
+                        PACKAGE, ver.c_str()) != 1) {
+      return false;
+    }
+    ase_ungroup_all(folder);
+  }
+  return true;
+}
+
 #ifdef ENABLE_SAVE
 
 bool AseFormat::onSave(FileOp* fop)
@@ -1497,4 +1531,46 @@ static void ase_file_write_user_data_chunk(FILE* f, ASE_FrameHeader* frame_heade
   }
 }
 
+static bool ase_has_groups(LayerFolder* folder)
+{
+  for (Layer* child : folder->getLayersList()) {
+    if (child->isFolder())
+      return true;
+  }
+  return false;
+}
+
+static void ase_ungroup_all(LayerFolder* folder)
+{
+  LayerFolder* root = folder->sprite()->folder();
+  LayerList list = folder->getLayersList();
+
+  for (Layer* child : list) {
+    if (child->isFolder()) {
+      ase_ungroup_all(static_cast<LayerFolder*>(child));
+      folder->removeLayer(child);
+    }
+    else if (folder != root) {
+      // Create a new name adding all group layer names
+      {
+        std::string name;
+        for (Layer* layer=child; layer!=root; layer=layer->parent()) {
+          if (!name.empty())
+            name.insert(0, "-");
+          name.insert(0, layer->name());
+        }
+        child->setName(name);
+      }
+
+      folder->removeLayer(child);
+      root->addLayer(child);
+    }
+  }
+
+  if (folder != root) {
+    ASSERT(folder->getLayersCount() == 0);
+    delete folder;
+  }
+}
+
 } // namespace app

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git



More information about the Pkg-games-commits mailing list