Serialize user data for layers and cel data

In this way undo/redo restore user data.
This commit is contained in:
David Capello 2015-12-11 15:11:24 -03:00
parent 9e6e303ccd
commit 8b5d013b03
6 changed files with 72 additions and 5 deletions

View File

@ -55,7 +55,8 @@ add_library(doc-lib
sprite.cpp
sprites.cpp
string_io.cpp
subobjects_io.cpp)
subobjects_io.cpp
user_data_io.cpp)
# TODO Remove 'she' as dependency and move conversion_she.cpp/h files
# to other library/layer (render-lib? new conversion-lib?)

View File

@ -14,6 +14,7 @@
#include "base/unique_ptr.h"
#include "doc/cel_data.h"
#include "doc/subobjects_io.h"
#include "doc/user_data_io.h"
#include <iostream>
@ -29,6 +30,7 @@ void write_celdata(std::ostream& os, const CelData* celdata)
write32(os, (int16_t)celdata->position().y);
write8(os, celdata->opacity());
write32(os, celdata->image()->id());
write_user_data(os, celdata->userData());
}
CelData* read_celdata(std::istream& is, SubObjectsIO* subObjects, bool setId)
@ -38,6 +40,8 @@ CelData* read_celdata(std::istream& is, SubObjectsIO* subObjects, bool setId)
int y = read32(is);
int opacity = read8(is);
ObjectId imageId = read32(is);
UserData userData = read_user_data(is);
ImageRef image(subObjects->getImageRef(imageId));
if (!image)
return nullptr;
@ -45,6 +49,7 @@ CelData* read_celdata(std::istream& is, SubObjectsIO* subObjects, bool setId)
base::UniquePtr<CelData> celdata(new CelData(image));
celdata->setPosition(x, y);
celdata->setOpacity(opacity);
celdata->setUserData(userData);
if (setId)
celdata->setId(id);
return celdata.release();

View File

@ -22,6 +22,7 @@
#include "doc/sprite.h"
#include "doc/string_io.h"
#include "doc/subobjects_io.h"
#include "doc/user_data_io.h"
#include <iostream>
#include <vector>
@ -99,6 +100,8 @@ void write_layer(std::ostream& os, const Layer* layer)
}
}
write_user_data(os, layer->userData());
}
Layer* read_layer(std::istream& is, SubObjectsFromSprite* subObjects)
@ -107,7 +110,6 @@ Layer* read_layer(std::istream& is, SubObjectsFromSprite* subObjects)
std::string name = read_string(is);
uint32_t flags = read32(is); // Flags
uint16_t layer_type = read16(is); // Type
base::UniquePtr<Layer> layer;
switch (static_cast<ObjectType>(layer_type)) {
@ -169,10 +171,13 @@ Layer* read_layer(std::istream& is, SubObjectsFromSprite* subObjects)
}
UserData userData = read_user_data(is);
if (layer) {
layer->setName(name);
layer->setFlags(static_cast<LayerFlags>(flags));
layer->setId(id);
layer->setUserData(userData);
}
return layer.release();

36
src/doc/user_data_io.cpp Normal file
View File

@ -0,0 +1,36 @@
// Aseprite Document Library
// Copyright (c) 2001-2015 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "doc/user_data_io.h"
#include "base/serialization.h"
#include "doc/string_io.h"
#include "doc/user_data.h"
#include <iostream>
namespace doc {
using namespace base::serialization;
using namespace base::serialization::little_endian;
void write_user_data(std::ostream& os, const UserData& userData)
{
write_string(os, userData.text());
}
UserData read_user_data(std::istream& is)
{
UserData userData;
userData.setText(read_string(is));
return userData;
}
}

22
src/doc/user_data_io.h Normal file
View File

@ -0,0 +1,22 @@
// Aseprite Document Library
// Copyright (c) 2001-2015 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
#ifndef DOC_USER_DATA_IO_H_INCLUDED
#define DOC_USER_DATA_IO_H_INCLUDED
#pragma once
#include <iosfwd>
namespace doc {
class UserData;
void write_user_data(std::ostream& os, const UserData& userData);
UserData read_user_data(std::istream& is);
} // namespace doc
#endif

View File

@ -18,9 +18,7 @@ namespace doc {
WithUserData(ObjectType type) : Object(type) {
}
const UserData& userData() const {
return m_userData;
}
const UserData& userData() const { return m_userData; }
void setUserData(const UserData& userData) {
m_userData = userData;