mirror of https://github.com/aseprite/aseprite.git
				
				
				
			
		
			
				
	
	
		
			652 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Lua
		
	
	
	
			
		
		
	
	
			652 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Lua
		
	
	
	
| -- Copyright (C) 2019-2023  Igara Studio S.A.
 | |
| -- Copyright (C) 2018  David Capello
 | |
| --
 | |
| -- This file is released under the terms of the MIT license.
 | |
| -- Read LICENSE.txt for more information.
 | |
| 
 | |
| dofile('./test_utils.lua')
 | |
| 
 | |
| local rgba = app.pixelColor.rgba
 | |
| local rgbaR = app.pixelColor.rgbaR
 | |
| local rgbaG = app.pixelColor.rgbaG
 | |
| local rgbaB = app.pixelColor.rgbaB
 | |
| 
 | |
| do -- Undo/Redo commands (like app.undo/redo())
 | |
|   local s = Sprite(32, 32)
 | |
|   assert(s.width == 32)
 | |
|   assert(s.height == 32)
 | |
| 
 | |
|   s:resize(50, 40)
 | |
|   assert(s.width == 50)
 | |
|   assert(s.height == 40)
 | |
| 
 | |
|   app.command.Undo()
 | |
|   assert(s.width == 32)
 | |
|   assert(s.height == 32)
 | |
| 
 | |
|   app.command.Redo()
 | |
|   assert(s.width == 50)
 | |
|   assert(s.height == 40)
 | |
| end
 | |
| 
 | |
| do -- NewSprite
 | |
|   local s1 = app.activeSprite
 | |
|   app.command.NewFile{ }
 | |
|   assert(s1 == app.activeSprite)
 | |
|   app.command.NewFile{ width=256, height=128, colorMode=ColorMode.INDEXED }
 | |
|   local s2 = app.activeSprite
 | |
|   assert(s1 ~= s2)
 | |
|   assert(s2.width == 256)
 | |
|   assert(s2.height == 128)
 | |
|   assert(s2.colorMode == ColorMode.INDEXED)
 | |
| end
 | |
| 
 | |
| do -- ExportSpriteSheet
 | |
|   local s = Sprite{ fromFile="sprites/2f-index-3x3.aseprite" }
 | |
|   app.command.ExportSpriteSheet {
 | |
|     type="horizontal",
 | |
|     textureFilename="_test_export_spritesheet1.png",
 | |
|     shapePadding=1
 | |
|   }
 | |
|   local i = Image{ fromFile="_test_export_spritesheet1.png" }
 | |
|   expect_img(i,  {
 | |
|     11,8,11,21,8,11,11,
 | |
|     11,8,11,21,11,8,11,
 | |
|     11,8,11,21,11,11,8,
 | |
|   })
 | |
| 
 | |
|   local s = Sprite{ fromFile="sprites/4f-index-4x4.aseprite" }
 | |
|   app.command.ExportSpriteSheet {
 | |
|     type=SpriteSheetType.PACKED,
 | |
|     textureFilename="_test_export_spritesheet2.png",
 | |
|     borderPadding=1,
 | |
|     shapePadding=1,
 | |
|     trim=true,
 | |
|   }
 | |
|   local i = Image{ fromFile="_test_export_spritesheet2.png" }
 | |
|   expect_img(i,  {
 | |
|     0,0,0,0,0,0,0,
 | |
|     0,1,0,2,0,3,0,
 | |
|     0,1,0,2,0,3,0,
 | |
|     0,1,0,0,0,0,0,
 | |
|     0,0,0,4,4,0,0,
 | |
|     0,0,0,0,0,0,0,
 | |
|   })
 | |
| 
 | |
|   app.sprite = s
 | |
|   app.command.ExportSpriteSheet {
 | |
|     type=SpriteSheetType.PACKED,
 | |
|     textureFilename="_test_export_spritesheet3.png",
 | |
|     borderPadding=2,
 | |
|     shapePadding=1,
 | |
|     innerPadding=1,
 | |
|     trim=true,
 | |
|   }
 | |
