From 3e3dd2a653a6741aeaed18cd8327ec7c396d4b7b Mon Sep 17 00:00:00 2001 From: Gaspar Capello Date: Tue, 11 Feb 2025 11:06:23 -0300 Subject: [PATCH 01/11] Fix timeline thumbnail zoom can't scale beyond 1:1 pixels (fix #4974) Prior this fix when using large thumbnail sizes on the timeline with smaller cel images, instead of enlarging the thumbnail image to fit the full area available, it just adds transparent whitespace around the thumbnail image. --- src/app/thumbnails.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/app/thumbnails.cpp b/src/app/thumbnails.cpp index 971cc81bc..eedae9fa6 100644 --- a/src/app/thumbnails.cpp +++ b/src/app/thumbnails.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2019-2020 Igara Studio S.A. +// Copyright (C) 2019-2025 Igara Studio S.A. // Copyright (C) 2018 David Capello // Copyright (C) 2016 Carlo Caputo // @@ -23,13 +23,7 @@ namespace app { namespace thumb { os::SurfaceRef get_cel_thumbnail(const doc::Cel* cel, const gfx::Size& fitInSize) { - gfx::Size newSize; - - if (cel->bounds().w > fitInSize.w || cel->bounds().h > fitInSize.h) - newSize = gfx::Rect(cel->bounds()).fitIn(gfx::Rect(fitInSize)).size(); - else - newSize = cel->bounds().size(); - + gfx::Size newSize(gfx::Rect(cel->bounds()).fitIn(gfx::Rect(fitInSize)).size()); if (newSize.w < 1 || newSize.h < 1) return nullptr; From 26f6a210b60b3415a7c09e1c9c3fe8a51b083d04 Mon Sep 17 00:00:00 2001 From: Gaspar Capello Date: Wed, 29 Jan 2025 16:50:36 -0300 Subject: [PATCH 02/11] Fix crash with custom pixel ratios (e.g. Size(4, 3)) (fix #4632) Prior this fix some custom pixel ratios + old render engine + zoom level <= 50% resulted in crashes. --- src/app/script/sprite_class.cpp | 8 ++++++-- src/render/projection.h | 16 +++++++++++++++- src/render/render.cpp | 16 ++++++++-------- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/app/script/sprite_class.cpp b/src/app/script/sprite_class.cpp index 899d9aeb3..1cf1831e8 100644 --- a/src/app/script/sprite_class.cpp +++ b/src/app/script/sprite_class.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018-2023 Igara Studio S.A. +// Copyright (C) 2018-2025 Igara Studio S.A. // Copyright (C) 2015-2018 David Capello // // This program is distributed under the terms of @@ -54,6 +54,7 @@ #include "app/ui/doc_view.h" #include "base/convert_to.h" #include "base/fs.h" +#include "base/gcd.h" #include "doc/layer.h" #include "doc/layer_tilemap.h" #include "doc/mask.h" @@ -973,7 +974,10 @@ int Sprite_get_pixelRatio(lua_State* L) int Sprite_set_pixelRatio(lua_State* L) { auto sprite = get_docobj(L, 1); - const gfx::Size pixelRatio = convert_args_into_size(L, 2); + gfx::Size pixelRatio = convert_args_into_size(L, 2); + double gcd = base::gcd(double(pixelRatio.w), double(pixelRatio.h)); + pixelRatio.w = int(double(pixelRatio.w) / gcd); + pixelRatio.h = int(double(pixelRatio.h) / gcd); Tx tx(sprite); tx(new cmd::SetPixelRatio(sprite, pixelRatio)); tx.commit(); diff --git a/src/render/projection.h b/src/render/projection.h index 1597ecac0..8addba473 100644 --- a/src/render/projection.h +++ b/src/render/projection.h @@ -1,5 +1,5 @@ // Aseprite Render Library -// Copyright (c) 2020 Igara Studio S.A. +// Copyright (c) 2020-2025 Igara Studio S.A. // Copyright (c) 2016 David Capello // // This file is released under the terms of the MIT license. @@ -31,6 +31,20 @@ public: void setPixelRatio(const doc::PixelRatio& pixelRatio) { m_pixelRatio = pixelRatio; } void setZoom(const Zoom& zoom) { m_zoom = zoom; } + // To identify simplest composite scale up cases' + bool isSimpleScaleUpCase() const + { + return scaleX() >= 1.0 && scaleY() >= 1.0 && (m_pixelRatio.w == 1 || m_pixelRatio.w % 2 == 0) && + (m_pixelRatio.h == 1 || m_pixelRatio.h % 2 == 0); + } + + // To identify simplest composite scale down cases + bool isSimpleScaleDownCase() const + { + return scaleX() <= 1.0 && scaleY() <= 1.0 && std::fmod(1.0 / scaleX(), 1.0) == 0.0 && + std::fmod(1.0 / scaleY(), 1.0) == 0.0; + } + double scaleX() const { return m_zoom.scale() * m_pixelRatio.w; } double scaleY() const { return m_zoom.scale() * m_pixelRatio.h; } diff --git a/src/render/render.cpp b/src/render/render.cpp index b496dfab5..60cc6223c 100644 --- a/src/render/render.cpp +++ b/src/render/render.cpp @@ -1,5 +1,5 @@ // Aseprite Render Library -// Copyright (C) 2019-2024 Igara Studio S.A. +// Copyright (C) 2019-2025 Igara Studio S.A. // Copyright (C) 2001-2018 David Capello // // This file is released under the terms of the MIT license. @@ -11,6 +11,7 @@ #include "render/render.h" +#include "base/gcd.h" #include "doc/blend_internals.h" #include "doc/blend_mode.h" #include "doc/doc.h" @@ -497,19 +498,18 @@ CompositeImageFunc get_fastest_composition_path(const Projection& proj, else if (finegrain || !proj.zoom().isSimpleZoomLevel()) { return composite_image_general; } - else if (proj.applyX(1) == 1 && proj.applyY(1) == 1) { + else if (proj.scaleX() == 1.0 && proj.scaleY() == 1.0) { return composite_image_without_scale; } - else if (proj.scaleX() >= 1.0 && proj.scaleY() >= 1.0) { + else if (proj.isSimpleScaleUpCase()) { return composite_image_scale_up; } - // Slower composite function for special cases with odd zoom and non-square pixel ratio - else if (((proj.removeX(1) > 1) && (proj.removeX(1) & 1)) || - ((proj.removeY(1) > 1) && (proj.removeY(1) & 1))) { - return composite_image_general; + else if (proj.isSimpleScaleDownCase()) { + return composite_image_scale_down; } else { - return composite_image_scale_down; + // Slower composite function for remaining cases not considered + return composite_image_general; } } From a4e0636c9f7dc4b94222f32aad1fba37b4666a5b Mon Sep 17 00:00:00 2001 From: David Capello Date: Wed, 19 Feb 2025 17:19:27 -0300 Subject: [PATCH 03/11] [lua] don't allow to set invalid pixel ratios (fix #3285) --- src/app/script/sprite_class.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/app/script/sprite_class.cpp b/src/app/script/sprite_class.cpp index 1cf1831e8..467281555 100644 --- a/src/app/script/sprite_class.cpp +++ b/src/app/script/sprite_class.cpp @@ -975,6 +975,9 @@ int Sprite_set_pixelRatio(lua_State* L) { auto sprite = get_docobj(L, 1); gfx::Size pixelRatio = convert_args_into_size(L, 2); + if (pixelRatio.w < 1 || pixelRatio.h < 1) + return luaL_error(L, "invalid pixel ratio = %d:%d", pixelRatio.w, pixelRatio.h); + double gcd = base::gcd(double(pixelRatio.w), double(pixelRatio.h)); pixelRatio.w = int(double(pixelRatio.w) / gcd); pixelRatio.h = int(double(pixelRatio.h) / gcd); From 919f4f33213998f81ab1707ab9d41d1fee54c813 Mon Sep 17 00:00:00 2001 From: David Capello Date: Wed, 19 Feb 2025 17:35:13 -0300 Subject: [PATCH 04/11] Update laf module --- laf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/laf b/laf index b51bee307..bd36a1130 160000 --- a/laf +++ b/laf @@ -1 +1 @@ -Subproject commit b51bee307deb19b79460bd40309abeb57a12c1a8 +Subproject commit bd36a113081aa95da8d03b14a7627083e936c06b From f2b870a17f2a3a6c1b00e341b2b1d0216db0dc3b Mon Sep 17 00:00:00 2001 From: Gaspar Capello Date: Fri, 14 Feb 2025 15:49:58 -0300 Subject: [PATCH 05/11] Fix image:drawImage+BlendMode.SRC doesn't draw mask pixels (fix #5001) Also added tests for Image:drawImage + BlendMode::SRC + ColorMode.RGBA --- src/doc/blend_internals.h | 10 +++++++++- tests/scripts/image.lua | 29 ++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/doc/blend_internals.h b/src/doc/blend_internals.h index 205dd4984..e17c6e222 100644 --- a/src/doc/blend_internals.h +++ b/src/doc/blend_internals.h @@ -1,5 +1,5 @@ // Aseprite Document Library -// Copyright (c) 2024 Igara Studio S.A. +// Copyright (c) 2024-2025 Igara Studio S.A. // Copyright (c) 2001-2015 David Capello // // This file is released under the terms of the MIT license. @@ -26,6 +26,7 @@ namespace doc { template class BlenderHelper { + BlendMode m_blendMode; BlendFunc m_blendFunc; color_t m_maskColor; @@ -36,6 +37,7 @@ public: const BlendMode blendMode, const bool newBlend) { + m_blendMode = blendMode; m_blendFunc = SrcTraits::get_blender(blendMode, newBlend); m_maskColor = src->maskColor(); } @@ -44,6 +46,8 @@ public: typename SrcTraits::pixel_t src, int opacity) { + if (m_blendMode == BlendMode::SRC) + return src; if (src != m_maskColor) return (*m_blendFunc)(dst, src, opacity); else @@ -56,6 +60,7 @@ public: template<> class BlenderHelper { + BlendMode m_blendMode; BlendFunc m_blendFunc; color_t m_maskColor; @@ -66,6 +71,7 @@ public: const BlendMode blendMode, const bool newBlend) { + m_blendMode = blendMode; m_blendFunc = RgbTraits::get_blender(blendMode, newBlend); m_maskColor = src->maskColor(); } @@ -74,6 +80,8 @@ public: GrayscaleTraits::pixel_t src, int opacity) { + if (m_blendMode == BlendMode::SRC) + return src; if (src != m_maskColor) { int v = graya_getv(src); return (*m_blendFunc)(dst, rgba(v, v, v, graya_geta(src)), opacity); diff --git a/tests/scripts/image.lua b/tests/scripts/image.lua index 6fb2dc054..c9f0a7306 100644 --- a/tests/scripts/image.lua +++ b/tests/scripts/image.lua @@ -1,4 +1,4 @@ --- Copyright (C) 2019-2024 Igara Studio S.A. +-- Copyright (C) 2019-2025 Igara Studio S.A. -- Copyright (C) 2018 David Capello -- -- This file is released under the terms of the MIT license. @@ -352,6 +352,33 @@ do end +-- Tests using Image:drawImage() with BlendMode::SRC + ColorMode.RGBA +do + local __ = Color(0, 0, 0, 0).rgbaPixel + local oo = Color(255, 255, 255, 0).rgbaPixel + local xx = Color(127, 127, 127, 127).rgbaPixel + local rr = Color(255, 0, 0).rgbaPixel + local BG = Color(127, 127, 127).rgbaPixel + + local a_rgb = Image(3, 2, ColorMode.RGBA) + array_to_pixels({ __, rr, xx, + oo, rr, __ }, a_rgb) + local b_rgb = Image(4, 4, ColorMode.RGBA) + b_rgb:clear(BG) + b_rgb:drawImage(a_rgb, Point(0, 1), 255, BlendMode.SRC) + expect_img(b_rgb, { BG, BG, BG, BG, + __, rr, xx, BG, + oo, rr, __, BG, + BG, BG, BG, BG }) + + b_rgb:clear(BG) + b_rgb:drawImage(a_rgb, Point(-1, 2), 255, BlendMode.SRC) + expect_img(b_rgb, { BG, BG, BG, BG, + BG, BG, BG, BG, + rr, xx, BG, BG, + rr, __, BG, BG }) +end + -- Tests using Image:drawImage() with opacity and blend modes do local spr = Sprite(3, 3, ColorMode.RGB) From e17c3400fb76e9de9c369d0e3be16ab025a8be39 Mon Sep 17 00:00:00 2001 From: Gaspar Capello Date: Thu, 23 Jan 2025 15:03:45 -0300 Subject: [PATCH 06/11] =?UTF-8?q?Fix=20"Straight=20Line=20from=20Last=20Po?= =?UTF-8?q?int=E2=80=9D=20bug=20in=20Tilemaps=20(fix=20#4623)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prior to this fix, when the following conditions were met: - On a tilemap layer - Tilemap mode = OFF - Tool = Pencil - Tileset mode = Manual - Modifying an existing tile with the "quick line" (i.e. holding down the SHIFT key) resulted in incorrect tool behavior. --- src/app/tools/intertwiners.h | 46 ++++++++++-------------------------- 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/src/app/tools/intertwiners.h b/src/app/tools/intertwiners.h index 21de06b0a..0dfa2d68d 100644 --- a/src/app/tools/intertwiners.h +++ b/src/app/tools/intertwiners.h @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018-2024 Igara Studio S.A. +// Copyright (C) 2018-2025 Igara Studio S.A. // Copyright (C) 2001-2018 David Capello // // This program is distributed under the terms of @@ -74,12 +74,6 @@ public: }; class IntertwineAsLines : public Intertwine { - // It was introduced to know if joinStroke function - // was executed inmediatelly after a "Last" trace policy (i.e. after the - // user confirms a line draw while he is holding down the SHIFT key), so - // we have to ignore printing the first pixel of the line. - bool m_retainedTracePolicyLast = false; - // In freehand-like tools, on each mouse movement we draw only the // line between the last two mouse points in the stroke (the // complete stroke is not re-painted again), so we want to indicate @@ -90,22 +84,10 @@ class IntertwineAsLines : public Intertwine { public: bool snapByAngle() override { return true; } - void prepareIntertwine(ToolLoop* loop) override - { - m_retainedTracePolicyLast = false; - m_firstStroke = true; - } + void prepareIntertwine(ToolLoop* loop) override { m_firstStroke = true; } void joinStroke(ToolLoop* loop, const Stroke& stroke) override { - // Required for LineFreehand controller in the first stage, when - // we are drawing the line and the trace policy is "Last". Each - // new joinStroke() is like a fresh start. Without this fix, the - // first stage on LineFreehand will draw a "star" like pattern - // with lines from the first point to the last point. - if (loop->getTracePolicy() == TracePolicy::Last) - m_retainedTracePolicyLast = true; - if (stroke.size() == 0) return; else if (stroke.size() == 1) { @@ -129,9 +111,10 @@ public: // when we use Shift+click in the Pencil tool to continue the // old stroke). // TODO useful only in the case when brush size = 1px - const int start = - (loop->getController()->isFreehand() && (m_retainedTracePolicyLast || !m_firstStroke) ? 1 : - 0); + const int start = (loop->getController()->isFreehand() && + ((loop->getTracePolicy() == TracePolicy::Last) || !m_firstStroke) ? + 1 : + 0); for (int c = start; c < pts.size(); ++c) doPointshapeStrokePt(pts[c], loop); @@ -442,11 +425,6 @@ public: }; class IntertwineAsPixelPerfect : public Intertwine { - // It was introduced to know if joinStroke function - // was executed inmediatelly after a "Last" trace policy (i.e. after the - // user confirms a line draw while he is holding down the SHIFT key), so - // we have to ignore printing the first pixel of the line. - bool m_retainedTracePolicyLast = false; Stroke m_pts; bool m_saveStrokeArea = false; @@ -483,7 +461,6 @@ public: void prepareIntertwine(ToolLoop* loop) override { m_pts.reset(); - m_retainedTracePolicyLast = false; m_grid = m_dstGrid = m_celGrid = loop->getGrid(); m_restoredRegion.clear(); @@ -509,10 +486,8 @@ public: // new joinStroke() is like a fresh start. Without this fix, the // first stage on LineFreehand will draw a "star" like pattern // with lines from the first point to the last point. - if (loop->getTracePolicy() == TracePolicy::Last) { - m_retainedTracePolicyLast = true; + if (loop->getTracePolicy() == TracePolicy::Last) m_pts.reset(); - } int thirdFromLastPt = 0, nextPt = 0; @@ -572,14 +547,17 @@ public: // a joinStroke pass with a retained "Last" trace policy // (i.e. the user confirms draw a line while he is holding // the SHIFT key)) - if (c == 0 && m_retainedTracePolicyLast) + if (c == 0 && loop->getTracePolicy() == TracePolicy::Last) continue; // For the last point we need to store the source image content at that // point so we can restore it when erasing a point because of // pixel-perfect. So we set the following flag to indicate this, and // use it in doTransformPoint. - m_saveStrokeArea = (c == m_pts.size() - 1); + // The previous behavior isn't required for LineFreehand controller and + // the trace policy is "Last" (i.e. the user is drawing a line while + // he is holding the SHIFT key) + m_saveStrokeArea = ((c == m_pts.size() - 1) && loop->getTracePolicy() != TracePolicy::Last); if (m_saveStrokeArea) { clearPointshapeStrokePtAreas(); setLastPtIndex(c); From 63f918cf2aa5b658639633a6d6d3f1b36c2171e9 Mon Sep 17 00:00:00 2001 From: Gaspar Capello Date: Tue, 11 Feb 2025 13:46:13 -0300 Subject: [PATCH 07/11] Fix onionskin visiblity is not updated if cel is empty (fix #4969) --- src/app/ui/timeline/timeline.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/ui/timeline/timeline.cpp b/src/app/ui/timeline/timeline.cpp index 739e5ab04..2e94dc2cc 100644 --- a/src/app/ui/timeline/timeline.cpp +++ b/src/app/ui/timeline/timeline.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018-2024 Igara Studio S.A. +// Copyright (C) 2018-2025 Igara Studio S.A. // Copyright (C) 2001-2018 David Capello // // This program is distributed under the terms of @@ -1953,6 +1953,8 @@ void Timeline::onAfterLayerVisibilityChange(DocEvent& ev) layer_t layerIdx = getLayerIndex(ev.layer()); if (layerIdx >= 0) invalidateRect(getPartBounds(Hit(PART_ROW_EYE_ICON, layerIdx)).offset(origin())); + if (docPref().onionskin.active()) + m_document->notifyGeneralUpdate(); } void Timeline::onStateChanged(Editor* editor) From ad765723c942770c573227bd25ad78bfafae200d Mon Sep 17 00:00:00 2001 From: lightovernight Date: Sat, 22 Feb 2025 21:39:06 +0800 Subject: [PATCH 08/11] Fix Straight line via SHIFT + Tiled mode starts at wrong position --- src/app/ui/editor/editor.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/ui/editor/editor.cpp b/src/app/ui/editor/editor.cpp index 8f241af2c..657061344 100644 --- a/src/app/ui/editor/editor.cpp +++ b/src/app/ui/editor/editor.cpp @@ -2364,6 +2364,10 @@ void Editor::onTiledModeChange() spritePos += mainTilePosition(); screenPos = editorToScreen(spritePos); + auto lastPoint = document()->lastDrawingPoint(); + lastPoint += mainTilePosition() - m_oldMainTilePos; + document()->setLastDrawingPoint(lastPoint); + centerInSpritePoint(spritePos); } From ed56011a0fe931f1501343e1ce0077f54158ce3a Mon Sep 17 00:00:00 2001 From: Liebranca Date: Fri, 31 Jan 2025 23:01:56 -0300 Subject: [PATCH 09/11] Fix set_sat() blend function --- src/doc/blend_funcs.cpp | 49 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/doc/blend_funcs.cpp b/src/doc/blend_funcs.cpp index c8fdd35dd..1e8ae2b80 100644 --- a/src/doc/blend_funcs.cpp +++ b/src/doc/blend_funcs.cpp @@ -397,6 +397,43 @@ static void set_lum(double& r, double& g, double& b, double l) clip_color(r, g, b); } +static inline uint8_t get_imin_channel(const double r, const double g, const double b) +{ + // We use '<=' to get min so as to catch two channels being equal + if (r <= g && r <= b) + return 0b001; + if (g <= r && g <= b) + return 0b010; + + return 0b100; +} + +static inline uint8_t get_imax_channel(const double r, const double g, const double b) +{ + if (r > g && r > b) + return 0b001; + if (g > r && g > b) + return 0b010; + + return 0b100; +} + +static inline uint8_t get_imid_channel(uint8_t imin, uint8_t imax) +{ + // Getting the remaining channel through exclusion guarantees that it is neither min nor max + return (~(imax | imin)) & 0b111; +} + +static inline double& index_to_ref(double& r, double& g, double& b, uint8_t i) +{ + if (i == 0b001) + return r; + if (i == 0b010) + return g; + + return b; +} + // TODO replace this with a better impl (and test this, not sure if it's correct) static void set_sat(double& r, double& g, double& b, double s) { @@ -409,9 +446,15 @@ static void set_sat(double& r, double& g, double& b, double s) ((x) > (y) ? ((y) > (z) ? (y) : ((x) > (z) ? (z) : (x))) : \ ((y) > (z) ? ((z) > (x) ? (z) : (x)) : (y))) - double& min = MIN(r, MIN(g, b)); - double& mid = MID(r, g, b); - double& max = MAX(r, MAX(g, b)); + // Fetch channel indices + const uint8_t imin = get_imin_channel(r, g, b); + const uint8_t imax = get_imax_channel(r, g, b); + const uint8_t imid = get_imid_channel(imin, imax); + + // Map the indices for each channel to references + double& min = index_to_ref(r, g, b, imin); + double& max = index_to_ref(r, g, b, imax); + double& mid = index_to_ref(r, g, b, imid); if (max > min) { mid = ((mid - min) * s) / (max - min); From e4b3981ca64aa5125b0ab2f5e64aed75d112718d Mon Sep 17 00:00:00 2001 From: Gaspar Capello Date: Fri, 21 Feb 2025 12:16:22 -0300 Subject: [PATCH 10/11] Fix when Slices are set to a semi-transparent color they become opaque as we draw. --- src/app/ui/editor/editor.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/app/ui/editor/editor.cpp b/src/app/ui/editor/editor.cpp index 657061344..4b6b20c53 100644 --- a/src/app/ui/editor/editor.cpp +++ b/src/app/ui/editor/editor.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018-2024 Igara Studio S.A. +// Copyright (C) 2018-2025 Igara Studio S.A. // Copyright (C) 2001-2018 David Capello // // This program is distributed under the terms of @@ -774,7 +774,7 @@ void Editor::drawOneSpriteUnclippedRect(ui::Graphics* g, } } - // Draw grids + // Draw Slices and Grids { gfx::Rect enclosingRect(m_padding.x + dx, m_padding.y + dy, @@ -783,6 +783,11 @@ void Editor::drawOneSpriteUnclippedRect(ui::Graphics* g, IntersectClip clip(g, dest); if (clip) { + // Draw slices + if (m_docPref.show.slices() && dx == m_proj.applyX(mainTilePosition().x) && + dy == m_proj.applyY(mainTilePosition().y)) + drawSlices(g); + // Draw the pixel grid if ((m_proj.zoom().scale() > 2.0) && m_docPref.show.pixelGrid()) { int alpha = m_docPref.pixelGrid.opacity(); @@ -895,10 +900,6 @@ void Editor::drawSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& _rc) enclosingRect = gfx::Rect(spriteRect.x, spriteRect.y, spriteRect.w * 3, spriteRect.h * 3); } - // Draw slices - if (m_docPref.show.slices()) - drawSlices(g); - // Symmetry mode if (isActive() && (m_flags & Editor::kShowSymmetryLine) && Preferences::instance().symmetryMode.enabled()) { From f7f93c64f29172057dc9f49d0203c0c1cdf88a05 Mon Sep 17 00:00:00 2001 From: David Capello Date: Wed, 26 Feb 2025 09:38:14 -0300 Subject: [PATCH 11/11] [lua] Update scripting API version to 32 --- src/app/script/api_version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/script/api_version.h b/src/app/script/api_version.h index c64082cea..9cc926797 100644 --- a/src/app/script/api_version.h +++ b/src/app/script/api_version.h @@ -10,6 +10,6 @@ // Increment this value if the scripting API is modified between two // released Aseprite versions. -#define API_VERSION 31 +#define API_VERSION 32 #endif