#!/usr/bin/ruby # A raw bitmap renderer # can be used to visually determine offset of a raw bitmap / sprite offset in a bigger file # needs ruby-gtk2 # type ? for help # License: WtfPLv2 # Author: (c) Y. Guillot, 11/2009 require 'gtk2' abort 'no file given' if not filename = ARGV.shift buf = File.open(filename, 'rb') { |fd| fd.read } off = 0 sz = 1 vflip = false w = Gtk::Window.new render = Gtk::DrawingArea.new w.signal_connect('destroy') { Gtk.main_quit } w.add render w_width = w_height = 1 redraw = lambda { render.window.invalidate Gdk::Rectangle.new(0, 0, 100000, 100000), false } render.set_events Gdk::Event::ALL_EVENTS_MASK render.signal_connect('size_allocate') { |ww, alloc| redraw[] if render.window } cols = [] render.signal_connect('realize') { 256.times { |t| c = t << 8 | t cols[t] = Gdk::Color.new(c, c, c) } cols.each { |c| render.window.colormap.alloc_color(c, true, true) } } w.signal_connect('key_press_event') { |ww, ev| case ev.keyval when ?o; off += 1 off = buf.size-1 if off >= buf.size when ?O; off += w_width*w_height off = buf.size-1 if off >= buf.size when ?p; off -= 1 off = 0 if off < 0 when ?P; off -= w_width*w_height off = 0 if off < 0 when ?f; vflip = !vflip when ?w; w.resize(w.size[0]+sz, w.size[1]) when ?W; w.resize(w.size[0]-sz, w.size[1]) when ?w; w.resize(w.size[0], w.size[1]+sz) when ?W; w.resize(w.size[0], w.size[1]-sz) when ?z; sz += 1 when ?Z; sz -= 1 sz = 1 if sz <= 0 when ??; puts <= buf.size end redraw[] } render.signal_connect('expose_event') { ww = render.window gc = Gdk::GC.new(ww) w_w = render.allocation.width w_h = render.allocation.height w_width = w_w/sz w_height = w_h/sz x = 0 y = 0 y = w_h-sz if vflip buf[off, w_width*(w_height+1)].each_byte { |o| gc.set_foreground cols[o] ww.draw_rectangle(gc, true, x, y, sz, sz) x += sz if x > w_w-sz x = 0 if vflip y -= sz break if y < 0 else y += sz break if y > w_h end end } true } w.title = "#{filename} +0" w.show_all Gtk.main