1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-03-15 15:55:18 +00:00

Compare commits

...

6 commits

26 changed files with 112 additions and 87 deletions

View file

@ -526,11 +526,7 @@ func is_empty() -> bool:
)
func can_pixel_get_drawn(
pixel: Vector2i,
image: SelectionMap = selection_map,
selection_position: Vector2i = Global.canvas.selection.big_bounding_rectangle.position
) -> bool:
func can_pixel_get_drawn(pixel: Vector2i, image := selection_map) -> bool:
if pixel.x < 0 or pixel.y < 0 or pixel.x >= size.x or pixel.y >= size.y:
return false
@ -538,10 +534,6 @@ func can_pixel_get_drawn(
return false
if has_selection:
if selection_position.x < 0:
pixel.x -= selection_position.x
if selection_position.y < 0:
pixel.y -= selection_position.y
return image.is_pixel_selected(pixel)
else:
return true

View file

@ -4,7 +4,13 @@ extends Image
var invert_shader := preload("res://src/Shaders/Effects/Invert.gdshader")
func is_pixel_selected(pixel: Vector2i) -> bool:
func is_pixel_selected(pixel: Vector2i, calculate_offset := true) -> bool:
var selection_position: Vector2i = Global.canvas.selection.big_bounding_rectangle.position
if calculate_offset:
if selection_position.x < 0:
pixel.x -= selection_position.x
if selection_position.y < 0:
pixel.y -= selection_position.y
if pixel.x < 0 or pixel.y < 0 or pixel.x >= get_width() or pixel.y >= get_height():
return false
var selected: bool = get_pixelv(pixel).a > 0
@ -90,6 +96,17 @@ func invert() -> void:
func return_cropped_copy(size: Vector2i) -> SelectionMap:
var selection_map_copy := SelectionMap.new()
selection_map_copy.copy_from(self)
var diff := Vector2i.ZERO
var selection_position: Vector2i = Global.canvas.selection.big_bounding_rectangle.position
if selection_position.x < 0:
diff.x += selection_position.x
if selection_position.y < 0:
diff.y += selection_position.y
if diff != Vector2i.ZERO:
# If there are pixels out of bounds on the negative side (left & up),
# move them before resizing
selection_map_copy.fill(Color(0))
selection_map_copy.blit_rect(self, Rect2i(Vector2i.ZERO, get_size()), diff)
selection_map_copy.crop(size.x, size.y)
return selection_map_copy

View file

@ -1,7 +1,7 @@
shader_type canvas_item;
render_mode unshaded;
uniform sampler2D selection : hint_default_black;
uniform sampler2D selection : filter_nearest, hint_default_black;
uniform vec4 color;
uniform float similarity_percent : hint_range(0.0, 100.0);
uniform int operation = 0; // 0 = add, 1 = subtract, 2 = intersect

View file

@ -467,7 +467,7 @@ func remove_unselected_parts_of_brush(brush: Image, dst: Vector2i) -> Image:
for x in brush_size.x:
for y in brush_size.y:
var pos := Vector2i(x, y) + dst
if !project.selection_map.is_pixel_selected(pos):
if !project.can_pixel_get_drawn(pos):
new_brush.set_pixel(x, y, Color(0))
return new_brush

View file

@ -84,27 +84,13 @@ func draw_start(pos: Vector2i) -> void:
_start_pos = pos
_offset = pos
var selection_position: Vector2i = selection_node.big_bounding_rectangle.position
var offsetted_pos := pos
if selection_position.x < 0:
offsetted_pos.x -= selection_position.x
if selection_position.y < 0:
offsetted_pos.y -= selection_position.y
var quick_copy := Input.is_action_pressed("transform_copy_selection_content", true)
if (
offsetted_pos.x >= 0
and offsetted_pos.y >= 0
and project.selection_map.is_pixel_selected(offsetted_pos)
project.selection_map.is_pixel_selected(pos)
and (!_add and !_subtract and !_intersect or quick_copy)
and !_ongoing_selection
):
if !(
Global
. current_project
. layers[Global.current_project.current_layer]
. can_layer_get_drawn()
):
if not project.layers[project.current_layer].can_layer_get_drawn():
return
# Move current selection
_move = true

View file

@ -199,7 +199,7 @@ func fill_in_color(pos: Vector2i) -> void:
var selection: Image
var selection_tex: ImageTexture
if project.has_selection:
selection = project.selection_map
selection = project.selection_map.return_cropped_copy(project.size)
else:
selection = Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
selection.fill(Color(1, 1, 1, 1))
@ -263,7 +263,7 @@ func fill_in_selection() -> void:
var selection: Image
var selection_tex: ImageTexture
if project.has_selection:
selection = project.selection_map
selection = project.selection_map.return_cropped_copy(project.size)
else:
selection = Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
selection.fill(Color(1, 1, 1, 1))

View file

@ -49,8 +49,6 @@ popup/item_2/id = 2
[node name="SimilaritySlider" parent="." index="4" instance=ExtResource("1")]
visible = false
layout_mode = 2
focus_mode = 2
theme_type_variation = &"ValueSlider"
value = 100.0
prefix = "Similarity:"
@ -96,14 +94,10 @@ stretch_mode = 6
[node name="OffsetX" parent="FillPattern" index="1" instance=ExtResource("1")]
layout_mode = 2
focus_mode = 2
theme_type_variation = &"ValueSlider"
prefix = "Offset X:"
[node name="OffsetY" parent="FillPattern" index="2" instance=ExtResource("1")]
layout_mode = 2
focus_mode = 2
theme_type_variation = &"ValueSlider"
prefix = "Offset Y:"
[connection signal="item_selected" from="FillAreaOptions" to="." method="_on_FillAreaOptions_item_selected"]

View file

@ -92,8 +92,9 @@ func apply_selection(_position: Vector2i) -> void:
func set_ellipse(selection_map: SelectionMap, pos: Vector2i) -> void:
var project := Global.current_project
var bitmap_size := selection_map.get_size()
var previous_selection_map := SelectionMap.new() # Used for intersect
previous_selection_map.copy_from(selection_map)
if _intersect:
selection_map.clear()
var points := DrawingAlgos.get_ellipse_points_filled(Vector2.ZERO, _rect.size)
@ -102,7 +103,7 @@ func set_ellipse(selection_map: SelectionMap, pos: Vector2i) -> void:
if fill_p.x < 0 or fill_p.y < 0 or fill_p.x >= bitmap_size.x or fill_p.y >= bitmap_size.y:
continue
if _intersect:
if project.selection_map.is_pixel_selected(fill_p):
if previous_selection_map.is_pixel_selected(fill_p):
selection_map.select_pixel(fill_p, true)
else:
selection_map.select_pixel(fill_p, !_subtract)

View file

@ -21,7 +21,7 @@ func draw_move(pos_i: Vector2i) -> void:
if !_move:
append_gap(_last_position, pos)
_last_position = pos
_draw_points.append(pos)
_draw_points.append(Vector2i(pos))
_offset = pos
@ -76,21 +76,26 @@ func apply_selection(_position) -> void:
super.apply_selection(_position)
var project := Global.current_project
var cleared := false
var previous_selection_map := SelectionMap.new() # Used for intersect
previous_selection_map.copy_from(project.selection_map)
if !_add and !_subtract and !_intersect:
cleared = true
Global.canvas.selection.clear_selection()
if _draw_points.size() > 3:
if _intersect:
project.selection_map.clear()
lasso_selection(project.selection_map, _draw_points)
lasso_selection(project.selection_map, previous_selection_map, _draw_points)
# Handle mirroring
if Tools.horizontal_mirror:
lasso_selection(project.selection_map, mirror_array(_draw_points, true, false))
var mirror_x := mirror_array(_draw_points, true, false)
lasso_selection(project.selection_map, previous_selection_map, mirror_x)
if Tools.vertical_mirror:
lasso_selection(project.selection_map, mirror_array(_draw_points, true, true))
var mirror_xy := mirror_array(_draw_points, true, true)
lasso_selection(project.selection_map, previous_selection_map, mirror_xy)
if Tools.vertical_mirror:
lasso_selection(project.selection_map, mirror_array(_draw_points, false, true))
var mirror_y := mirror_array(_draw_points, false, true)
lasso_selection(project.selection_map, previous_selection_map, mirror_y)
Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect()
else:
@ -102,14 +107,16 @@ func apply_selection(_position) -> void:
_last_position = Vector2.INF
func lasso_selection(selection_map: SelectionMap, points: Array[Vector2i]) -> void:
func lasso_selection(
selection_map: SelectionMap, previous_selection_map: SelectionMap, points: Array[Vector2i]
) -> void:
var project := Global.current_project
var selection_size := selection_map.get_size()
for point in points:
if point.x < 0 or point.y < 0 or point.x >= selection_size.x or point.y >= selection_size.y:
continue
if _intersect:
if project.selection_map.is_pixel_selected(point):
if previous_selection_map.is_pixel_selected(point):
selection_map.select_pixel(point, true)
else:
selection_map.select_pixel(point, !_subtract)
@ -122,7 +129,7 @@ func lasso_selection(selection_map: SelectionMap, points: Array[Vector2i]) -> vo
v.y = y
if Geometry2D.is_point_in_polygon(v, points):
if _intersect:
if project.selection_map.is_pixel_selected(v):
if previous_selection_map.is_pixel_selected(v):
selection_map.select_pixel(v, true)
else:
selection_map.select_pixel(v, !_subtract)

View file

@ -24,18 +24,19 @@ func apply_selection(pos: Vector2i) -> void:
var project := Global.current_project
if pos.x < 0 or pos.y < 0 or pos.x >= project.size.x or pos.y >= project.size.y:
return
var previous_selection_map := SelectionMap.new() # Used for intersect
previous_selection_map.copy_from(project.selection_map)
if !_add and !_subtract and !_intersect:
Global.canvas.selection.clear_selection()
if _intersect:
project.selection_map.clear()
var cel_image := Image.new()
cel_image.copy_from(_get_draw_image())
_flood_fill(pos, cel_image, project.selection_map)
_flood_fill(pos, cel_image, project.selection_map, previous_selection_map)
# Handle mirroring
for mirror_pos in Tools.get_mirrored_positions(pos):
_flood_fill(mirror_pos, cel_image, project.selection_map)
_flood_fill(mirror_pos, cel_image, project.selection_map, previous_selection_map)
Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect()
Global.canvas.selection.commit_undo("Select", undo_data)
@ -119,7 +120,9 @@ func _check_flooded_segment(
return ret
func _flood_fill(pos: Vector2i, image: Image, selection_map: SelectionMap) -> void:
func _flood_fill(
pos: Vector2i, image: Image, selection_map: SelectionMap, previous_selection_map: SelectionMap
) -> void:
# implements the floodfill routine by Shawn Hargreaves
# from https://www1.udel.edu/CIS/software/dist/allegro-4.2.1/src/flood.c
var project := Global.current_project
@ -130,7 +133,7 @@ func _flood_fill(pos: Vector2i, image: Image, selection_map: SelectionMap) -> vo
_compute_segments_for_image(pos, project, image, color)
# now actually color the image: since we have already checked a few things for the points
# we'll process here, we're going to skip a bunch of safety checks to speed things up.
_select_segments(selection_map)
_select_segments(selection_map, previous_selection_map)
func _compute_segments_for_image(
@ -162,18 +165,17 @@ func _compute_segments_for_image(
done = false
func _select_segments(selection_map: SelectionMap) -> void:
func _select_segments(selection_map: SelectionMap, previous_selection_map: SelectionMap) -> void:
# short circuit for flat colors
for c in _allegro_image_segments.size():
var p := _allegro_image_segments[c]
for px in range(p.left_position, p.right_position + 1):
# We don't have to check again whether the point being processed is within the bounds
_set_bit(Vector2i(px, p.y), selection_map)
_set_bit(Vector2i(px, p.y), selection_map, previous_selection_map)
func _set_bit(p: Vector2i, selection_map: SelectionMap) -> void:
var project := Global.current_project
func _set_bit(p: Vector2i, selection_map: SelectionMap, prev_selection_map: SelectionMap) -> void:
if _intersect:
selection_map.select_pixel(p, project.selection_map.is_pixel_selected(p))
selection_map.select_pixel(p, prev_selection_map.is_pixel_selected(p))
else:
selection_map.select_pixel(p, !_subtract)

View file

@ -104,6 +104,8 @@ func apply_selection(pos: Vector2i) -> void:
super.apply_selection(pos)
var project := Global.current_project
var cleared := false
var previous_selection_map := SelectionMap.new() # Used for intersect
previous_selection_map.copy_from(project.selection_map)
if !_add and !_subtract and !_intersect:
cleared = true
Global.canvas.selection.clear_selection()
@ -111,15 +113,18 @@ func apply_selection(pos: Vector2i) -> void:
if _draw_points.size() >= 1:
if _intersect:
project.selection_map.clear()
paint_selection(project.selection_map, _draw_points)
paint_selection(project.selection_map, previous_selection_map, _draw_points)
# Handle mirroring
if Tools.horizontal_mirror:
paint_selection(project.selection_map, mirror_array(_draw_points, true, false))
var mirror_x := mirror_array(_draw_points, true, false)
paint_selection(project.selection_map, previous_selection_map, mirror_x)
if Tools.vertical_mirror:
paint_selection(project.selection_map, mirror_array(_draw_points, true, true))
var mirror_xy := mirror_array(_draw_points, true, true)
paint_selection(project.selection_map, previous_selection_map, mirror_xy)
if Tools.vertical_mirror:
paint_selection(project.selection_map, mirror_array(_draw_points, false, true))
var mirror_y := mirror_array(_draw_points, false, true)
paint_selection(project.selection_map, previous_selection_map, mirror_y)
Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect()
else:
@ -131,14 +136,15 @@ func apply_selection(pos: Vector2i) -> void:
_last_position = Vector2.INF
func paint_selection(selection_map: SelectionMap, points: Array[Vector2i]) -> void:
var project := Global.current_project
func paint_selection(
selection_map: SelectionMap, previous_selection_map: SelectionMap, points: Array[Vector2i]
) -> void:
var selection_size := selection_map.get_size()
for point in points:
if point.x < 0 or point.y < 0 or point.x >= selection_size.x or point.y >= selection_size.y:
continue
if _intersect:
if project.selection_map.is_pixel_selected(point):
if previous_selection_map.is_pixel_selected(point):
selection_map.select_pixel(point, true)
else:
selection_map.select_pixel(point, !_subtract)

View file

@ -115,21 +115,26 @@ func apply_selection(pos: Vector2i) -> void:
return
var project := Global.current_project
var cleared := false
var previous_selection_map := SelectionMap.new() # Used for intersect
previous_selection_map.copy_from(project.selection_map)
if !_add and !_subtract and !_intersect:
cleared = true
Global.canvas.selection.clear_selection()
if _draw_points.size() > 3:
if _intersect:
project.selection_map.clear()
lasso_selection(project.selection_map, _draw_points)
lasso_selection(project.selection_map, previous_selection_map, _draw_points)
# Handle mirroring
if Tools.horizontal_mirror:
lasso_selection(project.selection_map, mirror_array(_draw_points, true, false))
var mirror_x := mirror_array(_draw_points, true, false)
lasso_selection(project.selection_map, previous_selection_map, mirror_x)
if Tools.vertical_mirror:
lasso_selection(project.selection_map, mirror_array(_draw_points, true, true))
var mirror_xy := mirror_array(_draw_points, true, true)
lasso_selection(project.selection_map, previous_selection_map, mirror_xy)
if Tools.vertical_mirror:
lasso_selection(project.selection_map, mirror_array(_draw_points, false, true))
var mirror_y := mirror_array(_draw_points, false, true)
lasso_selection(project.selection_map, previous_selection_map, mirror_y)
Global.canvas.selection.big_bounding_rectangle = project.selection_map.get_used_rect()
else:
@ -143,14 +148,16 @@ func apply_selection(pos: Vector2i) -> void:
Global.canvas.previews.queue_redraw()
func lasso_selection(selection_map: SelectionMap, points: Array[Vector2i]) -> void:
func lasso_selection(
selection_map: SelectionMap, previous_selection_map: SelectionMap, points: Array[Vector2i]
) -> void:
var project := Global.current_project
var selection_size := selection_map.get_size()
for point in points:
if point.x < 0 or point.y < 0 or point.x >= selection_size.x or point.y >= selection_size.y:
continue
if _intersect:
if project.selection_map.is_pixel_selected(point):
if previous_selection_map.is_pixel_selected(point):
selection_map.select_pixel(point, true)
else:
selection_map.select_pixel(point, !_subtract)
@ -163,7 +170,7 @@ func lasso_selection(selection_map: SelectionMap, points: Array[Vector2i]) -> vo
v.y = y
if Geometry2D.is_point_in_polygon(v, points):
if _intersect:
if project.selection_map.is_pixel_selected(v):
if previous_selection_map.is_pixel_selected(v):
selection_map.select_pixel(v, true)
else:
selection_map.select_pixel(v, !_subtract)

View file

@ -421,18 +421,20 @@ func select_rect(rect: Rect2i, operation := SelectionOperation.ADD) -> void:
elif operation == SelectionOperation.SUBTRACT:
project.selection_map.fill_rect(rect, Color(0))
elif operation == SelectionOperation.INTERSECT:
var previous_selection_map := SelectionMap.new()
previous_selection_map.copy_from(project.selection_map)
project.selection_map.clear()
for x in range(rect.position.x, rect.end.x):
for y in range(rect.position.y, rect.end.y):
var pos := Vector2i(x, y)
if !Rect2i(Vector2i.ZERO, project.selection_map.get_size()).has_point(pos):
if !Rect2i(Vector2i.ZERO, previous_selection_map.get_size()).has_point(pos):
continue
project.selection_map.select_pixel(
pos, project.selection_map.is_pixel_selected(pos)
pos, previous_selection_map.is_pixel_selected(pos, false)
)
big_bounding_rectangle = project.selection_map.get_used_rect()
if offset_position != Vector2i.ZERO:
if offset_position != Vector2i.ZERO and big_bounding_rectangle.get_area() != 0:
big_bounding_rectangle.position += offset_position
project.selection_map.move_bitmap_values(project)
@ -683,7 +685,7 @@ func copy() -> void:
offset_pos.x = 0
if offset_pos.y < 0:
offset_pos.y = 0
if not project.selection_map.is_pixel_selected(pos + offset_pos):
if not project.selection_map.is_pixel_selected(pos + offset_pos, false):
to_copy.set_pixelv(pos, Color(0))
cl_selection_map.copy_from(project.selection_map)
cl_big_bounding_rectangle = big_bounding_rectangle

View file

@ -236,7 +236,7 @@ func create_layer_list() -> void:
func update_dimensions_label() -> void:
if _preview_images.size() > 0:
var new_size: Vector2 = _preview_images[0].image.get_size() * (Export.resize / 100.0)
var new_size: Vector2i = _preview_images[0].image.get_size() * (Export.resize / 100.0)
dimension_label.text = str(new_size.x, "×", new_size.y)

View file

@ -18,7 +18,8 @@ func _ready() -> void:
func commit_action(cel: Image, project := Global.current_project) -> void:
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
var params := {
"red": red, "blue": blue, "green": green, "alpha": alpha, "selection": selection_tex

View file

@ -29,7 +29,8 @@ func commit_action(cel: Image, project := Global.current_project) -> void:
var offset_y := animate_panel.get_animated_value(commit_idx, Animate.OFFSET_Y)
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
var params := {
"offset": Vector2(offset_x, offset_y), "shadow_color": color, "selection": selection_tex

View file

@ -58,7 +58,8 @@ func _ready() -> void:
func commit_action(cel: Image, project := Global.current_project) -> void:
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
var dither_texture := selected_dither_matrix.texture
var gradient := gradient_edit.gradient

View file

@ -13,7 +13,8 @@ func _ready() -> void:
func commit_action(cel: Image, project := Global.current_project) -> void:
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
var params := {"selection": selection_tex, "gradient_map": $VBoxContainer/GradientEdit.texture}

View file

@ -30,7 +30,8 @@ func commit_action(cel: Image, project := Global.current_project) -> void:
var val = animate_panel.get_animated_value(commit_idx, Animate.VALUE) / 100
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
var params := {"hue": hue, "saturation": sat, "value": val, "selection": selection_tex}
if !has_been_confirmed:

View file

@ -18,7 +18,8 @@ func _ready() -> void:
func commit_action(cel: Image, project := Global.current_project) -> void:
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
var params := {
"red": red, "blue": blue, "green": green, "alpha": alpha, "selection": selection_tex

View file

@ -34,7 +34,8 @@ func commit_action(cel: Image, project := Global.current_project) -> void:
var offset := Vector2(offset_x, offset_y)
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
var params := {"offset": offset, "wrap_around": wrap_around, "selection": selection_tex}
if !has_been_confirmed:

View file

@ -25,7 +25,8 @@ func commit_action(cel: Image, project := Global.current_project) -> void:
var anim_thickness := animate_panel.get_animated_value(commit_idx, Animate.THICKNESS)
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
var params := {
"color": color,

View file

@ -13,7 +13,8 @@ func _ready() -> void:
func commit_action(cel: Image, project := Global.current_project) -> void:
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
if not is_instance_valid(Palettes.current_palette):
return

View file

@ -14,7 +14,8 @@ func _ready() -> void:
func commit_action(cel: Image, project := Global.current_project) -> void:
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
var params := {"pixel_size": pixel_size, "selection": selection_tex}
if !has_been_confirmed:

View file

@ -15,7 +15,8 @@ func _ready() -> void:
func commit_action(cel: Image, project := Global.current_project) -> void:
var selection_tex: ImageTexture
if selection_checkbox.button_pressed and project.has_selection:
selection_tex = ImageTexture.create_from_image(project.selection_map)
var selection := project.selection_map.return_cropped_copy(project.size)
selection_tex = ImageTexture.create_from_image(selection)
var params := {"colors": levels, "dither_intensity": dither, "selection": selection_tex}

View file

@ -85,7 +85,7 @@ func commit_action(cel: Image, _project := Global.current_project) -> void:
var image := Image.new()
image.copy_from(cel)
if _project.has_selection and selection_checkbox.button_pressed:
var selection := _project.selection_map
var selection := _project.selection_map.return_cropped_copy(_project.size)
selection_tex = ImageTexture.create_from_image(selection)
if !_type_is_shader():