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