ripxplore 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+