Replace image_free() with UniquePtrs

This commit is contained in:
David Capello 2013-03-30 19:53:52 -03:00
parent bf745b1033
commit 527c85e26e
27 changed files with 125 additions and 212 deletions

View File

@ -19,6 +19,7 @@
#include "config.h"
#include "app.h"
#include "base/unique_ptr.h"
#include "commands/command.h"
#include "context_access.h"
#include "document.h"
@ -85,7 +86,8 @@ void MergeDownLayerCommand::onExecute(Context* context)
Layer* src_layer = writer.layer();
Layer* dst_layer = src_layer->getPrevious();
Cel *src_cel, *dst_cel;
Image *src_image, *dst_image;
Image *src_image;
UniquePtr<Image> dst_image;
int index;
for (FrameNumber frpos(0); frpos<sprite->getTotalFrames(); ++frpos) {
@ -100,9 +102,7 @@ void MergeDownLayerCommand::onExecute(Context* context)
src_image = NULL;
if (dst_cel != NULL)
dst_image = sprite->getStock()->getImage(dst_cel->getImage());
else
dst_image = NULL;
dst_image.reset(sprite->getStock()->getImage(dst_cel->getImage()));
// With source image?
if (src_image != NULL) {
@ -111,10 +111,10 @@ void MergeDownLayerCommand::onExecute(Context* context)
// Copy this cel to the destination layer...
// Creating a copy of the image
dst_image = Image::createCopy(src_image);
dst_image.reset(Image::createCopy(src_image));
// Adding it in the stock of images
index = sprite->getStock()->addImage(dst_image);
index = sprite->getStock()->addImage(dst_image.release());
if (undo.isEnabled())
undo.pushUndoer(new undoers::AddImage(
undo.getObjects(), sprite->getStock(), index));
@ -129,12 +129,12 @@ void MergeDownLayerCommand::onExecute(Context* context)
static_cast<LayerImage*>(dst_layer)->addCel(dst_cel);
}
/* with destination */
// With destination
else {
int x1, y1, x2, y2, bgcolor;
Image *new_image;
/* merge down in the background layer */
// Merge down in the background layer
if (dst_layer->isBackground()) {
x1 = 0;
y1 = 0;
@ -142,7 +142,7 @@ void MergeDownLayerCommand::onExecute(Context* context)
y2 = sprite->getHeight();
bgcolor = app_get_color_to_clear_layer(dst_layer);
}
/* merge down in a transparent layer */
// Merge down in a transparent layer
else {
x1 = MIN(src_cel->getX(), dst_cel->getX());
y1 = MIN(src_cel->getY(), dst_cel->getY());
@ -156,7 +156,7 @@ void MergeDownLayerCommand::onExecute(Context* context)
y1-dst_cel->getY(),
x2-x1+1, y2-y1+1, bgcolor);
/* merge src_image in new_image */
// Merge src_image in new_image
image_merge(new_image, src_image,
src_cel->getX()-x1,
src_cel->getY()-y1,
@ -173,8 +173,6 @@ void MergeDownLayerCommand::onExecute(Context* context)
sprite->getStock(), dst_cel->getImage()));
sprite->getStock()->replaceImage(dst_cel->getImage(), new_image);
image_free(dst_image);
}
}
}

View File