|   local i = Image{ fromFile="_test_export_spritesheet3.png" }
 | |
|   expect_img(i,  {
 | |
|     0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,
 | |
|     0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,
 | |
|     0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,
 | |
|     0,0,0,1, 0,0,0,2, 0,0,0,3, 0,0,0,
 | |
| 
 | |
|     0,0,0,1, 0,0,0,2, 0,0,0,3, 0,0,0,
 | |
|     0,0,0,1, 0,0,0,0, 0,0,0,0, 0,0,0,
 | |
|     0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,
 | |
|     0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,
 | |
| 
 | |
|     0,0,0,0, 0,0,0,4, 4,0,0,0, 0,0,0,
 | |
|     0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,
 | |
|     0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,
 | |
|     0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,
 | |
|   })
 | |
| end
 | |
| 
 | |
| do -- NewLayer/RemoveLayer
 | |
|   local s = Sprite(32, 32)
 | |
|   assert(#s.layers == 1)
 | |
|   local lay = s.layers[1]
 | |
|   app.command.NewLayer{top=true}
 | |
|   local lay2 = app.activeLayer
 | |
|   assert(#s.layers == 2)
 | |
|   assert(s.layers[2].isImage)
 | |
| 
 | |
|   app.command.NewLayer{top=true, group=true}
 | |
|   local lay3 = app.activeLayer
 | |
|   assert(#s.layers == 3)
 | |
|   assert(s.layers[3].isGroup)
 | |
| 
 | |
|   assert(app.activeLayer == lay3)
 | |
|   app.command.RemoveLayer()
 | |
|   assert(app.activeLayer == lay2)
 | |
|   assert(#s.layers == 2)
 | |
| 
 | |
|   app.command.RemoveLayer()
 | |
|   assert(app.activeLayer == lay)
 | |
|   assert(#s.layers == 1)
 | |
| end
 | |
| 
 | |
| do -- Background/Transparent layers
 | |
|   local s = Sprite(32, 32)
 | |
|   assert(s.layers[1].isTransparent)
 | |
|   assert(s.cels[1].image:getPixel(0, 0) == app.pixelColor.rgba(0, 0, 0, 0))
 | |
| 
 | |
|   app.bgColor = Color(32, 64, 128)
 | |
|   app.command.BackgroundFromLayer() -- the layer will be filled with app.bgColor
 | |
|   assert(s.layers[1].isBackground)
 | |
|   assert(s.layers[1] == s.backgroundLayer)
 | |
|   assert(s.cels[1].image:getPixel(0, 0) == app.pixelColor.rgba(32, 64, 128, 255))
 | |
| 
 | |
|   app.command.LayerFromBackground()
 | |
|   assert(s.layers[1].isTransparent)
 | |
|   assert(s.cels[1].image:getPixel(0, 0) == app.pixelColor.rgba(32, 64, 128, 255))
 | |
| end
 | |
| 
 | |
| do -- Crop and Trim
 | |
|   local s = Sprite(32, 32)
 | |
|   s.selection:select(4, 5, 8, 10)
 | |
|   assert(s.cels[1].bounds == Rectangle(0, 0, 32, 32))
 | |
| 
 | |
|   -- Crop
 | |
| 
 | |
|   app.command.CropSprite()
 | |
|   assert(s.width == 8)
 | |
|   assert(s.height == 10)
 | |
|   assert(s.cels[1].bounds == Rectangle(-4, -5, 32, 32))
 | |
| 
 | |
|   -- Autocrop (Trim)
 | |
| 
 | |
|   app.command.AutocropSprite() -- Trim does nothing when we should remove all pixels
 | |
|   assert(s.width == 8)
 | |
|   assert(s.height == 10)
 | |
| 
 | |
|   s.cels[1].image:putPixel(5, 5, Color(255, 0, 0))
 | |
|   s.cels[1].image:putPixel(4, 6, Color(255, 0, 0))
 | |
|   app.command.AutocropSprite()
 | |
|   assert(s.width == 2)
 | |
|   assert(s.height == 2)
 | |
| end
 | |
| 
 | |
| do -- Cel Opacity
 | |
|   local s = Sprite(32, 32)
 | |
|   local c = s.cels[1]
 | |
|   assert(c.opacity == 255)
 | |
| 
 | |
|   app.command.CelOpacity{opacity=128}
 | |
|   assert(c.opacity == 128)
 | |
| 
 | |
|   s.cels[1].opacity = 255
 | |
|   assert(c.opacity == 255)
 | |
| 
 | |
|   app.undo()
 | |
|   assert(c.opacity == 128)
 | |
|   app.undo()
 | |
|   assert(c.opacity == 255)
 | |
| end
 | |
| 
 | |
| do -- PaletteSize
 | |
|   local s = Sprite(32, 32)
 | |
|   assert(#s.palettes[1] == 256)
 | |
|   app.command.PaletteSize{ size=32 }
 | |
|   assert(#s.palettes[1] == 32)
 | |
|   app.command.PaletteSize{ size=8 }
 | |
|   assert(#s.palettes[1] == 8)
 | |
| end
 | |
| 
 | |
| do -- CanvasSize
 | |
|   local s = Sprite(32, 32)
 | |
|   assert(s.bounds == Rectangle(0, 0, 32, 32))
 | |
|   app.command.CanvasSize{ left=2 }
 | |
|   assert(s.bounds == Rectangle(0, 0, 34, 32))
 | |
|   app.command.CanvasSize{ top=2, right=4, bottom=8 }
 | |
|   assert(s.bounds == Rectangle(0, 0, 38, 42))
 | |
| end
 | |
| 
 | |
| do -- ReplaceColor
 | |
|   local s = Sprite(4, 4)
 | |
|   local cel = app.activeCel
 | |
|   local red = Color(255, 0, 0)
 | |
|   local yellow = Color(255, 255, 0)
 | |
|   local blue = Color(0, 0, 255)
 | |
|   local r = red.rgbaPixel
 | |
|   local y = yellow.rgbaPixel
 | |
|   local b = blue.rgbaPixel
 | |
| 
 | |
|   expect_eq(cel.bounds, Rectangle(0, 0, 4, 4))
 | |
|   expect_img(cel.image,
 | |
|              { 0, 0, 0, 0,
 | |
|                0, 0, 0, 0,
 | |
|                0, 0, 0, 0,
 | |
|                0, 0, 0, 0 })
 | |
| 
 | |
|   app.useTool{ brush=Brush(1), color=red, points={Point(1,1)} }
 | |
|   app.useTool{ brush=Brush(1), color=yellow, points={Point(2,2)} }
 | |
|   expect_eq(cel.bounds, Rectangle(1, 1, 2, 2))
 | |
|   expect_img(cel.image,
 | |
|              { r, 0,
 | |
|                0, y })
 | |
| 
 | |
|   app.command.ReplaceColor{ from=red, to=blue }
 | |
|   expect_eq(cel.bounds, Rectangle(1, 1, 2, 2))
 | |
|   expect_img(cel.image,
 | |
|              { b, 0,
 | |
|                0, y })
 | |
| end
 | |
| 
 | |
| do -- Invert
 | |
|   local s = Sprite(2, 2)
 | |
|   local cel = app.activeCel
 | |
|   local aa = Color(255, 128, 128).rgbaPixel
 | |
|   local na = Color(0, 127, 127).rgbaPixel
 | |
|   local bb = Color(128, 128, 255).rgbaPixel
 | |
|   local nb = Color(127, 127, 0).rgbaPixel
 | |
|   local i = cel.image
 | |
| 
 | |
|   i:drawPixel(0, 0, aa)
 | |
|   i:drawPixel(1, 0, bb)
 | |
|   i:drawPixel(0, 1, bb)
 | |
|   i:drawPixel(1, 1, aa)
 | |
|   expect_img(cel.image,
 | |
|              { aa, bb,
 | |
|                bb, aa })
 | |
| 
 | |
|   app.command.InvertColor()
 | |
|   expect_img(cel.image,
 | |
|              { na, nb,
 | |
|                nb, na })
 | |
| 
 | |
|   local Na = Color(0, 127, 128).rgbaPixel
 | |
|   local Ng = Color(127, 127, 255).rgbaPixel
 | |
|   app.command.InvertColor{ channels=FilterChannels.BLUE }
 | |
|   expect_img(cel.image,
 | |
|              { Na, Ng,
 | |
|                Ng, Na })
 | |
| end
 | |
| 
 | |
| do -- Outline
 | |
|   local s = Sprite(4, 4)
 | |
|   local cel = app.activeCel
 | |
|   local red = Color(255, 0, 0)
 | |
|   local yellow = Color(255, 255, 0)
 | |
|   local blue = Color(0, 0, 255)
 | |
|   local r = red.rgbaPixel
 | |
|   local y = yellow.rgbaPixel
 | |
|   local b = blue.rgbaPixel
 | |
| 
 | |
|   expect_eq(cel.bounds, Rectangle(0, 0, 4, 4))
 | |
|   expect_img(cel.image,
 | |
|              { 0, 0, 0, 0,
 | |
|                0, 0, 0, 0,
 | |
|                0, 0, 0, 0,
 | |
|                0, 0, 0, 0 })
 | |
| 
 | |
|   app.useTool{ brush=Brush(1), color=red, points={Point(1,1)} }
 | |
|   app.useTool{ brush=Brush(1), color=yellow, points={Point(2,2)} }
 | |
|   expect_eq(cel.bounds, Rectangle(1, 1, 2, 2))
 | |
|   expect_img(cel.image,
 | |
|              { r, 0,
 | |
|                0, y })
 | |
| 
 | |
|   app.command.Outline{ color=blue }
 | |
|   expect_eq(cel.bounds, Rectangle(0, 0, 4, 4))
 | |
|   expect_img(cel.image,
 | |
|              { 0, b, 0, 0,
 | |
|                b, r, b, 0,
 | |
|                0, b, y, b,
 | |
|                0, 0, b, 0 })
 | |
| 
 | |
|   -- Test "bgColor", "matrix", "place" params
 | |
| 
 | |
|   app.useTool{ tool='filled_rectangle', brush=Brush(1), color=blue, points={Point(0,0), Point(3,3)} }
 | |
|   app.useTool{ tool='filled_rectangle', brush=Brush(1), color=yellow, points={Point(1,1), Point(2,2)} }
 | |
|   expect_eq(cel.bounds, Rectangle(0, 0, 4, 4))
 | |
|   expect_img(cel.image,
 | |
|              { b, b, b, b,
 | |
|                b, y, y, b,
 | |
|                b, y, y, b,
 | |
|                b, b, b, b })
 | |
| 
 | |
|   app.command.Outline{ color=red, bgColor=blue, matrix='circle' }
 | |
|   expect_eq(cel.bounds, Rectangle(0, 0, 4, 4))
 | |
|   expect_img(cel.image,
 | |
|              { b, r, r, b,
 | |
|                r, y, y, r,
 | |
|                r, y, y, r,
 | |
|                b, r, r, b })
 | |
|   app.undo()
 | |
| 
 | |
|   app.command.Outline{ color=red, bgColor=blue, matrix='square' }
 | |
|   expect_eq(cel.bounds, Rectangle(0, 0, 4, 4))
 | |
|   expect_img(cel.image,
 | |
|              { r, r, r, r,
 | |
|                r, y, y, r,
 | |
|                r, y, y, r,
 | |
|                r, r, r, r })
 | |
|   app.undo()
 | |
| 
 | |
|   app.command.Outline{ color=red, bgColor=blue, place='inside' }
 | |
|   expect_eq(cel.bounds, Rectangle(0, 0, 4, 4))
 | |
|   expect_img(cel.image,
 | |
|              { b, b, b, b,
 | |
|                b, r, r, b,
 | |
|                b, r, r, b,
 | |
|                b, b, b, b })
 | |
| 
 | |
| end
 | |
| 
 | |
| do -- BrightnessContrast
 | |
|   local s = Sprite(2, 2)
 | |
|   local cel = app.activeCel
 | |
|   local c = { rgba(255, 128, 64), rgba(250, 225, 110),
 | |
|               rgba( 30,  60,  0), rgba(200, 100,  50), }
 | |
|   local i = cel.image
 | |
| 
 | |
|   i:drawPixel(0, 0, c[1])
 | |
|   i:drawPixel(1, 0, c[2])
 | |
|   i:drawPixel(0, 1, c[3])
 | |
|   i:drawPixel(1, 1, c[4])
 | |
|   expect_img(i,
 | |
|              { c[1], c[2],
 | |
|                c[3], c[4] })
 | |
| 
 | |
|   app.command.BrightnessContrast() -- Do nothing by default
 | |
|   expect_img(i,
 | |
|              { c[1], c[2],
 | |
|                c[3], c[4] })
 | |
| 
 | |
|   local d = {}
 | |
|   for k,v in ipairs(c) do
 | |
|     d[k] = rgba(math.min(255, rgbaR(v)*1.5),
 | |
|                 math.min(255, rgbaG(v)*1.5),
 | |
|                 math.min(255, rgbaB(v)*1.5), 255)
 | |
|   end
 | |
|   app.command.BrightnessContrast{ brightness=50 } -- Do nothing by default
 | |
|   expect_img(i,
 | |
|              { d[1], d[2],
 | |
|                d[3], d[4] })
 | |
| end
 | |
| 
 | |
| do -- Despeckle
 | |
|   local s = Sprite(5, 5)
 | |
|   local white = Color(255, 255, 255)
 | |
|   local red = Color(255, 0, 0)
 | |
| 
 | |
|   app.bgColor = white
 | |
|   app.command.BackgroundFromLayer()
 | |
| 
 | |
|   local cel = app.activeCel
 | |
|   local i = cel.image
 | |
|   local b = white.rgbaPixel
 | |
|   local c = red.rgbaPixel
 | |
|   expect_img(i,
 | |
|              { b,b,b,b,b,
 | |
|                b,b,b,b,b,
 | |
|                b,b,b,b,b,
 | |
|                b,b,b,b,b,
 | |
|                b,b,b,b,b })
 | |
| 
 | |
|   app.useTool{ tool='filled_rectangle', brush=Brush(1), color=red,
 | |
|                points={Point(1,1),Point(3,3)} }
 | |
|   expect_img(i,
 | |
|              { b,b,b,b,b,
 | |
|                b,c,c,c,b,
 | |
|                b,c,c,c,b,
 | |
|                b,c,c,c,b,
 | |
|                b,b,b,b,b })
 | |
| 
 | |
|   app.command.Despeckle()
 | |
|   expect_img(i,
 | |
|              { b,b,b,b,b,
 | |
|                b,b,c,b,b,
 | |
|                b,c,c,c,b,
 | |
|                b,b,c,b,b,
 | |
|                b,b,b,b,b })
 | |
| 
 | |
|   app.command.Despeckle()
 | |
|   expect_img(i,
 | |
|              { b,b,b,b,b,
 | |
|                b,b,b,b,b,
 | |
|                b,b,c,b,b,
 | |
|                b,b,b,b,b,
 | |
|                b,b,b,b,b })
 | |
| end
 | |
| 
 | |
| do -- HueSaturation
 | |
|   local s = Sprite(1, 1)
 | |
|   local cel = app.activeCel
 | |
|   local i = cel.image
 | |
|   local b = Color(255, 0, 0).rgbaPixel
 | |
| 
 | |
|   i:drawPixel(0, 0, b)
 | |
|   expect_img(i, { b })
 | |
| 
 | |
|   app.command.HueSaturation{ hue=360 } -- Do nothing (change hue to a full 360 circle)
 | |
|   expect_img(i, { b })
 | |
| 
 | |
|   app.command.HueSaturation{ hue=60 }
 | |
|   b = Color(255, 255, 0).rgbaPixel
 | |
|   expect_img(i, { b })
 | |
| 
 | |
|   app.command.HueSaturation{ hue=60 }
 | |
|   b = Color(0, 255, 0).rgbaPixel
 | |
|   expect_img(i, { b })
 | |
| 
 | |
|   app.command.HueSaturation{ saturation=-50 }
 | |
|   b = Color(64, 191, 64).rgbaPixel
 | |
|   expect_img(i, { b })
 | |
| 
 | |
|   app.undo()
 | |
|   app.command.HueSaturation{ saturation=-100 }
 | |
|   b = Color(128, 128, 128).rgbaPixel
 | |
|   expect_img(i, { b })
 | |
| 
 | |
|   app.undo()
 | |
|   app.command.HueSaturation{ saturation=-50, mode='hsv' }
 | |
|   b = Color(128, 255, 128).rgbaPixel
 | |
|   expect_img(i, { b })
 | |
| 
 | |
|   app.undo()
 | |
|   app.command.HueSaturation{ value=75 }
 | |
|   b = Color(191, 255, 191).rgbaPixel
 | |
|   expect_img(i, { b })
 | |
| 
 | |
|   app.undo()
 | |
|   app.command.HueSaturation{ alpha=-50 }
 | |
|   b = Color(0, 255, 0, 127).rgbaPixel
 | |
|   expect_img(i, { b })
 | |
| 
 | |
| end
 | |
| 
 | |
| do -- ColorCurve
 | |
|   local s = Sprite(2, 1)
 | |
|   local cel = app.activeCel
 | |
|   local i = cel.image
 | |
| 
 | |
|   i:drawPixel(0, 0, rgba(255, 128, 0))
 | |
|   i:drawPixel(1, 0, rgba(64, 0, 32))
 | |
|   expect_img(i, { rgba(255, 128, 0), rgba(64, 0, 32) })
 | |
| 
 | |
|   app.command.ColorCurve() -- Do nothing
 | |
|   expect_img(i, { rgba(255, 128, 0), rgba(64, 0, 32) })
 | |
| 
 | |
|   app.command.ColorCurve{ curve={{0,0},{255,128}} }
 | |
|   expect_img(i, { rgba(128, 64, 0), rgba(32, 0, 16) })
 | |
| 
 | |
|   app.command.ColorCurve{ channels=FilterChannels.ALPHA, curve={{0,0},{255,128}} }
 | |
|   expect_img(i, { rgba(128, 64, 0, 128), rgba(32, 0, 16, 128) })
 | |
| 
 | |
|   app.command.ColorCurve{ channels=FilterChannels.RGBA, curve={{0,255},{255,255}} }
 | |
|   expect_img(i, { rgba(255, 255, 255), rgba(255, 255, 255) })
 | |
| 
 | |
|   app.command.ColorCurve{ channels=FilterChannels.GREEN, curve={{0,0},{255,0}} }
 | |
|   expect_img(i, { rgba(255, 0, 255), rgba(255, 0, 255) })
 | |
| 
 | |
|   app.command.ColorCurve{ channels=FilterChannels.BLUE, curve="0,128,255,128" }
 | |
|   expect_img(i, { rgba(255, 0, 128), rgba(255, 0, 128) })
 | |
| end
 | |
| 
 | |
| do -- ConvolutionMatrix
 | |
|   local s = Sprite(3, 3)
 | |
|   local cel = app.activeCel
 | |
|   local i = cel.image
 | |
|   local b = rgba(0, 0, 0)
 | |
|   local w = rgba(255, 255, 255)
 | |
| 
 | |
|   app.bgColor = Color(255, 255, 255)
 | |
|   app.command.BackgroundFromLayer()
 | |
|   i:drawPixel(1, 1, b)
 | |
|   expect_img(i, { w, w, w,
 | |
|                   w, b, w,
 | |
|                   w, w, w })
 | |
| 
 | |
|   local u = rgba(239, 239, 239)
 | |
|   local v = rgba(223, 223, 223)
 | |
|   local w = rgba(191, 191, 191)
 | |
|   app.command.ConvolutionMatrix{ fromResource="blur-3x3" }
 | |
|   expect_img(i, { u, v, u,
 | |
|                   v, w, v,
 | |
|                   u, v, u })
 | |
| end
 | |
| 
 | |
| -- MoveColors and CopyColors
 | |
| do
 | |
|   local s = Sprite(32, 32, ColorMode.INDEXED)
 | |
|   local p = Palette(4)
 | |
|   p:setColor(0, Color(0, 0, 0))
 | |
|   p:setColor(1, Color(255, 0, 0))
 | |
|   p:setColor(2, Color(0, 255, 0))
 | |
|   p:setColor(3, Color(0, 0, 255))
 | |
|   s:setPalette(p)
 | |
|   assert(#app.range.colors == 0)
 | |
|   app.range.colors = { 0, 2 }
 | |
|   assert(#app.range.colors == 2)
 | |
|   assert(app.range.colors[1] == 0)
 | |
|   assert(app.range.colors[2] == 2)
 | |
|   app.command.MoveColors{ before=0 }
 | |
|   p = s.palettes[1]
 | |
|   p:setColor(0, Color(0, 0, 0))
 | |
|   p:setColor(1, Color(0, 255, 0))
 | |
|   p:setColor(2, Color(255, 0, 0))
 | |
|   p:setColor(3, Color(0, 0, 255))
 | |
| 
 | |
|   app.range.colors = { 0, 1 }
 | |
|   assert(#app.range.colors == 2)
 | |
|   assert(app.range.colors[1] == 0)
 | |
|   assert(app.range.colors[2] == 1)
 | |
|   app.command.CopyColors{ before=4 }
 | |
|   p = s.palettes[1]
 | |
|   p:setColor(0, Color(0, 0, 0))
 | |
|   p:setColor(1, Color(0, 255, 0))
 | |
|   p:setColor(2, Color(255, 0, 0))
 | |
|   p:setColor(3, Color(0, 0, 255))
 | |
|   p:setColor(4, Color(0, 0, 0))
 | |
|   p:setColor(5, Color(0, 255, 0))
 | |
| end
 | |
| 
 | |
| -- AddColor
 | |
| do
 | |
|   local s = Sprite(32, 32)
 | |
|   local p = s.palettes[1]
 | |
| 
 | |
|   function testAddColor(color)
 | |
|     assert(p:getColor(#p-1) ~= color)
 | |
|     app.command.AddColor{ color=color }
 | |
|     assert(p:getColor(#p-1) == color)
 | |
|   end
 | |
|   testAddColor(Color(255, 0, 0))
 | |
|   testAddColor(Color(0, 255, 0))
 | |
|   testAddColor(Color(0, 0, 255))
 | |
| 
 | |
|   local color = Color(128, 0, 0)
 | |
|   app.preferences.color_bar.fg_color = color
 | |
|   app.command.AddColor{ source="fg" }
 | |
|   assert(p:getColor(#p-1) == color)
 | |
| 
 | |
|   local color = Color(0, 0, 128)
 | |
|   app.preferences.color_bar.bg_color = color
 | |
|   app.command.AddColor{ source="bg" }
 | |
|   assert(p:getColor(#p-1) == color)
 | |
| end
 | |
| 
 | |
| -- Flip
 | |
| do
 | |
|   local s = Sprite(4, 2, ColorMode.INDEXED)
 | |
|   local i = s.cels[1].image
 | |
|   array_to_pixels({ 0, 1, 2, 3,
 | |
|                     4, 5, 6, 7 }, i)
 | |
|   app.command.Flip{ orientation="horizontal" }
 | |
|   expect_img(i, { 3, 2, 1, 0,
 | |
|                   7, 6, 5, 4 })
 | |
| 
 | |
|   app.command.Flip{ orientation="vertical" }
 | |
|   expect_img(i, { 7, 6, 5, 4,
 | |
|                   3, 2, 1, 0 })
 | |
| 
 | |
|   s.selection:select{ 1, 0, 2, 2 }
 | |
|   app.command.Flip{ orientation="horizontal", target="mask" }
 | |
|   expect_img(i, { 7, 5, 6, 4,
 | |
|                   3, 1, 2, 0 })
 | |
| 
 | |
|   s:newFrame()
 | |
| 
 | |
|   assert(app.activeCel.frameNumber == 2)
 | |
|   local j = app.activeImage
 | |
|   app.command.Flip{ orientation="vertical", target="mask" }
 | |
|   expect_img(i, { 7, 5, 6, 4,
 | |
|                   3, 1, 2, 0 })
 | |
|   expect_img(j, { 7, 1, 2, 4,
 | |
|                   3, 5, 6, 0 })
 | |
| 
 | |
|   app.range.frames = { 1, 2 }
 | |
|   app.command.Flip{ orientation="horizontal", target="mask" }
 | |
|   expect_img(i, { 7, 6, 5, 4,
 | |
|                   3, 2, 1, 0 })
 | |
|   expect_img(j, { 7, 2, 1, 4,
 | |
|                   3, 6, 5, 0 })
 | |
| end
 | |
| 
 | |
| -- Fill
 | |
| do
 | |
|   local s = Sprite(4, 2, ColorMode.INDEXED)
 | |
|   local c = s.cels[1]
 | |
|   local i = c.image
 | |
|   i:clear(1)
 | |
|   array_to_pixels({ 1, 1, 1, 1,
 | |
|                     1, 1, 1, 1 }, i)
 | |
|   app.fgColor = Color{ index=0 }
 | |
|   s.selection = Selection(Rectangle(1, 1, 2, 1))
 | |
|   app.command.Fill()
 | |
|   expect_eq(Rectangle(0, 0, 4, 2), c.bounds)
 | |
|   expect_img(i, { 1, 1, 1, 1,
 | |
|                   1, 0, 0, 1 })
 | |
| 
 | |
|   c.position = { x=0, y=1 }
 | |
|   app.fgColor = Color{ index=2 }
 | |
|   s.selection = Selection(Rectangle(1, 0, 2, 2))
 | |
|   app.command.Fill()
 | |
|   expect_eq(Rectangle(0, 0, 4, 3), c.bounds)
 | |
|   expect_img(i, { 0, 2, 2, 0,
 | |
|                   1, 2, 2, 1,
 | |
|                   1, 0, 0, 1 })
 | |
| 
 | |
|   app.fgColor = Color{ index=0 }
 | |
|   s.selection = Selection(Rectangle(0, 0, 3, 3))
 | |
|   app.command.Fill()
 | |
|   expect_eq(Rectangle(3, 1, 1, 2), c.bounds)
 | |
|   expect_img(i, { 1,
 | |
|                   1 })
 | |
| 
 | |
|   app.undo() -- undo Fill
 | |
|   expect_eq(Rectangle(0, 0, 4, 3), c.bounds)
 | |
|   expect_img(i, { 0, 2, 2, 0,
 | |
|                   1, 2, 2, 1,
 | |
|                   1, 0, 0, 1 })
 | |
| 
 | |
|   expect_eq(Rectangle(0, 0, 3, 3), s.selection.bounds)
 | |
|   app.undo() -- undo selection change
 | |
|   expect_eq(Rectangle(1, 0, 2, 2), s.selection.bounds)
 | |
|   app.undo() -- undo Fill
 | |
|   expect_eq(Rectangle(0, 1, 4, 2), c.bounds)
 | |
|   expect_img(i, { 1, 1, 1, 1,
 | |
|                   1, 0, 0, 1 })
 | |
| end
 |