Class: DiscreetProxy::Proxy
- Inherits:
-
Object
- Object
- DiscreetProxy::Proxy
- Defined in:
- lib/discreet_proxy.rb
Overview
This class represents a proxy.
Instance Attribute Summary collapse
-
#height ⇒ Object
readonly
Image dimensions, standard is 126x92.
-
#rows ⇒ Object
readonly
Array of rows with each row being an array of packed color integers (you can unpack them with ChunkyPNG::Color).
-
#width ⇒ Object
readonly
Image dimensions, standard is 126x92.
Instance Method Summary collapse
-
#[](left, top) ⇒ Object
Get an array of the [r,g,b] pixel values at the specific coordinate.
-
#[]=(x, y, *rgb) ⇒ Object
Set the color value at the specific coordinate.
-
#fill_pixbuf(io) ⇒ Object
Once the proxy metadata is known, this method can parse out the actual pixel data from the passed IO.
-
#initialize(w = DEFAULT_WIDTH, h = DEFAULT_HEIGHT) ⇒ Proxy
constructor
A new instance of Proxy.
-
#save(filename) ⇒ Object
Save out the .p file.
-
#save_png(filename) ⇒ Object
Save out the PNG version of the file.
-
#to_dotp ⇒ Object
Compose a string with the entire contents of a proxy file.
- #to_png ⇒ Object
Constructor Details
#initialize(w = DEFAULT_WIDTH, h = DEFAULT_HEIGHT) ⇒ Proxy
Returns a new instance of Proxy.
57 58 59 60 61 |
# File 'lib/discreet_proxy.rb', line 57 def initialize(w = DEFAULT_WIDTH, h = DEFAULT_HEIGHT) @width, @height = w.to_i, h.to_i # Blank out the pixel values with black generate_black end |
Instance Attribute Details
#height ⇒ Object (readonly)
Image dimensions, standard is 126x92
51 52 53 |
# File 'lib/discreet_proxy.rb', line 51 def height @height end |
#rows ⇒ Object (readonly)
Array of rows with each row being an array of packed color integers (you can unpack them with ChunkyPNG::Color)
55 56 57 |
# File 'lib/discreet_proxy.rb', line 55 def rows @rows end |
#width ⇒ Object (readonly)
Image dimensions, standard is 126x92
51 52 53 |
# File 'lib/discreet_proxy.rb', line 51 def width @width end |
Instance Method Details
#[](left, top) ⇒ Object
Get an array of the [r,g,b] pixel values at the specific coordinate
75 76 77 78 |
# File 'lib/discreet_proxy.rb', line 75 def [](left, top) png_color_int = @rows[top][left] unpack_rgb(png_color_int) end |
#[]=(x, y, *rgb) ⇒ Object
Set the color value at the specific coordinate. If the passed value is a single integer, it gets interpreted as a PNG color value. If a triplet array with three components is passed it’s interpreted as RGB
83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/discreet_proxy.rb', line 83 def []=(x, y, *rgb) color = rgb.flatten # Check for raw pixel value if color.length == 1 && color[0].is_a?(Numeric) @rows[y][x] = color[0] else r, g, b = color.map{|e| e.to_i } @rows[y][x] = pack_rgb(r, g ,b) end end |
#fill_pixbuf(io) ⇒ Object
Once the proxy metadata is known, this method can parse out the actual pixel data from the passed IO
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/discreet_proxy.rb', line 119 def fill_pixbuf(io) @rows = [] # Data comes in row per row, starting on bottom left because of endianness per_row = (@width.to_i + row_pad) * 3 total_size = ((per_row + row_pad) * @height) + 1 blob = StringIO.new(io.read(total_size)) @height.times do row = [] row_data = blob.read(@width.to_i * 3) row_data = StringIO.new(row_data.to_s) # Read 3x8bit for each pixel @width.times do rgb = (row_data.read(3) || "AAA").unpack("CCC") row.push(pack_rgb(*rgb)) end # At the end of each row (thus at the beginning byteswap), # 2 bytes contain garbage since rows are aligned # to start at 8-complement byte offsets. If they are not discarded this disturbs # the RGB cadence of the other values. blob.seek(blob.pos + row_pad) # Since the file is actually BE, the rows are ordered top to bottom in the file @rows.unshift(row) end end |
#save(filename) ⇒ Object
Save out the .p file
150 151 152 |
# File 'lib/discreet_proxy.rb', line 150 def save(filename) File.open(filename, 'wb') { |io| io.write(to_dotp) } end |
#save_png(filename) ⇒ Object
Save out the PNG version of the file
155 156 157 |
# File 'lib/discreet_proxy.rb', line 155 def save_png(filename) to_png.save(filename) end |
#to_dotp ⇒ Object
Compose a string with the entire contents of a proxy file
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/discreet_proxy.rb', line 96 def to_dotp # Pack the header buf = StringIO.new(0xFF.chr * 40) byteswap_version = [PROXY_VERSION].pack("e").reverse header = [MAGIC, VERSION_BSWAP, width, height, PROXY_DEPTH].pack("na6nnn") buf.write(header) buf.seek(40) # Write out all the rows starting with the last one @rows.reverse.each do | row | row.each do | pix | rgb = unpack_rgb(pix).pack("CCC") buf.write(rgb) end # Then write the padding buf.write(0x00.chr * row_pad) end buf.string end |
#to_png ⇒ Object
63 64 65 66 67 68 69 70 71 72 |
# File 'lib/discreet_proxy.rb', line 63 def to_png png = ChunkyPNG::Image.new(@width, @height) png.["Software"] = "Ruby DiscreetProxy converter/chunky_png" @rows.each_with_index do | row, y | png.replace_row!(y, row) end # Bump it to the default icon size png.resample_bilinear!(DEFAULT_WIDTH, DEFAULT_HEIGHT) png end |