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:
parent
68cbf4cfb3
commit
1d20295f7d
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue