Fix ink tests when ENABLE_UI=0

It looks like we cannot trust in the get_current_palette() content
when we are running scripts without UI. So it's preferable if we get
the palette directly from the sprite.

We should completely remove the get_current_palette() function.

Tests can be found in https://github.com/aseprite/tests/blob/main/scripts/inks.lua
This commit is contained in:
David Capello 2022-03-02 21:27:06 -03:00
parent 4b3b1f31e0
commit 31ce326d5b
6 changed files with 28 additions and 20 deletions

View File

@ -1,4 +1,5 @@
// Aseprite
// Copyright (C) 2022 Igara Studio S.A.
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
@ -119,6 +120,9 @@ void load_default_palette()
set_current_palette(nullptr, true);
}
// TODO This palette isn't synced with the current sprite palette when
// ENABLE_UI=0 and we are running scripts, we should remove this
// function and use the active Site palette.
Palette* get_current_palette()
{
return ase_current_palette;

View File

@ -1,12 +1,11 @@
// Aseprite
// Copyright (C) 2019-2020 Igara Studio S.A.
// Copyright (C) 2019-2022 Igara Studio S.A.
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
#include "app/color_utils.h"
#include "app/modules/palettes.h"
#include "app/util/wrap_point.h"
#include "app/util/wrap_value.h"
#include "base/clamp.h"
@ -198,7 +197,7 @@ template<>
class LockAlphaInkProcessing<IndexedTraits> : public DoubleInkProcessing<LockAlphaInkProcessing<IndexedTraits>, IndexedTraits> {
public:
LockAlphaInkProcessing(ToolLoop* loop)
: m_palette(get_current_palette())
: m_palette(loop->getPalette())
, m_rgbmap(loop->getRgbMap())
, m_opacity(loop->getOpacity())
, m_maskIndex(loop->getLayer()->isBackground() ? -1: loop->sprite()->transparentColor()) {
@ -270,7 +269,7 @@ template<>
class TransparentInkProcessing<IndexedTraits> : public DoubleInkProcessing<TransparentInkProcessing<IndexedTraits>, IndexedTraits> {
public:
TransparentInkProcessing(ToolLoop* loop) :
m_palette(get_current_palette()),
m_palette(loop->getPalette()),
m_rgbmap(loop->getRgbMap()),
m_opacity(loop->getOpacity()),
m_maskIndex(loop->getLayer()->isBackground() ? -1: loop->sprite()->transparentColor()),
@ -345,7 +344,7 @@ template<>
class MergeInkProcessing<IndexedTraits> : public DoubleInkProcessing<MergeInkProcessing<IndexedTraits>, IndexedTraits> {
public:
MergeInkProcessing(ToolLoop* loop) :
m_palette(get_current_palette()),
m_palette(loop->getPalette()),
m_rgbmap(loop->getRgbMap()),
m_opacity(loop->getOpacity()),
m_maskIndex(loop->getLayer()->isBackground() ? -1: loop->sprite()->transparentColor()) {
@ -496,12 +495,12 @@ template<>
class BlurInkProcessing<IndexedTraits> : public DoubleInkProcessing<BlurInkProcessing<IndexedTraits>, IndexedTraits> {
public:
BlurInkProcessing(ToolLoop* loop) :
m_palette(get_current_palette()),
m_palette(loop->getPalette()),
m_rgbmap(loop->getRgbMap()),
m_opacity(loop->getOpacity()),
m_tiledMode(loop->getTiledMode()),
m_srcImage(loop->getSrcImage()),
m_area(get_current_palette(),
m_area(loop->getPalette(),
loop->getLayer()->isBackground() ? -1: loop->sprite()->transparentColor()) {
}
@ -616,7 +615,7 @@ template<>
class ReplaceInkProcessing<IndexedTraits> : public DoubleInkProcessing<ReplaceInkProcessing<IndexedTraits>, IndexedTraits> {
public:
ReplaceInkProcessing(ToolLoop* loop) {
m_palette = get_current_palette();
m_palette = loop->getPalette();
m_rgbmap = loop->getRgbMap();
m_color1 = loop->getPrimaryColor();
m_color2 = loop->getSecondaryColor();
@ -655,7 +654,7 @@ template<typename ImageTraits>
class JumbleInkProcessing : public DoubleInkProcessing<JumbleInkProcessing<ImageTraits>, ImageTraits> {
public:
JumbleInkProcessing(ToolLoop* loop) :
m_palette(get_current_palette()),
m_palette(loop->getPalette()),
m_rgbmap(loop->getRgbMap()),
m_speed(loop->getSpeed() / 4),
m_opacity(loop->getOpacity()),
@ -851,7 +850,7 @@ public:
using pixel_t = IndexedTraits::pixel_t;
PixelShadingInkHelper(ToolLoop* loop) :
m_palette(get_current_palette()),
m_palette(loop->getPalette()),
m_remap(loop->getShadingRemap()),
m_left(loop->getMouseButton() == ToolLoop::Left) {
}
@ -968,7 +967,7 @@ public:
GradientInkProcessing(ToolLoop* loop)
: GradientRenderer(loop)
, m_opacity(loop->getOpacity())
, m_palette(get_current_palette())
, m_palette(loop->getPalette())
, m_rgbmap(loop->getRgbMap())
, m_maskIndex(loop->getLayer()->isBackground() ? -1: loop->sprite()->transparentColor())
{
@ -1101,7 +1100,7 @@ template<>
class XorInkProcessing<IndexedTraits> : public DoubleInkProcessing<XorInkProcessing<IndexedTraits>, IndexedTraits> {
public:
XorInkProcessing(ToolLoop* loop) :
m_palette(get_current_palette()),
m_palette(loop->getPalette()),
m_rgbmap(loop->getRgbMap()),
m_color(m_palette->getEntry(loop->getPrimaryColor())) {
}
@ -1138,7 +1137,7 @@ public:
BrushInkProcessingBase(ToolLoop* loop) {
m_fgColor = loop->getPrimaryColor();
m_bgColor = loop->getSecondaryColor();
m_palette = get_current_palette();
m_palette = loop->getPalette();
m_brush = loop->getBrush();
m_brushImage = (m_brush->patternImage() ? m_brush->patternImage():
m_brush->image());

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2018-2020 Igara Studio S.A.
// Copyright (C) 2018-2022 Igara Studio S.A.
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
@ -143,7 +143,7 @@ public:
else if (color == loop->sprite()->transparentColor())
opaque = false;
else {
color = get_current_palette()->getEntry(color);
color = loop->getPalette()->getEntry(color);
opaque = (rgba_geta(color) == 255);
}
break;

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2019-2021 Igara Studio S.A.
// Copyright (C) 2019-2022 Igara Studio S.A.
// Copyright (C) 2001-2017 David Capello
//
// This program is distributed under the terms of
@ -117,9 +117,9 @@ public:
int maskIndex = (loop->getLayer()->isBackground() ? -1: loop->sprite()->transparentColor());
// Convert index to RGBA
if (a == maskIndex) a = 0;
else a = get_current_palette()->getEntry(a);
else a = loop->getPalette()->getEntry(a);
if (b == maskIndex) b = 0;
else b = get_current_palette()->getEntry(b);
else b = loop->getPalette()->getEntry(b);
// Same as in RGBA gradient
if (rgba_geta(a) == 0) a = b;
else if (rgba_geta(b) == 0) b = a;

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2019-2020 Igara Studio S.A.
// Copyright (C) 2019-2022 Igara Studio S.A.
// Copyright (C) 2001-2017 David Capello
//
// This program is distributed under the terms of
@ -29,6 +29,7 @@ namespace doc {
class Image;
class Layer;
class Mask;
class Palette;
class Remap;
class RgbMap;
class Slice;
@ -120,6 +121,9 @@ namespace app {
// image, used by "overlap" tools like jumble or spray.
virtual void copyValidDstToSrcImage(const gfx::Region& rgn) = 0;
// Returns the current Palette.
virtual Palette* getPalette() = 0;
// Returns the RGB map used to convert RGB values to palette index.
virtual RgbMap* getRgbMap() = 0;

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2019-2021 Igara Studio S.A.
// Copyright (C) 2019-2022 Igara Studio S.A.
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
@ -248,6 +248,7 @@ public:
Sprite* sprite() override { return m_sprite; }
Layer* getLayer() override { return m_layer; }
frame_t getFrame() override { return m_frame; }
Palette* getPalette() override { return m_sprite->palette(m_frame); }
RgbMap* getRgbMap() override {
if (!m_rgbMap) {
Sprite::RgbMapFor forLayer =