Add a sprite representation.
This commit is contained in:
parent
61fb44bbce
commit
45f3e51890
77
src/chalk/sprite.cr
Normal file
77
src/chalk/sprite.cr
Normal file
|
@ -0,0 +1,77 @@
|
|||
module Chalk
|
||||
module Table
|
||||
class Sprite
|
||||
def initialize
|
||||
@pixels = Hash(UInt8, UInt8).new(default_value: 0_u8)
|
||||
end
|
||||
|
||||
def initialize(string, blank_char = ' ')
|
||||
@pixels = Hash(UInt8, UInt8).new(default_value: 0_u8)
|
||||
string.split("\n").each_with_index do |s, i|
|
||||
break if i > 15
|
||||
index = 0
|
||||
byte = 0_u8
|
||||
s.each_char do |char|
|
||||
break if index > 7
|
||||
bit = (char == blank_char) ? 0_u8 : 1_u8
|
||||
byte |= (bit << (7 - index))
|
||||
index += 1
|
||||
end
|
||||
@pixels[i.to_u8] = byte
|
||||
end
|
||||
end
|
||||
|
||||
def set_pixel(x, y)
|
||||
raise "Invalid x-coordinate" if x > 7
|
||||
raise "Invalid y-coordinate" if y > 15
|
||||
x = x.to_u8
|
||||
y = y.to_u8
|
||||
char = @pixels.fetch y, 0_u8
|
||||
char |= (1 << (7 - x))
|
||||
@pixels[y] = char
|
||||
end
|
||||
|
||||
def unset_pixel(x, y)
|
||||
raise "Invalid x-coordinate" if x > 7
|
||||
raise "Invalid y-coordinate" if y > 15
|
||||
x = x.to_u8
|
||||
y = y.to_u8
|
||||
char = @pixels.fetch y, 0_u8
|
||||
char &= ~(1 << (7 - x))
|
||||
@pixels[y] = char
|
||||
end
|
||||
|
||||
def toggle_pixel(x, y)
|
||||
raise "Invalid x-coordinate" if x > 7
|
||||
raise "Invalid y-coordinate" if y > 15
|
||||
x = x.to_u8
|
||||
y = y.to_u8
|
||||
char = @pixels.fetch y, 0_u8
|
||||
char ^= (1 << (7 - x))
|
||||
@pixels[y] = char
|
||||
end
|
||||
|
||||
def draw(io = STDOUT, blank_char = ' ', ink_char = 'x')
|
||||
until_y = @pixels.keys.max?
|
||||
return unless until_y
|
||||
(0..until_y).each do |y|
|
||||
row = @pixels.fetch y, 0_u8
|
||||
pointer = 0b10000000
|
||||
while pointer != 0
|
||||
draw_pixel = (row & pointer) != 0
|
||||
io << (draw_pixel ? ink_char : blank_char)
|
||||
pointer = pointer >> 1
|
||||
end
|
||||
io << '\n'
|
||||
end
|
||||
end
|
||||
|
||||
def encode
|
||||
if until_y = @pixels.keys.max?
|
||||
return (0..until_y).map { |it| @pixels.fetch it, 0_u8 }
|
||||
end
|
||||
return [0_u8]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue
Block a user