Use rendered images to create optimized palette in render::create_palette_from_rgb()

This commit is contained in:
David Capello 2015-05-21 10:17:59 -03:00
parent 13ac74f37a
commit 85d638097b
4 changed files with 28 additions and 40 deletions

View File

@ -64,7 +64,7 @@ void ColorQuantizationCommand::onExecute(Context* context)
int n = entries.picks(); int n = entries.picks();
Palette palette(frame, n); Palette palette(frame, n);
render::create_palette_from_rgb(sprite, frame, &palette); render::create_palette_from_rgb(sprite, 0, sprite->lastFrame(), &palette);
Palette newPalette(*get_current_palette()); Palette newPalette(*get_current_palette());

View File

@ -706,18 +706,18 @@ void fop_post_load(FileOp* fop)
return; return;
} }
if (fop->document->sprite() != NULL) { Sprite* sprite = fop->document->sprite();
if (sprite) {
// Creates a suitable palette for RGB images // Creates a suitable palette for RGB images
if (fop->document->sprite()->pixelFormat() == IMAGE_RGB && if (sprite->pixelFormat() == IMAGE_RGB &&
fop->document->sprite()->getPalettes().size() <= 1 && sprite->getPalettes().size() <= 1 &&
fop->document->sprite()->palette(frame_t(0))->isBlack()) { sprite->palette(frame_t(0))->isBlack()) {
base::SharedPtr<Palette> palette base::SharedPtr<Palette> palette(
(render::create_palette_from_rgb( render::create_palette_from_rgb(
fop->document->sprite(), sprite, frame_t(0), sprite->lastFrame(), nullptr));
frame_t(0), NULL));
fop->document->sprite()->resetPalettes(); sprite->resetPalettes();
fop->document->sprite()->setPalette(palette.get(), false); sprite->setPalette(palette.get(), false);
} }
} }

View File

@ -43,43 +43,30 @@ static Image* ordered_dithering(
Palette* create_palette_from_rgb( Palette* create_palette_from_rgb(
const Sprite* sprite, const Sprite* sprite,
frame_t frameNumber, frame_t fromFrame,
frame_t toFrame,
Palette* palette) Palette* palette)
{ {
PaletteOptimizer optimizer;
if (!palette) if (!palette)
palette = new Palette(frame_t(0), Palette::MaxColors); palette = new Palette(fromFrame, Palette::MaxColors);
bool has_background_layer = (sprite->backgroundLayer() != NULL); bool has_background_layer = (sprite->backgroundLayer() != nullptr);
ImagesCollector images(
sprite->folder(), // All layers
frameNumber, // Ignored, we'll use all frames
true, // All frames,
false); // forWrite=false, read only
// Add a flat image with the current sprite's frame rendered // Add a flat image with the current sprite's frame rendered
ImageRef flat_image(Image::create(sprite->pixelFormat(), ImageRef flat_image(Image::create(IMAGE_RGB,
sprite->width(), sprite->height())); sprite->width(), sprite->height()));
render::Render().renderSprite(flat_image.get(), sprite, frameNumber); // Feed the optimizer with all rendered frames
render::Render render;
// Create an array of images for (frame_t frame=fromFrame; frame<=toFrame; ++frame) {
std::vector<Image*> image_array; render.renderSprite(flat_image.get(), sprite, frame);
std::map<ObjectId, Image*> used_images; optimizer.feedWithImage(flat_image.get());
for (auto it=images.begin(); it!=images.end(); ++it) {
Image* image = it->image();
ObjectId imageId = image->id();
if (used_images.find(imageId) == used_images.end()) {
used_images.insert(std::make_pair(imageId, image));
image_array.push_back(image);
}
} }
image_array.push_back(flat_image.get());
// Generate an optimized palette for all images // Generate an optimized palette
create_palette_from_images(image_array, palette, has_background_layer); optimizer.calculate(palette, has_background_layer);
return palette; return palette;
} }

View File

@ -1,5 +1,5 @@
// Aseprite Rener Library // Aseprite Rener Library
// Copyright (c) 2001-2014 David Capello // Copyright (c) 2001-2015 David Capello
// //
// This file is released under the terms of the MIT license. // This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information. // Read LICENSE.txt for more information.
@ -43,7 +43,8 @@ namespace render {
// Creates a new palette suitable to quantize the given RGB sprite to Indexed color. // Creates a new palette suitable to quantize the given RGB sprite to Indexed color.
Palette* create_palette_from_rgb( Palette* create_palette_from_rgb(
const Sprite* sprite, const Sprite* sprite,
frame_t frameNumber, frame_t fromFrame,
frame_t toFrame,
Palette* newPalette); // Can be NULL to create a new palette Palette* newPalette); // Can be NULL to create a new palette
// Changes the image pixel format. The dithering method is used only // Changes the image pixel format. The dithering method is used only