@ -121,8 +121,8 @@ void PreviewCommand::onExecute(Context* context)
bool redraw = true;
// Render the sprite
Image* render = NULL;
Image* doublebuf = Image::create(IMAGE_RGB, JI_SCREEN_W, JI_SCREEN_H);
UniquePtr<Image> render;
UniquePtr<Image> doublebuf(Image::create(IMAGE_RGB, JI_SCREEN_W, JI_SCREEN_H));
do {
// Update scroll
@ -140,9 +140,8 @@ void PreviewCommand::onExecute(Context* context)
RenderEngine renderEngine(document, sprite,
editor->getLayer(),
editor->getFrame());
render =
renderEngine.renderSprite(0, 0, sprite->getWidth(), sprite->getHeight(),
editor->getFrame(), 0, false);
render.reset(renderEngine.renderSprite(0, 0, sprite->getWidth(), sprite->getHeight(),
editor->getFrame(), 0, false));
}
// Redraw the screen
@ -206,9 +205,7 @@ void PreviewCommand::onExecute(Context* context)
redraw = true;
// Re-render
if (render)
image_free(render);
render = NULL;
render.reset(NULL);
}
// Play the animation
else if (command != NULL &&
@ -236,9 +233,6 @@ void PreviewCommand::onExecute(Context* context)
}
} while (!jmouse_b(0));
if (render) image_free(render);
if (doublebuf) image_free(doublebuf);
do {
jmouse_poll();
gui_feedback();

View File

@ -118,9 +118,10 @@ protected:
// Resize mask
if (m_document->isMaskVisible()) {
Image* old_bitmap = image_crop(m_document->getMask()->getBitmap(), -1, -1,
m_document->getMask()->getBitmap()->w+2,
m_document->getMask()->getBitmap()->h+2, 0);
UniquePtr<Image> old_bitmap
(image_crop(m_document->getMask()->getBitmap(), -1, -1,
m_document->getMask()->getBitmap()->w+2,
m_document->getMask()->getBitmap()->h+2, 0));
int w = scale_x(old_bitmap->w);
int h = scale_y(old_bitmap->h);
@ -131,7 +132,6 @@ protected:
m_resize_method,
m_sprite->getPalette(FrameNumber(0)), // Ignored
m_sprite->getRgbMap(FrameNumber(0))); // Ignored
image_free(old_bitmap);
// Reshrink
new_mask->intersect(new_mask->getBounds().x, new_mask->getBounds().y,

View File

@ -50,16 +50,16 @@ FilterManagerImpl::FilterManagerImpl(Context* context, Filter* filter)
, m_location(context->getActiveLocation())
, m_filter(filter)
, m_progressDelegate(NULL)
, m_dst(NULL)
, m_preview_mask(NULL)
{
int offset_x, offset_y;
m_src = NULL;
m_dst = NULL;
m_row = 0;
m_offset_x = 0;
m_offset_y = 0;
m_mask = NULL;
m_preview_mask = NULL;
m_mask_address = NULL;
m_targetOrig = TARGET_ALL_CHANNELS;
m_target = TARGET_ALL_CHANNELS;
@ -73,11 +73,6 @@ FilterManagerImpl::FilterManagerImpl(Context* context, Filter* filter)
FilterManagerImpl::~FilterManagerImpl()
{
if (m_preview_mask)
delete m_preview_mask;
if (m_dst)
image_free(m_dst);
}
void FilterManagerImpl::setProgressDelegate(IProgressDelegate* progressDelegate)
@ -115,15 +110,10 @@ void FilterManagerImpl::beginForPreview()
{
Document* document = m_location.document();
if (m_preview_mask) {
delete m_preview_mask;
m_preview_mask = NULL;
}
if (document->isMaskVisible())
m_preview_mask = new Mask(*document->getMask());
m_preview_mask.reset(new Mask(*document->getMask()));
else {
m_preview_mask = new Mask();
m_preview_mask.reset(new Mask());
m_preview_mask->replace(m_offset_x, m_offset_y,
m_src->w, m_src->h);
}
@ -152,8 +142,7 @@ void FilterManagerImpl::beginForPreview()
h = y2 - y1 + 1;
if ((w < 1) || (h < 1)) {
delete m_preview_mask;
m_preview_mask = NULL;
m_preview_mask.reset(NULL);
m_row = -1;
return;
}
@ -162,8 +151,7 @@ void FilterManagerImpl::beginForPreview()
}
if (!updateMask(m_mask, m_src)) {
delete m_preview_mask;
m_preview_mask = NULL;
m_preview_mask.reset(NULL);
m_row = -1;
return;
}
@ -334,21 +322,11 @@ void FilterManagerImpl::init(const Layer* layer, Image* image, int offset_x, int
if (!updateMask(m_location.document()->getMask(), image))
throw InvalidAreaException();
if (m_preview_mask) {
delete m_preview_mask;
m_preview_mask = NULL;
}
if (m_dst) {
image_free(m_dst);
m_dst = NULL;
}
m_src = image;
m_dst = image_crop(image, 0, 0, image->w, image->h, 0);
m_dst.reset(image_crop(image, 0, 0, image->w, image->h, 0));
m_row = -1;
m_mask = NULL;
m_preview_mask = NULL;
m_preview_mask.reset(NULL);
m_mask_address = NULL;
m_target = m_targetOrig;

View File

@ -20,7 +20,7 @@
#define COMMANDS_FILTERS_FILTER_MANAGER_IMPL_H_INCLUDED
#include "base/exception.h"
#include "base/exception.h"
#include "base/unique_ptr.h"
#include "document_location.h"
#include "filters/filter_indexed_data.h"
#include "filters/filter_manager.h"
@ -116,12 +116,12 @@ private:
DocumentLocation m_location;
Filter* m_filter;
Image* m_src;
Image* m_dst;
UniquePtr<Image> m_dst;
int m_row;
int m_x, m_y, m_w, m_h;
int m_offset_x, m_offset_y;
Mask* m_mask;
Mask* m_preview_mask;
UniquePtr<Mask> m_preview_mask;
unsigned char* m_mask_address;
div_t m_d;
Target m_targetOrig; // Original targets

View File

@ -601,7 +601,6 @@ bool BmpFormat::onLoad(FileOp *fop)
unsigned long rmask, gmask, bmask;
BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;
Image *image;
unsigned long biSize;
PixelFormat pixelFormat;
int format;
@ -654,9 +653,9 @@ bool BmpFormat::onLoad(FileOp *fop)
else
rmask = gmask = bmask = 0;
image = fop_sequence_image(fop, pixelFormat,
infoheader.biWidth,
ABS((int)infoheader.biHeight));
Image* image = fop_sequence_image(fop, pixelFormat,
infoheader.biWidth,
ABS((int)infoheader.biHeight));
if (!image) {
return false;
}
@ -682,7 +681,6 @@ bool BmpFormat::onLoad(FileOp *fop)
case BI_BITFIELDS:
if (read_bitfields_image(f, image, &infoheader, rmask, gmask, bmask) < 0) {
image_free(image);
fop_error(fop, "Unsupported bitfields in the BMP file.\n");
return false;
}

View File

@ -461,40 +461,37 @@ void fop_operate(FileOp *fop, IFileOpProgress* progress)
if (!old_image) {
// Error reading the first frame
if (!loadres || !fop->document || !fop->seq.last_cel) {
if (fop->seq.image) image_free(fop->seq.image);
if (fop->seq.last_cel) delete fop->seq.last_cel;
if (fop->document) {
delete fop->document;
fop->document = NULL;
}
delete fop->seq.image;
delete fop->seq.last_cel;
delete fop->document;
fop->document = NULL;
break;
}
// Read ok
else {
/* add the keyframe */
// Add the keyframe
SEQUENCE_IMAGE();
}
}
/* for other frames */
// For other frames
else {
/* all done (or maybe not enough memory) */
// All done (or maybe not enough memory)
if (!loadres || !fop->seq.last_cel) {
if (fop->seq.image) image_free(fop->seq.image);
if (fop->seq.last_cel) delete fop->seq.last_cel;
delete fop->seq.image;
delete fop->seq.last_cel;
break;
}
/* compare the old frame with the new one */
#if USE_LINK /* TODO this should be configurable through a check-box */
// Compare the old frame with the new one
#if USE_LINK // TODO this should be configurable through a check-box
if (image_count_diff(old_image, fop->seq.image)) {
SEQUENCE_IMAGE();
}
/* we don't need this image */
// We don't need this image
else {
image_free(fop->seq.image);
delete fop->seq.image;
/* but add a link frame */
// But add a link frame
fop->seq.last_cel->image = image_index;
layer_add_frame(fop->seq.layer, fop->seq.last_cel);
@ -574,7 +571,7 @@ void fop_operate(FileOp *fop, IFileOpProgress* progress)
fop->filename = *fop->seq.filename_list.begin();
// Destroy the image
image_free(fop->seq.image);
delete fop->seq.image;
}
else {
fop_error(fop, "Not enough memory for the temporary bitmap.\n");

View File

@ -70,17 +70,12 @@ bool FliFormat::onLoad(FileOp* fop)
unsigned char cmap[768];
unsigned char omap[768];
s_fli_header fli_header;
Image *bmp, *old, *image;
Sprite *sprite;
LayerImage *layer;
Palette *pal;
int c, w, h;
FrameNumber frpos_in;
FrameNumber frpos_out;
int index = 0;
Cel *cel;
/* open the file to read in binary mode */
// Open the file to read in binary mode
FileHandle f(fop->filename.c_str(), "rb");
fli_read_header(f, &fli_header);
@ -95,21 +90,14 @@ bool FliFormat::onLoad(FileOp* fop)
w = fli_header.width;
h = fli_header.height;
/* create the bitmaps */
bmp = Image::create(IMAGE_INDEXED, w, h);
old = Image::create(IMAGE_INDEXED, w, h);
pal = new Palette(FrameNumber(0), 256);
if (!bmp || !old || !pal) {
fop_error(fop, "Not enough memory.\n");
if (bmp) image_free(bmp);
if (old) image_free(old);
if (pal) delete pal;
return false;
}
// Create the bitmaps
UniquePtr<Image> bmp(Image::create(IMAGE_INDEXED, w, h));
UniquePtr<Image> old(Image::create(IMAGE_INDEXED, w, h));
UniquePtr<Palette> pal(new Palette(FrameNumber(0), 256));
// Create the image
sprite = new Sprite(IMAGE_INDEXED, w, h, 256);
layer = new LayerImage(sprite);
Sprite* sprite = new Sprite(IMAGE_INDEXED, w, h, 256);
LayerImage* layer = new LayerImage(sprite);
sprite->getFolder()->addLayer(layer);
layer->configureAsBackground();
@ -137,21 +125,11 @@ bool FliFormat::onLoad(FileOp* fop)
if (frpos_in != 0)
++frpos_out;
/* add the new frame */
image = Image::createCopy(bmp);
if (!image) {
fop_error(fop, "Not enough memory\n");
break;
}
// Add the new frame
Image* image = Image::createCopy(bmp);
index = sprite->getStock()->addImage(image);
if (index < 0) {
image_free(image);
fop_error(fop, "Not enough memory\n");
break;
}
cel = new Cel(frpos_out, index);
Cel* cel = new Cel(frpos_out, index);
layer->addCel(cel);
/* first frame or the palette changes */
@ -165,7 +143,7 @@ bool FliFormat::onLoad(FileOp* fop)
SETPAL();
// Add link
cel = new Cel(frpos_out, index);
Cel* cel = new Cel(frpos_out, index);
layer_add_cel(layer, cel);
}
#endif
@ -192,11 +170,6 @@ bool FliFormat::onLoad(FileOp* fop)
// Update number of frames
sprite->setTotalFrames(frpos_out.next());
// Destroy the bitmaps
image_free(bmp);
image_free(old);
delete pal;
fop->document = new Document(sprite);
return true;
}
@ -208,7 +181,6 @@ bool FliFormat::onSave(FileOp* fop)
unsigned char omap[768];
s_fli_header fli_header;
int c, times;
Image *bmp, *old;
Palette *pal;
/* prepare fli header */
@ -236,17 +208,11 @@ bool FliFormat::onSave(FileOp* fop)
fseek(f, 128, SEEK_SET);
/* create the bitmaps */
bmp = Image::create(IMAGE_INDEXED, sprite->getWidth(), sprite->getHeight());
old = Image::create(IMAGE_INDEXED, sprite->getWidth(), sprite->getHeight());
if ((!bmp) || (!old)) {
fop_error(fop, "Not enough memory for temporary bitmaps.\n");
if (bmp) image_free(bmp);
if (old) image_free(old);
return false;
}
// Create the bitmaps
UniquePtr<Image> bmp(Image::create(IMAGE_INDEXED, sprite->getWidth(), sprite->getHeight()));
UniquePtr<Image> old(Image::create(IMAGE_INDEXED, sprite->getWidth(), sprite->getHeight()));
/* write frame by frame */
// Write frame by frame
for (FrameNumber frpos(0);
frpos < sprite->getTotalFrames();
++frpos) {
@ -285,13 +251,9 @@ bool FliFormat::onSave(FileOp* fop)
fop_progress(fop, (float)(frpos.next()) / (float)(sprite->getTotalFrames()));
}
/* write the header and close the file */
// Write the header and close the file
fli_write_header(f, &fli_header);
/* destroy the bitmaps */
image_free(bmp);
image_free(old);
return true;
}

View File

@ -271,9 +271,9 @@ bool IcoFormat::onSave(FileOp* fop)
offset += size;
}
Image* image = Image::create(sprite->getPixelFormat(),
sprite->getWidth(),
sprite->getHeight());
UniquePtr<Image> image(Image::create(sprite->getPixelFormat(),
sprite->getWidth(),
sprite->getHeight()));
for (n=FrameNumber(0); n<num; ++n) {
image_clear(image, 0);
@ -388,7 +388,5 @@ bool IcoFormat::onSave(FileOp* fop)
}
}
image_free(image);
return true;
}

