ripxplore 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (454) hide show
  1. data/bin/ripxplore.rb +188 -0
  2. data/doc/classes/A2Dsk.html +226 -0
  3. data/doc/classes/A2Dsk.src/M000005.html +18 -0
  4. data/doc/classes/A2Dsk.src/M000006.html +18 -0
  5. data/doc/classes/A2Dsk.src/M000007.html +18 -0
  6. data/doc/classes/A2Dsk.src/M000008.html +18 -0
  7. data/doc/classes/A2Dsk.src/M000009.html +18 -0
  8. data/doc/classes/A2Dsk.src/M000010.html +22 -0
  9. data/doc/classes/A2DskDosOrder.html +139 -0
  10. data/doc/classes/A2DskDosOrder.src/M000242.html +18 -0
  11. data/doc/classes/A2DskPhysicalOrder.html +139 -0
  12. data/doc/classes/A2DskPhysicalOrder.src/M000019.html +18 -0
  13. data/doc/classes/Apple2.html +187 -0
  14. data/doc/classes/Apple2.src/M000128.html +18 -0
  15. data/doc/classes/Apple2.src/M000129.html +18 -0
  16. data/doc/classes/Apple2.src/M000130.html +18 -0
  17. data/doc/classes/Apple2.src/M000131.html +19 -0
  18. data/doc/classes/AppleBinary.html +193 -0
  19. data/doc/classes/AppleBinary.src/M000089.html +20 -0
  20. data/doc/classes/AppleBinary.src/M000090.html +18 -0
  21. data/doc/classes/AppleBinary.src/M000091.html +18 -0
  22. data/doc/classes/AppleBinary.src/M000092.html +18 -0
  23. data/doc/classes/AppleCPM.html +228 -0
  24. data/doc/classes/AppleCPM.src/M000243.html +18 -0
  25. data/doc/classes/AppleCPM.src/M000244.html +18 -0
  26. data/doc/classes/AppleCPM.src/M000245.html +21 -0
  27. data/doc/classes/AppleCPM.src/M000246.html +40 -0
  28. data/doc/classes/AppleDos.html +275 -0
  29. data/doc/classes/AppleDos.src/M000161.html +18 -0
  30. data/doc/classes/AppleDos.src/M000162.html +18 -0
  31. data/doc/classes/AppleDos.src/M000163.html +18 -0
  32. data/doc/classes/AppleDos.src/M000164.html +86 -0
  33. data/doc/classes/AppleHiResPic.html +279 -0
  34. data/doc/classes/AppleHiResPic.src/M000083.html +22 -0
  35. data/doc/classes/AppleHiResPic.src/M000084.html +18 -0
  36. data/doc/classes/AppleHiResPic.src/M000085.html +22 -0
  37. data/doc/classes/AppleHiResPic.src/M000086.html +57 -0
  38. data/doc/classes/AppleHiResPic.src/M000087.html +18 -0
  39. data/doc/classes/AppleHiResPic.src/M000088.html +18 -0
  40. data/doc/classes/AppleText.html +156 -0
  41. data/doc/classes/AppleText.src/M000142.html +21 -0
  42. data/doc/classes/AppleText.src/M000143.html +20 -0
  43. data/doc/classes/AppleWorksWP.html +160 -0
  44. data/doc/classes/AppleWorksWP.src/M000081.html +20 -0
  45. data/doc/classes/AppleWorksWP.src/M000082.html +45 -0
  46. data/doc/classes/Applesoft.html +169 -0
  47. data/doc/classes/Applesoft.src/M000175.html +21 -0
  48. data/doc/classes/Applesoft.src/M000176.html +75 -0
  49. data/doc/classes/Atari800.html +169 -0
  50. data/doc/classes/Atari800.src/M000177.html +23 -0
  51. data/doc/classes/Atari800.src/M000178.html +18 -0
  52. data/doc/classes/Atari800.src/M000179.html +19 -0
  53. data/doc/classes/AtariBasic.html +215 -0
  54. data/doc/classes/AtariBasic.src/M000204.html +20 -0
  55. data/doc/classes/AtariBasic.src/M000205.html +108 -0
  56. data/doc/classes/AtariBinary.html +193 -0
  57. data/doc/classes/AtariBinary.src/M000238.html +20 -0
  58. data/doc/classes/AtariBinary.src/M000239.html +18 -0
  59. data/doc/classes/AtariBinary.src/M000240.html +18 -0
  60. data/doc/classes/AtariBinary.src/M000241.html +18 -0
  61. data/doc/classes/AtariDos.html +186 -0
  62. data/doc/classes/AtariDos.src/M000047.html +18 -0
  63. data/doc/classes/AtariDos.src/M000048.html +43 -0
  64. data/doc/classes/AtariText.html +159 -0
  65. data/doc/classes/AtariText.src/M000002.html +20 -0
  66. data/doc/classes/AtariText.src/M000003.html +18 -0
  67. data/doc/classes/Atr.html +271 -0
  68. data/doc/classes/Atr.src/M000208.html +18 -0
  69. data/doc/classes/Atr.src/M000209.html +18 -0
  70. data/doc/classes/Atr.src/M000210.html +19 -0
  71. data/doc/classes/Atr.src/M000211.html +18 -0
  72. data/doc/classes/Atr.src/M000212.html +18 -0
  73. data/doc/classes/Atr.src/M000213.html +19 -0
  74. data/doc/classes/Atr.src/M000214.html +19 -0
  75. data/doc/classes/C64.html +206 -0
  76. data/doc/classes/C64.src/M000020.html +18 -0
  77. data/doc/classes/C64.src/M000021.html +31 -0
  78. data/doc/classes/C64.src/M000022.html +22 -0
  79. data/doc/classes/C64.src/M000023.html +19 -0
  80. data/doc/classes/C64.src/M000024.html +19 -0
  81. data/doc/classes/C64BasicPrg.html +201 -0
  82. data/doc/classes/C64BasicPrg.src/M000035.html +20 -0
  83. data/doc/classes/C64BasicPrg.src/M000036.html +59 -0
  84. data/doc/classes/C64Prg.html +190 -0
  85. data/doc/classes/C64Prg.src/M000169.html +20 -0
  86. data/doc/classes/C64Prg.src/M000170.html +18 -0
  87. data/doc/classes/C64Prg.src/M000171.html +18 -0
  88. data/doc/classes/C64Prg.src/M000172.html +20 -0
  89. data/doc/classes/C64PrgText.html +139 -0
  90. data/doc/classes/C64PrgText.src/M000237.html +18 -0
  91. data/doc/classes/C64Seq.html +156 -0
  92. data/doc/classes/C64Seq.src/M000013.html +20 -0
  93. data/doc/classes/C64Seq.src/M000014.html +18 -0
  94. data/doc/classes/CPMFile.html +156 -0
  95. data/doc/classes/CPMFile.src/M000108.html +20 -0
  96. data/doc/classes/CPMFile.src/M000109.html +18 -0
  97. data/doc/classes/CbmDos.html +172 -0
  98. data/doc/classes/CbmDos.src/M000182.html +18 -0
  99. data/doc/classes/CbmDos.src/M000183.html +42 -0
  100. data/doc/classes/CbmFile.html +156 -0
  101. data/doc/classes/CbmFile.src/M000235.html +20 -0
  102. data/doc/classes/CbmFile.src/M000236.html +18 -0
  103. data/doc/classes/D64.html +247 -0
  104. data/doc/classes/D64.src/M000037.html +18 -0
  105. data/doc/classes/D64.src/M000038.html +18 -0
  106. data/doc/classes/D64.src/M000039.html +18 -0
  107. data/doc/classes/D64.src/M000040.html +22 -0
  108. data/doc/classes/D64.src/M000041.html +18 -0
  109. data/doc/classes/D64.src/M000042.html +21 -0
  110. data/doc/classes/D65.html +170 -0
  111. data/doc/classes/D65.src/M000049.html +22 -0
  112. data/doc/classes/D65.src/M000050.html +68 -0
  113. data/doc/classes/DumpUtilities.html +152 -0
  114. data/doc/classes/DumpUtilities.src/M000077.html +33 -0
  115. data/doc/classes/DumpUtilities.src/M000078.html +27 -0
  116. data/doc/classes/FileCache.html +210 -0
  117. data/doc/classes/FileCache.src/M000135.html +18 -0
  118. data/doc/classes/FileCache.src/M000136.html +20 -0
  119. data/doc/classes/FileCache.src/M000137.html +22 -0
  120. data/doc/classes/FileCache.src/M000138.html +32 -0
  121. data/doc/classes/FileCacheItem.html +152 -0
  122. data/doc/classes/FileCacheItem.src/M000165.html +18 -0
  123. data/doc/classes/FileCacheItem.src/M000166.html +18 -0
  124. data/doc/classes/FileContainer.html +146 -0
  125. data/doc/classes/FileContainer.src/M000232.html +26 -0
  126. data/doc/classes/FileSystem.html +252 -0
  127. data/doc/classes/FileSystem.src/M000069.html +18 -0
  128. data/doc/classes/FileSystem.src/M000070.html +18 -0
  129. data/doc/classes/FileSystem.src/M000071.html +18 -0
  130. data/doc/classes/FileSystem.src/M000072.html +18 -0
  131. data/doc/classes/FileSystem.src/M000073.html +18 -0
  132. data/doc/classes/FileSystem.src/M000074.html +18 -0
  133. data/doc/classes/FileSystem.src/M000075.html +20 -0
  134. data/doc/classes/FileSystem.src/M000076.html +25 -0
  135. data/doc/classes/FileSystemImage.html +430 -0
  136. data/doc/classes/FileSystemImage.src/M000215.html +19 -0
  137. data/doc/classes/FileSystemImage.src/M000216.html +41 -0
  138. data/doc/classes/FileSystemImage.src/M000217.html +27 -0
  139. data/doc/classes/FileSystemImage.src/M000218.html +18 -0
  140. data/doc/classes/FileSystemImage.src/M000219.html +18 -0
  141. data/doc/classes/FileSystemImage.src/M000220.html +18 -0
  142. data/doc/classes/FileSystemImage.src/M000221.html +22 -0
  143. data/doc/classes/FileSystemImage.src/M000222.html +19 -0
  144. data/doc/classes/FileSystemImage.src/M000223.html +18 -0
  145. data/doc/classes/FileSystemImage.src/M000224.html +18 -0
  146. data/doc/classes/FileSystemImage.src/M000225.html +18 -0
  147. data/doc/classes/FileSystemImage.src/M000226.html +18 -0
  148. data/doc/classes/FileSystemImage.src/M000227.html +20 -0
  149. data/doc/classes/FileSystemImage.src/M000228.html +22 -0
  150. data/doc/classes/FileSystemImage.src/M000229.html +22 -0
  151. data/doc/classes/FileSystemImage.src/M000230.html +18 -0
  152. data/doc/classes/FileSystemImage.src/M000231.html +23 -0
  153. data/doc/classes/G64.html +257 -0
  154. data/doc/classes/G64.src/M000093.html +30 -0
  155. data/doc/classes/G64.src/M000094.html +18 -0
  156. data/doc/classes/G64.src/M000095.html +18 -0
  157. data/doc/classes/G64.src/M000096.html +17 -0
  158. data/doc/classes/G64.src/M000097.html +18 -0
  159. data/doc/classes/G64.src/M000098.html +18 -0
  160. data/doc/classes/G64.src/M000099.html +21 -0
  161. data/doc/classes/GenericFile.html +157 -0
  162. data/doc/classes/GenericFile.src/M000167.html +20 -0
  163. data/doc/classes/GenericFile.src/M000168.html +18 -0
  164. data/doc/classes/HostSystem.html +225 -0
  165. data/doc/classes/HostSystem.src/M000025.html +22 -0
  166. data/doc/classes/HostSystem.src/M000026.html +18 -0
  167. data/doc/classes/HostSystem.src/M000027.html +18 -0
  168. data/doc/classes/HostSystem.src/M000028.html +22 -0
  169. data/doc/classes/HostSystem.src/M000029.html +33 -0
  170. data/doc/classes/HostSystem.src/M000030.html +18 -0
  171. data/doc/classes/ImageFormat.html +415 -0
  172. data/doc/classes/ImageFormat.src/M000144.html +18 -0
  173. data/doc/classes/ImageFormat.src/M000145.html +18 -0
  174. data/doc/classes/ImageFormat.src/M000146.html +18 -0
  175. data/doc/classes/ImageFormat.src/M000147.html +18 -0
  176. data/doc/classes/ImageFormat.src/M000148.html +18 -0
  177. data/doc/classes/ImageFormat.src/M000149.html +22 -0
  178. data/doc/classes/ImageFormat.src/M000150.html +19 -0
  179. data/doc/classes/ImageFormat.src/M000151.html +18 -0
  180. data/doc/classes/ImageFormat.src/M000152.html +18 -0
  181. data/doc/classes/ImageFormat.src/M000153.html +18 -0
  182. data/doc/classes/ImageFormat.src/M000154.html +18 -0
  183. data/doc/classes/ImageFormat.src/M000155.html +18 -0
  184. data/doc/classes/ImageFormat.src/M000156.html +18 -0
  185. data/doc/classes/ImageFormat.src/M000157.html +18 -0
  186. data/doc/classes/ImageFormat.src/M000158.html +20 -0
  187. data/doc/classes/ImageFormat.src/M000159.html +26 -0
  188. data/doc/classes/ImageFormat.src/M000160.html +18 -0
  189. data/doc/classes/ImageSniffing.html +152 -0
  190. data/doc/classes/ImageSniffing.src/M000051.html +57 -0
  191. data/doc/classes/ImageSniffing.src/M000052.html +131 -0
  192. data/doc/classes/IntegerBASIC.html +247 -0
  193. data/doc/classes/IntegerBASIC.src/M000206.html +20 -0
  194. data/doc/classes/IntegerBASIC.src/M000207.html +86 -0
  195. data/doc/classes/MBasic.html +182 -0
  196. data/doc/classes/MBasic.src/M000011.html +20 -0
  197. data/doc/classes/MBasic.src/M000012.html +22 -0
  198. data/doc/classes/NADOLDos.html +187 -0
  199. data/doc/classes/NADOLDos.src/M000180.html +18 -0
  200. data/doc/classes/NADOLDos.src/M000181.html +52 -0
  201. data/doc/classes/NADOLFile.html +157 -0
  202. data/doc/classes/NADOLFile.src/M000045.html +20 -0
  203. data/doc/classes/NADOLFile.src/M000046.html +18 -0
  204. data/doc/classes/NADOLTokens.html +170 -0
  205. data/doc/classes/NADOLTokens.src/M000018.html +41 -0
  206. data/doc/classes/NativeFileType.html +444 -0
  207. data/doc/classes/NativeFileType.src/M000110.html +22 -0
  208. data/doc/classes/NativeFileType.src/M000111.html +18 -0
  209. data/doc/classes/NativeFileType.src/M000112.html +18 -0
  210. data/doc/classes/NativeFileType.src/M000113.html +18 -0
  211. data/doc/classes/NativeFileType.src/M000114.html +18 -0
  212. data/doc/classes/NativeFileType.src/M000115.html +18 -0
  213. data/doc/classes/NativeFileType.src/M000116.html +18 -0
  214. data/doc/classes/NativeFileType.src/M000117.html +23 -0
  215. data/doc/classes/NativeFileType.src/M000118.html +18 -0
  216. data/doc/classes/NativeFileType.src/M000119.html +18 -0
  217. data/doc/classes/NativeFileType.src/M000120.html +24 -0
  218. data/doc/classes/NativeFileType.src/M000121.html +35 -0
  219. data/doc/classes/NativeFileType.src/M000122.html +24 -0
  220. data/doc/classes/NativeFileType.src/M000123.html +18 -0
  221. data/doc/classes/NativeFileType.src/M000124.html +18 -0
  222. data/doc/classes/NativeFileType.src/M000125.html +18 -0
  223. data/doc/classes/NativeFileType.src/M000126.html +20 -0
  224. data/doc/classes/NativeFileType.src/M000127.html +27 -0
  225. data/doc/classes/PNG/Canvas.html +273 -0
  226. data/doc/classes/PNG/Canvas.src/M000196.html +20 -0
  227. data/doc/classes/PNG/Canvas.src/M000197.html +20 -0
  228. data/doc/classes/PNG/Canvas.src/M000198.html +20 -0
  229. data/doc/classes/PNG/Canvas.src/M000199.html +22 -0
  230. data/doc/classes/PNG/Canvas.src/M000200.html +18 -0
  231. data/doc/classes/PNG/Canvas.src/M000201.html +73 -0
  232. data/doc/classes/PNG/Color.html +338 -0
  233. data/doc/classes/PNG/Color.src/M000189.html +18 -0
  234. data/doc/classes/PNG/Color.src/M000190.html +16 -0
  235. data/doc/classes/PNG/Color.src/M000191.html +16 -0
  236. data/doc/classes/PNG/Color.src/M000192.html +16 -0
  237. data/doc/classes/PNG/Color.src/M000193.html +16 -0
  238. data/doc/classes/PNG/Color.src/M000194.html +21 -0
  239. data/doc/classes/PNG/Color.src/M000195.html +18 -0
  240. data/doc/classes/PNG.html +229 -0
  241. data/doc/classes/PNG.src/M000185.html +18 -0
  242. data/doc/classes/PNG.src/M000186.html +21 -0
  243. data/doc/classes/PNG.src/M000187.html +26 -0
  244. data/doc/classes/PNG.src/M000188.html +26 -0
  245. data/doc/classes/PascalDos.html +203 -0
  246. data/doc/classes/PascalDos.src/M000132.html +18 -0
  247. data/doc/classes/PascalDos.src/M000133.html +21 -0
  248. data/doc/classes/PascalDos.src/M000134.html +62 -0
  249. data/doc/classes/PascalFile.html +169 -0
  250. data/doc/classes/PascalFile.src/M000173.html +20 -0
  251. data/doc/classes/PascalFile.src/M000174.html +18 -0
  252. data/doc/classes/ProDos.html +164 -0
  253. data/doc/classes/ProDos.src/M000102.html +18 -0
  254. data/doc/classes/ProDos.src/M000103.html +22 -0
  255. data/doc/classes/ProDosFile.html +187 -0
  256. data/doc/classes/ProDosFile.src/M000015.html +20 -0
  257. data/doc/classes/ProDosFile.src/M000016.html +18 -0
  258. data/doc/classes/ProDosFile.src/M000017.html +19 -0
  259. data/doc/classes/Proc.html +315 -0
  260. data/doc/classes/Proc.src/M000053.html +21 -0
  261. data/doc/classes/Proc.src/M000054.html +19 -0
  262. data/doc/classes/Proc.src/M000055.html +22 -0
  263. data/doc/classes/Proc.src/M000056.html +22 -0
  264. data/doc/classes/Proc.src/M000057.html +22 -0
  265. data/doc/classes/Proc.src/M000058.html +19 -0
  266. data/doc/classes/Proc.src/M000059.html +16 -0
  267. data/doc/classes/Proc.src/M000060.html +20 -0
  268. data/doc/classes/Proc.src/M000061.html +18 -0
  269. data/doc/classes/Proc.src/M000062.html +16 -0
  270. data/doc/classes/Proc.src/M000063.html +16 -0
  271. data/doc/classes/ProcSource.html +146 -0
  272. data/doc/classes/ProcSource.src/M000248.html +38 -0
  273. data/doc/classes/ProcSource.src/M000249.html +109 -0
  274. data/doc/classes/RDoc.html +135 -0
  275. data/doc/classes/RDoc.src/M000247.html +40 -0
  276. data/doc/classes/RawDisk.html +157 -0
  277. data/doc/classes/RawDisk.src/M000100.html +18 -0
  278. data/doc/classes/RawDisk.src/M000101.html +18 -0
  279. data/doc/classes/RipXplore.html +124 -0
  280. data/doc/classes/RipXploreLog.html +167 -0
  281. data/doc/classes/RipXploreLog.src/M000139.html +18 -0
  282. data/doc/classes/RipXploreLog.src/M000140.html +20 -0
  283. data/doc/classes/RipXploreLog.src/M000141.html +18 -0
  284. data/doc/classes/ScAsm.html +145 -0
  285. data/doc/classes/ScAsm.src/M000004.html +45 -0
  286. data/doc/classes/SubclassTracking.html +138 -0
  287. data/doc/classes/SubclassTracking.src/M000250.html +23 -0
  288. data/doc/classes/TestFileCache.html +137 -0
  289. data/doc/classes/TestFileCache.src/M000184.html +21 -0
  290. data/doc/classes/Trs80.html +157 -0
  291. data/doc/classes/Trs80.src/M000043.html +18 -0
  292. data/doc/classes/Trs80.src/M000044.html +18 -0
  293. data/doc/classes/Trs80Cmd.html +217 -0
  294. data/doc/classes/Trs80Cmd.src/M000104.html +19 -0
  295. data/doc/classes/Trs80Cmd.src/M000105.html +24 -0
  296. data/doc/classes/Trs80Cmd.src/M000106.html +20 -0
  297. data/doc/classes/Trs80Cmd.src/M000107.html +35 -0
  298. data/doc/classes/Trs80Jcl.html +156 -0
  299. data/doc/classes/Trs80Jcl.src/M000233.html +20 -0
  300. data/doc/classes/Trs80Jcl.src/M000234.html +18 -0
  301. data/doc/classes/Trs80Jv1Dsk.html +211 -0
  302. data/doc/classes/Trs80Jv1Dsk.src/M000064.html +18 -0
  303. data/doc/classes/Trs80Jv1Dsk.src/M000065.html +18 -0
  304. data/doc/classes/Trs80Jv1Dsk.src/M000066.html +18 -0
  305. data/doc/classes/Trs80Jv1Dsk.src/M000067.html +18 -0
  306. data/doc/classes/Trs80Jv1Dsk.src/M000068.html +19 -0
  307. data/doc/classes/Trs80LevelIIBasic.html +169 -0
  308. data/doc/classes/Trs80LevelIIBasic.src/M000079.html +20 -0
  309. data/doc/classes/Trs80LevelIIBasic.src/M000080.html +43 -0
  310. data/doc/classes/Trs80PascalSource.html +156 -0
  311. data/doc/classes/Trs80PascalSource.src/M000202.html +20 -0
  312. data/doc/classes/Trs80PascalSource.src/M000203.html +30 -0
  313. data/doc/classes/TrsDos.html +255 -0
  314. data/doc/classes/TrsDos.src/M000031.html +18 -0
  315. data/doc/classes/TrsDos.src/M000032.html +18 -0
  316. data/doc/classes/TrsDos.src/M000033.html +18 -0
  317. data/doc/classes/TrsDos.src/M000034.html +62 -0
  318. data/doc/created.rid +1 -0
  319. data/doc/files/bin/ripxplore_rb.html +150 -0
  320. data/doc/files/lib/DumpUtilities_rb.html +101 -0
  321. data/doc/files/lib/FileCache_rb.html +110 -0
  322. data/doc/files/lib/FileContainer_rb.html +101 -0
  323. data/doc/files/lib/FileSystemImage_rb.html +109 -0
  324. data/doc/files/lib/FileSystem_rb.html +111 -0
  325. data/doc/files/lib/HostSystem_rb.html +110 -0
  326. data/doc/files/lib/ImageFormat_rb.html +111 -0
  327. data/doc/files/lib/NativeFileType_rb.html +111 -0
  328. data/doc/files/lib/PatchedPNG_rb.html +116 -0
  329. data/doc/files/lib/RipXploreLog_rb.html +108 -0
  330. data/doc/files/lib/RipXplore_rb.html +114 -0
  331. data/doc/files/lib/SubclassTracking_rb.html +108 -0
  332. data/doc/files/lib/disassemblers/D65_rb.html +101 -0
  333. data/doc/files/lib/file_systems/AppleCPM_rb.html +108 -0
  334. data/doc/files/lib/file_systems/AppleDos_rb.html +108 -0
  335. data/doc/files/lib/file_systems/AtariDos_rb.html +108 -0
  336. data/doc/files/lib/file_systems/CbmDos_rb.html +108 -0
  337. data/doc/files/lib/file_systems/NADOLDos_rb.html +108 -0
  338. data/doc/files/lib/file_systems/PascalDos_rb.html +108 -0
  339. data/doc/files/lib/file_systems/ProDos_rb.html +108 -0
  340. data/doc/files/lib/file_systems/RawDisk_rb.html +108 -0
  341. data/doc/files/lib/file_systems/TrsDos_rb.html +108 -0
  342. data/doc/files/lib/host_systems/Apple2_rb.html +109 -0
  343. data/doc/files/lib/host_systems/Atari800_rb.html +109 -0
  344. data/doc/files/lib/host_systems/C64_rb.html +109 -0
  345. data/doc/files/lib/host_systems/Trs80_rb.html +108 -0
  346. data/doc/files/lib/image_formats/A2Dsk_rb.html +108 -0
  347. data/doc/files/lib/image_formats/Atr_rb.html +108 -0
  348. data/doc/files/lib/image_formats/D64_rb.html +108 -0
  349. data/doc/files/lib/image_formats/G64_rb.html +108 -0
  350. data/doc/files/lib/image_formats/Trs80Jv1Dsk_rb.html +108 -0
  351. data/doc/files/lib/native_file_types/apple2/AppleBinary_rb.html +108 -0
  352. data/doc/files/lib/native_file_types/apple2/AppleHiResPic_rb.html +108 -0
  353. data/doc/files/lib/native_file_types/apple2/AppleText_rb.html +108 -0
  354. data/doc/files/lib/native_file_types/apple2/AppleWorksWP_rb.html +108 -0
  355. data/doc/files/lib/native_file_types/apple2/Applesoft_rb.html +108 -0
  356. data/doc/files/lib/native_file_types/apple2/IntegerBASIC_rb.html +108 -0
  357. data/doc/files/lib/native_file_types/apple2/NADOLFile_rb.html +108 -0
  358. data/doc/files/lib/native_file_types/apple2/PascalFile_rb.html +108 -0
  359. data/doc/files/lib/native_file_types/apple2/ProDosFile_rb.html +108 -0
  360. data/doc/files/lib/native_file_types/apple2/ScAsm_rb.html +101 -0
  361. data/doc/files/lib/native_file_types/atari800/AtariBasic_rb.html +108 -0
  362. data/doc/files/lib/native_file_types/atari800/AtariBinary_rb.html +108 -0
  363. data/doc/files/lib/native_file_types/atari800/AtariText_rb.html +108 -0
  364. data/doc/files/lib/native_file_types/c64/C64BasicPrg_rb.html +109 -0
  365. data/doc/files/lib/native_file_types/c64/C64PrgText_rb.html +109 -0
  366. data/doc/files/lib/native_file_types/c64/C64Prg_rb.html +109 -0
  367. data/doc/files/lib/native_file_types/c64/C64Seq_rb.html +109 -0
  368. data/doc/files/lib/native_file_types/c64/CbmFile_rb.html +108 -0
  369. data/doc/files/lib/native_file_types/cpm/CPMFile_rb.html +108 -0
  370. data/doc/files/lib/native_file_types/cpm/MBasic_rb.html +108 -0
  371. data/doc/files/lib/native_file_types/generic/GenericFile_rb.html +101 -0
  372. data/doc/files/lib/native_file_types/trs80/Trs80Cmd_rb.html +108 -0
  373. data/doc/files/lib/native_file_types/trs80/Trs80Jcl_rb.html +108 -0
  374. data/doc/files/lib/native_file_types/trs80/Trs80LevelIIBasic_rb.html +108 -0
  375. data/doc/files/lib/native_file_types/trs80/Trs80PascalSource_rb.html +108 -0
  376. data/doc/files/lib/proc_source_rb.html +182 -0
  377. data/doc/files/lib/proc_source_rb.src/M000001.html +24 -0
  378. data/doc/files/lib/rdoc_patch_rb.html +108 -0
  379. data/doc/files/test/tc_file_cache_rb.html +108 -0
  380. data/doc/files/test/tc_image_sniffing_rb.html +108 -0
  381. data/doc/files/test/testhelper_rb.html +129 -0
  382. data/doc/files/test/ts_test_all_rb.html +108 -0
  383. data/doc/fr_class_index.html +26 -0
  384. data/doc/fr_file_index.html +27 -0
  385. data/doc/fr_method_index.html +26 -0
  386. data/doc/index.html +24 -0
  387. data/doc/rdoc-style.css +208 -0
  388. data/lib/DumpUtilities.rb +34 -0
  389. data/lib/FileCache.rb +84 -0
  390. data/lib/FileContainer.rb +45 -0
  391. data/lib/FileSystem.rb +83 -0
  392. data/lib/FileSystemImage.rb +176 -0
  393. data/lib/HostSystem.rb +84 -0
  394. data/lib/ImageFormat.rb +127 -0
  395. data/lib/NativeFileType.rb +168 -0
  396. data/lib/PatchedPNG.rb +303 -0
  397. data/lib/RipXplore.rb +77 -0
  398. data/lib/RipXploreLog.rb +63 -0
  399. data/lib/SubclassTracking.rb +11 -0
  400. data/lib/disassemblers/D65.rb +181 -0
  401. data/lib/file_systems/AppleCPM.rb +123 -0
  402. data/lib/file_systems/AppleDos.rb +211 -0
  403. data/lib/file_systems/AtariDos.rb +80 -0
  404. data/lib/file_systems/CbmDos.rb +75 -0
  405. data/lib/file_systems/NADOLDos.rb +110 -0
  406. data/lib/file_systems/PascalDos.rb +131 -0
  407. data/lib/file_systems/ProDos.rb +155 -0
  408. data/lib/file_systems/RawDisk.rb +45 -0
  409. data/lib/file_systems/TrsDos.rb +148 -0
  410. data/lib/host_systems/Apple2.rb +57 -0
  411. data/lib/host_systems/Atari800.rb +57 -0
  412. data/lib/host_systems/C64.rb +82 -0
  413. data/lib/host_systems/Trs80.rb +48 -0
  414. data/lib/host_systems/a2_symbols.yaml +199 -0
  415. data/lib/host_systems/atari_800_symbols.yaml +496 -0
  416. data/lib/host_systems/c64_symbols.yaml +636 -0
  417. data/lib/image_formats/A2Dsk.rb +77 -0
  418. data/lib/image_formats/Atr.rb +83 -0
  419. data/lib/image_formats/D64.rb +87 -0
  420. data/lib/image_formats/G64.rb +174 -0
  421. data/lib/image_formats/Trs80Jv1Dsk.rb +65 -0
  422. data/lib/native_file_types/apple2/AppleBinary.rb +51 -0
  423. data/lib/native_file_types/apple2/AppleHiResPic.rb +166 -0
  424. data/lib/native_file_types/apple2/AppleText.rb +43 -0
  425. data/lib/native_file_types/apple2/AppleWorksWP.rb +68 -0
  426. data/lib/native_file_types/apple2/Applesoft.rb +115 -0
  427. data/lib/native_file_types/apple2/IntegerBASIC.rb +217 -0
  428. data/lib/native_file_types/apple2/NADOLFile.rb +205 -0
  429. data/lib/native_file_types/apple2/PascalFile.rb +48 -0
  430. data/lib/native_file_types/apple2/ProDosFile.rb +112 -0
  431. data/lib/native_file_types/apple2/ScAsm.rb +110 -0
  432. data/lib/native_file_types/atari800/AtariBasic.rb +396 -0
  433. data/lib/native_file_types/atari800/AtariBinary.rb +53 -0
  434. data/lib/native_file_types/atari800/AtariText.rb +49 -0
  435. data/lib/native_file_types/c64/C64BasicPrg.rb +333 -0
  436. data/lib/native_file_types/c64/C64Prg.rb +57 -0
  437. data/lib/native_file_types/c64/C64PrgText.rb +45 -0
  438. data/lib/native_file_types/c64/C64Seq.rb +47 -0
  439. data/lib/native_file_types/c64/CbmFile.rb +41 -0
  440. data/lib/native_file_types/cpm/CPMFile.rb +40 -0
  441. data/lib/native_file_types/cpm/MBasic.rb +311 -0
  442. data/lib/native_file_types/generic/GenericFile.rb +43 -0
  443. data/lib/native_file_types/trs80/Trs80Cmd.rb +130 -0
  444. data/lib/native_file_types/trs80/Trs80Jcl.rb +43 -0
  445. data/lib/native_file_types/trs80/Trs80LevelIIBasic.rb +201 -0
  446. data/lib/native_file_types/trs80/Trs80PascalSource.rb +58 -0
  447. data/lib/proc_source.rb +238 -0
  448. data/lib/rdoc_patch.rb +32 -0
  449. data/test/tc_file_cache.rb +11 -0
  450. data/test/tc_image_sniffing.rb +165 -0
  451. data/test/testhelper.rb +14 -0
  452. data/test/testlog.txt +30755 -0
  453. data/test/ts_test_all.rb +3 -0
  454. metadata +601 -0
