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

Added more options to the Rotate Image dialog

Now all of the image effects (except those related to resizing) have the same affect options.
This commit is contained in:
Manolis Papadeas 2020-10-23 17:50:52 +03:00
parent b3aa4a6343
commit cce4fa4cbb
3 changed files with 154 additions and 113 deletions

View file

@ -62,25 +62,24 @@ func scale3X(sprite : Image, tol : float = 50) -> Image:
return scaled
func rotxel(sprite : Image, angle : float) -> void:
func rotxel(sprite : Image, angle : float, pixels : Array) -> void:
# If angle is simple, then nn rotation is the best
if angle == 0 || angle == PI/2 || angle == PI || angle == 2*PI:
nn_rotate(sprite, angle)
nn_rotate(sprite, angle, pixels)
return
var aux : Image = Image.new()
aux.copy_from(sprite)
# warning-ignore:integer_division
# warning-ignore:integer_division
var center : Vector2 = Vector2(sprite.get_width() / 2, sprite.get_height() / 2)
var selection_rectangle := Rect2(pixels[0].x, pixels[0].y, pixels[-1].x - pixels[0].x + 1, pixels[-1].y - pixels[0].y + 1)
var center : Vector2 = selection_rectangle.position + ((selection_rectangle.end - selection_rectangle.position) / 2)
var ox : int
var oy : int
var p : Color
aux.lock()
sprite.lock()
for x in range(sprite.get_width()):
for y in range(sprite.get_height()):
for pix in pixels:
var x = pix.x
var y = pix.y
var dx = 3*(x - center.x)
var dy = 3*(y - center.y)
var found_pixel : bool = false
@ -176,24 +175,42 @@ func rotxel(sprite : Image, angle : float) -> void:
aux.unlock()
func fake_rotsprite(sprite : Image, angle : float) -> void:
sprite.copy_from(scale3X(sprite))
nn_rotate(sprite,angle)
func fake_rotsprite(sprite : Image, angle : float, pixels : Array) -> void:
var selection_rectangle := Rect2(pixels[0].x, pixels[0].y, pixels[-1].x - pixels[0].x + 1, pixels[-1].y - pixels[0].y + 1)
var selected_sprite := Image.new()
selected_sprite = sprite.get_rect(selection_rectangle)
selected_sprite.copy_from(scale3X(selected_sprite))
nn_rotate(selected_sprite, angle, [])
# warning-ignore:integer_division
# warning-ignore:integer_division
sprite.resize(sprite.get_width() / 3, sprite.get_height() / 3, 0)
selected_sprite.resize(selected_sprite.get_width() / 3, selected_sprite.get_height() / 3, 0)
sprite.blit_rect(selected_sprite, Rect2(Vector2.ZERO, selected_sprite.get_size()), selection_rectangle.position)
func nn_rotate(sprite : Image, angle : float) -> void:
func nn_rotate(sprite : Image, angle : float, pixels : Array) -> void:
var aux : Image = Image.new()
aux.copy_from(sprite)
sprite.lock()
aux.lock()
var ox: int
var oy: int
var center : Vector2
if pixels:
var selection_rectangle := Rect2(pixels[0].x, pixels[0].y, pixels[-1].x - pixels[0].x + 1, pixels[-1].y - pixels[0].y + 1)
center = selection_rectangle.position + ((selection_rectangle.end - selection_rectangle.position) / 2)
for pix in pixels:
var x = pix.x
var y = pix.y
ox = (x - center.x)*cos(angle) + (y - center.y)*sin(angle) + center.x
oy = -(x - center.x)*sin(angle) + (y - center.y)*cos(angle) + center.y
if ox >= 0 && ox < sprite.get_width() && oy >= 0 && oy < sprite.get_height():
sprite.set_pixel(x, y, aux.get_pixel(ox, oy))
else:
sprite.set_pixel(x, y, Color(0,0,0,0))
else:
# warning-ignore:integer_division
# warning-ignore:integer_division
var center : Vector2 = Vector2(sprite.get_width() / 2, sprite.get_height() / 2)
center = Vector2(sprite.get_width() / 2, sprite.get_height() / 2)
for x in range(sprite.get_width()):
for y in range(sprite.get_height()):
ox = (x - center.x)*cos(angle) + (y - center.y)*sin(angle) + center.x

View file

