1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-02-12 16:53:07 +00:00

Compare commits

..

No commits in common. "b87a8e2ab8ddcbacb93ec95a96eda4e543e7ed36" and "fede2d8e6faf4dbb0c819d7b9293f2caf11740ed" have entirely different histories.

9 changed files with 29 additions and 33 deletions

View file

@ -8,7 +8,7 @@ var image: ImageExtended:
set = image_changed
func _init(_image := ImageExtended.new(), _opacity := 1.0) -> void:
func _init(_image: ImageExtended, _opacity := 1.0) -> void:
image_texture = ImageTexture.new()
image = _image # Set image and call setter
opacity = _opacity
@ -20,7 +20,7 @@ func image_changed(value: ImageExtended) -> void:
image_texture.set_image(image)
func get_content() -> ImageExtended:
func get_content():
return image
@ -34,19 +34,17 @@ func set_content(content, texture: ImageTexture = null) -> void:
image_texture.update(image)
func create_empty_content() -> ImageExtended:
var empty := Image.create(image.get_width(), image.get_height(), false, image.get_format())
var new_image := ImageExtended.new()
new_image.copy_from_custom(empty, image.is_indexed)
return new_image
func copy_content() -> ImageExtended:
var tmp_image := Image.create_from_data(
image.get_width(), image.get_height(), false, image.get_format(), image.get_data()
func create_empty_content():
var empty_image := Image.create(
image.get_size().x, image.get_size().y, false, Image.FORMAT_RGBA8
)
return empty_image
func copy_content():
var copy_image := Image.create_from_data(
image.get_width(), image.get_height(), false, Image.FORMAT_RGBA8, image.get_data()
)
var copy_image := ImageExtended.new()
copy_image.copy_from_custom(tmp_image, image.is_indexed)
return copy_image

View file

@ -74,9 +74,8 @@ func select_palette(_name: String, convert_to_rgb := true) -> void:
## Updates [member palette] to contain the colors of [member current_palette].
func update_palette() -> void:
if palette.size() != current_palette.colors_max:
palette.resize(current_palette.colors_max)
palette.fill(TRANSPARENT)
if palette.size() != current_palette.colors.size():
palette.resize(current_palette.colors.size())
for i in current_palette.colors:
palette[i] = current_palette.colors[i].color
@ -85,7 +84,7 @@ func update_palette() -> void:
func convert_indexed_to_rgb() -> void:
if not is_indexed:
return
var palette_image := Palettes.current_palette.convert_to_image(false)
var palette_image := Palettes.current_palette.convert_to_image()
var palette_texture := ImageTexture.create_from_image(palette_image)
var shader_image_effect := ShaderImageEffect.new()
var indices_texture := ImageTexture.create_from_image(indices_image)
@ -99,7 +98,7 @@ func convert_indexed_to_rgb() -> void:
func convert_rgb_to_indexed() -> void:
if not is_indexed:
return
var palette_image := Palettes.current_palette.convert_to_image(false)
var palette_image := Palettes.current_palette.convert_to_image()
var palette_texture := ImageTexture.create_from_image(palette_image)
var params := {
"palette_texture": palette_texture, "rgb_texture": ImageTexture.create_from_image(self)

View file

@ -25,7 +25,7 @@ var colors_max := 0
class PaletteColor:
var color := Color(0, 0, 0, 0)
var color := Color.TRANSPARENT
var index := -1
func _init(init_color := Color.BLACK, init_index := -1) -> void:
@ -358,11 +358,9 @@ static func strip_unvalid_characters(string_to_strip: String) -> String:
return regex.sub(string_to_strip, "", true)
func convert_to_image(crop_image := true) -> Image:
func convert_to_image() -> Image:
var image := Image.create(colors_max, 1, false, Image.FORMAT_RGBA8)
for i in colors_max:
if colors.has(i):
image.set_pixel(i, 0, Color(colors[i].color.to_html()))
if crop_image:
image.copy_from(image.get_region(image.get_used_rect()))
image.set_pixel(i, 0, colors[i].color)
return image

View file

@ -252,7 +252,6 @@ func _on_ColorPicker_color_changed(color: Color) -> void:
== Palettes.current_palette_get_selected_color_index(MOUSE_BUTTON_RIGHT)
):
Tools.assign_color(color, MOUSE_BUTTON_RIGHT)
Palettes.current_palette_set_color(edited_swatch_index, edited_swatch_color)
## Saves edited swatch to palette file when color selection dialog is closed

View file

@ -14,7 +14,7 @@ vec4 swap_color(vec4 color) {
int n_of_colors = textureSize(palette_texture, 0).x;
int color_index = find_index(color, n_of_colors, palette_texture);
return texelFetch(palette_texture, ivec2(color_index, 0), 0);
return texture(palette_texture, vec2(float(color_index) / float(n_of_colors), 0.0));
}
void fragment() {

View file

@ -2,7 +2,8 @@ int find_index(vec4 color, int n_of_colors, sampler2D palette_texture) {
int color_index = 0;
float smaller_distance = distance(color, texture(palette_texture, vec2(0.0)));
for (int i = 0; i <= n_of_colors; i++) {
vec4 palette_color = texelFetch(palette_texture, ivec2(i, 0), 0);
vec2 uv = vec2(float(i) / float(n_of_colors), 0.0);
vec4 palette_color = texture(palette_texture, uv);
float dist = distance(color, palette_color);
if (dist < smaller_distance) {
smaller_distance = dist;

View file

@ -7,16 +7,16 @@ uniform sampler2D palette_texture : filter_nearest;
uniform sampler2D indices_texture : filter_nearest;
void fragment() {
float index = texture(indices_texture, UV).r * 255.0;
float index = texture(indices_texture, UV).r;
if (index <= EPSILON) { // If index is zero, make it transparent
COLOR = vec4(0.0);
}
else {
float n_of_colors = float(textureSize(palette_texture, 0).x);
index -= 1.0;
float index_normalized = index / n_of_colors;
if (index < n_of_colors) {
COLOR = texelFetch(palette_texture, ivec2(int(index), 0), 0);
index -= 1.0 / 255.0;
float index_normalized = ((index * 255.0)) / n_of_colors;
if (index_normalized + EPSILON < 1.0) {
COLOR = texture(palette_texture, vec2(index_normalized + EPSILON, 0.0));
}
else {
// If index is bigger than the size of the palette, make it transparent.

View file

@ -8,7 +8,7 @@ uniform sampler2D palette_texture : filter_nearest;
void fragment() {
vec4 color = texture(rgb_texture, UV);
if (color.a <= 0.0001) {
if (color.a <= 0.01) {
COLOR.r = 0.0;
}
else {

View file

@ -421,6 +421,7 @@ func _setup_color_mode_submenu(item: String) -> void:
color_mode_submenu.add_radio_check_item("RGBA", ColorModes.RGBA)
color_mode_submenu.set_item_checked(ColorModes.RGBA, true)
color_mode_submenu.add_radio_check_item("Indexed", ColorModes.INDEXED)
color_mode_submenu.hide_on_checkable_item_selection = false
color_mode_submenu.id_pressed.connect(_color_mode_submenu_id_pressed)
image_menu.add_child(color_mode_submenu)