data/lib/HostSystem.rb ADDED
@@ -0,0 +1,84 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+ require 'open-uri'
4
+ require 'RipXploreLog'
5
+ require 'SubclassTracking'
6
+
7
+ class HostSystem
8
+ def HostSystem.possible_file_systems
9
+ results=[]
10
+ FileSystem.all_file_systems.each do |candidate|
11
+ results<<candidate if self==candidate.host_system
12
+ end
13
+ results
14
+ end
15
+
16
+ def HostSystem.all_host_systems
17
+ HostSystem.subclasses
18
+ end
19
+
20
+ #each subclass should override to_ascii with a function that converts a character in the native format to an ASCII equivalent
21
+ def HostSystem.to_ascii(byte)
22
+ byte.chr
23
+ end
24
+
25
+ def HostSystem.s_to_ascii(s)
26
+ r=""
27
+ s.each_byte do |b|
28
+ r+=to_ascii(b)
29
+ end
30
+ r
31
+ end
32
+
33
+ #given a buffer (e.g a sector or a file), produce a formatted hex dump which includes chars converted to ASCII
34
+ def HostSystem.hex_dump(buffer)
35
+ s=""
36
+ (0..(buffer.length/16)).each {|line_number|
37
+ lhs=""
38
+ rhs=""
39
+ start_byte=line_number*16
40
+ line=buffer[start_byte,16]
41
+ if line.length>0 then
42
+ line.each_byte {|byte|
43
+ lhs+= sprintf("%02X ", byte)
44
+ rhs+= to_ascii(byte).sub(/[\x00-\x1f]/,'.')
45
+ }
46
+ lhs+=" "*(16-line.length)*3
47
+ s+=sprintf("%02X\t%s %s\n",start_byte,lhs,rhs)
48
+ end
49
+ }
50
+ s
51
+ end
52
+
53
+ #does counting of tracks start at track 0 (e.g. Apple 2) or track 1 (e.g. C64)?
54
+ def HostSystem.start_track
55
+ 0
56
+ end
57
+ end
58
+
59
+ HostSystem.extend SubclassTracking
60
+
61
+ # == Author
62
+ # Jonno Downes (jonno@jamtronix.com)
63
+ #
64
+ # == Copyright
65
+ # Copyright (c) 2008 Jonno Downes (jonno@jamtronix.com)
66
+ #
67
+ #Permission is hereby granted, free of charge, to any person obtaining
68
+ #a copy of this software and associated documentation files (the
69
+ #"Software"), to deal in the Software without restriction, including
70
+ #without limitation the rights to use, copy, modify, merge, publish,
71
+ #distribute, sublicense, and/or sell copies of the Software, and to
72
+ #permit persons to whom the Software is furnished to do so, subject to
73
+ #the following conditions:
74
+
75
+ # The above copyright notice and this permission notice shall be
76
+ # included in all copies or substantial portions of the Software.
77
+
78
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
79
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
80
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
81
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
82
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
83
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
84
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,127 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+ require 'open-uri'
4
+ require 'RipXploreLog'
5
+ require 'SubclassTracking'
6
+ require 'proc_source'
7
+ class ImageFormat
8
+
9
+ def self.possible_extensions
10
+ []
11
+ end
12
+
13
+ def to_s
14
+ self.class.name
15
+ end
16
+ def self.host_system
17
+ nil
18
+ end
19
+
20
+ def host_system
21
+ self.class.host_system
22
+ end
23
+ def self.all_image_formats
24
+ ImageFormat.subclasses
25
+ end
26
+
27
+ def self.possible_file_systems
28
+ results=[]
29
+ FileSystem.all_file_systems.each do |candidate|
30
+ results<<candidate if (host_system==candidate.host_system) || (candidate.host_system==HostSystem)
31
+ end
32
+ results
33
+ end
34
+
35
+ @@all_possible_extensions=nil
36
+ def self.all_possible_extensions
37
+ @@all_possible_extensions= ImageFormat.all_image_formats.collect{|format| format.possible_extensions}.flatten.uniq.collect{|ext| ext.downcase} if @@all_possible_extensions.nil?
38
+ @@all_possible_extensions
39
+ end
40
+
41
+ #return an array containing a list of numbers of valid tracks on this image
42
+ def track_list
43
+ (start_track..end_track).collect
44
+ end
45
+
46
+ #for a given byte stream, how many tracks could be interpreted by this image format?
47
+ def track_count
48
+ 0
49
+ end
50
+
51
+ #given a track number, a sector number, and an array of bytes, return an array of bytes representing the contents of that track/sector, or nil if specified track/sector not available
52
+ #needs to be overriden in each ImageFormat
53
+ def get_sector(track,sector)
54
+ nil
55
+ end
56
+
57
+ #given a track number, how many sectors should be in this track for this ImageFormat?
58
+ def sectors_in_track(track)
59
+ [0]
60
+ end
61
+
62
+
63
+ #is the first track called track 0 or track 1?
64
+ def start_track
65
+ host_system.respond_to?(:start_track) ? host_system.start_track : 0
66
+ end
67
+ #what track does counting end at?
68
+ def end_track
69
+ track_count-1+start_track
70
+ end
71
+
72
+ @@code_for_tests={}
73
+ def self.code_for_tests
74
+ @@code_for_tests[self] || []
75
+ end
76
+
77
+ def self.is_valid_image_if(code_for_test)
78
+ RipXploreLog.debug "adding test for #{self}: #{code_for_test.source}"
79
+ @@code_for_tests[self] ||=[]
80
+ @@code_for_tests[self]<<code_for_test.source
81
+ end
82
+
83
+ def compatability_score(file_system_image)
84
+ final_score=1
85
+ self.class.code_for_tests.each do |code_for_test|
86
+ RipXploreLog.debug "test for #{file_system_image.filename}#{self} : #{code_for_test} "
87
+ result = eval code_for_test,binding
88
+ RipXploreLog.debug "result : #{result}"
89
+ final_score+=1
90
+ return 0 unless (result)
91
+ end
92
+ return final_score
93
+ end
94
+
95
+
96
+ attr_accessor :file_bytes
97
+ def initialize(file_bytes)
98
+ @file_bytes=file_bytes
99
+ end
100
+ end
101
+
102
+ ImageFormat.extend SubclassTracking
103
+
104
+ # == Author
105
+ # Jonno Downes (jonno@jamtronix.com)
106
+ #
107
+ # == Copyright
108
+ # Copyright (c) 2008 Jonno Downes (jonno@jamtronix.com)
109
+ #
110
+ #Permission is hereby granted, free of charge, to any person obtaining
111
+ #a copy of this software and associated documentation files (the
112
+ #"Software"), to deal in the Software without restriction, including
113
+ #without limitation the rights to use, copy, modify, merge, publish,
114
+ #distribute, sublicense, and/or sell copies of the Software, and to
115
+ #permit persons to whom the Software is furnished to do so, subject to
116
+ #the following conditions:
117
+
118
+ # The above copyright notice and this permission notice shall be
119
+ # included in all copies or substantial portions of the Software.
120
+
121
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
122
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
123
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
124
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
125
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
126
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
127
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,168 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+ require 'open-uri'
4
+ require 'RipXploreLog'
5
+ require 'SubclassTracking'
6
+ require 'proc_source'
7
+
8
+ class NativeFileType
9
+ attr_accessor(:file_system_image,:filename,:contents,:file_type,:aux_code)
10
+ def initialize(file_system_image,filename,contents,file_type,aux_code)
11
+ @file_system_image=file_system_image
12
+ @filename=filename
13
+ @contents=contents
14
+ @file_type=file_type
15
+ @aux_code=aux_code
16
+ end
17
+
18
+ def NativeFileType.matching_score
19
+ ancestors.length
20
+ end
21
+
22
+ def NativeFileType.non_matching_score
23
+ 0
24
+ end
25
+
26
+
27
+ def NativeFileType.all_native_file_types
28
+ NativeFileType.subclasses
29
+ end
30
+
31
+ #how should this file be described in a catalog list?
32
+ def type_description
33
+ self.class
34
+ end
35
+
36
+ def load_address
37
+ self.class.load_address(contents)
38
+ end
39
+
40
+ def NativeFileType.load_address(filebytes)
41
+ 0
42
+ end
43
+
44
+ def <=>(o)
45
+ return -1 unless o.respond_to?(:filename)
46
+ if filename==o.filename then
47
+ return self.to_s<=>o.to_s
48
+ else
49
+ return (filename<=>o.filename)
50
+ end
51
+ end
52
+
53
+ def to_hex_dump
54
+ file_system_image.file_system.host_system.hex_dump(contents)
55
+ end
56
+ #some filesystems differentiate between full and partial filenames.
57
+ #e.g. in ProDOS the 'full' filename includes the full path
58
+ #by default, full_filename is the same as filename, but can be overridden
59
+ #for those filesystems that need this
60
+ def full_filename
61
+ @filename
62
+ end
63
+
64
+ def ==(other_object)
65
+ if !other_object.kind_of? NativeFileType then
66
+ return false
67
+ end
68
+ if self.filename!=other_object.filename then
69
+ return false
70
+ end
71
+ return self.to_s==other_object.to_s
72
+ end
73
+
74
+
75
+ #given metadata and contents of a file from a file system image, return an instance of the NativeFileType subclass that is the closest match
76
+ def NativeFileType.best_fit(file_system_image,filename,contents,file_type=nil,aux_code=nil)
77
+ candidates={}
78
+ NativeFileType.all_native_file_types.each do |native_file_type|
79
+ if !native_file_type.file_system_file_types.keys.include?(file_system_image.file_system) then
80
+ RipXploreLog.debug("skipping #{native_file_type} - can't reside on #{file_system_image.file_system}")
81
+ else
82
+ RipXploreLog.debug("checking native file type #{native_file_type}")
83
+ candidate_score=native_file_type.compatability_score(file_system_image,filename,contents,file_type,aux_code)
84
+ RipXploreLog.debug("score - #{candidate_score}")
85
+ candidates[native_file_type]=candidate_score
86
+ end
87
+ end
88
+ if candidates.length==0 then
89
+ RipXploreLog.debug( 'no valid combination of file system and native file types found')
90
+ return nil
91
+ end
92
+ best_candidate=candidates.keys.sort{|a,b| candidates[b]<=>candidates[a]}[0]
93
+ RipXploreLog.debug("best candidate for #{filename} = #{best_candidate} score: #{candidates[best_candidate]}")
94
+ best_candidate.new(file_system_image,filename,contents,file_type,aux_code)
95
+ end
96
+
97
+
98
+ def NativeFileType.file_type_matches?(file_system_image,file_type)
99
+ result=false
100
+ [file_system_file_types[file_system_image.file_system]].flatten.each do |target_file_type|
101
+ result=true if target_file_type==:any
102
+ result=true if(file_type.to_s==target_file_type.to_s)
103
+ RipXploreLog.debug "test for #{file_type} == #{target_file_type} : #{result}"
104
+ end
105
+ result
106
+ end
107
+
108
+ #how many bytes should be skipped to get to the file data?
109
+ def header_length
110
+ 0
111
+ end
112
+
113
+ def data_without_header
114
+ @contents[header_length,@contents.length-header_length]
115
+ end
116
+
117
+ @@code_for_tests={}
118
+ def self.code_for_tests
119
+ @@code_for_tests[self] || []
120
+ end
121
+
122
+ def self.is_valid_file_if(code_for_test)
123
+ #puts "adding test for #{self}: #{code_for_test.source}"
124
+ @@code_for_tests[self] ||=[]
125
+ @@code_for_tests[self]<<code_for_test.source
126
+ end
127
+
128
+ def self.compatability_score(file_system_image,filename,contents,file_type,aux_code)
129
+ return non_matching_score unless (file_type_matches?(file_system_image,file_type))
130
+ load_address=self.load_address(contents)
131
+ passed_tests=0
132
+ code_for_tests.each do |code_for_test|
133
+ result = eval code_for_test,binding
134
+ RipXploreLog.debug "test for #{self} : #{code_for_test} : #{result}"
135
+ return non_matching_score unless (result)
136
+ passed_tests+=1
137
+ end
138
+ return matching_score+passed_tests
139
+ end
140
+
141
+ end
142
+
143
+ NativeFileType.extend SubclassTracking
144
+
145
+ # == Author
146
+ # Jonno Downes (jonno@jamtronix.com)
147
+ #
148
+ # == Copyright
149
+ # Copyright (c) 2008 Jonno Downes (jonno@jamtronix.com)
150
+ #
151
+ #Permission is hereby granted, free of charge, to any person obtaining
152
+ #a copy of this software and associated documentation files (the
153
+ #"Software"), to deal in the Software without restriction, including
154
+ #without limitation the rights to use, copy, modify, merge, publish,
155
+ #distribute, sublicense, and/or sell copies of the Software, and to
156
+ #permit persons to whom the Software is furnished to do so, subject to
157
+ #the following conditions:
158
+
159
+ # The above copyright notice and this permission notice shall be
160
+ # included in all copies or substantial portions of the Software.
161
+
162
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
163
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
164
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
165
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
166
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
167
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
168
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/lib/PatchedPNG.rb ADDED
@@ -0,0 +1,303 @@
1
+ #code ripped from the Pure Ruby PNG library by Ryan Davis. (http://blog.zenspider.com/)
2
+
3
+ require 'zlib'
4
+
5
+
6
+ class String # :nodoc:
7
+
8
+ ##
9
+ # Calculates a CRC using the algorithm in the PNG specification.
10
+
11
+ def png_crc
12
+ unless defined? @@crc then
13
+ @@crc = Array.new(256)
14
+ 256.times do |n|
15
+ c = n
16
+ 8.times do
17
+ c = (c & 1 == 1) ? 0xedb88320 ^ (c >> 1) : c >> 1
18
+ end
19
+ @@crc[n] = c
20
+ end
21
+ end
22
+
23
+ c = 0xffffffff
24
+ each_byte do |b|
25
+ c = @@crc[(c^b) & 0xff] ^ (c >> 8)
26
+ end
27
+ return c ^ 0xffffffff
28
+ end
29
+
30
+ end
31
+
32
+ ##
33
+ # A pure Ruby Portable Network Graphics (PNG) writer.
34
+ #
35
+ # http://www.libpng.org/pub/png/spec/1.2/
36
+ #
37
+ # PNG supports:
38
+ # + 8 bit truecolor PNGs
39
+ #
40
+ # PNG does not support:
41
+ # + any other color depth
42
+ # + extra data chunks
43
+ # + filters
44
+ #
45
+ # = Example
46
+ #
47
+ # require 'png'
48
+ #
49
+ # canvas = PNG::Canvas.new 200, 200
50
+ # canvas[100, 100] = PNG::Color::Black
51
+ # canvas.line 50, 50, 100, 50, PNG::Color::Blue
52
+ # png = PNG.new canvas
53
+ # png.save 'blah.png'
54
+
55
+ class PNG
56
+
57
+ ##
58
+ # Creates a PNG chunk of type +type+ that contains +data+.
59
+
60
+ def self.chunk(type, data="")
61
+ [data.size, type, data, (type + data).png_crc].pack("Na*a*N")
62
+ end
63
+
64
+ ##
65
+ # Creates a new PNG object using +canvas+
66
+
67
+ def initialize(canvas)
68
+ @height = canvas.height
69
+ @width = canvas.width
70
+ @bits = 8
71
+ @data = canvas.data
72
+ end
73
+
74
+ ##
75
+ # Writes the PNG to +path+.
76
+
77
+ def save(path)
78
+ File.open(path, "w") do |f|
79
+ f.write [137, 80, 78, 71, 13, 10, 26, 10].pack("C*") # PNG signature
80
+ f.write PNG.chunk('IHDR',
81
+ [ @height, @width, @bits, 6, 0, 0, 0 ].pack("N2C5"))
82
+ # 0 == filter type code "none"
83
+ data = @data.map { |row| [0] + row.map { |p| p.values } }.flatten
84
+ f.write PNG.chunk('IDAT', Zlib::Deflate.deflate(data.pack("C*"), 9))
85
+ f.write PNG.chunk('IEND', '')
86
+ end
87
+ end
88
+
89
+ def raw_bytes
90
+ bytes=""
91
+ bytes<< [137, 80, 78, 71, 13, 10, 26, 10].pack("C*") # PNG signature
92
+ bytes<< PNG.chunk('IHDR',
93
+ [ @height, @width, @bits, 6, 0, 0, 0 ].pack("N2C5"))
94
+ # 0 == filter type code "none"
95
+ data = @data.map { |row| [0] + row.map { |p| p.values } }.flatten
96
+ bytes<< PNG.chunk('IDAT', Zlib::Deflate.deflate(data.pack("C*"), 9))
97
+ bytes<< PNG.chunk('IEND', '')
98
+ bytes
99
+ end
100
+
101
+ ##
102
+ # RGBA colors
103
+
104
+ class Color
105
+
106
+ attr_reader :values
107
+
108
+ ##
109
+ # Creates a new color with values +red+, +green+, +blue+, and +alpha+.
110
+
111
+ def initialize(red, green, blue, alpha)
112
+ @values = [red, green, blue, alpha]
113
+ end
114
+
115
+ ##
116
+ # Transparent white
117
+
118
+ Background = Color.new 0xFF, 0xFF, 0xFF, 0x00
119
+
120
+ White = Color.new 0xFF, 0xFF, 0xFF, 0xFF
121
+ Black = Color.new 0x00, 0x00, 0x00, 0xFF
122
+ Gray = Color.new 0x7F, 0x7F, 0x7F, 0xFF
123
+
124
+ Red = Color.new 0xFF, 0x00, 0x00, 0xFF
125
+ Orange = Color.new 0xFF, 0xA5, 0x00, 0xFF
126
+ Yellow = Color.new 0xFF, 0xFF, 0x00, 0xFF
127
+ Green = Color.new 0x00, 0xFF, 0x00, 0xFF
128
+ Blue = Color.new 0x00, 0x00, 0xFF, 0xFF
129
+ Purple = Color.new 0XFF, 0x00, 0xFF, 0xFF
130
+
131
+ ##
132
+ # Red component
133
+
134
+ def r; @values[0]; end
135
+
136
+ ##
137
+ # Green component
138
+
139
+ def g; @values[1]; end
140
+
141
+ ##
142
+ # Blue component
143
+
144
+ def b; @values[2]; end
145
+
146
+ ##
147
+ # Alpha transparency component
148
+
149
+ def a; @values[3]; end
150
+
151
+ ##
152
+ # Blends +color+ into this color returning a new blended color.
153
+
154
+ def blend(color)
155
+ return Color.new((r * (0xFF - color.a) + color.r * color.a) >> 8,
156
+ (g * (0xFF - color.a) + color.g * color.a) >> 8,
157
+ (b * (0xFF - color.a) + color.b * color.a) >> 8,
158
+ (a * (0xFF - color.a) + color.a * color.a) >> 8)
159
+ end
160
+
161
+ ##
162
+ # Returns a new color with an alpha value adjusted by +i+.
163
+
164
+ def intensity(i)
165
+ return Color.new(r,b,g,(a*i) >> 8)
166
+ end
167
+
168
+ def inspect # :nodoc:
169
+ "#<%s %02x %02x %02x %02x>" % [self.class, *@values]
170
+ end
171
+
172
+ end
173
+
174
+ ##
175
+ # PNG canvas
176
+
177
+ class Canvas
178
+
179
+ ##
180
+ # Height of the canvas
181
+
182
+ attr_reader :height
183
+
184
+ ##
185
+ # Width of the canvas
186
+
187
+ attr_reader :width
188
+
189
+ ##
190
+ # Raw data
191
+
192
+ attr_reader :data
193
+
194
+ def initialize(height, width, background = Color::White)
195
+ @height = height
196
+ @width = width
197
+ @data = Array.new(@width) { |x| Array.new(@height) { background } }
198
+ end
199
+
200
+ ##
201
+ # Retrieves the color of the pixel at (+x+, +y+).
202
+
203
+ def [](x, y)
204
+ raise "bad x value #{x} >= #{@height}" if x >= @height
205
+ raise "bad y value #{y} >= #{@width}" if y >= @width
206
+ @data[y][x]
207
+ end
208
+
209
+ ##
210
+ # Sets the color of the pixel at (+x+, +y+) to +color+.
211
+
212
+ def []=(x, y, color)
213
+ raise "bad x value #{x} >= #{@height}" if x >= @height
214
+ raise "bad y value #{y} >= #{@width}" if y >= @width
215
+ @data[y][x] = color
216
+ end
217
+
218
+ ##
219
+ # Iterates over each pixel in the canvas.
220
+
221
+ def each
222
+ @data.each_with_index do |row, y|
223
+ row.each_with_index do |pixel, x|
224
+ yield x, y, color
225
+ end
226
+ end
227
+ end
228
+
229
+ ##
230
+ # Blends +color+ onto the color at point (+x+, +y+).
231
+
232
+ def point(x, y, color)
233
+ self[x,y] = self[x,y].blend(color)
234
+ end
235
+
236
+ ##
237
+ # Draws a line using Xiaolin Wu's antialiasing technique.
238
+ #
239
+ # http://en.wikipedia.org/wiki/Xiaolin_Wu's_line_algorithm
240
+
241
+ def line(x0, y0, x1, y1, color)
242
+ dx = x1 - x0
243
+ sx = dx < 0 ? -1 : 1
244
+ dx *= sx # TODO: abs?
245
+ dy = y1 - y0
246
+
247
+ # 'easy' cases
248
+ if dy == 0 then
249
+ Range.new(*[x0,x1].sort).each do |x|
250
+ point(x, y0, color)
251
+ end
252
+ return
253
+ end
254
+
255
+ if dx == 0 then
256
+ (y0..y1).each do |y|
257
+ point(x0, y, color)
258
+ end
259
+ return
260
+ end
261
+
262
+ if dx == dy then
263
+ Range.new(*[x0,x1].sort).each do |x|
264
+ point(x, y0, color)
265
+ y0 += 1
266
+ end
267
+ return
268
+ end
269
+
270
+ # main loop
271
+ point(x0, y0, color)
272
+ e_acc = 0
273
+ if dy > dx then # vertical displacement
274
+ e = (dx << 16) / dy
275
+ (y0...y1-1).each do |i|
276
+ e_acc_temp, e_acc = e_acc, (e_acc + e) & 0xFFFF
277
+ x0 = x0 + sx if (e_acc <= e_acc_temp)
278
+ w = 0xFF-(e_acc >> 8)
279
+ point(x0, y0, color.intensity(w))
280
+ y0 = y0 + 1
281
+ point(x0 + sx, y0, color.intensity(0xFF-w))
282
+ end
283
+ point(x1, y1, color)
284
+ return
285
+ end
286
+
287
+ # horizontal displacement
288
+ e = (dy << 16) / dx
289
+ (x0...(x1-sx)).each do |i|
290
+ e_acc_temp, e_acc = e_acc, (e_acc + e) & 0xFFFF
291
+ y0 += 1 if (e_acc <= e_acc_temp)
292
+ w = 0xFF-(e_acc >> 8)
293
+ point(x0, y0, color.intensity(w))
294
+ x0 += sx
295
+ point(x0, y0 + 1, color.intensity(0xFF-w))
296
+ end
297
+ point(x1, y1, color)
298
+ end
299
+
300
+ end
301
+
302
+ end
303
+