@ -14,6 +14,8 @@ func _ready() -> void:
func set_nodes() -> void:
preview = $VBoxContainer/Preview
selection_checkbox = $VBoxContainer/OptionsContainer/SelectionCheckBox
affect_option_button = $VBoxContainer/OptionsContainer/AffectOptionButton
func _about_to_show() -> void:
@ -22,13 +24,14 @@ func _about_to_show() -> void:
func commit_action(_cel : Image, _pixels : Array, _project : Project = Global.current_project) -> void:
var angle : float = deg2rad(angle_hslider.value)
match type_option_button.text:
"Rotxel":
DrawingAlgos.rotxel(_cel,angle_hslider.value*PI/180)
DrawingAlgos.rotxel(_cel, angle, _pixels)
"Nearest neighbour":
DrawingAlgos.nn_rotate(_cel,angle_hslider.value*PI/180)
DrawingAlgos.nn_rotate(_cel, angle, _pixels)
"Upscale, Rotate and Downscale":
DrawingAlgos.fake_rotsprite(_cel,angle_hslider.value*PI/180)
DrawingAlgos.fake_rotsprite(_cel, angle, _pixels)
func _confirmed() -> void:

View file

@ -25,8 +25,8 @@ __meta__ = {
}
[node name="Preview" type="TextureRect" parent="VBoxContainer"]
margin_left = 14.0
margin_right = 214.0
margin_left = 31.0
margin_right = 231.0
margin_bottom = 200.0
rect_min_size = Vector2( 200, 200 )
size_flags_horizontal = 4
@ -39,7 +39,7 @@ show_behind_parent = true
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 204.0
margin_right = 229.0
margin_right = 263.0
margin_bottom = 224.0
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer2"]
@ -50,7 +50,7 @@ text = "Type:"
[node name="TypeOptionButton" type="OptionButton" parent="VBoxContainer/HBoxContainer2"]
margin_left = 38.0
margin_right = 229.0
margin_right = 263.0
margin_bottom = 20.0
mouse_default_cursor_shape = 2
size_flags_horizontal = 3
@ -58,7 +58,7 @@ size_flags_vertical = 3
[node name="AngleOptions" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 228.0
margin_right = 229.0
margin_right = 263.0
margin_bottom = 252.0
[node name="Label" type="Label" parent="VBoxContainer/AngleOptions"]
@ -69,7 +69,7 @@ text = "Angle:"
[node name="AngleHSlider" type="HSlider" parent="VBoxContainer/AngleOptions"]
margin_left = 44.0
margin_right = 151.0
margin_right = 185.0
margin_bottom = 24.0
mouse_default_cursor_shape = 2
size_flags_horizontal = 3
@ -80,12 +80,33 @@ __meta__ = {
}
[node name="AngleSpinBox" type="SpinBox" parent="VBoxContainer/AngleOptions"]
margin_left = 155.0
margin_right = 229.0
margin_left = 189.0
margin_right = 263.0
margin_bottom = 24.0
mouse_default_cursor_shape = 2
max_value = 359.0
suffix = "°"
[node name="OptionsContainer" type="HBoxContainer" parent="VBoxContainer"]
margin_top = 256.0
margin_right = 263.0
margin_bottom = 280.0
[node name="SelectionCheckBox" type="CheckBox" parent="VBoxContainer/OptionsContainer"]
margin_right = 160.0
margin_bottom = 24.0
mouse_default_cursor_shape = 2
pressed = true
text = "Only affect selection"
[node name="AffectOptionButton" type="OptionButton" parent="VBoxContainer/OptionsContainer"]
margin_left = 164.0
margin_right = 263.0
margin_bottom = 24.0
mouse_default_cursor_shape = 2
text = "Current cel"
items = [ "Current cel", null, false, 0, null, "Current frame", null, false, 1, null, "All frames", null, false, 2, null, "All projects", null, false, 3, null ]
selected = 0
[connection signal="item_selected" from="VBoxContainer/HBoxContainer2/TypeOptionButton" to="." method="_on_TypeOptionButton_item_selected"]
[connection signal="value_changed" from="VBoxContainer/AngleOptions/AngleHSlider" to="." method="_on_HSlider_value_changed"]
[connection signal="value_changed" from="VBoxContainer/AngleOptions/AngleSpinBox" to="." method="_on_SpinBox_value_changed"]