mirror of
https://github.com/aseprite/aseprite.git
synced 2024-12-28 15:20:15 +00:00
241 lines
6.9 KiB
C++
241 lines
6.9 KiB
C++
/* ASEPRITE
|
|
* Copyright (C) 2001-2012 David Capello
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef DOCUMENT_H_INCLUDED
|
|
#define DOCUMENT_H_INCLUDED
|
|
|
|
#include "base/disable_copying.h"
|
|
#include "base/shared_ptr.h"
|
|
#include "base/unique_ptr.h"
|
|
#include "document_id.h"
|
|
#include "gfx/transformation.h"
|
|
#include "raster/pixel_format.h"
|
|
|
|
#include <string>
|
|
|
|
class Cel;
|
|
class FormatOptions;
|
|
class Image;
|
|
class Layer;
|
|
class Mask;
|
|
class Mutex;
|
|
class Sprite;
|
|
struct _BoundSeg;
|
|
|
|
namespace undo {
|
|
class ObjectsContainer;
|
|
class UndoHistory;
|
|
}
|
|
|
|
struct PreferredEditorSettings
|
|
{
|
|
int scroll_x;
|
|
int scroll_y;
|
|
int zoom;
|
|
bool virgin;
|
|
};
|
|
|
|
enum DuplicateType
|
|
{
|
|
DuplicateExactCopy,
|
|
DuplicateWithFlattenLayers,
|
|
};
|
|
|
|
// An application document. It is the class used to contain one file
|
|
// opened and being edited by the user (a sprite).
|
|
class Document
|
|
{
|
|
public:
|
|
|
|
enum LockType {
|
|
ReadLock,
|
|
WriteLock
|
|
};
|
|
|
|
// Creates a document with one sprite, with one transparent layer,
|
|
// and one frame.
|
|
static Document* createBasicDocument(PixelFormat format, int width, int height, int ncolors);
|
|
|
|
Document(Sprite* sprite);
|
|
~Document();
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Main properties
|
|
|
|
DocumentId getId() const { return m_id; }
|
|
void setId(DocumentId id) { m_id = id; }
|
|
|
|
const Sprite* getSprite() const { return m_sprite; }
|
|
const undo::UndoHistory* getUndoHistory() const { return m_undoHistory; }
|
|
|
|
Sprite* getSprite() { return m_sprite; }
|
|
undo::UndoHistory* getUndoHistory() { return m_undoHistory; }
|
|
|
|
void addSprite(Sprite* sprite);
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// File related properties
|
|
|
|
const char* getFilename() const;
|
|
void setFilename(const char* filename);
|
|
|
|
bool isModified() const;
|
|
bool isAssociatedToFile() const;
|
|
void markAsSaved();
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Loaded options from file
|
|
|
|
void setFormatOptions(const SharedPtr<FormatOptions>& format_options);
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Preferred editor settings
|
|
|
|
PreferredEditorSettings getPreferredEditorSettings() const;
|
|
void setPreferredEditorSettings(const PreferredEditorSettings& settings);
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Boundaries
|
|
|
|
int getBoundariesSegmentsCount() const;
|
|
const _BoundSeg* getBoundariesSegments() const;
|
|
|
|
void generateMaskBoundaries(Mask* mask = NULL);
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Extra Cel (it is used to draw pen preview, pixels in movement, etc.)
|
|
|
|
void prepareExtraCel(int x, int y, int w, int h, int opacity);
|
|
void destroyExtraCel();
|
|
Cel* getExtraCel() const;
|
|
Image* getExtraCelImage() const;
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Mask
|
|
|
|
// Returns the current mask, it can be empty. The mask could be not
|
|
// empty but hidden to the user if the setMaskVisible(false) was
|
|
// used called before.
|
|
Mask* getMask() const;
|
|
|
|
// Sets the current mask. The new mask will be visible by default,
|
|
// so you don't need to call setMaskVisible(true).
|
|
void setMask(const Mask* mask);
|
|
|
|
// Returns true only when the mask is not empty, and was not yet
|
|
// hidden using setMaskVisible (e.g. when the user "deselect the
|
|
// mask").
|
|
bool isMaskVisible() const;
|
|
|
|
// Changes the visibility state of the mask (it is useful only if
|
|
// the getMask() is not empty and the user can see that the mask is
|
|
// being hidden and shown to him).
|
|
void setMaskVisible(bool visible);
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Transformation
|
|
|
|
gfx::Transformation getTransformation() const;
|
|
void setTransformation(const gfx::Transformation& transform);
|
|
void resetTransformation();
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Copying
|
|
|
|
void copyLayerContent(const Layer* sourceLayer, Document* destDoc, Layer* destLayer) const;
|
|
Document* duplicate(DuplicateType type) const;
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Multi-threading ("sprite wrappers" use this)
|
|
|
|
// Locks the sprite to read or write on it, returning true if the
|
|
// sprite can be accessed in the desired mode.
|
|
bool lock(LockType lockType);
|
|
|
|
// If you've locked the sprite to read, using this method you can
|
|
// raise your access level to write it.
|
|
bool lockToWrite();
|
|
|
|
// If you've locked the sprite to write, using this method you can
|
|
// your access level to only read it.
|
|
void unlockToRead();
|
|
|
|
void unlock();
|
|
|
|
private:
|
|
// Unique identifier for this document (it is assigned by Documents class).
|
|
DocumentId m_id;
|
|
|
|
// The main sprite.
|
|
UniquePtr<Sprite> m_sprite;
|
|
|
|
// Collection of objects used by UndoHistory to reference deleted
|
|
// objects that are re-created by an Undoer. The container keeps an
|
|
// ID that is saved in the serialization process, and loaded in the
|
|
// deserialization process. The ID can be used by different undoers
|
|
// to keep references to deleted objects.
|
|
UniquePtr<undo::ObjectsContainer> m_objects;
|
|
|
|
// Stack of undoers to undo operations.
|
|
UniquePtr<undo::UndoHistory> m_undoHistory;
|
|
|
|
// Document's file name (from where it was loaded, where it is saved).
|
|
std::string m_filename;
|
|
|
|
// True if this sprite is associated to a file in the file-system.
|
|
bool m_associated_to_file;
|
|
|
|
// Selected mask region boundaries
|
|
struct {
|
|
int nseg;
|
|
_BoundSeg* seg;
|
|
} m_bound;
|
|
|
|
// Mutex to modify the 'locked' flag.
|
|
Mutex* m_mutex;
|
|
|
|
// True if some thread is writing the sprite.
|
|
bool m_write_lock;
|
|
|
|
// Greater than zero when one or more threads are reading the sprite.
|
|
int m_read_locks;
|
|
|
|
// Data to save the file in the same format that it was loaded
|
|
SharedPtr<FormatOptions> m_format_options;
|
|
|
|
// Preferred options in the editor.
|
|
PreferredEditorSettings m_preferred;
|
|
|
|
// Extra cel used to draw extra stuff (e.g. editor's pen preview, pixels in movement, etc.)
|
|
Cel* m_extraCel;
|
|
|
|
// Image of the extra cel.
|
|
Image* m_extraImage;
|
|
|
|
// Current mask.
|
|
UniquePtr<Mask> m_mask;
|
|
bool m_maskVisible;
|
|
|
|
// Current transformation.
|
|
gfx::Transformation m_transformation;
|
|
|
|
DISABLE_COPYING(Document);
|
|
};
|
|
|
|
#endif
|