View File

@ -103,7 +103,6 @@ bool JpegFormat::onLoad(FileOp* fop)
{
struct jpeg_decompress_struct cinfo;
struct error_mgr jerr;
Image *image;
JDIMENSION num_scanlines;
JSAMPARRAY buffer;
JDIMENSION buffer_height;
@ -143,11 +142,11 @@ bool JpegFormat::onLoad(FileOp* fop)
jpeg_start_decompress(&cinfo);
// Create the image.
image = fop_sequence_image(fop,
(cinfo.out_color_space == JCS_RGB ? IMAGE_RGB:
IMAGE_GRAYSCALE),
cinfo.output_width,
cinfo.output_height);
Image* image = fop_sequence_image(fop,
(cinfo.out_color_space == JCS_RGB ? IMAGE_RGB:
IMAGE_GRAYSCALE),
cinfo.output_width,
cinfo.output_height);
if (!image) {
jpeg_destroy_decompress(&cinfo);
return false;

View File

@ -53,7 +53,6 @@ FileFormat* CreatePcxFormat()
bool PcxFormat::onLoad(FileOp* fop)
{
Image *image;
int c, r, g, b;
int width, height;
int bpp, bytes_per_line;
@ -98,10 +97,10 @@ bool PcxFormat::onLoad(FileOp* fop)
for (c=0; c<60; c++) /* skip some more junk */
fgetc(f);
image = fop_sequence_image(fop, bpp == 8 ?
IMAGE_INDEXED:
IMAGE_RGB,
width, height);
Image* image = fop_sequence_image(fop, bpp == 8 ?
IMAGE_INDEXED:
IMAGE_RGB,
width, height);
if (!image) {
return false;
}

View File

@ -73,7 +73,6 @@ bool PngFormat::onLoad(FileOp* fop)
int num_palette;
png_colorp palette;
png_bytep row_pointer;
Image *image;
PixelFormat pixelFormat;
FileHandle fp(fop->filename.c_str(), "rb");
@ -181,7 +180,7 @@ bool PngFormat::onLoad(FileOp* fop)
int imageWidth = png_get_image_width(png_ptr, info_ptr);
int imageHeight = png_get_image_height(png_ptr, info_ptr);
image = fop_sequence_image(fop, pixelFormat, imageWidth, imageHeight);
Image* image = fop_sequence_image(fop, pixelFormat, imageWidth, imageHeight);
if (!image) {
fop_error(fop, "file_sequence_image %dx%d\n", imageWidth, imageHeight);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);

View File

@ -202,7 +202,6 @@ bool TgaFormat::onLoad(FileOp* fop)
short unsigned int first_color, palette_colors;
short unsigned int left, top, image_width, image_height;
unsigned int c, i, x, y, yc;
Image *image;
int compressed;
FileHandle f(fop->filename.c_str(), "rb");
@ -308,7 +307,7 @@ bool TgaFormat::onLoad(FileOp* fop)
return false;
}
image = fop_sequence_image(fop, pixelFormat, image_width, image_height);
Image* image = fop_sequence_image(fop, pixelFormat, image_width, image_height);
if (!image)
return false;

View File

@ -80,12 +80,6 @@ Image* Image::createCopy(const Image* image)
return image_crop(image, 0, 0, image->w, image->h, 0);
}
void image_free(Image* image)
{
ASSERT(image);
delete image;
}
int image_getpixel(const Image* image, int x, int y)
{
if ((x >= 0) && (y >= 0) && (x < image->w) && (y < image->h))

View File

@ -69,8 +69,6 @@ private:
PixelFormat m_format;
};
void image_free(Image* image);
int image_getpixel(const Image* image, int x, int y);
void image_putpixel(Image* image, int x, int y, int color);
void image_putpen(Image* image, Pen* pen, int x, int y, int fg_color, int bg_color);

View File

@ -129,7 +129,7 @@ void LayerImage::destroyAllCels()
ASSERT(image != NULL);
getSprite()->getStock()->removeImage(image);
image_free(image);
delete image;
delete cel;
}
m_cels.clear();

