ripxplore 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/ripxplore.rb +188 -0
- data/doc/classes/A2Dsk.html +226 -0
- data/doc/classes/A2Dsk.src/M000005.html +18 -0
- data/doc/classes/A2Dsk.src/M000006.html +18 -0
- data/doc/classes/A2Dsk.src/M000007.html +18 -0
- data/doc/classes/A2Dsk.src/M000008.html +18 -0
- data/doc/classes/A2Dsk.src/M000009.html +18 -0
- data/doc/classes/A2Dsk.src/M000010.html +22 -0
- data/doc/classes/A2DskDosOrder.html +139 -0
- data/doc/classes/A2DskDosOrder.src/M000242.html +18 -0
- data/doc/classes/A2DskPhysicalOrder.html +139 -0
- data/doc/classes/A2DskPhysicalOrder.src/M000019.html +18 -0
- data/doc/classes/Apple2.html +187 -0
- data/doc/classes/Apple2.src/M000128.html +18 -0
- data/doc/classes/Apple2.src/M000129.html +18 -0
- data/doc/classes/Apple2.src/M000130.html +18 -0
- data/doc/classes/Apple2.src/M000131.html +19 -0
- data/doc/classes/AppleBinary.html +193 -0
- data/doc/classes/AppleBinary.src/M000089.html +20 -0
- data/doc/classes/AppleBinary.src/M000090.html +18 -0
- data/doc/classes/AppleBinary.src/M000091.html +18 -0
- data/doc/classes/AppleBinary.src/M000092.html +18 -0
- data/doc/classes/AppleCPM.html +228 -0
- data/doc/classes/AppleCPM.src/M000243.html +18 -0
- data/doc/classes/AppleCPM.src/M000244.html +18 -0
- data/doc/classes/AppleCPM.src/M000245.html +21 -0
- data/doc/classes/AppleCPM.src/M000246.html +40 -0
- data/doc/classes/AppleDos.html +275 -0
- data/doc/classes/AppleDos.src/M000161.html +18 -0
- data/doc/classes/AppleDos.src/M000162.html +18 -0
- data/doc/classes/AppleDos.src/M000163.html +18 -0
- data/doc/classes/AppleDos.src/M000164.html +86 -0
- data/doc/classes/AppleHiResPic.html +279 -0
- data/doc/classes/AppleHiResPic.src/M000083.html +22 -0
- data/doc/classes/AppleHiResPic.src/M000084.html +18 -0
- data/doc/classes/AppleHiResPic.src/M000085.html +22 -0
- data/doc/classes/AppleHiResPic.src/M000086.html +57 -0
- data/doc/classes/AppleHiResPic.src/M000087.html +18 -0
- data/doc/classes/AppleHiResPic.src/M000088.html +18 -0
- data/doc/classes/AppleText.html +156 -0
- data/doc/classes/AppleText.src/M000142.html +21 -0
- data/doc/classes/AppleText.src/M000143.html +20 -0
- data/doc/classes/AppleWorksWP.html +160 -0
- data/doc/classes/AppleWorksWP.src/M000081.html +20 -0
- data/doc/classes/AppleWorksWP.src/M000082.html +45 -0
- data/doc/classes/Applesoft.html +169 -0
- data/doc/classes/Applesoft.src/M000175.html +21 -0
- data/doc/classes/Applesoft.src/M000176.html +75 -0
- data/doc/classes/Atari800.html +169 -0
- data/doc/classes/Atari800.src/M000177.html +23 -0
- data/doc/classes/Atari800.src/M000178.html +18 -0
- data/doc/classes/Atari800.src/M000179.html +19 -0
- data/doc/classes/AtariBasic.html +215 -0
- data/doc/classes/AtariBasic.src/M000204.html +20 -0
- data/doc/classes/AtariBasic.src/M000205.html +108 -0
- data/doc/classes/AtariBinary.html +193 -0
- data/doc/classes/AtariBinary.src/M000238.html +20 -0
- data/doc/classes/AtariBinary.src/M000239.html +18 -0
- data/doc/classes/AtariBinary.src/M000240.html +18 -0
- data/doc/classes/AtariBinary.src/M000241.html +18 -0
- data/doc/classes/AtariDos.html +186 -0
- data/doc/classes/AtariDos.src/M000047.html +18 -0
- data/doc/classes/AtariDos.src/M000048.html +43 -0
- data/doc/classes/AtariText.html +159 -0
- data/doc/classes/AtariText.src/M000002.html +20 -0
- data/doc/classes/AtariText.src/M000003.html +18 -0
- data/doc/classes/Atr.html +271 -0
- data/doc/classes/Atr.src/M000208.html +18 -0
- data/doc/classes/Atr.src/M000209.html +18 -0
- data/doc/classes/Atr.src/M000210.html +19 -0
- data/doc/classes/Atr.src/M000211.html +18 -0
- data/doc/classes/Atr.src/M000212.html +18 -0
- data/doc/classes/Atr.src/M000213.html +19 -0
- data/doc/classes/Atr.src/M000214.html +19 -0
- data/doc/classes/C64.html +206 -0
- data/doc/classes/C64.src/M000020.html +18 -0
- data/doc/classes/C64.src/M000021.html +31 -0
- data/doc/classes/C64.src/M000022.html +22 -0
- data/doc/classes/C64.src/M000023.html +19 -0
- data/doc/classes/C64.src/M000024.html +19 -0
- data/doc/classes/C64BasicPrg.html +201 -0
- data/doc/classes/C64BasicPrg.src/M000035.html +20 -0
- data/doc/classes/C64BasicPrg.src/M000036.html +59 -0
- data/doc/classes/C64Prg.html +190 -0
- data/doc/classes/C64Prg.src/M000169.html +20 -0
- data/doc/classes/C64Prg.src/M000170.html +18 -0
- data/doc/classes/C64Prg.src/M000171.html +18 -0
- data/doc/classes/C64Prg.src/M000172.html +20 -0
- data/doc/classes/C64PrgText.html +139 -0
- data/doc/classes/C64PrgText.src/M000237.html +18 -0
- data/doc/classes/C64Seq.html +156 -0
- data/doc/classes/C64Seq.src/M000013.html +20 -0
- data/doc/classes/C64Seq.src/M000014.html +18 -0
- data/doc/classes/CPMFile.html +156 -0
- data/doc/classes/CPMFile.src/M000108.html +20 -0
- data/doc/classes/CPMFile.src/M000109.html +18 -0
- data/doc/classes/CbmDos.html +172 -0
- data/doc/classes/CbmDos.src/M000182.html +18 -0
- data/doc/classes/CbmDos.src/M000183.html +42 -0
- data/doc/classes/CbmFile.html +156 -0
- data/doc/classes/CbmFile.src/M000235.html +20 -0
- data/doc/classes/CbmFile.src/M000236.html +18 -0
- data/doc/classes/D64.html +247 -0
- data/doc/classes/D64.src/M000037.html +18 -0
- data/doc/classes/D64.src/M000038.html +18 -0
- data/doc/classes/D64.src/M000039.html +18 -0
- data/doc/classes/D64.src/M000040.html +22 -0
- data/doc/classes/D64.src/M000041.html +18 -0
- data/doc/classes/D64.src/M000042.html +21 -0
- data/doc/classes/D65.html +170 -0
- data/doc/classes/D65.src/M000049.html +22 -0
- data/doc/classes/D65.src/M000050.html +68 -0
- data/doc/classes/DumpUtilities.html +152 -0
- data/doc/classes/DumpUtilities.src/M000077.html +33 -0
- data/doc/classes/DumpUtilities.src/M000078.html +27 -0
- data/doc/classes/FileCache.html +210 -0
- data/doc/classes/FileCache.src/M000135.html +18 -0
- data/doc/classes/FileCache.src/M000136.html +20 -0
- data/doc/classes/FileCache.src/M000137.html +22 -0
- data/doc/classes/FileCache.src/M000138.html +32 -0
- data/doc/classes/FileCacheItem.html +152 -0
- data/doc/classes/FileCacheItem.src/M000165.html +18 -0
- data/doc/classes/FileCacheItem.src/M000166.html +18 -0
- data/doc/classes/FileContainer.html +146 -0
- data/doc/classes/FileContainer.src/M000232.html +26 -0
- data/doc/classes/FileSystem.html +252 -0
- data/doc/classes/FileSystem.src/M000069.html +18 -0
- data/doc/classes/FileSystem.src/M000070.html +18 -0
- data/doc/classes/FileSystem.src/M000071.html +18 -0
- data/doc/classes/FileSystem.src/M000072.html +18 -0
- data/doc/classes/FileSystem.src/M000073.html +18 -0
- data/doc/classes/FileSystem.src/M000074.html +18 -0
- data/doc/classes/FileSystem.src/M000075.html +20 -0
- data/doc/classes/FileSystem.src/M000076.html +25 -0
- data/doc/classes/FileSystemImage.html +430 -0
- data/doc/classes/FileSystemImage.src/M000215.html +19 -0
- data/doc/classes/FileSystemImage.src/M000216.html +41 -0
- data/doc/classes/FileSystemImage.src/M000217.html +27 -0
- data/doc/classes/FileSystemImage.src/M000218.html +18 -0
- data/doc/classes/FileSystemImage.src/M000219.html +18 -0
- data/doc/classes/FileSystemImage.src/M000220.html +18 -0
- data/doc/classes/FileSystemImage.src/M000221.html +22 -0
- data/doc/classes/FileSystemImage.src/M000222.html +19 -0
- data/doc/classes/FileSystemImage.src/M000223.html +18 -0
- data/doc/classes/FileSystemImage.src/M000224.html +18 -0
- data/doc/classes/FileSystemImage.src/M000225.html +18 -0
- data/doc/classes/FileSystemImage.src/M000226.html +18 -0
- data/doc/classes/FileSystemImage.src/M000227.html +20 -0
- data/doc/classes/FileSystemImage.src/M000228.html +22 -0
- data/doc/classes/FileSystemImage.src/M000229.html +22 -0
- data/doc/classes/FileSystemImage.src/M000230.html +18 -0
- data/doc/classes/FileSystemImage.src/M000231.html +23 -0
- data/doc/classes/G64.html +257 -0
- data/doc/classes/G64.src/M000093.html +30 -0
- data/doc/classes/G64.src/M000094.html +18 -0
- data/doc/classes/G64.src/M000095.html +18 -0
- data/doc/classes/G64.src/M000096.html +17 -0
- data/doc/classes/G64.src/M000097.html +18 -0
- data/doc/classes/G64.src/M000098.html +18 -0
- data/doc/classes/G64.src/M000099.html +21 -0
- data/doc/classes/GenericFile.html +157 -0
- data/doc/classes/GenericFile.src/M000167.html +20 -0
- data/doc/classes/GenericFile.src/M000168.html +18 -0
- data/doc/classes/HostSystem.html +225 -0
- data/doc/classes/HostSystem.src/M000025.html +22 -0
- data/doc/classes/HostSystem.src/M000026.html +18 -0
- data/doc/classes/HostSystem.src/M000027.html +18 -0
- data/doc/classes/HostSystem.src/M000028.html +22 -0
- data/doc/classes/HostSystem.src/M000029.html +33 -0
- data/doc/classes/HostSystem.src/M000030.html +18 -0
- data/doc/classes/ImageFormat.html +415 -0
- data/doc/classes/ImageFormat.src/M000144.html +18 -0
- data/doc/classes/ImageFormat.src/M000145.html +18 -0
- data/doc/classes/ImageFormat.src/M000146.html +18 -0
- data/doc/classes/ImageFormat.src/M000147.html +18 -0
- data/doc/classes/ImageFormat.src/M000148.html +18 -0
- data/doc/classes/ImageFormat.src/M000149.html +22 -0
- data/doc/classes/ImageFormat.src/M000150.html +19 -0
- data/doc/classes/ImageFormat.src/M000151.html +18 -0
- data/doc/classes/ImageFormat.src/M000152.html +18 -0
- data/doc/classes/ImageFormat.src/M000153.html +18 -0
- data/doc/classes/ImageFormat.src/M000154.html +18 -0
- data/doc/classes/ImageFormat.src/M000155.html +18 -0
- data/doc/classes/ImageFormat.src/M000156.html +18 -0
- data/doc/classes/ImageFormat.src/M000157.html +18 -0
- data/doc/classes/ImageFormat.src/M000158.html +20 -0
- data/doc/classes/ImageFormat.src/M000159.html +26 -0
- data/doc/classes/ImageFormat.src/M000160.html +18 -0
- data/doc/classes/ImageSniffing.html +152 -0
- data/doc/classes/ImageSniffing.src/M000051.html +57 -0
- data/doc/classes/ImageSniffing.src/M000052.html +131 -0
- data/doc/classes/IntegerBASIC.html +247 -0
- data/doc/classes/IntegerBASIC.src/M000206.html +20 -0
- data/doc/classes/IntegerBASIC.src/M000207.html +86 -0
- data/doc/classes/MBasic.html +182 -0
- data/doc/classes/MBasic.src/M000011.html +20 -0
- data/doc/classes/MBasic.src/M000012.html +22 -0
- data/doc/classes/NADOLDos.html +187 -0
- data/doc/classes/NADOLDos.src/M000180.html +18 -0
- data/doc/classes/NADOLDos.src/M000181.html +52 -0
- data/doc/classes/NADOLFile.html +157 -0
- data/doc/classes/NADOLFile.src/M000045.html +20 -0
- data/doc/classes/NADOLFile.src/M000046.html +18 -0
- data/doc/classes/NADOLTokens.html +170 -0
- data/doc/classes/NADOLTokens.src/M000018.html +41 -0
- data/doc/classes/NativeFileType.html +444 -0
- data/doc/classes/NativeFileType.src/M000110.html +22 -0
- data/doc/classes/NativeFileType.src/M000111.html +18 -0
- data/doc/classes/NativeFileType.src/M000112.html +18 -0
- data/doc/classes/NativeFileType.src/M000113.html +18 -0
- data/doc/classes/NativeFileType.src/M000114.html +18 -0
- data/doc/classes/NativeFileType.src/M000115.html +18 -0
- data/doc/classes/NativeFileType.src/M000116.html +18 -0
- data/doc/classes/NativeFileType.src/M000117.html +23 -0
- data/doc/classes/NativeFileType.src/M000118.html +18 -0
- data/doc/classes/NativeFileType.src/M000119.html +18 -0
- data/doc/classes/NativeFileType.src/M000120.html +24 -0
- data/doc/classes/NativeFileType.src/M000121.html +35 -0
- data/doc/classes/NativeFileType.src/M000122.html +24 -0
- data/doc/classes/NativeFileType.src/M000123.html +18 -0
- data/doc/classes/NativeFileType.src/M000124.html +18 -0
- data/doc/classes/NativeFileType.src/M000125.html +18 -0
- data/doc/classes/NativeFileType.src/M000126.html +20 -0
- data/doc/classes/NativeFileType.src/M000127.html +27 -0
- data/doc/classes/PNG/Canvas.html +273 -0
- data/doc/classes/PNG/Canvas.src/M000196.html +20 -0
- data/doc/classes/PNG/Canvas.src/M000197.html +20 -0
- data/doc/classes/PNG/Canvas.src/M000198.html +20 -0
- data/doc/classes/PNG/Canvas.src/M000199.html +22 -0
- data/doc/classes/PNG/Canvas.src/M000200.html +18 -0
- data/doc/classes/PNG/Canvas.src/M000201.html +73 -0
- data/doc/classes/PNG/Color.html +338 -0
- data/doc/classes/PNG/Color.src/M000189.html +18 -0
- data/doc/classes/PNG/Color.src/M000190.html +16 -0
- data/doc/classes/PNG/Color.src/M000191.html +16 -0
- data/doc/classes/PNG/Color.src/M000192.html +16 -0
- data/doc/classes/PNG/Color.src/M000193.html +16 -0
- data/doc/classes/PNG/Color.src/M000194.html +21 -0
- data/doc/classes/PNG/Color.src/M000195.html +18 -0
- data/doc/classes/PNG.html +229 -0
- data/doc/classes/PNG.src/M000185.html +18 -0
- data/doc/classes/PNG.src/M000186.html +21 -0
- data/doc/classes/PNG.src/M000187.html +26 -0
- data/doc/classes/PNG.src/M000188.html +26 -0
- data/doc/classes/PascalDos.html +203 -0
- data/doc/classes/PascalDos.src/M000132.html +18 -0
- data/doc/classes/PascalDos.src/M000133.html +21 -0
- data/doc/classes/PascalDos.src/M000134.html +62 -0
- data/doc/classes/PascalFile.html +169 -0
- data/doc/classes/PascalFile.src/M000173.html +20 -0
- data/doc/classes/PascalFile.src/M000174.html +18 -0
- data/doc/classes/ProDos.html +164 -0
- data/doc/classes/ProDos.src/M000102.html +18 -0
- data/doc/classes/ProDos.src/M000103.html +22 -0
- data/doc/classes/ProDosFile.html +187 -0
- data/doc/classes/ProDosFile.src/M000015.html +20 -0
- data/doc/classes/ProDosFile.src/M000016.html +18 -0
- data/doc/classes/ProDosFile.src/M000017.html +19 -0
- data/doc/classes/Proc.html +315 -0
- data/doc/classes/Proc.src/M000053.html +21 -0
- data/doc/classes/Proc.src/M000054.html +19 -0
- data/doc/classes/Proc.src/M000055.html +22 -0
- data/doc/classes/Proc.src/M000056.html +22 -0
- data/doc/classes/Proc.src/M000057.html +22 -0
- data/doc/classes/Proc.src/M000058.html +19 -0
- data/doc/classes/Proc.src/M000059.html +16 -0
- data/doc/classes/Proc.src/M000060.html +20 -0
- data/doc/classes/Proc.src/M000061.html +18 -0
- data/doc/classes/Proc.src/M000062.html +16 -0
- data/doc/classes/Proc.src/M000063.html +16 -0
- data/doc/classes/ProcSource.html +146 -0
- data/doc/classes/ProcSource.src/M000248.html +38 -0
- data/doc/classes/ProcSource.src/M000249.html +109 -0
- data/doc/classes/RDoc.html +135 -0
- data/doc/classes/RDoc.src/M000247.html +40 -0
- data/doc/classes/RawDisk.html +157 -0
- data/doc/classes/RawDisk.src/M000100.html +18 -0
- data/doc/classes/RawDisk.src/M000101.html +18 -0
- data/doc/classes/RipXplore.html +124 -0
- data/doc/classes/RipXploreLog.html +167 -0
- data/doc/classes/RipXploreLog.src/M000139.html +18 -0
- data/doc/classes/RipXploreLog.src/M000140.html +20 -0
- data/doc/classes/RipXploreLog.src/M000141.html +18 -0
- data/doc/classes/ScAsm.html +145 -0
- data/doc/classes/ScAsm.src/M000004.html +45 -0
- data/doc/classes/SubclassTracking.html +138 -0
- data/doc/classes/SubclassTracking.src/M000250.html +23 -0
- data/doc/classes/TestFileCache.html +137 -0
- data/doc/classes/TestFileCache.src/M000184.html +21 -0
- data/doc/classes/Trs80.html +157 -0
- data/doc/classes/Trs80.src/M000043.html +18 -0
- data/doc/classes/Trs80.src/M000044.html +18 -0
- data/doc/classes/Trs80Cmd.html +217 -0
- data/doc/classes/Trs80Cmd.src/M000104.html +19 -0
- data/doc/classes/Trs80Cmd.src/M000105.html +24 -0
- data/doc/classes/Trs80Cmd.src/M000106.html +20 -0
- data/doc/classes/Trs80Cmd.src/M000107.html +35 -0
- data/doc/classes/Trs80Jcl.html +156 -0
- data/doc/classes/Trs80Jcl.src/M000233.html +20 -0
- data/doc/classes/Trs80Jcl.src/M000234.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.html +211 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000064.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000065.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000066.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000067.html +18 -0
- data/doc/classes/Trs80Jv1Dsk.src/M000068.html +19 -0
- data/doc/classes/Trs80LevelIIBasic.html +169 -0
- data/doc/classes/Trs80LevelIIBasic.src/M000079.html +20 -0
- data/doc/classes/Trs80LevelIIBasic.src/M000080.html +43 -0
- data/doc/classes/Trs80PascalSource.html +156 -0
- data/doc/classes/Trs80PascalSource.src/M000202.html +20 -0
- data/doc/classes/Trs80PascalSource.src/M000203.html +30 -0
- data/doc/classes/TrsDos.html +255 -0
- data/doc/classes/TrsDos.src/M000031.html +18 -0
- data/doc/classes/TrsDos.src/M000032.html +18 -0
- data/doc/classes/TrsDos.src/M000033.html +18 -0
- data/doc/classes/TrsDos.src/M000034.html +62 -0
- data/doc/created.rid +1 -0
- data/doc/files/bin/ripxplore_rb.html +150 -0
- data/doc/files/lib/DumpUtilities_rb.html +101 -0
- data/doc/files/lib/FileCache_rb.html +110 -0
- data/doc/files/lib/FileContainer_rb.html +101 -0
- data/doc/files/lib/FileSystemImage_rb.html +109 -0
- data/doc/files/lib/FileSystem_rb.html +111 -0
- data/doc/files/lib/HostSystem_rb.html +110 -0
- data/doc/files/lib/ImageFormat_rb.html +111 -0
- data/doc/files/lib/NativeFileType_rb.html +111 -0
- data/doc/files/lib/PatchedPNG_rb.html +116 -0
- data/doc/files/lib/RipXploreLog_rb.html +108 -0
- data/doc/files/lib/RipXplore_rb.html +114 -0
- data/doc/files/lib/SubclassTracking_rb.html +108 -0
- data/doc/files/lib/disassemblers/D65_rb.html +101 -0
- data/doc/files/lib/file_systems/AppleCPM_rb.html +108 -0
- data/doc/files/lib/file_systems/AppleDos_rb.html +108 -0
- data/doc/files/lib/file_systems/AtariDos_rb.html +108 -0
- data/doc/files/lib/file_systems/CbmDos_rb.html +108 -0
- data/doc/files/lib/file_systems/NADOLDos_rb.html +108 -0
- data/doc/files/lib/file_systems/PascalDos_rb.html +108 -0
- data/doc/files/lib/file_systems/ProDos_rb.html +108 -0
- data/doc/files/lib/file_systems/RawDisk_rb.html +108 -0
- data/doc/files/lib/file_systems/TrsDos_rb.html +108 -0
- data/doc/files/lib/host_systems/Apple2_rb.html +109 -0
- data/doc/files/lib/host_systems/Atari800_rb.html +109 -0
- data/doc/files/lib/host_systems/C64_rb.html +109 -0
- data/doc/files/lib/host_systems/Trs80_rb.html +108 -0
- data/doc/files/lib/image_formats/A2Dsk_rb.html +108 -0
- data/doc/files/lib/image_formats/Atr_rb.html +108 -0
- data/doc/files/lib/image_formats/D64_rb.html +108 -0
- data/doc/files/lib/image_formats/G64_rb.html +108 -0
- data/doc/files/lib/image_formats/Trs80Jv1Dsk_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/AppleBinary_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/AppleHiResPic_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/AppleText_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/AppleWorksWP_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/Applesoft_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/IntegerBASIC_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/NADOLFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/PascalFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/ProDosFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/apple2/ScAsm_rb.html +101 -0
- data/doc/files/lib/native_file_types/atari800/AtariBasic_rb.html +108 -0
- data/doc/files/lib/native_file_types/atari800/AtariBinary_rb.html +108 -0
- data/doc/files/lib/native_file_types/atari800/AtariText_rb.html +108 -0
- data/doc/files/lib/native_file_types/c64/C64BasicPrg_rb.html +109 -0
- data/doc/files/lib/native_file_types/c64/C64PrgText_rb.html +109 -0
- data/doc/files/lib/native_file_types/c64/C64Prg_rb.html +109 -0
- data/doc/files/lib/native_file_types/c64/C64Seq_rb.html +109 -0
- data/doc/files/lib/native_file_types/c64/CbmFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/cpm/CPMFile_rb.html +108 -0
- data/doc/files/lib/native_file_types/cpm/MBasic_rb.html +108 -0
- data/doc/files/lib/native_file_types/generic/GenericFile_rb.html +101 -0
- data/doc/files/lib/native_file_types/trs80/Trs80Cmd_rb.html +108 -0
- data/doc/files/lib/native_file_types/trs80/Trs80Jcl_rb.html +108 -0
- data/doc/files/lib/native_file_types/trs80/Trs80LevelIIBasic_rb.html +108 -0
- data/doc/files/lib/native_file_types/trs80/Trs80PascalSource_rb.html +108 -0
- data/doc/files/lib/proc_source_rb.html +182 -0
- data/doc/files/lib/proc_source_rb.src/M000001.html +24 -0
- data/doc/files/lib/rdoc_patch_rb.html +108 -0
- data/doc/files/test/tc_file_cache_rb.html +108 -0
- data/doc/files/test/tc_image_sniffing_rb.html +108 -0
- data/doc/files/test/testhelper_rb.html +129 -0
- data/doc/files/test/ts_test_all_rb.html +108 -0
- data/doc/fr_class_index.html +26 -0
- data/doc/fr_file_index.html +27 -0
- data/doc/fr_method_index.html +26 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/DumpUtilities.rb +34 -0
- data/lib/FileCache.rb +84 -0
- data/lib/FileContainer.rb +45 -0
- data/lib/FileSystem.rb +83 -0
- data/lib/FileSystemImage.rb +176 -0
- data/lib/HostSystem.rb +84 -0
- data/lib/ImageFormat.rb +127 -0
- data/lib/NativeFileType.rb +168 -0
- data/lib/PatchedPNG.rb +303 -0
- data/lib/RipXplore.rb +77 -0
- data/lib/RipXploreLog.rb +63 -0
- data/lib/SubclassTracking.rb +11 -0
- data/lib/disassemblers/D65.rb +181 -0
- data/lib/file_systems/AppleCPM.rb +123 -0
- data/lib/file_systems/AppleDos.rb +211 -0
- data/lib/file_systems/AtariDos.rb +80 -0
- data/lib/file_systems/CbmDos.rb +75 -0
- data/lib/file_systems/NADOLDos.rb +110 -0
- data/lib/file_systems/PascalDos.rb +131 -0
- data/lib/file_systems/ProDos.rb +155 -0
- data/lib/file_systems/RawDisk.rb +45 -0
- data/lib/file_systems/TrsDos.rb +148 -0
- data/lib/host_systems/Apple2.rb +57 -0
- data/lib/host_systems/Atari800.rb +57 -0
- data/lib/host_systems/C64.rb +82 -0
- data/lib/host_systems/Trs80.rb +48 -0
- data/lib/host_systems/a2_symbols.yaml +199 -0
- data/lib/host_systems/atari_800_symbols.yaml +496 -0
- data/lib/host_systems/c64_symbols.yaml +636 -0
- data/lib/image_formats/A2Dsk.rb +77 -0
- data/lib/image_formats/Atr.rb +83 -0
- data/lib/image_formats/D64.rb +87 -0
- data/lib/image_formats/G64.rb +174 -0
- data/lib/image_formats/Trs80Jv1Dsk.rb +65 -0
- data/lib/native_file_types/apple2/AppleBinary.rb +51 -0
- data/lib/native_file_types/apple2/AppleHiResPic.rb +166 -0
- data/lib/native_file_types/apple2/AppleText.rb +43 -0
- data/lib/native_file_types/apple2/AppleWorksWP.rb +68 -0
- data/lib/native_file_types/apple2/Applesoft.rb +115 -0
- data/lib/native_file_types/apple2/IntegerBASIC.rb +217 -0
- data/lib/native_file_types/apple2/NADOLFile.rb +205 -0
- data/lib/native_file_types/apple2/PascalFile.rb +48 -0
- data/lib/native_file_types/apple2/ProDosFile.rb +112 -0
- data/lib/native_file_types/apple2/ScAsm.rb +110 -0
- data/lib/native_file_types/atari800/AtariBasic.rb +396 -0
- data/lib/native_file_types/atari800/AtariBinary.rb +53 -0
- data/lib/native_file_types/atari800/AtariText.rb +49 -0
- data/lib/native_file_types/c64/C64BasicPrg.rb +333 -0
- data/lib/native_file_types/c64/C64Prg.rb +57 -0
- data/lib/native_file_types/c64/C64PrgText.rb +45 -0
- data/lib/native_file_types/c64/C64Seq.rb +47 -0
- data/lib/native_file_types/c64/CbmFile.rb +41 -0
- data/lib/native_file_types/cpm/CPMFile.rb +40 -0
- data/lib/native_file_types/cpm/MBasic.rb +311 -0
- data/lib/native_file_types/generic/GenericFile.rb +43 -0
- data/lib/native_file_types/trs80/Trs80Cmd.rb +130 -0
- data/lib/native_file_types/trs80/Trs80Jcl.rb +43 -0
- data/lib/native_file_types/trs80/Trs80LevelIIBasic.rb +201 -0
- data/lib/native_file_types/trs80/Trs80PascalSource.rb +58 -0
- data/lib/proc_source.rb +238 -0
- data/lib/rdoc_patch.rb +32 -0
- data/test/tc_file_cache.rb +11 -0
- data/test/tc_image_sniffing.rb +165 -0
- data/test/testhelper.rb +14 -0
- data/test/testlog.txt +30755 -0
- data/test/ts_test_all.rb +3 -0
- 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.
|
data/lib/ImageFormat.rb
ADDED
@@ -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
|
+
|