mirror of
https://github.com/aseprite/aseprite.git
synced 2025-03-01 10:13:22 +00:00
Use rendered images to create optimized palette in render::create_palette_from_rgb()
This commit is contained in:
parent
13ac74f37a
commit
85d638097b
@ -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());
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user