diff --git a/image_converter.rb b/image_converter.rb index 669e113..dff49e3 100755 --- a/image_converter.rb +++ b/image_converter.rb @@ -28,10 +28,17 @@ class Color @blue = blue end + WHITE = new(red: 15, green: 15, blue: 15) + BLACK = new(red: 0, green: 0, blue: 0) + def ==(other) red == other.red && green == other.green && blue == other.blue end + def -(other) + red - other.red + green - other.green + blue - other.blue + end + alias eql? == def hash @@ -87,4 +94,63 @@ image.each_pixel do |px, x, y| rows[y].add(pixel:, x:) end -pp rows[50].colors_with_usage +prioritized_colors = rows[50].colors_with_usage.to_a.sort { |a, b| b.last <=> a.last } + +presets_by_pixel_color = [ + nil, Color::BLACK, Color::WHITE +] + +unavailable_bitplane_colors = { + 0 => true, + 1 => true, + 2 => true +} + +MAX_BITPLANE_COLORS = 8 + +bitplane_colors = [ + nil, + Color::BLACK, + Color::WHITE +] + +color_to_pixel_map = {} + +# take 5 + BLACK + WHITE colors into bitplane_colors + +prioritized_colors.map(&:first).each do |color| + maybe_preset_index = presets_by_pixel_color.find_index { |c| c && color == c } + + if !maybe_preset_index.nil? + bitplane_colors[maybe_preset_index] = color + color_to_pixel_map[color] = maybe_preset_index + + unavailable_bitplane_colors[maybe_preset_index] = true + elsif bitplane_colors.count < MAX_BITPLANE_COLORS + next_available_bitplane_color = 8.times.find { |i| !unavailable_bitplane_colors[i] } + + bitplane_colors[next_available_bitplane_color] = color + color_to_pixel_map[color] = next_available_bitplane_color + + unavailable_bitplane_colors[next_available_bitplane_color] = true + else + closest_match = bitplane_colors.each_with_index.map do |bp_color, index| + next unless bp_color + + [(bp_color - color).abs, index] + end.compact.min_by(&:first) + + pp color + pp closest_match + pp bitplane_colors[closest_match.last] + puts '************************' + + color_to_pixel_map[color] = closest_match.last + end +end + +pp prioritized_colors +pp bitplane_colors +pp color_to_pixel_map + +# .to_a.sort(&:last).reverse