mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-10 21:44:22 +00:00
Add support to use ColorQuantization from scripts
This commit is contained in:
parent
35aaa18ee3
commit
f317f9594d
@ -207,7 +207,6 @@ if(ENABLE_UI)
|
|||||||
commands/cmd_clear_cel.cpp
|
commands/cmd_clear_cel.cpp
|
||||||
commands/cmd_clear_recent_files.cpp
|
commands/cmd_clear_recent_files.cpp
|
||||||
commands/cmd_close_file.cpp
|
commands/cmd_close_file.cpp
|
||||||
commands/cmd_color_quantization.cpp
|
|
||||||
commands/cmd_contiguous_fill.cpp
|
commands/cmd_contiguous_fill.cpp
|
||||||
commands/cmd_copy.cpp
|
commands/cmd_copy.cpp
|
||||||
commands/cmd_copy_cel.cpp
|
commands/cmd_copy_cel.cpp
|
||||||
@ -494,6 +493,7 @@ add_library(app-lib
|
|||||||
commands/cmd_canvas_size.cpp
|
commands/cmd_canvas_size.cpp
|
||||||
commands/cmd_cel_opacity.cpp
|
commands/cmd_cel_opacity.cpp
|
||||||
commands/cmd_change_pixel_format.cpp
|
commands/cmd_change_pixel_format.cpp
|
||||||
|
commands/cmd_color_quantization.cpp
|
||||||
commands/cmd_crop.cpp
|
commands/cmd_crop.cpp
|
||||||
commands/cmd_export_sprite_sheet.cpp
|
commands/cmd_export_sprite_sheet.cpp
|
||||||
commands/cmd_flatten_layers.cpp
|
commands/cmd_flatten_layers.cpp
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
#include "app/app.h"
|
#include "app/app.h"
|
||||||
#include "app/cmd/set_palette.h"
|
#include "app/cmd/set_palette.h"
|
||||||
#include "app/commands/command.h"
|
#include "app/commands/new_params.h"
|
||||||
#include "app/console.h"
|
#include "app/console.h"
|
||||||
#include "app/context.h"
|
#include "app/context.h"
|
||||||
#include "app/context_access.h"
|
#include "app/context_access.h"
|
||||||
@ -29,9 +29,18 @@
|
|||||||
|
|
||||||
#include "palette_from_sprite.xml.h"
|
#include "palette_from_sprite.xml.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
namespace app {
|
namespace app {
|
||||||
|
|
||||||
class ColorQuantizationCommand : public Command {
|
struct ColorQuantizationParams : public NewParams {
|
||||||
|
Param<bool> ui { this, true, "ui" };
|
||||||
|
Param<bool> withAlpha { this, true, "withAlpha" };
|
||||||
|
Param<int> maxColors { this, 256, "maxColors" };
|
||||||
|
Param<bool> useRange { this, false, "useRange" };
|
||||||
|
};
|
||||||
|
|
||||||
|
class ColorQuantizationCommand : public CommandWithNewParams<ColorQuantizationParams> {
|
||||||
public:
|
public:
|
||||||
ColorQuantizationCommand();
|
ColorQuantizationCommand();
|
||||||
|
|
||||||
@ -41,37 +50,44 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
ColorQuantizationCommand::ColorQuantizationCommand()
|
ColorQuantizationCommand::ColorQuantizationCommand()
|
||||||
: Command(CommandId::ColorQuantization(), CmdRecordableFlag)
|
: CommandWithNewParams<ColorQuantizationParams>(
|
||||||
|
CommandId::ColorQuantization(),
|
||||||
|
CmdRecordableFlag)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ColorQuantizationCommand::onEnabled(Context* context)
|
bool ColorQuantizationCommand::onEnabled(Context* ctx)
|
||||||
{
|
{
|
||||||
return context->checkFlags(ContextFlags::ActiveDocumentIsWritable);
|
return ctx->checkFlags(ContextFlags::ActiveDocumentIsWritable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ColorQuantizationCommand::onExecute(Context* context)
|
void ColorQuantizationCommand::onExecute(Context* ctx)
|
||||||
{
|
{
|
||||||
try {
|
#ifdef ENABLE_UI
|
||||||
|
const bool ui = (params().ui() && ctx->isUIAvailable());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool withAlpha = params().withAlpha();
|
||||||
|
int maxColors = params().maxColors();
|
||||||
|
bool createPal;
|
||||||
|
|
||||||
|
Site site = ctx->activeSite();
|
||||||
|
PalettePicks entries = site.selectedColors();
|
||||||
|
|
||||||
|
#ifdef ENABLE_UI
|
||||||
|
if (ui) {
|
||||||
app::gen::PaletteFromSprite window;
|
app::gen::PaletteFromSprite window;
|
||||||
PalettePicks entries;
|
|
||||||
|
|
||||||
Sprite* sprite;
|
|
||||||
frame_t frame;
|
|
||||||
Palette* curPalette;
|
|
||||||
{
|
{
|
||||||
ContextReader reader(context);
|
ContextReader reader(ctx);
|
||||||
Site site = context->activeSite();
|
const Palette* curPalette = site.sprite()->palette(site.frame());
|
||||||
sprite = site.sprite();
|
|
||||||
frame = site.frame();
|
if (!params().withAlpha.isSet())
|
||||||
curPalette = sprite->palette(frame);
|
withAlpha = App::instance()->preferences().quantization.withAlpha();
|
||||||
|
|
||||||
window.newPalette()->setSelected(true);
|
window.newPalette()->setSelected(true);
|
||||||
window.alphaChannel()->setSelected(
|
window.alphaChannel()->setSelected(withAlpha);
|
||||||
App::instance()->preferences().quantization.withAlpha());
|
window.ncolors()->setTextf("%d", maxColors);
|
||||||
window.ncolors()->setText("256");
|
|
||||||
|
|
||||||
ColorBar::instance()->getPaletteView()->getSelectedEntries(entries);
|
|
||||||
if (entries.picks() > 1) {
|
if (entries.picks() > 1) {
|
||||||
window.currentRange()->setTextf(
|
window.currentRange()->setTextf(
|
||||||
"%s, %d color(s)",
|
"%s, %d color(s)",
|
||||||
@ -91,26 +107,39 @@ void ColorQuantizationCommand::onExecute(Context* context)
|
|||||||
if (window.closer() != window.ok())
|
if (window.closer() != window.ok())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool withAlpha = window.alphaChannel()->isSelected();
|
maxColors = window.ncolors()->textInt();
|
||||||
|
withAlpha = window.alphaChannel()->isSelected();
|
||||||
App::instance()->preferences().quantization.withAlpha(withAlpha);
|
App::instance()->preferences().quantization.withAlpha(withAlpha);
|
||||||
|
|
||||||
bool createPal = false;
|
|
||||||
if (window.newPalette()->isSelected()) {
|
if (window.newPalette()->isSelected()) {
|
||||||
int n = window.ncolors()->textInt();
|
|
||||||
n = MAX(1, n);
|
|
||||||
entries = PalettePicks(n);
|
|
||||||
entries.all();
|
|
||||||
createPal = true;
|
createPal = true;
|
||||||
}
|
}
|
||||||
else if (window.currentPalette()->isSelected()) {
|
else {
|
||||||
entries.all();
|
createPal = false;
|
||||||
|
if (window.currentPalette()->isSelected())
|
||||||
|
entries.all();
|
||||||
}
|
}
|
||||||
if (entries.picks() == 0)
|
}
|
||||||
return;
|
else
|
||||||
|
#endif // ENABLE_UI
|
||||||
|
{
|
||||||
|
createPal = (!params().useRange());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (createPal) {
|
||||||
|
entries = PalettePicks(std::max(1, maxColors));
|
||||||
|
entries.all();
|
||||||
|
}
|
||||||
|
if (entries.picks() == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
ContextReader reader(ctx);
|
||||||
|
Sprite* sprite = site.sprite();
|
||||||
|
frame_t frame = site.frame();
|
||||||
|
const Palette* curPalette = site.sprite()->palette(frame);
|
||||||
Palette tmpPalette(frame, entries.picks());
|
Palette tmpPalette(frame, entries.picks());
|
||||||
|
|
||||||
ContextReader reader(context);
|
|
||||||
SpriteJob job(reader, "Color Quantization");
|
SpriteJob job(reader, "Color Quantization");
|
||||||
const bool newBlend = Preferences::instance().experimental.newBlend();
|
const bool newBlend = Preferences::instance().experimental.newBlend();
|
||||||
job.startJobWithCallback(
|
job.startJobWithCallback(
|
||||||
@ -144,8 +173,12 @@ void ColorQuantizationCommand::onExecute(Context* context)
|
|||||||
if (*curPalette != *newPalette)
|
if (*curPalette != *newPalette)
|
||||||
job.tx()(new cmd::SetPalette(sprite, frame, newPalette.get()));
|
job.tx()(new cmd::SetPalette(sprite, frame, newPalette.get()));
|
||||||
|
|
||||||
set_current_palette(newPalette.get(), false);
|
#ifdef ENABLE_UI
|
||||||
ui::Manager::getDefault()->invalidate();
|
if (ui) {
|
||||||
|
set_current_palette(newPalette.get(), false);
|
||||||
|
ui::Manager::getDefault()->invalidate();
|
||||||
|
}
|
||||||
|
#endif // ENABLE_UI
|
||||||
}
|
}
|
||||||
catch (const base::Exception& e) {
|
catch (const base::Exception& e) {
|
||||||
Console::showException(e);
|
Console::showException(e);
|
||||||
|
@ -12,6 +12,7 @@ FOR_EACH_COMMAND(CanvasSize)
|
|||||||
FOR_EACH_COMMAND(CelOpacity)
|
FOR_EACH_COMMAND(CelOpacity)
|
||||||
FOR_EACH_COMMAND(ChangePixelFormat)
|
FOR_EACH_COMMAND(ChangePixelFormat)
|
||||||
FOR_EACH_COMMAND(ColorCurve)
|
FOR_EACH_COMMAND(ColorCurve)
|
||||||
|
FOR_EACH_COMMAND(ColorQuantization)
|
||||||
FOR_EACH_COMMAND(ConvolutionMatrix)
|
FOR_EACH_COMMAND(ConvolutionMatrix)
|
||||||
FOR_EACH_COMMAND(CopyColors)
|
FOR_EACH_COMMAND(CopyColors)
|
||||||
FOR_EACH_COMMAND(CropSprite)
|
FOR_EACH_COMMAND(CropSprite)
|
||||||
@ -52,7 +53,6 @@ FOR_EACH_COMMAND(ClearCel)
|
|||||||
FOR_EACH_COMMAND(ClearRecentFiles)
|
FOR_EACH_COMMAND(ClearRecentFiles)
|
||||||
FOR_EACH_COMMAND(CloseAllFiles)
|
FOR_EACH_COMMAND(CloseAllFiles)
|
||||||
FOR_EACH_COMMAND(CloseFile)
|
FOR_EACH_COMMAND(CloseFile)
|
||||||
FOR_EACH_COMMAND(ColorQuantization)
|
|
||||||
FOR_EACH_COMMAND(ContiguousFill)
|
FOR_EACH_COMMAND(ContiguousFill)
|
||||||
FOR_EACH_COMMAND(Copy)
|
FOR_EACH_COMMAND(Copy)
|
||||||
FOR_EACH_COMMAND(CopyCel)
|
FOR_EACH_COMMAND(CopyCel)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user