mirror of
https://github.com/aseprite/aseprite.git
synced 2024-11-20 14:21:45 +00:00
151 lines
4.4 KiB
Lua
151 lines
4.4 KiB
Lua
-- Copyright (C) 2022-2023 Igara Studio S.A.
|
|
--
|
|
-- This file is released under the terms of the MIT license.
|
|
-- Read LICENSE.txt for more information.
|
|
|
|
function fix_images(testImg, scale, fileExt, c, cm, c1)
|
|
-- GIF file is loaded as indexed, so we have to convert from indexed
|
|
-- to the ColorMode
|
|
if c.colorMode ~= cm then
|
|
assert(fileExt == "gif" or fileExt == "bmp")
|
|
|
|
if cm == ColorMode.RGB then
|
|
app.sprite = c
|
|
app.command.ChangePixelFormat{ format="rgb" }
|
|
elseif cm == ColorMode.GRAYSCALE then
|
|
app.sprite = c
|
|
app.command.ChangePixelFormat{ format="grayscale" }
|
|
else
|
|
assert(false)
|
|
end
|
|
end
|
|
|
|
-- With file formats that don't support alpha channel, we
|
|
-- compare totally transparent pixels (alpha=0) with black.
|
|
if fileExt == "tga" and cm == ColorMode.GRAYSCALE then
|
|
local pixel
|
|
if cm == ColorMode.RGB then
|
|
pixel = c1.rgbaPixel
|
|
elseif cm == ColorMode.GRAYSCALE then
|
|
pixel = c1.grayPixel
|
|
else
|
|
pixel = 0 -- Do nothing in indexed
|
|
end
|
|
for p in testImg:pixels() do
|
|
if p() == 0 then p(pixel) end
|
|
end
|
|
end
|
|
testImg:resize(testImg.width*scale, testImg.height*scale)
|
|
end
|
|
|
|
function compatible_modes(fileExt, cm)
|
|
return
|
|
-- TODO support saving any color mode to FLI files on the fly
|
|
(fileExt ~= "fli" or cm == ColorMode.INDEXED) and
|
|
-- TODO Review grayscale support in bmp files
|
|
(fileExt ~= "bmp" or cm ~= ColorMode.GRAYSCALE) and
|
|
-- TODO Review grayscale/indexed support in webp files
|
|
(fileExt ~= "webp" or cm == ColorMode.RGB)
|
|
end
|
|
|
|
for _,cm in ipairs{ ColorMode.RGB,
|
|
ColorMode.GRAYSCALE,
|
|
ColorMode.INDEXED } do
|
|
local spr = Sprite(32, 32, cm)
|
|
spr.palettes[1]:resize(3)
|
|
spr.palettes[1]:setColor(0, Color(0, 0, 0, 0))
|
|
spr.palettes[1]:setColor(1, Color(0, 0, 0, 255))
|
|
spr.palettes[1]:setColor(2, Color(255, 0, 0, 255))
|
|
|
|
local c1, c2
|
|
if cm == ColorMode.RGB then
|
|
c1 = Color(0, 0, 0)
|
|
c2 = Color(255, 0, 0)
|
|
elseif cm == ColorMode.GRAYSCALE then
|
|
c1 = Color{ gray=0 }
|
|
c2 = Color{ gray=255 }
|
|
elseif cm == ColorMode.INDEXED then
|
|
c1 = 1
|
|
c2 = 2
|
|
end
|
|
|
|
app.useTool{ color=c1, brush=Brush(1),
|
|
tool="filled_ellipse", points={{0,0},{31,31}} }
|
|
app.useTool{ color=c2, brush=Brush(1),
|
|
tool="filled_ellipse", points={{4,4},{27,27}} }
|
|
spr.filename = "_test_a.aseprite"
|
|
|
|
app.command.SaveFile()
|
|
assert(spr.filename == "_test_a.aseprite")
|
|
|
|
app.command.SaveFileAs{ filename="_test_b.png" }
|
|
assert(spr.filename == "_test_b.png")
|
|
|
|
app.command.SaveFileCopyAs{ filename="_test_c.png" }
|
|
assert(spr.filename == "_test_b.png")
|
|
|
|
-- Scale
|
|
for _,fn in ipairs{ "_test_c_scaled.bmp",
|
|
"_test_c_scaled.fli",
|
|
"_test_c_scaled.gif",
|
|
"_test_c_scaled.png",
|
|
"_test_c_scaled.tga",
|
|
"_test_c_scaled.webp" } do
|
|
local fileExt = app.fs.fileExtension(fn)
|
|
|
|
if compatible_modes(fileExt, cm) then
|
|
for _,scale in ipairs({ 0.25, 0.5, 1, 2, 3, 4 }) do
|
|
print(fn, scale, cm)
|
|
|
|
app.sprite = spr
|
|
app.command.SaveFileCopyAs{ filename=fn, scale=scale }
|
|
local c = app.open(fn)
|
|
assert(c.width == spr.width*scale)
|
|
assert(c.height == spr.height*scale)
|
|
|
|
local testImg = Image(spr.cels[1].image)
|
|
fix_images(testImg, scale, fileExt, c, cm, c1)
|
|
if not c.cels[1].image:isEqual(testImg) then
|
|
c.cels[1].image:saveAs("_testA.png")
|
|
testImg:saveAs("_testB.png")
|
|
end
|
|
assert(c.cels[1].image.colorMode == testImg.colorMode)
|
|
assert(c.cels[1].image:isEqual(testImg))
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Scale + Slices
|
|
local slice = spr:newSlice(Rectangle(1, 2, 8, 15))
|
|
slice.name = "small_slice"
|
|
for _,fn in ipairs({ "_test_c_small_slice.bmp",
|
|
"_test_c_small_slice.fli",
|
|
"_test_c_small_slice.gif",
|
|
"_test_c_small_slice.png",
|
|
"_test_c_small_slice.tga",
|
|
"_test_c_small_slice.webp" }) do
|
|
local fileExt = app.fs.fileExtension(fn)
|
|
|
|
if compatible_modes(fileExt, cm) then
|
|
for _,scale in ipairs({ 0.25, 0.5, 1, 2, 3, 4 }) do
|
|
print(fn, scale, cm)
|
|
|
|
app.sprite = spr
|
|
app.command.SaveFileCopyAs{ filename=fn, slice="small_slice", scale=scale }
|
|
local c = app.open(fn)
|
|
assert(c.width == slice.bounds.width*scale)
|
|
assert(c.height == slice.bounds.height*scale)
|
|
|
|
local testImg = Image(spr.cels[1].image, spr.slices[1].bounds)
|
|
fix_images(testImg, scale, fileExt, c, cm, c1)
|
|
if not c.cels[1].image:isEqual(testImg) then
|
|
c.cels[1].image:saveAs("_testA.png")
|
|
testImg:saveAs("_testB.png")
|
|
end
|
|
assert(c.cels[1].image:isEqual(testImg))
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|