Skip to content

Commit

Permalink
refactor: clean up Magick++ target a bit (#2822)
Browse files Browse the repository at this point in the history
refactor: clean up Magick++ target a bit
  • Loading branch information
ice0 committed Sep 9, 2022
2 parents 1ce65b6 + ee9d66f commit 2d4d77a
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 49 deletions.
73 changes: 32 additions & 41 deletions synfig-core/src/modules/mod_magickpp/trgt_magickpp.cpp
Expand Up @@ -98,7 +98,7 @@ magickpp_trgt::~magickpp_trgt()
if (multiple_images)
{
// check whether this file format supports multiple-image files
Magick::Image image(*(images.begin()));
Magick::Image image(images.front());
image.fileName(filename);
try
{
Expand Down Expand Up @@ -199,9 +199,6 @@ magickpp_trgt::~magickpp_trgt()
synfig::error("unknown exception");
}

if (buffer1) delete [] buffer1;
if (buffer2) delete [] buffer2;
if (color_buffer) delete [] color_buffer;
//exceptionInfo = MagickCore::DestroyExceptionInfo(exceptionInfo);
MagickCore::DestroyExceptionInfo(exceptionInfo);
}
Expand All @@ -219,79 +216,73 @@ magickpp_trgt::init(synfig::ProgressCallback*)
width = desc.get_w();
height = desc.get_h();

start_pointer = nullptr;
buffer_pointer = nullptr;

buffer1 = new unsigned char[4*width*height];
if (!buffer1)
return false;
std::string extension = filename_extension(filename);
std::transform(extension.begin(), extension.end(), extension.begin(), [](unsigned char c) { return std::tolower(c); });
is_gif = extension == ".gif";

buffer2 = new unsigned char[4*width*height];
if (!buffer2)
{
delete [] buffer1;
return false;
}
std::size_t buffer_size = static_cast<std::size_t>(4) * width * height;
buffer1.resize(buffer_size);
if (is_gif)
buffer2.resize(buffer_size);

color_buffer = new Color[width];
if (!color_buffer)
{
delete [] buffer1;
delete [] buffer2;
return false;
}
color_buffer.resize(width);

return true;
}

void
magickpp_trgt::end_frame()
{
Magick::Image image(width, height, "RGBA", Magick::CharPixel, start_pointer);
if (transparent && images.begin() != images.end())
(images.end()-1)->gifDisposeMethod(Magick::BackgroundDispose);
Magick::Image image(width, height, "RGBA", Magick::CharPixel, buffer_pointer);
if (is_gif && transparent && images.size() > 1)
images.back().gifDisposeMethod(Magick::BackgroundDispose);
images.push_back(image);
}

bool
magickpp_trgt::start_frame(synfig::ProgressCallback */*callback*/)
{
if (start_pointer == buffer1)
start_pointer = buffer_pointer = buffer2;
else
start_pointer = buffer_pointer = buffer1;
if (is_gif)
previous_row_buffer_pointer = buffer_pointer;

previous_buffer_pointer = start_pointer;
if (is_gif && buffer_pointer == buffer1.data())
buffer_pointer = current_row_buffer_pointer = buffer2.data();
else
buffer_pointer = current_row_buffer_pointer = buffer1.data();

transparent = false;

return true;
}

Color*
magickpp_trgt::start_scanline(int /*scanline*/)
{
return color_buffer;
return color_buffer.data();
}

bool
magickpp_trgt::end_scanline()
{
if (previous_buffer_pointer)
color_to_pixelformat(previous_buffer_pointer, color_buffer, PF_RGB|PF_A, 0, width);

if (!transparent)
for (int i = 0; i < width; i++)
if (previous_buffer_pointer && // this isn't the first frame
buffer_pointer[i*4 + 3] < 128 && // our pixel is transparent
!(previous_buffer_pointer[i*4 + 3] < 128)) // the previous frame's pixel wasn't
color_to_pixelformat(current_row_buffer_pointer, color_buffer.data(), PF_RGB|PF_A, 0, width);

if (!transparent && previous_row_buffer_pointer) {
for (int i = 0; i < width; i++) {
if (current_row_buffer_pointer[i*4 + 3] < 128 && // our pixel is transparent
!(previous_row_buffer_pointer[i*4 + 3] < 128)) // the previous frame's pixel wasn't
{
transparent = true;
break;
}
}
}

buffer_pointer += 4 * width;
current_row_buffer_pointer += 4 * width;

if (previous_buffer_pointer)
previous_buffer_pointer += 4 * width;
if (previous_row_buffer_pointer)
previous_row_buffer_pointer += 4 * width;

return true;
}
17 changes: 9 additions & 8 deletions synfig-core/src/modules/mod_magickpp/trgt_magickpp.h
Expand Up @@ -56,10 +56,13 @@ class magickpp_trgt : public synfig::Target_Scanline
int width, height;

synfig::String filename;
unsigned char *buffer1, *start_pointer, *buffer_pointer;
unsigned char *buffer2, *previous_buffer_pointer;
std::vector<unsigned char> buffer1, buffer2;
unsigned char* buffer_pointer;
unsigned char* current_row_buffer_pointer;
unsigned char* previous_row_buffer_pointer;
bool transparent;
synfig::Color *color_buffer;
bool is_gif;
std::vector<synfig::Color> color_buffer;
std::vector<Magick::Image> images;
synfig::String sequence_separator;

Expand All @@ -69,13 +72,11 @@ class magickpp_trgt : public synfig::Target_Scanline
width(),
height(),
filename(filename),
buffer1(nullptr),
start_pointer(nullptr),
buffer_pointer(nullptr),
buffer2(nullptr),
previous_buffer_pointer(nullptr),
current_row_buffer_pointer(nullptr),
previous_row_buffer_pointer(nullptr),
transparent(),
color_buffer(nullptr),
is_gif(false),
sequence_separator(params.sequence_separator)
{ }
virtual ~magickpp_trgt();
Expand Down

0 comments on commit 2d4d77a

Please sign in to comment.