From 34c29bcbba9bc2cf2573994719afa06dd7c3c7b1 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 9 Aug 2025 09:13:03 +0100 Subject: [PATCH] add functions to add and remove pixels from layer-tree --- dotscape | Bin 1051816 -> 1051816 bytes fcore/app-init.sml | 2 +- fcore/app-type.sml | 2 +- fcore/grid.sml | 18 +++++++++++++++--- fcore/layer-tree.sml | 27 ++++++++++++++++++--------- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/dotscape b/dotscape index d53c824cda8a14d342536b7d4ee8573f48bd8d00..6a86ddd07ec4210402dd3b6ba03f1c4568fb1311 100755 GIT binary patch delta 11119 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 Un!SDU&kM7h^2c)qzxBKS2bGTekN^Mx delta 11092 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 diff --git a/fcore/app-init.sml b/fcore/app-init.sml index bf5d66a..f74694a 100644 --- a/fcore/app-init.sml +++ b/fcore/app-init.sml @@ -48,7 +48,7 @@ struct , b = 0 , a = 1 , layer = 0 - , layerTree = LayerTree.emptyTree + , layerTree = LayerTree.empty , modalNum = 0 , undo = [] , redo = [] diff --git a/fcore/app-type.sml b/fcore/app-type.sml index 0b31a70..181eb3a 100644 --- a/fcore/app-type.sml +++ b/fcore/app-type.sml @@ -34,7 +34,7 @@ struct , b: int , a: int , layer: int - , layerTree: LayerTree.tree + , layerTree: LayerTree.t , modalNum: int , undo: square list , redo: square list diff --git a/fcore/grid.sml b/fcore/grid.sml index bee7ede..a7c016e 100644 --- a/fcore/grid.sml +++ b/fcore/grid.sml @@ -1,12 +1,12 @@ structure Grid = struct - type square = {r: int, g: int, b: int, a: int} + type pixel = {r: int, g: int, b: int, a: int} - type t = square vector vector + type t = pixel vector vector val emptyPixel = {r = 0, g = 0, b = 0, a = 0} - fun isBlank ({a, ...}: square) = a = 0 + fun isBlank ({a, ...}: pixel) = a = 0 fun changeGridSize maxSide grid = Vector.tabulate (maxSide, fn i => @@ -20,4 +20,16 @@ struct end else Vector.tabulate (maxSide, fn _ => emptyPixel)) + + fun updateGrid (grid, newX, newY, pixel) = + let + val yAxis = Vector.sub (grid, newX) + val yAxis = Vector.update (yAxis, newY, pixel) + in + Vector.update (grid, newX, yAxis) + end + + fun makeEmpty maxSide = + Vector.tabulate (maxSide, fn _ => + Vector.tabulate (maxSide, fn _ => emptyPixel)) end diff --git a/fcore/layer-tree.sml b/fcore/layer-tree.sml index f03103e..15fbe20 100644 --- a/fcore/layer-tree.sml +++ b/fcore/layer-tree.sml @@ -1,10 +1,8 @@ structure LayerTree = struct - datatype tree = - NODE of {key: int, value: Grid.t, left: tree, right: tree} - | LEAF + datatype t = NODE of {key: int, value: Grid.t, left: t, right: t} | LEAF - val emptyTree = LEAF + val empty = LEAF fun insert (newKey, newValue, tree) = case tree of @@ -65,15 +63,26 @@ struct else valuePixel) valueYAxis) value - fun makeEmptyGrid maxSide = - Vector.tabulate (maxSide, fn _ => - Vector.tabulate (maxSide, fn _ => Grid.emptyPixel)) - fun flatten (maxSide, tree) = - foldl (helpFlatten, tree, makeEmptyGrid maxSide) + foldl (helpFlatten, tree, Grid.makeEmpty maxSide) fun changeGridSize (maxSide, tree) = let val f = Grid.changeGridSize maxSide in map (f, tree) end + + fun addPixel (key, newX, newY, maxSide, pixel, tree) = + let + val grid = + case get (key, tree) of + SOME grid => grid + | NONE => Grid.makeEmpty maxSide + + val grid = Grid.updateGrid (grid, newX, newY, pixel) + in + insert (key, grid, tree) + end + + fun removePixel (key, newX, newY, maxSide, tree) = + addPixel (key, newX, newY, maxSide, Grid.emptyPixel, tree) end