1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-19 01:29:49 +00:00

Keep images unlocked after editing them - Should close #331

Not sure if this actually solves the issue or just makes it more rare, but I haven't been able to reproduce any PoolVector locking issues so far. The problem was that images were remained locked essentially all the time, which seemed to cause issues. Maybe other PoolVectors could not get locked?
This commit is contained in:
Manolis Papadeas 2021-07-25 21:49:37 +03:00
parent 68cbf4cfb3
commit 1d20295f7d
13 changed files with 16 additions and 25 deletions

View file

@ -261,9 +261,8 @@ func crop_image() -> void:
var used_rect := Rect2() var used_rect := Rect2()
for f in Global.current_project.frames: for f in Global.current_project.frames:
for cel in f.cels: for cel in f.cels:
cel.image.unlock() cel.image.unlock() # May be unneeded now, but keep it just in case
var cel_used_rect : Rect2 = cel.image.get_used_rect() var cel_used_rect : Rect2 = cel.image.get_used_rect()
cel.image.lock()
if cel_used_rect == Rect2(0, 0, 0, 0): # If the cel has no content if cel_used_rect == Rect2(0, 0, 0, 0): # If the cel has no content
continue continue
@ -586,7 +585,6 @@ func generate_gradient(image : Image, colors : Array, steps : int, direction : i
color = colors[-1].linear_interpolate(colors[0], t * i) color = colors[-1].linear_interpolate(colors[0], t * i)
colors.insert(1, color) colors.insert(1, color)
image.unlock()
if direction == GradientDirection.BOTTOM or direction == GradientDirection.RIGHT: if direction == GradientDirection.BOTTOM or direction == GradientDirection.RIGHT:
colors.invert() colors.invert()
@ -623,3 +621,5 @@ func generate_gradient(image : Image, colors : Array, steps : int, direction : i
if selection and !project.selection_bitmap.get_bit(pos): if selection and !project.selection_bitmap.get_bit(pos):
continue continue
image.set_pixelv(pos, colors[i]) image.set_pixelv(pos, colors[i])
image.unlock()

View file

@ -189,7 +189,6 @@ func open_old_pxo_file(file : File, new_project : Project, first_line : String)
cel_opacity = file.get_float() cel_opacity = file.get_float()
var image := Image.new() var image := Image.new()
image.create_from_data(width, height, false, Image.FORMAT_RGBA8, buffer) image.create_from_data(width, height, false, Image.FORMAT_RGBA8, buffer)
image.lock()
frame_class.cels.append(Cel.new(image, cel_opacity)) frame_class.cels.append(Cel.new(image, cel_opacity))
if file_major_version >= 0 and file_minor_version >= 7: if file_major_version >= 0 and file_minor_version >= 7:
if frame in linked_cels[layer_i]: if frame in linked_cels[layer_i]:
@ -352,7 +351,6 @@ func open_image_as_new_tab(path : String, image : Image) -> void:
var frame := Frame.new() var frame := Frame.new()
image.convert(Image.FORMAT_RGBA8) image.convert(Image.FORMAT_RGBA8)
image.lock()
frame.cels.append(Cel.new(image, 1)) frame.cels.append(Cel.new(image, 1))
project.frames.append(frame) project.frames.append(frame)
@ -374,14 +372,12 @@ func open_image_as_spritesheet_tab(path : String, image : Image, horizontal : in
cropped_image = image.get_rect(Rect2(frame_width * xx, frame_height * yy, frame_width, frame_height)) cropped_image = image.get_rect(Rect2(frame_width * xx, frame_height * yy, frame_width, frame_height))
project.size = cropped_image.get_size() project.size = cropped_image.get_size()
cropped_image.convert(Image.FORMAT_RGBA8) cropped_image.convert(Image.FORMAT_RGBA8)
cropped_image.lock()
frame.cels.append(Cel.new(cropped_image, 1)) frame.cels.append(Cel.new(cropped_image, 1))
for _i in range(1, project.layers.size()): for _i in range(1, project.layers.size()):
var empty_sprite := Image.new() var empty_sprite := Image.new()
empty_sprite.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8) empty_sprite.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
empty_sprite.fill(Color(0, 0, 0, 0)) empty_sprite.fill(Color(0, 0, 0, 0))
empty_sprite.lock()
frame.cels.append(Cel.new(empty_sprite, 1)) frame.cels.append(Cel.new(empty_sprite, 1))
project.frames.append(frame) project.frames.append(frame)
@ -436,7 +432,6 @@ func open_image_at_frame(image : Image, layer_index := 0, frame_index := 0) -> v
for i in project.frames.size(): for i in project.frames.size():
if i == frame_index: if i == frame_index:
image.convert(Image.FORMAT_RGBA8) image.convert(Image.FORMAT_RGBA8)
image.lock()
frames[i].cels[layer_index] = (Cel.new(image, 1)) frames[i].cels[layer_index] = (Cel.new(image, 1))
project.undo_redo.add_do_property(project.frames[i], "cels", frames[i].cels) project.undo_redo.add_do_property(project.frames[i], "cels", frames[i].cels)
project.undo_redo.add_undo_property(project.frames[i], "cels", project.frames[i].cels) project.undo_redo.add_undo_property(project.frames[i], "cels", project.frames[i].cels)
@ -461,12 +456,10 @@ func open_image_as_new_frame(image : Image, layer_index := 0) -> void:
for i in project.layers.size(): for i in project.layers.size():
if i == layer_index: if i == layer_index:
image.convert(Image.FORMAT_RGBA8) image.convert(Image.FORMAT_RGBA8)
image.lock()
frame.cels.append(Cel.new(image, 1)) frame.cels.append(Cel.new(image, 1))
else: else:
var empty_image := Image.new() var empty_image := Image.new()
empty_image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8) empty_image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
empty_image.lock()
frame.cels.append(Cel.new(empty_image, 1)) frame.cels.append(Cel.new(empty_image, 1))
new_frames.append(frame) new_frames.append(frame)
@ -498,12 +491,10 @@ func open_image_as_new_layer(image : Image, file_name : String, frame_index := 0
var new_cels : Array = project.frames[i].cels.duplicate(true) var new_cels : Array = project.frames[i].cels.duplicate(true)
if i == frame_index: if i == frame_index:
image.convert(Image.FORMAT_RGBA8) image.convert(Image.FORMAT_RGBA8)
image.lock()
new_cels.append(Cel.new(image, 1)) new_cels.append(Cel.new(image, 1))
else: else:
var empty_image := Image.new() var empty_image := Image.new()
empty_image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8) empty_image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
empty_image.lock()
new_cels.append(Cel.new(empty_image, 1)) new_cels.append(Cel.new(empty_image, 1))
project.undo_redo.add_do_property(project.frames[i], "cels", new_cels) project.undo_redo.add_do_property(project.frames[i], "cels", new_cels)

View file

@ -41,5 +41,4 @@ func generate_image(_img : Image,_shaderpath: String, _params : Dictionary , siz
#Global.canvas.handle_undo("Draw") #Global.canvas.handle_undo("Draw")
_img.copy_from(viewport_texture) _img.copy_from(viewport_texture)
#Global.canvas.handle_redo("Draw") #Global.canvas.handle_redo("Draw")
_img.lock()
emit_signal("done") emit_signal("done")

View file

@ -124,8 +124,6 @@ func fill_in_color(position : Vector2) -> void:
if tool_slot.color.is_equal_approx(color): if tool_slot.color.is_equal_approx(color):
return return
image.lock()
for x in Global.current_project.size.x: for x in Global.current_project.size.x:
for y in Global.current_project.size.y: for y in Global.current_project.size.y:
var pos := Vector2(x, y) var pos := Vector2(x, y)
@ -165,7 +163,6 @@ func _flood_fill(position : Vector2) -> void:
if tool_slot.color.is_equal_approx(color): if tool_slot.color.is_equal_approx(color):
return return
image.lock()
var processed := BitMap.new() var processed := BitMap.new()
processed.create(image.get_size()) processed.create(image.get_size())
var q = [position] var q = [position]
@ -203,6 +200,7 @@ func _set_pixel(image : Image, x : int, y : int, color : Color) -> void:
var px := int(x + _offset_x) % int(size.x) var px := int(x + _offset_x) % int(size.x)
var py := int(y + _offset_y) % int(size.y) var py := int(y + _offset_y) % int(size.y)
var pc := _pattern.image.get_pixel(px, py) var pc := _pattern.image.get_pixel(px, py)
_pattern.image.unlock()
image.set_pixel(x, y, pc) image.set_pixel(x, y, pc)
@ -219,6 +217,7 @@ func commit_undo(action : String, undo_data : Dictionary) -> void:
project.undo_redo.create_action(action) project.undo_redo.create_action(action)
for image in redo_data: for image in redo_data:
project.undo_redo.add_do_property(image, "data", redo_data[image]) project.undo_redo.add_do_property(image, "data", redo_data[image])
image.unlock()
for image in undo_data: for image in undo_data:
project.undo_redo.add_undo_property(image, "data", undo_data[image]) project.undo_redo.add_undo_property(image, "data", undo_data[image])
project.undo_redo.add_do_method(Global, "redo", frame, layer) project.undo_redo.add_do_method(Global, "redo", frame, layer)

View file

@ -159,6 +159,7 @@ func commit_undo(action : String) -> void:
project.undo_redo.create_action(action) project.undo_redo.create_action(action)
for image in redo_data: for image in redo_data:
project.undo_redo.add_do_property(image, "data", redo_data[image]) project.undo_redo.add_do_property(image, "data", redo_data[image])
image.unlock()
for image in _undo_data: for image in _undo_data:
project.undo_redo.add_undo_property(image, "data", _undo_data[image]) project.undo_redo.add_undo_property(image, "data", _undo_data[image])
project.undo_redo.add_do_method(Global, "redo", frame, layer) project.undo_redo.add_do_method(Global, "redo", frame, layer)

View file

@ -105,6 +105,7 @@ func commit_undo(action : String) -> void:
project.undo_redo.create_action(action) project.undo_redo.create_action(action)
for image in redo_data: for image in redo_data:
project.undo_redo.add_do_property(image, "data", redo_data[image]) project.undo_redo.add_do_property(image, "data", redo_data[image])
image.unlock()
for image in _undo_data: for image in _undo_data:
project.undo_redo.add_undo_property(image, "data", _undo_data[image]) project.undo_redo.add_undo_property(image, "data", _undo_data[image])
project.undo_redo.add_do_method(Global, "redo", frame, layer) project.undo_redo.add_do_method(Global, "redo", frame, layer)

View file

@ -132,7 +132,6 @@ func new_empty_frame(first_time := false, single_layer := false, size := Global.
fill_color = Global.config_cache.get_value("preferences", "default_fill_color") fill_color = Global.config_cache.get_value("preferences", "default_fill_color")
sprite.create(size.x, size.y, false, Image.FORMAT_RGBA8) sprite.create(size.x, size.y, false, Image.FORMAT_RGBA8)
sprite.fill(fill_color) sprite.fill(fill_color)
sprite.lock()
frame.cels.append(Cel.new(sprite, 1)) frame.cels.append(Cel.new(sprite, 1))
if single_layer: if single_layer:

View file

@ -538,6 +538,7 @@ func commit_undo(action : String, _undo_data : Dictionary) -> void:
if not image is Image: if not image is Image:
continue continue
project.undo_redo.add_do_property(image, "data", redo_data[image]) project.undo_redo.add_do_property(image, "data", redo_data[image])
image.unlock()
for image in _undo_data: for image in _undo_data:
if not image is Image: if not image is Image:
continue continue

View file

@ -47,5 +47,6 @@ func flip_image(image : Image, affect_selection : bool, project : Project = Glob
selected_image.flip_x() selected_image.flip_x()
if flip_v.pressed: if flip_v.pressed:
selected_image.flip_y() selected_image.flip_y()
selected_image.unlock()
image.blit_rect_mask(selected_image, selected_image, Rect2(Vector2.ZERO, selected_image.get_size()), Vector2.ZERO) image.blit_rect_mask(selected_image, selected_image, Rect2(Vector2.ZERO, selected_image.get_size()), Vector2.ZERO)
image.unlock()

View file

@ -32,6 +32,7 @@ func _on_ResizeCanvas_about_to_show() -> void:
var pixel_color := cel_image.get_pixel(xx, yy) var pixel_color := cel_image.get_pixel(xx, yy)
var alpha : float = pixel_color.a * cel.opacity var alpha : float = pixel_color.a * cel.opacity
cel_image.set_pixel(xx, yy, Color(pixel_color.r, pixel_color.g, pixel_color.b, alpha)) cel_image.set_pixel(xx, yy, Color(pixel_color.r, pixel_color.g, pixel_color.b, alpha))
cel_image.unlock()
image.blend_rect(cel_image, Rect2(Vector2.ZERO, Global.current_project.size), Vector2.ZERO) image.blend_rect(cel_image, Rect2(Vector2.ZERO, Global.current_project.size), Vector2.ZERO)
layer_i += 1 layer_i += 1
image.unlock() image.unlock()

View file

@ -63,7 +63,6 @@ func _on_ShaderEffect_confirmed() -> void:
Global.canvas.handle_undo("Draw") Global.canvas.handle_undo("Draw")
current_cel.copy_from(viewport_texture) current_cel.copy_from(viewport_texture)
Global.canvas.handle_redo("Draw") Global.canvas.handle_redo("Draw")
current_cel.lock()
func _on_ShaderEffect_popup_hide() -> void: func _on_ShaderEffect_popup_hide() -> void:

View file

@ -1,5 +1,6 @@
extends Panel extends Panel
var is_animation_running := false
var animation_loop := 1 # 0 is no loop, 1 is cycle loop, 2 is ping-pong loop var animation_loop := 1 # 0 is no loop, 1 is cycle loop, 2 is ping-pong loop
var animation_forward := true var animation_forward := true
var first_frame := 0 var first_frame := 0
@ -173,7 +174,6 @@ func _on_CopyFrame_pressed(frame := -1) -> void:
for cel in Global.current_project.frames[frame].cels: # Copy every cel for cel in Global.current_project.frames[frame].cels: # Copy every cel
var sprite := Image.new() var sprite := Image.new()
sprite.copy_from(cel.image) sprite.copy_from(cel.image)
sprite.lock()
var sprite_texture := ImageTexture.new() var sprite_texture := ImageTexture.new()
sprite_texture.create_from_image(sprite, 0) sprite_texture.create_from_image(sprite, 0)
new_frame.cels.append(Cel.new(sprite, cel.opacity, sprite_texture)) new_frame.cels.append(Cel.new(sprite, cel.opacity, sprite_texture))
@ -304,6 +304,7 @@ func _on_AnimationTimer_timeout() -> void:
Global.play_forward.pressed = false Global.play_forward.pressed = false
Global.play_backwards.pressed = false Global.play_backwards.pressed = false
Global.animation_timer.stop() Global.animation_timer.stop()
is_animation_running = false
1: # Cycle loop 1: # Cycle loop
Global.current_project.selected_cels.clear() Global.current_project.selected_cels.clear()
Global.current_project.current_frame = first_frame Global.current_project.current_frame = first_frame
@ -325,6 +326,7 @@ func _on_AnimationTimer_timeout() -> void:
Global.play_backwards.pressed = false Global.play_backwards.pressed = false
Global.play_forward.pressed = false Global.play_forward.pressed = false
Global.animation_timer.stop() Global.animation_timer.stop()
is_animation_running = false
1: # Cycle loop 1: # Cycle loop
Global.current_project.selected_cels.clear() Global.current_project.selected_cels.clear()
Global.current_project.current_frame = last_frame Global.current_project.current_frame = last_frame
@ -372,6 +374,8 @@ func play_animation(play : bool, forward_dir : bool) -> void:
else: else:
Global.animation_timer.stop() Global.animation_timer.stop()
is_animation_running = play
func _on_NextFrame_pressed() -> void: func _on_NextFrame_pressed() -> void:
Global.canvas.selection.transform_content_confirm() Global.canvas.selection.transform_content_confirm()
@ -439,8 +443,6 @@ func add_layer(is_new := true) -> void:
else: # Clone layer else: # Clone layer
new_layer.copy_from(f.cels[Global.current_project.current_layer].image) new_layer.copy_from(f.cels[Global.current_project.current_layer].image)
new_layer.lock()
var new_cels : Array = f.cels.duplicate() var new_cels : Array = f.cels.duplicate()
new_cels.append(Cel.new(new_layer, 1)) new_cels.append(Cel.new(new_layer, 1))
Global.current_project.undo_redo.add_do_property(f, "cels", new_cels) Global.current_project.undo_redo.add_do_property(f, "cels", new_cels)
@ -524,7 +526,6 @@ func _on_MergeDownLayer_pressed() -> void:
new_cels[i] = Cel.new(new_cels[i].image, new_cels[i].opacity) new_cels[i] = Cel.new(new_cels[i].image, new_cels[i].opacity)
var selected_layer := Image.new() var selected_layer := Image.new()
selected_layer.copy_from(new_cels[Global.current_project.current_layer].image) selected_layer.copy_from(new_cels[Global.current_project.current_layer].image)
selected_layer.lock()
if f.cels[Global.current_project.current_layer].opacity < 1: # If we have layer transparency if f.cels[Global.current_project.current_layer].opacity < 1: # If we have layer transparency
for xx in selected_layer.get_size().x: for xx in selected_layer.get_size().x:
@ -535,7 +536,6 @@ func _on_MergeDownLayer_pressed() -> void:
var new_layer := Image.new() var new_layer := Image.new()
new_layer.copy_from(f.cels[Global.current_project.current_layer - 1].image) new_layer.copy_from(f.cels[Global.current_project.current_layer - 1].image)
new_layer.lock()
new_layer.blend_rect(selected_layer, Rect2(Vector2.ZERO, Global.current_project.size), Vector2.ZERO) new_layer.blend_rect(selected_layer, Rect2(Vector2.ZERO, Global.current_project.size), Vector2.ZERO)
new_cels.remove(Global.current_project.current_layer) new_cels.remove(Global.current_project.current_layer)
if !selected_layer.is_invisible() and Global.current_project.layers[Global.current_project.current_layer - 1].linked_cels.size() > 1 and (f in Global.current_project.layers[Global.current_project.current_layer - 1].linked_cels): if !selected_layer.is_invisible() and Global.current_project.layers[Global.current_project.current_layer - 1].linked_cels.size() > 1 and (f in Global.current_project.layers[Global.current_project.current_layer - 1].linked_cels):

View file

@ -116,7 +116,6 @@ func _on_PopupMenu_id_pressed(ID : int) -> void:
new_layers[layer].linked_cels.remove(cel_index) new_layers[layer].linked_cels.remove(cel_index)
var sprite := Image.new() var sprite := Image.new()
sprite.copy_from(f.cels[layer].image) sprite.copy_from(f.cels[layer].image)
sprite.lock()
var sprite_texture := ImageTexture.new() var sprite_texture := ImageTexture.new()
sprite_texture.create_from_image(sprite, 0) sprite_texture.create_from_image(sprite, 0)
new_cels[layer].image = sprite new_cels[layer].image = sprite