View File

@ -201,7 +201,6 @@ void Mask::subtract(int x, int y, int w, int h)
void Mask::intersect(int x, int y, int w, int h)
{
if (m_bitmap) {
Image *image;
int x1 = m_bounds.x;
int y1 = m_bounds.y;
int x2 = MIN(m_bounds.x+m_bounds.w-1, x+w-1);
@ -212,8 +211,8 @@ void Mask::intersect(int x, int y, int w, int h)
m_bounds.w = x2 - m_bounds.x + 1;
m_bounds.h = y2 - m_bounds.y + 1;
image = image_crop(m_bitmap, m_bounds.x-x1, m_bounds.y-y1, m_bounds.w, m_bounds.h, 0);
image_free(m_bitmap);
Image* image = image_crop(m_bitmap, m_bounds.x-x1, m_bounds.y-y1, m_bounds.w, m_bounds.h, 0);
delete m_bitmap;
m_bitmap = image;
shrink();
@ -481,7 +480,7 @@ void Mask::shrink()
m_bounds.h = y2 - y1 + 1;
Image* image = image_crop(m_bitmap, m_bounds.x-u, m_bounds.y-v, m_bounds.w, m_bounds.h, 0);
image_free(m_bitmap);
delete m_bitmap;
m_bitmap = image;
}

View File

@ -80,7 +80,7 @@ void Pen::set_angle(int angle)
void Pen::clean_pen()
{
if (m_image) {
image_free(m_image);
delete m_image;
m_image = NULL;
}

View File

@ -22,6 +22,7 @@
#include "base/memory.h"
#include "base/remove_from_container.h"
#include "base/unique_ptr.h"
#include "raster/raster.h"
#include <cstring>
@ -379,11 +380,10 @@ int Sprite::getPixel(int x, int y, FrameNumber frame) const
int color = 0;
if ((x >= 0) && (y >= 0) && (x < m_width) && (y < m_height)) {
Image* image = Image::create(m_format, 1, 1);
UniquePtr<Image> image(Image::create(m_format, 1, 1));
image_clear(image, (m_format == IMAGE_INDEXED ? getTransparentColor(): 0));
render(image, -x, -y, frame);
color = image_getpixel(image, 0, 0);
image_free(image);
}
return color;

View File

@ -84,7 +84,13 @@ Image* Stock::getImage(int index) const
int Stock::addImage(Image* image)
{
int i = m_image.size();
m_image.resize(m_image.size()+1);
try {
m_image.resize(m_image.size()+1);
}
catch (...) {
delete image;
throw;
}
m_image[i] = image;
return i;
}

View File

@ -58,6 +58,6 @@ void ReplaceImage::revert(ObjectsContainer* objects, UndoersCollector* redoers)
// Replace the image in the stock
stock->replaceImage(m_imageIndex, image);
// destroy the old image
image_free(oldImage);
// Destroy the old image
delete oldImage;
}

View File

@ -106,8 +106,8 @@ void move_cel(ContextWriter& writer)
image */
if (!src_layer->isBackground() &&
dst_layer->isBackground()) {
Image *src_image = sprite->getStock()->getImage(src_cel->getImage());
Image *dst_image = image_crop(src_image,
Image* src_image = sprite->getStock()->getImage(src_cel->getImage());
Image* dst_image = image_crop(src_image,
-src_cel->getX(),
-src_cel->getY(),
sprite->getWidth(),
@ -127,7 +127,7 @@ void move_cel(ContextWriter& writer)
src_cel->setOpacity(255);
sprite->getStock()->replaceImage(src_cel->getImage(), dst_image);
image_free(src_image);
delete src_image;
}
if (undo.isEnabled())
@ -247,7 +247,7 @@ static void remove_cel(Sprite* sprite, UndoTransaction& undo, LayerImage *layer,
sprite->getStock(), cel->getImage()));
sprite->getStock()->removeImage(image);
image_free(image);
delete image;
}
if (undo.isEnabled()) {

View File

@ -209,7 +209,7 @@ void util::clipboard::paste()
editor->pasteImage(src_image, clipboard_x, clipboard_y);
if (src_image != clipboard_image)
image_free(src_image);
delete src_image;
}
bool util::clipboard::get_image_size(gfx::Size& size)

View File

@ -189,7 +189,7 @@ void ExpandCelCanvas::commit()
m_sprite->getStock()->replaceImage(m_cel->getImage(), m_dstImage);
// Destroy the old cel image.
image_free(m_celImage);
delete m_celImage;
// Now the m_dstImage is used, so we haven't to destroy it.
m_dstImage = NULL;

View File

@ -20,12 +20,13 @@
#include <allegro.h>
#include "base/unique_ptr.h"
#include "raster/image.h"
#include "raster/mask.h"
#include "util/pic_file.h"
/* loads a MSK file (Animator and Animator Pro format) */
Mask *load_msk_file(const char *filename)
// Loads a MSK file (Animator and Animator Pro format)
Mask* load_msk_file(const char* filename)
{
#if (MAKE_VERSION(4, 2, 1) >= MAKE_VERSION(ALLEGRO_VERSION, \
ALLEGRO_SUB_VERSION, \
@ -45,21 +46,16 @@ Mask *load_msk_file(const char *filename)
size = pack_igetl(f);
magic = pack_igetw(f);
/* Animator Pro MSK format */
// Animator Pro MSK format
if ((size == orig_size) && (magic == 0x9500)) {
Image *image;
int x, y;
pack_fclose(f);
/* just load an Animator Pro PIC file */
image = load_pic_file(filename, &x, &y, NULL);
if ((!image) || (image->getPixelFormat() != IMAGE_BITMAP)) {
if (image)
image_free(image);
}
else {
mask = new Mask(x, y, image);
// Just load an Animator Pro PIC file
UniquePtr<Image> image(load_pic_file(filename, &x, &y, NULL));
if (image != NULL && (image->getPixelFormat() == IMAGE_BITMAP)) {
mask = new Mask(x, y, image.release());
}
}
// Animator MSK format
@ -88,8 +84,8 @@ Mask *load_msk_file(const char *filename)
return mask;
}
/* saves an Animator Pro MSK file (really a PIC file) */
int save_msk_file(const Mask *mask, const char *filename)
// Saves an Animator Pro MSK file (really a PIC file)
int save_msk_file(const Mask* mask, const char* filename)
{
if (mask->getBitmap())
return save_pic_file(filename,

View File

@ -21,16 +21,17 @@
#include <allegro/color.h>
#include <allegro/file.h>
#include "base/unique_ptr.h"
#include "raster/image.h"
/* loads a PIC file (Animator and Animator Pro format) */
Image *load_pic_file(const char *filename, int *x, int *y, RGB *palette)
// Loads a PIC file (Animator and Animator Pro format)
Image* load_pic_file(const char* filename, int* x, int* y, RGB* palette)
{
UniquePtr<Image> image;
int size, compression;
int image_size;
int block_size;
int block_type;
Image *image;
PACKFILE *f;
int version;
int r, g, b;
@ -74,15 +75,15 @@ Image *load_pic_file(const char *filename, int *x, int *y, RGB *palette)
}
}
/* read image */
image = Image::create(IMAGE_INDEXED, w, h);
// Read image
image.reset(Image::create(IMAGE_INDEXED, w, h));
for (v=0; v<h; v++)
for (u=0; u<w; u++)
image->putpixel(u, v, pack_getc(f));
pack_fclose (f);
return image;
pack_fclose(f);
return image.release();
}
/* rewind */
@ -117,7 +118,7 @@ Image *load_pic_file(const char *filename, int *x, int *y, RGB *palette)
size -= 64; /* the header uses 64 bytes */
image = Image::create(bpp == 8 ? IMAGE_INDEXED: IMAGE_BITMAP, w, h);
image.reset(Image::create(bpp == 8 ? IMAGE_INDEXED: IMAGE_BITMAP, w, h));
/* read blocks to end of file */
while (size > 0) {
@ -130,7 +131,6 @@ Image *load_pic_file(const char *filename, int *x, int *y, RGB *palette)
case 0:
version = pack_igetw (f); /* palette version */
if (version != 0) {
image_free (image);
pack_fclose (f);
return NULL;
}
@ -169,10 +169,10 @@ Image *load_pic_file(const char *filename, int *x, int *y, RGB *palette)
}
pack_fclose (f);
return image;
return image.release();
}
/* saves an Animator Pro PIC file */
// Saves an Animator Pro PIC file
int save_pic_file(const char *filename, int x, int y,
const RGB* palette, const Image* image)
{

View File

@ -26,6 +26,7 @@
#include "app/color.h"
#include "app/color_utils.h"
#include "base/bind.h"
#include "base/unique_ptr.h"
#include "commands/commands.h"
#include "commands/params.h"
#include "document_location.h"
@ -404,8 +405,9 @@ void Editor::drawSpriteUnclippedRect(const gfx::Rect& rc)
RenderEngine renderEngine(m_document, m_sprite, m_layer, m_frame);
// Generate the rendered image
Image* rendered = renderEngine.renderSprite(source_x, source_y, width, height,
m_frame, m_zoom, true);
UniquePtr<Image> rendered
(renderEngine.renderSprite(source_x, source_y, width, height,
m_frame, m_zoom, true));
if (rendered) {
// Pre-render decorator.
@ -421,15 +423,12 @@ void Editor::drawSpriteUnclippedRect(const gfx::Rect& rc)
image_to_allegro(rendered, bmp, 0, 0, m_sprite->getPalette(m_frame));
blit(bmp, ji_screen, 0, 0, dest_x, dest_y, width, height);
image_free(rendered);
destroy_bitmap(bmp);
#else
acquire_bitmap(ji_screen);
image_to_allegro(rendered, ji_screen, dest_x, dest_y,
m_sprite->getPalette(m_frame));
release_bitmap(ji_screen);
image_free(rendered);
#endif
}
}