- Timestamp:
- 09/25/08 08:24:58 (2 months ago)
- Files:
-
- 1 modified
-
lang/ruby/misc/fitview.rb (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/ruby/misc/fitview.rb
r19838 r19871 7 7 # ruby/SDL (http://www.kmc.gr.jp/~ohai/rubysdl.html)入ってる環境で 8 8 # $ ruby fitview.rb 画像ファイルかディレクトリ 9 # で画像を適当に拡縮して全画面表示(1024x768) 10 # 11 # ディレクトリ移動する機能が欲しい 12 # 13 # ・操作 9 # で画像を適当に拡大縮小して全画面表示(1024x768) 10 # 11 # ・画像表示画面の操作 14 12 # ←: 前の画像を表示 15 13 # →: 次の画像を表示 … … 17 15 # ↓: 画像の下部分に移動。既に下を表示してるなら次の画像を表示 18 16 # Q, Esc: プログラムの終了 17 # End: ディレクトリ選択へ 18 # /: 拡大縮小アルゴリズムの高速/高性能切り替え 19 # 20 # ・ディレクトリ選択画面の操作 21 # ←: 選択しているディレクトリを開く。"."を選択で画像表示(先頭から) 22 # →: 選択しているディレクトリを開く。"."を選択で画像表示(末尾から) 23 # Delete: ディレクトリをTRASHDIRに移動 19 24 # 20 25 … … 24 29 WIDTH = 1024 25 30 HEIGHT = 768 26 j 31 27 32 EXTS = %w[png jpg jpeg gif bmp].map{|ext| ".#{ext}" } 28 33 29 34 FONTS_PATH = ['c:\hoge\sys\mplus_j12r.bdf', 'c:\hoge\sys\mplus_f12r.bdf'] 30 35 FONTSIZE = 12 36 37 TRASHDIR = 'C:/TEMP' 31 38 32 39 class SDL::Surface … … 40 47 self.update_rect(0, 0, self.w, self.h) 41 48 end 42 def scale_draw(surface, scale )43 SDL::Surface.transform_draw(surface, self, 0, scale, scale, 0, 0, 0, 0, SDL::Surface::TRANSFORM_AA)44 end 45 def scale_transform(scale )46 self.transform_surface(0, 0, scale, scale, SDL::Surface::TRANSFORM_AA)47 end 48 end 49 50 def open_path(path )49 def scale_draw(surface, scale, flags) 50 SDL::Surface.transform_draw(surface, self, 0, scale, scale, 0, 0, 0, 0, flags) 51 end 52 def scale_transform(scale, flags) 53 self.transform_surface(0, 0, scale, scale, flags) 54 end 55 end 56 57 def open_path(path, reverse) 51 58 basename = nil 52 59 if File.directory?(path) … … 57 64 end 58 65 entries = Dir.entries('.').reject!{|x| 59 !EXTS.include?(File.extname(x).downcase) 66 !EXTS.include?(File.extname(x).downcase) 60 67 } 61 68 … … 65 72 end 66 73 67 return entries, (basename ? entries.index(basename) : 0)74 return entries, (basename ? entries.index(basename) : (reverse ? entries.length-1 : 0)) 68 75 end 69 76 class Pages 70 def initialize(entries) 77 ## @tableはweakrefあたり使ってキャッシュすると良さそう 78 def initialize(entries, curpage) 71 79 @entries = entries 72 80 @table = [] 73 @curpage = 0 81 @curpage = curpage 82 @fastmode = false 74 83 end 75 84 def load(page) … … 84 93 h = image.h * scale 85 94 86 @table[page] = image.scale_transform(scale) 95 if @fastmode 96 @table[page] = image.scale_transform(scale, 0) 97 else 98 @table[page] = image.scale_transform(scale, SDL::Surface::TRANSFORM_AA) 99 end 87 100 rescue SDL::Error 88 101 text = "cannot open #{path}" … … 95 108 @table[page] 96 109 end 97 def preload 98 self.load(@curpage==self.length-1 ? 0 : @curpage+1) 110 def unload(page) 111 @table[page] = nil 112 GC.start 113 end 114 def reload 115 self.unload(@curpage-1) 116 self.unload(@curpage+1) 117 self.unload(@curpage) 118 GC.start 119 self.load(@curpage-1) 120 self.load(@curpage+1) 121 self.load(@curpage) 99 122 end 100 123 def length … … 105 128 raise SelectDirectoryEvent 106 129 end 130 self.unload(@curpage-1) 107 131 @curpage = @curpage+1 132 self.load(@curpage+1) 108 133 self.load(@curpage) 109 134 end … … 112 137 raise SelectDirectoryEvent 113 138 end 139 self.unload(@curpage+1) 114 140 @curpage = @curpage-1 141 self.load(@curpage-1) 115 142 self.load(@curpage) 116 143 end 117 end 118 def fitview(input_path) 144 145 attr_accessor :fastmode 146 end 147 def paint(image, upview) 148 copy = image 149 unless image.h <= SCREEN.h 150 h = upview ? 0 : image.h - SCREEN.h 151 copy = image.copy_rect(0, h, SCREEN.w, SCREEN.h) 152 end 153 154 SCREEN.fill(0) 155 SCREEN.put(copy, 0, 0) 156 SCREEN.update 157 end 158 def fitview(input_path, reverse) 119 159 basename = File.basename(input_path) 120 entries, curpage = open_path(input_path )160 entries, curpage = open_path(input_path, reverse) 121 161 122 162 upview = true 123 163 124 pages = Pages.new(entries )164 pages = Pages.new(entries, curpage) 125 165 image = pages.load(curpage) 126 166 127 167 loop do 128 copy = image 129 unless image.h <= SCREEN.h 130 h = upview ? 0 : image.h - SCREEN.h 131 copy = image.copy_rect(0, h, SCREEN.w, SCREEN.h) 132 end 133 134 SCREEN.fill(0) 135 SCREEN.put(copy, 0, 0) 136 SCREEN.update 137 pages.preload 168 paint(image, upview) 138 169 139 170 case event = SDL::Event.wait … … 164 195 upview = false 165 196 end 197 when SDL::Key::END 198 raise SelectDirectoryEvent 199 when SDL::Key::SLASH 200 pages.fastmode = !pages.fastmode 201 image = pages.reload 166 202 end 167 203 end … … 186 222 when SDL::Key::Q, SDL::Key::ESCAPE 187 223 raise QuitException 188 when SDL::Key::LEFT, SDL::Key::RIGHT 189 return dirs[select] 224 when SDL::Key::LEFT 225 return dirs[select], true 226 when SDL::Key::RIGHT 227 return dirs[select], false 190 228 when SDL::Key::UP 191 229 select = select==0? dirs.length-1 : select-1 192 230 when SDL::Key::DOWN 193 231 select = select==dirs.length-1? 0 : select+1 232 when SDL::Key::DELETE 233 name = dirs[select] 234 begin 235 File.rename(name, "#{TRASHDIR}/#{name}") 236 #rescue Errno::EXXX 237 rescue SystemCallError 238 puts "cannot delete #{name}" 239 end 240 dirs = Dir.entries('.').reject{|file| !File.directory?(file)} 241 if select==dirs.length 242 select = 0 243 end 194 244 end 195 245 end … … 223 273 image_path = ARGV[0] 224 274 225 prev_select = File.expand_path(image_path) 226 if File.directory?(prev_select) 227 prev_select = File.basename(prev_select) 228 else 229 prev_select = File.basename(File.dirname(prev_select)) 230 end 275 prev_select = '.' 276 reverse = false 231 277 232 278 loop do 233 279 begin 234 fitview(image_path )280 fitview(image_path, reverse) 235 281 rescue SelectDirectoryEvent 236 while dir = dirselect(prev_select) 282 GC.start 283 loop do 284 dir, reverse = dirselect(prev_select) 237 285 if dir == '.' 238 286 image_path = '.' 239 287 break 240 288 else 241 if dir !='..'242 prev_select = dir289 if dir=='..' 290 prev_select = File.basename(File.expand_path('.')) 243 291 end 244 292 Dir.chdir(dir)
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)