mirror of
https://github.com/aseprite/aseprite.git
synced 2024-10-04 13:59:46 +00:00
Refactor Stock class to contains methods instead of stock_*() functions.
This commit is contained in:
parent
2f8d9a0d1a
commit
9e419c418f
@ -101,13 +101,13 @@ void CelPropertiesCommand::onExecute(Context* context)
|
||||
|
||||
/* dimension (and memory size) */
|
||||
memsize =
|
||||
image_line_size(sprite->getStock()->image[cel->image],
|
||||
sprite->getStock()->image[cel->image]->w)*
|
||||
sprite->getStock()->image[cel->image]->h;
|
||||
image_line_size(sprite->getStock()->getImage(cel->image),
|
||||
sprite->getStock()->getImage(cel->image)->w)*
|
||||
sprite->getStock()->getImage(cel->image)->h;
|
||||
|
||||
usprintf(buf, "%dx%d (%s)",
|
||||
sprite->getStock()->image[cel->image]->w,
|
||||
sprite->getStock()->image[cel->image]->h,
|
||||
sprite->getStock()->getImage(cel->image)->w,
|
||||
sprite->getStock()->getImage(cel->image)->h,
|
||||
get_pretty_memory_size(memsize).c_str());
|
||||
|
||||
label_size->setText(buf);
|
||||
|
@ -134,7 +134,7 @@ void FlipCommand::onExecute(Context* context)
|
||||
// for each cel...
|
||||
for (CelIterator it = cels.begin(); it != cels.end(); ++it) {
|
||||
Cel* cel = *it;
|
||||
Image* image = stock_get_image(sprite->getStock(), cel->image);
|
||||
Image* image = sprite->getStock()->getImage(cel->image);
|
||||
|
||||
undoable.setCelPosition(cel,
|
||||
m_flip_horizontal ? sprite->getWidth() - image->w - cel->x: cel->x,
|
||||
|
@ -92,12 +92,12 @@ void MergeDownLayerCommand::onExecute(Context* context)
|
||||
|
||||
/* get images */
|
||||
if (src_cel != NULL)
|
||||
src_image = stock_get_image(sprite->getStock(), src_cel->image);
|
||||
src_image = sprite->getStock()->getImage(src_cel->image);
|
||||
else
|
||||
src_image = NULL;
|
||||
|
||||
if (dst_cel != NULL)
|
||||
dst_image = stock_get_image(sprite->getStock(), dst_cel->image);
|
||||
dst_image = sprite->getStock()->getImage(dst_cel->image);
|
||||
else
|
||||
dst_image = NULL;
|
||||
|
||||
@ -111,7 +111,7 @@ void MergeDownLayerCommand::onExecute(Context* context)
|
||||
dst_image = image_new_copy(src_image);
|
||||
|
||||
/* adding it in the stock of images */
|
||||
index = stock_add_image(sprite->getStock(), dst_image);
|
||||
index = sprite->getStock()->addImage(dst_image);
|
||||
if (sprite->getUndo()->isEnabled())
|
||||
undo_add_image(sprite->getUndo(), sprite->getStock(), index);
|
||||
|
||||
@ -168,7 +168,7 @@ void MergeDownLayerCommand::onExecute(Context* context)
|
||||
|
||||
if (sprite->getUndo()->isEnabled())
|
||||
undo_replace_image(sprite->getUndo(), sprite->getStock(), dst_cel->image);
|
||||
stock_replace_image(sprite->getStock(), dst_cel->image, new_image);
|
||||
sprite->getStock()->replaceImage(dst_cel->image, new_image);
|
||||
|
||||
image_free(dst_image);
|
||||
}
|
||||
|
@ -75,7 +75,7 @@ void NewCelCommand::onExecute(Context* context)
|
||||
image_clear(image, 0);
|
||||
|
||||
/* add the image in the stock */
|
||||
image_index = stock_add_image(current_sprite->stock, image);
|
||||
image_index = current_sprite->stock->addImage(image);
|
||||
|
||||
if (undo_is_enabled(current_sprite->undo)) {
|
||||
current_sprite->undo->setLabel("New Cel");
|
||||
|
@ -83,7 +83,7 @@ protected:
|
||||
// for each cel...
|
||||
for (CelIterator it = cels.begin(); it != cels.end(); ++it) {
|
||||
Cel* cel = *it;
|
||||
Image* image = stock_get_image(m_sprite->getStock(), cel->image);
|
||||
Image* image = m_sprite->getStock()->getImage(cel->image);
|
||||
|
||||
// change it location
|
||||
switch (m_angle) {
|
||||
@ -102,8 +102,8 @@ protected:
|
||||
}
|
||||
|
||||
// for each stock's image
|
||||
for (int i=0; i<m_sprite->getStock()->nimage; ++i) {
|
||||
Image* image = stock_get_image(m_sprite->getStock(), i);
|
||||
for (int i=0; i<m_sprite->getStock()->size(); ++i) {
|
||||
Image* image = m_sprite->getStock()->getImage(i);
|
||||
if (!image)
|
||||
continue;
|
||||
|
||||
@ -115,7 +115,7 @@ protected:
|
||||
|
||||
undoable.replaceStockImage(i, new_image);
|
||||
|
||||
jobProgress((float)i / m_sprite->getStock()->nimage);
|
||||
jobProgress((float)i / m_sprite->getStock()->size());
|
||||
|
||||
// cancel all the operation?
|
||||
if (isCanceled())
|
||||
|
@ -82,7 +82,7 @@ protected:
|
||||
undoable.setCelPosition(cel, scale_x(cel->x), scale_y(cel->y));
|
||||
|
||||
// Get cel's image
|
||||
Image* image = stock_get_image(m_sprite->getStock(), cel->image);
|
||||
Image* image = m_sprite->getStock()->getImage(cel->image);
|
||||
if (!image)
|
||||
continue;
|
||||
|
||||
|
@ -1201,8 +1201,9 @@ static void anieditor_draw_cel(JWidget widget, JRect clip, int layer_index, int
|
||||
|
||||
/* empty cel? */
|
||||
if (cel == NULL ||
|
||||
stock_get_image(anieditor->sprite->getStock(),
|
||||
cel->image) == NULL) { /* TODO why a cel can't have an associated image? */
|
||||
// TODO why a cel can't have an associated image?
|
||||
anieditor->sprite->getStock()->getImage(cel->image) == NULL) {
|
||||
|
||||
jdraw_rectfill(thumbnail_rect, bg);
|
||||
draw_emptyset_symbol(ji_screen, thumbnail_rect, ji_color_disabled());
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ static ImageRef* images_ref_get_from_layer(Sprite* sprite, Layer* layer, int tar
|
||||
{ \
|
||||
ImageRef* image_ref = jnew(ImageRef, 1); \
|
||||
\
|
||||
image_ref->image = layer->getSprite()->getStock()->image[cel->image]; \
|
||||
image_ref->image = layer->getSprite()->getStock()->getImage(cel->image); \
|
||||
image_ref->layer = layer; \
|
||||
image_ref->cel = cel; \
|
||||
image_ref->next = NULL; \
|
||||
|
@ -1044,7 +1044,7 @@ static Cel *ase_file_read_cel_chunk(FILE *f, Sprite *sprite, int frame, int imgt
|
||||
break;
|
||||
}
|
||||
|
||||
cel->image = stock_add_image(sprite->getStock(), image);
|
||||
cel->image = sprite->getStock()->addImage(image);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1056,8 +1056,8 @@ static Cel *ase_file_read_cel_chunk(FILE *f, Sprite *sprite, int frame, int imgt
|
||||
|
||||
if (link) {
|
||||
// Create a copy of the linked cel (avoid using links cel)
|
||||
Image* image = image_new_copy(stock_get_image(sprite->getStock(), link->image));
|
||||
cel->image = stock_add_image(sprite->getStock(), image);
|
||||
Image* image = image_new_copy(sprite->getStock()->getImage(link->image));
|
||||
cel->image = sprite->getStock()->addImage(image);
|
||||
}
|
||||
else {
|
||||
cel_free(cel);
|
||||
@ -1096,7 +1096,7 @@ static Cel *ase_file_read_cel_chunk(FILE *f, Sprite *sprite, int frame, int imgt
|
||||
break;
|
||||
}
|
||||
|
||||
cel->image = stock_add_image(sprite->getStock(), image);
|
||||
cel->image = sprite->getStock()->addImage(image);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1124,7 +1124,7 @@ static void ase_file_write_cel_chunk(FILE *f, Cel *cel, LayerImage *layer, Sprit
|
||||
switch (cel_type) {
|
||||
|
||||
case ASE_FILE_RAW_CEL: {
|
||||
Image* image = stock_get_image(sprite->getStock(), cel->image);
|
||||
Image* image = sprite->getStock()->getImage(cel->image);
|
||||
|
||||
if (image) {
|
||||
// Width and height
|
||||
@ -1162,7 +1162,7 @@ static void ase_file_write_cel_chunk(FILE *f, Cel *cel, LayerImage *layer, Sprit
|
||||
break;
|
||||
|
||||
case ASE_FILE_COMPRESSED_CEL: {
|
||||
Image* image = stock_get_image(sprite->getStock(), cel->image);
|
||||
Image* image = sprite->getStock()->getImage(cel->image);
|
||||
|
||||
if (image) {
|
||||
// Width and height
|
||||
|
@ -464,8 +464,7 @@ void fop_operate(FileOp *fop)
|
||||
/* TODO set_palette for each frame??? */
|
||||
#define SEQUENCE_IMAGE() \
|
||||
do { \
|
||||
image_index = stock_add_image(fop->sprite->getStock(), \
|
||||
fop->seq.image); \
|
||||
image_index = fop->sprite->getStock()->addImage(fop->seq.image); \
|
||||
\
|
||||
fop->seq.last_cel->image = image_index; \
|
||||
fop->seq.layer->addCel(fop->seq.last_cel); \
|
||||
|
@ -139,7 +139,7 @@ static bool load_FLI(FileOp *fop)
|
||||
break;
|
||||
}
|
||||
|
||||
index = stock_add_image(sprite->getStock(), image);
|
||||
index = sprite->getStock()->addImage(image);
|
||||
if (index < 0) {
|
||||
image_free(image);
|
||||
fop_error(fop, "Not enough memory\n");
|
||||
|
@ -195,7 +195,7 @@ static bool load_GIF(FileOp *fop)
|
||||
0, 0
|
||||
#endif
|
||||
);
|
||||
cel->image = stock_add_image(sprite->getStock(), image);
|
||||
cel->image = sprite->getStock()->addImage(image);
|
||||
layer->addCel(cel);
|
||||
|
||||
#ifdef LOAD_GIF_STRUCTURE
|
||||
|
@ -130,7 +130,7 @@ static bool load_ICO(FileOp *fop)
|
||||
|
||||
// Create the first image/cel
|
||||
Image* image = image_new(imgtype, width, height);
|
||||
int image_index = stock_add_image(sprite->getStock(), image);
|
||||
int image_index = sprite->getStock()->addImage(image);
|
||||
Cel* cel = cel_new(0, image_index);
|
||||
layer->addCel(cel);
|
||||
|
||||
|
@ -20,6 +20,8 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "gui/jbase.h" // TODO remove this reference
|
||||
|
||||
#include "raster/algo.h"
|
||||
#include "raster/pen.h"
|
||||
#include "raster/dirty.h"
|
||||
@ -121,11 +123,7 @@ static void swap_hline8(void* image, void* data, int x1, int x2);
|
||||
|
||||
Dirty* dirty_new(Image* image, int x1, int y1, int x2, int y2, bool tiled)
|
||||
{
|
||||
Dirty* dirty;
|
||||
|
||||
dirty = (Dirty*)jnew(Dirty, 1);
|
||||
if (!dirty)
|
||||
return NULL;
|
||||
Dirty* dirty = new Dirty;
|
||||
|
||||
dirty->image = image;
|
||||
dirty->x1 = MID(0, x1, image->w-1);
|
||||
@ -142,12 +140,8 @@ Dirty* dirty_new(Image* image, int x1, int y1, int x2, int y2, bool tiled)
|
||||
|
||||
Dirty* dirty_new_copy(Dirty* src)
|
||||
{
|
||||
Dirty* dst = dirty_new(src->image, src->x1, src->y1, src->x2, src->y2, src->tiled);
|
||||
int u, v, size;
|
||||
Dirty* dst;
|
||||
|
||||
dst = dirty_new(src->image, src->x1, src->y1, src->x2, src->y2, src->tiled);
|
||||
if (!dst)
|
||||
return NULL;
|
||||
|
||||
dst->rows = src->rows;
|
||||
dst->row = (DirtyRow*)jmalloc(sizeof(DirtyRow) * src->rows);
|
||||
|
@ -19,7 +19,6 @@
|
||||
#ifndef RASTER_GFXOBJ_H_INCLUDED
|
||||
#define RASTER_GFXOBJ_H_INCLUDED
|
||||
|
||||
#include "gui/jbase.h"
|
||||
#include <list>
|
||||
|
||||
enum GfxObjType {
|
||||
|
@ -22,8 +22,6 @@
|
||||
#include <string.h>
|
||||
#include <allegro/unicode.h>
|
||||
|
||||
#include "gui/jlist.h"
|
||||
|
||||
#include "raster/blend.h"
|
||||
#include "raster/cel.h"
|
||||
#include "raster/image.h"
|
||||
@ -127,14 +125,14 @@ LayerImage::LayerImage(const LayerImage* src_layer, Sprite* dst_sprite)
|
||||
Cel* cel_copy = cel_new_copy(cel);
|
||||
|
||||
ASSERT((cel->image >= 0) &&
|
||||
(cel->image < src_layer->getSprite()->getStock()->nimage));
|
||||
(cel->image < src_layer->getSprite()->getStock()->size()));
|
||||
|
||||
Image* image = src_layer->getSprite()->getStock()->image[cel->image];
|
||||
Image* image = src_layer->getSprite()->getStock()->getImage(cel->image);
|
||||
ASSERT(image != NULL);
|
||||
|
||||
Image* image_copy = image_new_copy(image);
|
||||
|
||||
cel_copy->image = stock_add_image(dst_sprite->getStock(), image_copy);
|
||||
cel_copy->image = dst_sprite->getStock()->addImage(image_copy);
|
||||
if (dst_sprite->getUndo()->isEnabled())
|
||||
undo_add_image(dst_sprite->getUndo(), dst_sprite->getStock(), cel_copy->image);
|
||||
|
||||
@ -159,11 +157,11 @@ void LayerImage::destroy_all_cels()
|
||||
|
||||
for (; it != end; ++it) {
|
||||
Cel* cel = *it;
|
||||
Image* image = getSprite()->getStock()->image[cel->image];
|
||||
Image* image = getSprite()->getStock()->getImage(cel->image);
|
||||
|
||||
ASSERT(image != NULL);
|
||||
|
||||
stock_remove_image(getSprite()->getStock(), image);
|
||||
getSprite()->getStock()->removeImage(image);
|
||||
image_free(image);
|
||||
cel_free(cel);
|
||||
}
|
||||
@ -379,7 +377,7 @@ Layer* layer_new_flatten_copy(Sprite* dst_sprite, const Layer* src_layer,
|
||||
try {
|
||||
/* create the new cel for the output layer (add the image to
|
||||
stock too) */
|
||||
Cel* cel = cel_new(frame, stock_add_image(flat_layer->getSprite()->getStock(), image));
|
||||
Cel* cel = cel_new(frame, flat_layer->getSprite()->getStock()->addImage(image));
|
||||
cel_set_position(cel, x, y);
|
||||
|
||||
/* clear the image and render this frame */
|
||||
@ -415,9 +413,9 @@ void layer_render(const Layer* layer, Image* image, int x, int y, int frame)
|
||||
|
||||
if (cel) {
|
||||
ASSERT((cel->image >= 0) &&
|
||||
(cel->image < layer->getSprite()->getStock()->nimage));
|
||||
(cel->image < layer->getSprite()->getStock()->size()));
|
||||
|
||||
src_image = layer->getSprite()->getStock()->image[cel->image];
|
||||
src_image = layer->getSprite()->getStock()->getImage(cel->image);
|
||||
ASSERT(src_image != NULL);
|
||||
|
||||
image_merge(image, src_image,
|
||||
|
@ -20,7 +20,6 @@
|
||||
#define RASTER_LAYER_H_INCLUDED
|
||||
|
||||
#include <string>
|
||||
#include "gui/jbase.h"
|
||||
#include "raster/gfxobj.h"
|
||||
|
||||
class Cel;
|
||||
|
@ -21,6 +21,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "gui/jbase.h" // TODO remove this reference
|
||||
|
||||
#include "raster/image.h"
|
||||
#include "raster/mask.h"
|
||||
|
||||
|
@ -20,6 +20,8 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "gui/jbase.h" // TODO remove this reference
|
||||
|
||||
#include "raster/blend.h"
|
||||
#include "raster/image.h"
|
||||
#include "raster/path.h"
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include <allegro/base.h>
|
||||
#include <math.h>
|
||||
|
||||
#include "gui/jbase.h"
|
||||
#include "gui/jbase.h" // TODO remove this reference
|
||||
|
||||
#include "raster/algo.h"
|
||||
#include "raster/pen.h"
|
||||
|
@ -226,9 +226,9 @@ public:
|
||||
const Cel* cel = static_cast<const LayerImage*>(getCurrentLayer())->getCel(getCurrentFrame());
|
||||
if (cel) {
|
||||
ASSERT((cel->image >= 0) &&
|
||||
(cel->image < getStock()->nimage));
|
||||
(cel->image < getStock()->size()));
|
||||
|
||||
image = getStock()->image[cel->image];
|
||||
image = getStock()->getImage(cel->image);
|
||||
|
||||
if (x) *x = cel->x;
|
||||
if (y) *y = cel->y;
|
||||
@ -247,9 +247,9 @@ public:
|
||||
Cel* cel = static_cast<LayerImage*>(getCurrentLayer())->getCel(getCurrentFrame());
|
||||
if (cel) {
|
||||
ASSERT((cel->image >= 0) &&
|
||||
(cel->image < getStock()->nimage));
|
||||
(cel->image < getStock()->size()));
|
||||
|
||||
image = getStock()->image[cel->image];
|
||||
image = getStock()->getImage(cel->image);
|
||||
|
||||
if (x) *x = cel->x;
|
||||
if (y) *y = cel->y;
|
||||
@ -277,7 +277,7 @@ public:
|
||||
// Remap this Cel because is inside the specified range
|
||||
if (cel->frame >= frame_from &&
|
||||
cel->frame <= frame_to) {
|
||||
Image* image = stock_get_image(getStock(), cel->image);
|
||||
Image* image = getStock()->getImage(cel->image);
|
||||
|
||||
for (int y=0; y<image->h; ++y) {
|
||||
IndexedTraits::address_t ptr = image_address_fast<IndexedTraits>(image, 0, y);
|
||||
@ -451,7 +451,7 @@ SpriteImpl::SpriteImpl(Sprite* sprite, int imgtype, int width, int height, int n
|
||||
m_frames = 1;
|
||||
m_frlens.push_back(100); // First frame with 100 msecs of duration
|
||||
m_frame = 0;
|
||||
m_stock = stock_new(imgtype);
|
||||
m_stock = new Stock(imgtype);
|
||||
m_folder = new LayerFolder(m_self);
|
||||
m_layer = NULL;
|
||||
m_path = NULL;
|
||||
@ -516,13 +516,11 @@ SpriteImpl* SpriteImpl::copyBase(Sprite* new_sprite, const SpriteImpl* src_sprit
|
||||
src_sprite->getPalette(0)->size());
|
||||
|
||||
|
||||
// Copy stock
|
||||
stock_free(dst_sprite->m_stock);
|
||||
dst_sprite->m_stock = stock_new_copy(src_sprite->m_stock);
|
||||
if (!dst_sprite->m_stock) {
|
||||
delete dst_sprite;
|
||||
return NULL;
|
||||
}
|
||||
// Delete the original empty stock from the dst_sprite
|
||||
delete dst_sprite->m_stock;
|
||||
|
||||
// Clone the src_sprite stock
|
||||
dst_sprite->m_stock = new Stock(*src_sprite->m_stock);
|
||||
|
||||
// Copy general properties
|
||||
dst_sprite->m_filename = src_sprite->m_filename;
|
||||
@ -623,7 +621,7 @@ SpriteImpl::~SpriteImpl()
|
||||
|
||||
// Destroy images' stock
|
||||
if (m_stock)
|
||||
stock_free(m_stock);
|
||||
delete m_stock;
|
||||
|
||||
// Destroy paths
|
||||
{
|
||||
@ -749,9 +747,8 @@ int SpriteImpl::getMemSize() const
|
||||
Image *image;
|
||||
int i, size = 0;
|
||||
|
||||
for (i=0; i<m_stock->nimage; i++) {
|
||||
image = m_stock->image[i];
|
||||
|
||||
for (i=0; i<m_stock->size(); i++) {
|
||||
image = m_stock->getImage(i);
|
||||
if (image != NULL)
|
||||
size += image_line_size(image, image->w) * image->h;
|
||||
}
|
||||
@ -1033,7 +1030,7 @@ Sprite* Sprite::createWithLayer(int imgtype, int width, int height, int ncolors)
|
||||
layer->set_blend_mode(BLEND_MODE_NORMAL);
|
||||
|
||||
/* add image in the layer stock */
|
||||
int index = stock_add_image(sprite->getStock(), image);
|
||||
int index = sprite->getStock()->addImage(image);
|
||||
|
||||
/* create the cel */
|
||||
cel = cel_new(0, index);
|
||||
|
@ -23,136 +23,87 @@
|
||||
#include "raster/image.h"
|
||||
#include "raster/stock.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
Stock::Stock(int imgtype)
|
||||
: GfxObj(GFXOBJ_STOCK)
|
||||
{
|
||||
this->imgtype = imgtype;
|
||||
this->nimage = 0;
|
||||
this->image = NULL;
|
||||
m_imgtype = imgtype;
|
||||
|
||||
stock_add_image(this, NULL); /* image 0 is NULL */
|
||||
// Image with index=0 is always NULL.
|
||||
m_image.push_back(NULL);
|
||||
}
|
||||
|
||||
Stock::Stock(const Stock& stock)
|
||||
: GfxObj(stock)
|
||||
{
|
||||
this->imgtype = stock.imgtype;
|
||||
this->nimage = 0;
|
||||
this->image = NULL;
|
||||
m_imgtype = stock.getImgType();
|
||||
|
||||
for (int c=0; c<stock.nimage; ++c) {
|
||||
if (!stock.image[c])
|
||||
stock_add_image(this, NULL);
|
||||
try {
|
||||
for (int i=0; i<stock.size(); ++i) {
|
||||
if (!stock.getImage(i))
|
||||
addImage(NULL);
|
||||
else {
|
||||
Image* image_copy = image_new_copy(stock.image[c]);
|
||||
// TODO try/catch remove created images
|
||||
stock_add_image(this, image_copy);
|
||||
Image* image_copy = image_new_copy(stock.getImage(i));
|
||||
addImage(image_copy);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (...) {
|
||||
for (int i=0; i<size(); ++i) {
|
||||
if (getImage(i))
|
||||
delete getImage(i);
|
||||
}
|
||||
throw;
|
||||
}
|
||||
|
||||
ASSERT(this->nimage == stock.nimage);
|
||||
ASSERT(size() == stock.size());
|
||||
}
|
||||
|
||||
Stock::~Stock()
|
||||
{
|
||||
for (int i=0; i<this->nimage; i++) {
|
||||
if (this->image[i])
|
||||
image_free(this->image[i]);
|
||||
for (int i=0; i<size(); ++i) {
|
||||
if (getImage(i))
|
||||
delete getImage(i);
|
||||
}
|
||||
jfree(this->image);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new stock, the "imgtype" argument indicates that this
|
||||
* stock will contain images of that type.
|
||||
*/
|
||||
Stock* stock_new(int imgtype)
|
||||
int Stock::getImgType() const
|
||||
{
|
||||
return new Stock(imgtype);
|
||||
return m_imgtype;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new copy of "stock"; the new copy will have copies of all
|
||||
* images.
|
||||
*/
|
||||
Stock* stock_new_copy(const Stock* stock)
|
||||
void Stock::setImgType(int imgtype)
|
||||
{
|
||||
ASSERT(stock);
|
||||
return new Stock(*stock);
|
||||
m_imgtype = imgtype;
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroys the stock.
|
||||
*/
|
||||
void stock_free(Stock* stock)
|
||||
Image* Stock::getImage(int index) const
|
||||
{
|
||||
ASSERT(stock);
|
||||
delete stock;
|
||||
ASSERT((index >= 0) && (index < size()));
|
||||
|
||||
return m_image[index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new image in the stock resizing the images-array.
|
||||
*/
|
||||
int stock_add_image(Stock* stock, Image* image)
|
||||
int Stock::addImage(Image* image)
|
||||
{
|
||||
int i = stock->nimage++;
|
||||
|
||||
stock->image = (Image**)jrealloc(stock->image, sizeof(Image*) * stock->nimage);
|
||||
if (!stock->image)
|
||||
return -1;
|
||||
|
||||
stock->image[i] = image;
|
||||
int i = m_image.size();
|
||||
m_image.resize(m_image.size()+1);
|
||||
m_image[i] = image;
|
||||
return i;
|
||||
}
|
||||
|
||||
/* removes a image from the stock, it doesn't resize the stock */
|
||||
void stock_remove_image(Stock* stock, Image* image)
|
||||
void Stock::removeImage(Image* image)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<stock->nimage; i++)
|
||||
if (stock->image[i] == image) {
|
||||
stock->image[i] = NULL;
|
||||
break;
|
||||
for (int i=0; i<size(); i++)
|
||||
if (m_image[i] == image) {
|
||||
m_image[i] = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
ASSERT(false && "The specified image was not found");
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the image in the stock in the "index" position with the
|
||||
* new "image"; you must free the old image before, e.g:
|
||||
* @code
|
||||
* Image* old_image = stock_get_image(stock, index);
|
||||
* if (old_image)
|
||||
* image_free(old_image);
|
||||
* stock_replace_image(stock, index, new_image);
|
||||
* @endcode
|
||||
*/
|
||||
void stock_replace_image(Stock* stock, int index, Image* image)
|
||||
void Stock::replaceImage(int index, Image* image)
|
||||
{
|
||||
/* the zero index can't be changed */
|
||||
if ((index > 0) && (index < stock->nimage))
|
||||
stock->image[index] = image;
|
||||
ASSERT((index > 0) && (index < size()));
|
||||
m_image[index] = image;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the image in the "index" position
|
||||
*/
|
||||
Image* stock_get_image(Stock* stock, int index)
|
||||
{
|
||||
return ((index >= 0) && (index < stock->nimage)) ? stock->image[index]: NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the image in the "index" position
|
||||
*/
|
||||
const Image* stock_get_image(const Stock* stock, int index)
|
||||
{
|
||||
return ((index >= 0) && (index < stock->nimage)) ? stock->image[index]: NULL;
|
||||
}
|
||||
|
||||
|
@ -20,31 +20,51 @@
|
||||
#define RASTER_STOCK_H_INCLUDED
|
||||
|
||||
#include "raster/gfxobj.h"
|
||||
#include <vector>
|
||||
|
||||
class Image;
|
||||
|
||||
typedef std::vector<Image*> ImagesList;
|
||||
|
||||
class Stock : public GfxObj
|
||||
{
|
||||
public:
|
||||
int imgtype; /* type of images (all images in the stock
|
||||
must be of this type) */
|
||||
int nimage; /* how many images have this stock */
|
||||
Image** image; /* the images-array where the images are */
|
||||
|
||||
Stock(int imgtype);
|
||||
Stock(const Stock& stock);
|
||||
virtual ~Stock();
|
||||
|
||||
int getImgType() const;
|
||||
void setImgType(int imgtype);
|
||||
|
||||
// Returns the number of image in the stock.
|
||||
int size() const {
|
||||
return m_image.size();
|
||||
}
|
||||
|
||||
// Returns the image in the "index" position
|
||||
Image* getImage(int index) const;
|
||||
|
||||
// Adds a new image in the stock resizing the images-array. Returns
|
||||
// the index/position in the stock (this index can be used with the
|
||||
// Stock::getImage() function).
|
||||
int addImage(Image* image);
|
||||
|
||||
// Removes a image from the stock, it doesn't resize the stock.
|
||||
void removeImage(Image* image);
|
||||
|
||||
// Replaces the image in the stock in the "index" position with the
|
||||
// new "image"; you must delete the old image before, e.g:
|
||||
//
|
||||
// Image* old_image = stock->getImage(index);
|
||||
// if (old_image)
|
||||
// delete old_image;
|
||||
// stock->replaceImage(index, new_image);
|
||||
//
|
||||
void replaceImage(int index, Image* image);
|
||||
|
||||
//private: TODO uncomment this line
|
||||
int m_imgtype; // Type of images (all images in the stock must be of this type).
|
||||
ImagesList m_image; // The images-array where the images are.
|
||||
};
|
||||
|
||||
Stock* stock_new(int imgtype);
|
||||
Stock* stock_new_copy(const Stock* stock);
|
||||
void stock_free(Stock* stock);
|
||||
|
||||
int stock_add_image(Stock* stock, Image* image);
|
||||
void stock_remove_image(Stock* stock, Image* image);
|
||||
void stock_replace_image(Stock* stock, int index, Image* image);
|
||||
|
||||
Image* stock_get_image(Stock* stock, int index);
|
||||
const Image* stock_get_image(const Stock* stock, int index);
|
||||
|
||||
#endif
|
||||
|
@ -863,10 +863,10 @@ static void chunk_add_image_invert(UndoStream* stream, UndoChunkAddImage* chunk,
|
||||
Stock *stock = (Stock *)GfxObj::find(stock_id);
|
||||
|
||||
if (stock) {
|
||||
Image* image = stock_get_image(stock, image_index);
|
||||
Image* image = stock->getImage(image_index);
|
||||
if (image != NULL) {
|
||||
chunk_remove_image_new(stream, stock, image_index);
|
||||
stock_remove_image(stock, image);
|
||||
stock->removeImage(image);
|
||||
image_free(image);
|
||||
}
|
||||
}
|
||||
@ -898,8 +898,8 @@ void undo_remove_image(Undo* undo, Stock *stock, int image_index)
|
||||
|
||||
static void chunk_remove_image_new(UndoStream* stream, Stock *stock, int image_index)
|
||||
{
|
||||
Image* image = stock->image[image_index];
|
||||
UndoChunkRemoveImage* chunk = (UndoChunkRemoveImage* )
|
||||
Image* image = stock->getImage(image_index);
|
||||
UndoChunkRemoveImage* chunk = (UndoChunkRemoveImage*)
|
||||
undo_chunk_new(stream,
|
||||
UNDO_TYPE_REMOVE_IMAGE,
|
||||
sizeof(UndoChunkRemoveImage)+get_raw_image_size(image));
|
||||
@ -921,7 +921,7 @@ static void chunk_remove_image_invert(UndoStream* stream, UndoChunkRemoveImage*
|
||||
|
||||
/* ASSERT(image != NULL); */
|
||||
|
||||
stock_replace_image(stock, image_index, image);
|
||||
stock->replaceImage(image_index, image);
|
||||
chunk_add_image_new(stream, stock, image_index);
|
||||
}
|
||||
}
|
||||
@ -952,7 +952,7 @@ void undo_replace_image(Undo* undo, Stock *stock, int image_index)
|
||||
|
||||
static void chunk_replace_image_new(UndoStream* stream, Stock *stock, int image_index)
|
||||
{
|
||||
Image* image = stock_get_image(stock, image_index);
|
||||
Image* image = stock->getImage(image_index);
|
||||
UndoChunkReplaceImage* chunk = (UndoChunkReplaceImage* )
|
||||
undo_chunk_new(stream,
|
||||
UNDO_TYPE_REPLACE_IMAGE,
|
||||
@ -976,10 +976,10 @@ static void chunk_replace_image_invert(UndoStream* stream, UndoChunkReplaceImage
|
||||
|
||||
// save the current image in the (redo) stream
|
||||
chunk_replace_image_new(stream, stock, image_index);
|
||||
Image* old_image = stock_get_image(stock, image_index);
|
||||
Image* old_image = stock->getImage(image_index);
|
||||
|
||||
// replace the image in the stock
|
||||
stock_replace_image(stock, image_index, image);
|
||||
stock->replaceImage(image_index, image);
|
||||
|
||||
// destroy the old image
|
||||
image_free(old_image);
|
||||
@ -2175,7 +2175,7 @@ static Layer* read_raw_layer(ase_uint8* raw_data)
|
||||
Image* image = read_raw_image(raw_data);
|
||||
raw_data += get_raw_image_size(image);
|
||||
|
||||
stock_replace_image(layer->getSprite()->getStock(), cel->image, image);
|
||||
layer->getSprite()->getStock()->replaceImage(cel->image, image);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -2246,7 +2246,7 @@ static ase_uint8* write_raw_layer(ase_uint8* raw_data, Layer* layer)
|
||||
Cel* cel = *it;
|
||||
raw_data = write_raw_cel(raw_data, cel);
|
||||
|
||||
Image* image = layer->getSprite()->getStock()->image[cel->image];
|
||||
Image* image = layer->getSprite()->getStock()->getImage(cel->image);
|
||||
ASSERT(image != NULL);
|
||||
|
||||
write_raw_uint8(1);
|
||||
@ -2290,7 +2290,7 @@ static int get_raw_layer_size(Layer* layer)
|
||||
size += get_raw_cel_size(cel);
|
||||
size++; // has image?
|
||||
|
||||
Image* image = layer->getSprite()->getStock()->image[cel->image];
|
||||
Image* image = layer->getSprite()->getStock()->getImage(cel->image);
|
||||
size += get_raw_image_size(image);
|
||||
}
|
||||
break;
|
||||
|
@ -82,7 +82,7 @@ void test ()
|
||||
}
|
||||
|
||||
/* add the new image in the stock */
|
||||
image_index = stock_add_image(sprite->stock, image);
|
||||
image_index = sprite->stock->addImage(image);
|
||||
|
||||
/* cel properties */
|
||||
cel = cel_new(i, image_index);
|
||||
|
@ -198,15 +198,15 @@ void Undoable::setImgType(int new_imgtype, int dithering_method)
|
||||
|
||||
/* change imgtype of the stock of images */
|
||||
if (isEnabled())
|
||||
undo_int(m_sprite->getUndo(), m_sprite->getStock(), &m_sprite->getStock()->imgtype);
|
||||
undo_int(m_sprite->getUndo(), m_sprite->getStock(), &m_sprite->getStock()->m_imgtype);
|
||||
|
||||
m_sprite->getStock()->imgtype = new_imgtype;
|
||||
m_sprite->getStock()->setImgType(new_imgtype);
|
||||
|
||||
// Use the rgbmap for the specified sprite
|
||||
const RgbMap* rgbmap = m_sprite->getRgbMap();
|
||||
|
||||
for (c=0; c<m_sprite->getStock()->nimage; c++) {
|
||||
old_image = stock_get_image(m_sprite->getStock(), c);
|
||||
for (c=0; c<m_sprite->getStock()->size(); c++) {
|
||||
old_image = m_sprite->getStock()->getImage(c);
|
||||
if (!old_image)
|
||||
continue;
|
||||
|
||||
@ -221,7 +221,7 @@ void Undoable::setImgType(int new_imgtype, int dithering_method)
|
||||
undo_replace_image(m_sprite->getUndo(), m_sprite->getStock(), c);
|
||||
|
||||
image_free(old_image);
|
||||
stock_replace_image(m_sprite->getStock(), c, new_image);
|
||||
m_sprite->getStock()->replaceImage(c, new_image);
|
||||
}
|
||||
|
||||
/* change "sprite.imgtype" field */
|
||||
@ -259,7 +259,7 @@ int Undoable::addImageInStock(Image* image)
|
||||
ASSERT(image);
|
||||
|
||||
// add the image in the stock
|
||||
int image_index = stock_add_image(m_sprite->getStock(), image);
|
||||
int image_index = m_sprite->getStock()->addImage(image);
|
||||
|
||||
if (isEnabled())
|
||||
undo_add_image(m_sprite->getUndo(), m_sprite->getStock(), image_index);
|
||||
@ -274,27 +274,27 @@ void Undoable::removeImageFromStock(int image_index)
|
||||
{
|
||||
ASSERT(image_index >= 0);
|
||||
|
||||
Image* image = stock_get_image(m_sprite->getStock(), image_index);
|
||||
Image* image = m_sprite->getStock()->getImage(image_index);
|
||||
ASSERT(image);
|
||||
|
||||
if (isEnabled())
|
||||
undo_remove_image(m_sprite->getUndo(), m_sprite->getStock(), image_index);
|
||||
|
||||
stock_remove_image(m_sprite->getStock(), image);
|
||||
m_sprite->getStock()->removeImage(image);
|
||||
image_free(image);
|
||||
}
|
||||
|
||||
void Undoable::replaceStockImage(int image_index, Image* new_image)
|
||||
{
|
||||
// get the current image in the 'image_index' position
|
||||
Image* old_image = stock_get_image(m_sprite->getStock(), image_index);
|
||||
Image* old_image = m_sprite->getStock()->getImage(image_index);
|
||||
ASSERT(old_image);
|
||||
|
||||
// replace the image in the stock
|
||||
if (isEnabled())
|
||||
undo_replace_image(m_sprite->getUndo(), m_sprite->getStock(), image_index);
|
||||
|
||||
stock_replace_image(m_sprite->getStock(), image_index, new_image);
|
||||
m_sprite->getStock()->replaceImage(image_index, new_image);
|
||||
|
||||
// destroy the old image
|
||||
image_free(old_image);
|
||||
@ -431,10 +431,10 @@ void Undoable::backgroundFromLayer(LayerImage* layer, int bgcolor)
|
||||
for (; it != end; ++it) {
|
||||
Cel* cel = *it;
|
||||
ASSERT((cel->image > 0) &&
|
||||
(cel->image < m_sprite->getStock()->nimage));
|
||||
(cel->image < m_sprite->getStock()->size()));
|
||||
|
||||
// get the image from the sprite's stock of images
|
||||
Image* cel_image = stock_get_image(m_sprite->getStock(), cel->image);
|
||||
Image* cel_image = m_sprite->getStock()->getImage(cel->image);
|
||||
ASSERT(cel_image);
|
||||
|
||||
image_clear(bg_image, bgcolor);
|
||||
@ -539,7 +539,7 @@ void Undoable::flattenLayers(int bgcolor)
|
||||
|
||||
cel = background->getCel(frame);
|
||||
if (cel) {
|
||||
cel_image = m_sprite->getStock()->image[cel->image];
|
||||
cel_image = m_sprite->getStock()->getImage(cel->image);
|
||||
ASSERT(cel_image != NULL);
|
||||
|
||||
/* we have to save the current state of `cel_image' in the undo */
|
||||
@ -556,7 +556,7 @@ void Undoable::flattenLayers(int bgcolor)
|
||||
/* TODO error handling: if (!cel_image) { ... } */
|
||||
|
||||
/* here we create the new cel (with the new image `cel_image') */
|
||||
cel = cel_new(frame, stock_add_image(m_sprite->getStock(), cel_image));
|
||||
cel = cel_new(frame, m_sprite->getStock()->addImage(cel_image));
|
||||
/* TODO error handling: if (!cel) { ... } */
|
||||
|
||||
/* and finally we add the cel in the background */
|
||||
@ -706,8 +706,7 @@ void Undoable::copyPreviousFrame(Layer* layer, int frame)
|
||||
|
||||
// create a copy of the previous cel
|
||||
Cel* src_cel = static_cast<LayerImage*>(layer)->getCel(frame-1);
|
||||
Image* src_image = src_cel ? stock_get_image(m_sprite->getStock(),
|
||||
src_cel->image):
|
||||
Image* src_image = src_cel ? m_sprite->getStock()->getImage(src_cel->image):
|
||||
NULL;
|
||||
|
||||
// nothing to copy, it will be a transparent cel
|
||||
@ -907,7 +906,7 @@ Cel* Undoable::getCurrentCel()
|
||||
|
||||
void Undoable::cropCel(Cel* cel, int x, int y, int w, int h, int bgcolor)
|
||||
{
|
||||
Image* cel_image = stock_get_image(m_sprite->getStock(), cel->image);
|
||||
Image* cel_image = m_sprite->getStock()->getImage(cel->image);
|
||||
ASSERT(cel_image);
|
||||
|
||||
// create the new image through a crop
|
||||
@ -922,8 +921,8 @@ void Undoable::cropCel(Cel* cel, int x, int y, int w, int h, int bgcolor)
|
||||
|
||||
Image* Undoable::getCelImage(Cel* cel)
|
||||
{
|
||||
if (cel && cel->image >= 0 && cel->image < m_sprite->getStock()->nimage)
|
||||
return m_sprite->getStock()->image[cel->image];
|
||||
if (cel && cel->image >= 0 && cel->image < m_sprite->getStock()->size())
|
||||
return m_sprite->getStock()->getImage(cel->image);
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
@ -1028,7 +1027,7 @@ void Undoable::pasteImage(const Image* src_image, int x, int y, int opacity)
|
||||
Cel* cel = ((LayerImage*)layer)->getCel(m_sprite->getCurrentFrame());
|
||||
ASSERT(cel);
|
||||
|
||||
Image* cel_image = stock_get_image(m_sprite->getStock(), cel->image);
|
||||
Image* cel_image = m_sprite->getStock()->getImage(cel->image);
|
||||
Image* cel_image2 = image_new_copy(cel_image);
|
||||
image_merge(cel_image2, src_image, x-cel->x, y-cel->y, opacity, BLEND_MODE_NORMAL);
|
||||
|
||||
|
@ -106,7 +106,7 @@ void move_cel(SpriteWriter& sprite)
|
||||
image */
|
||||
if (!src_layer->is_background() &&
|
||||
dst_layer->is_background()) {
|
||||
Image *src_image = stock_get_image(sprite->getStock(), src_cel->image);
|
||||
Image *src_image = sprite->getStock()->getImage(src_cel->image);
|
||||
Image *dst_image = image_crop(src_image,
|
||||
-src_cel->x,
|
||||
-src_cel->y,
|
||||
@ -127,7 +127,7 @@ void move_cel(SpriteWriter& sprite)
|
||||
src_cel->y = 0;
|
||||
src_cel->opacity = 255;
|
||||
|
||||
stock_replace_image(sprite->getStock(), src_cel->image, dst_image);
|
||||
sprite->getStock()->replaceImage(src_cel->image, dst_image);
|
||||
image_free(src_image);
|
||||
}
|
||||
|
||||
@ -174,7 +174,7 @@ void copy_cel(SpriteWriter& sprite)
|
||||
|
||||
/* move the cel in the same layer */
|
||||
if (src_cel != NULL) {
|
||||
Image *src_image = stock_get_image(sprite->getStock(), src_cel->image);
|
||||
Image *src_image = sprite->getStock()->getImage(src_cel->image);
|
||||
Image *dst_image;
|
||||
int image_index;
|
||||
int dst_cel_x;
|
||||
@ -207,7 +207,7 @@ void copy_cel(SpriteWriter& sprite)
|
||||
}
|
||||
|
||||
/* add the image in the stock */
|
||||
image_index = stock_add_image(sprite->getStock(), dst_image);
|
||||
image_index = sprite->getStock()->addImage(dst_image);
|
||||
if (sprite->getUndo()->isEnabled())
|
||||
undo_add_image(sprite->getUndo(), sprite->getStock(), image_index);
|
||||
|
||||
@ -253,12 +253,12 @@ static void remove_cel(Sprite* sprite, LayerImage *layer, Cel *cel)
|
||||
if (!used) {
|
||||
/* if the image is only used by this cel, we can remove the
|
||||
image from the stock */
|
||||
image = stock_get_image(sprite->getStock(), cel->image);
|
||||
image = sprite->getStock()->getImage(cel->image);
|
||||
|
||||
if (sprite->getUndo()->isEnabled())
|
||||
undo_remove_image(sprite->getUndo(), sprite->getStock(), cel->image);
|
||||
|
||||
stock_remove_image(sprite->getStock(), image);
|
||||
sprite->getStock()->removeImage(image);
|
||||
image_free(image);
|
||||
}
|
||||
|
||||
|
@ -223,7 +223,7 @@ void clipboard::paste(SpriteWriter& sprite)
|
||||
image_clear(dst_image, 0);
|
||||
|
||||
// Add the new image in the stock
|
||||
int dst_image_index = stock_add_image(sprite->getStock(), dst_image);
|
||||
int dst_image_index = sprite->getStock()->addImage(dst_image);
|
||||
if (sprite->getUndo()->isEnabled())
|
||||
undo_add_image(sprite->getUndo(), sprite->getStock(), dst_image_index);
|
||||
|
||||
|
@ -578,8 +578,8 @@ void RenderEngine::renderLayer(const Sprite *sprite,
|
||||
}
|
||||
/* if not, we use the original cel-image from the images' stock */
|
||||
else if ((cel->image >= 0) &&
|
||||
(cel->image < layer->getSprite()->getStock()->nimage))
|
||||
src_image = layer->getSprite()->getStock()->image[cel->image];
|
||||
(cel->image < layer->getSprite()->getStock()->size()))
|
||||
src_image = layer->getSprite()->getStock()->getImage(cel->image);
|
||||
else
|
||||
src_image = NULL;
|
||||
|
||||
|
@ -82,7 +82,7 @@ BITMAP* generate_thumbnail(const Layer* layer, const Cel* cel, const Sprite *spr
|
||||
return NULL;
|
||||
|
||||
thumbnail_render(bmp,
|
||||
stock_get_image(sprite->getStock(), cel->image),
|
||||
sprite->getStock()->getImage(cel->image),
|
||||
!layer->is_background(),
|
||||
sprite->getPalette(cel->frame));
|
||||
|
||||
|
@ -1844,7 +1844,7 @@ public:
|
||||
if (m_layer->is_image()) {
|
||||
m_cel = static_cast<LayerImage*>(sprite->getCurrentLayer())->getCel(sprite->getCurrentFrame());
|
||||
if (m_cel)
|
||||
m_cel_image = sprite->getStock()->image[m_cel->image];
|
||||
m_cel_image = sprite->getStock()->getImage(m_cel->image);
|
||||
}
|
||||
|
||||
if (m_cel == NULL) {
|
||||
@ -1925,7 +1925,7 @@ public:
|
||||
image_copy(m_cel_image, m_dst_image, 0, 0);
|
||||
|
||||
/* add the 'cel_image' in the images' stock of the sprite */
|
||||
m_cel->image = stock_add_image(m_sprite->getStock(), m_cel_image);
|
||||
m_cel->image = m_sprite->getStock()->addImage(m_cel_image);
|
||||
|
||||
/* is the undo enabled? */
|
||||
if (m_sprite->getUndo()->isEnabled()) {
|
||||
@ -1985,7 +1985,7 @@ public:
|
||||
}
|
||||
|
||||
/* replace the image in the stock */
|
||||
stock_replace_image(m_sprite->getStock(), m_cel->image, m_dst_image);
|
||||
m_sprite->getStock()->replaceImage(m_cel->image, m_dst_image);
|
||||
|
||||
/* destroy the old cel image */
|
||||
image_free(m_cel_image);
|
||||
|
Loading…
Reference in New Issue
Block a user