[Scummvm-git-logs] scummvm master -> 41e823ebab005e182e6d20fd0a14e8954bfcb571
sev-
noreply at scummvm.org
Mon Jul 11 16:12:52 UTC 2022
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
41e823ebab DEVTOOLS: Use Python for extracting classic mac fonts
Commit: 41e823ebab005e182e6d20fd0a14e8954bfcb571
https://github.com/scummvm/scummvm/commit/41e823ebab005e182e6d20fd0a14e8954bfcb571
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2022-07-11T18:12:06+02:00
Commit Message:
DEVTOOLS: Use Python for extracting classic mac fonts
Changed paths:
A devtools/decompress-diskcopy-image.py
devtools/create_classicmacfonts.sh
diff --git a/devtools/create_classicmacfonts.sh b/devtools/create_classicmacfonts.sh
index b2b1aeb61bf..32b47cc893c 100755
--- a/devtools/create_classicmacfonts.sh
+++ b/devtools/create_classicmacfonts.sh
@@ -35,30 +35,33 @@ fi
echo done
-echo_n "Mounting System 7.0.1 image..."
+echo_n "Decompressing System 7.0.1 image..."
macbinary decode System_7.0.1.smi.bin
-hdiutil convert -quiet System\ 7.0.1.smi -format UDRO -o sys7.dmg
rm System_7.0.1.smi.bin
-hdiutil attach -quiet sys7.dmg
+./decompress-diskcopy-image.py System\ 7.0.1.smi sys.img
-if test ! -f /Volumes/7.0.1\ \(1440k.images\)/Fonts.image; then
- echo "Failed to attach sys7.dmg"
- exit
-fi
+echo done
+
+echo "Dumping floppy images..."
+
+./dumper-companion.py iso sys.img .
+
+echo Done
+
+echo_n "Cutting Fonts.image..."
+mv Fonts.image Fonts.image.bin
+macbinary decode Fonts.image.bin
+
+tail -c +85 Fonts.image | head -c 1474048 >Fonts1.image
echo done
-echo_n "Mounting Fonts disk image..."
+echo "Extracting fonts..."
-hdiutil convert -quiet /Volumes/7.0.1\ \(1440k.images\)/Fonts.image -format UDRO -o fonts.dmg
-hdiutil detach -quiet `hdiutil info|grep "/Volumes/7.0.1 (1440k.images)"|cut -f 1`
-hdiutil attach -quiet fonts.dmg
+./dumper-companion.py iso Fonts1.image .
-if test ! -f /Volumes/Fonts/Chicago; then
- echo "Failed to attach fonts.dmg"
- exit
-fi
+rm Fonts.image.bin
echo done
@@ -66,21 +69,18 @@ echo_n "Copying fonts..."
for i in Athens Cairo Chicago Courier Geneva Helvetica London "Los Angeles" Monaco "New York" Palatino "San Francisco" Symbol Times Venice
do
- echo $i
- macbinary encode "/Volumes/Fonts/$i" -o "$i.bin" -n
+ mv "$i" "$i.bin"
done
-echo ...Done
-
-hdiutil detach -quiet `hdiutil info|grep "/Volumes/Fonts"|cut -f 1`
+echo ...done
zip -9 classicmacfonts *.bin
mv classicmacfonts.zip classicmacfonts.dat
echo_n "Cleaning up..."
rm *.bin
-rm *.dmg
rm *.smi
+rm *.image
echo done
ls -l classicmacfonts.dat
diff --git a/devtools/decompress-diskcopy-image.py b/devtools/decompress-diskcopy-image.py
new file mode 100755
index 00000000000..ea9261f8f02
--- /dev/null
+++ b/devtools/decompress-diskcopy-image.py
@@ -0,0 +1,166 @@
+#!/usr/bin/env python3
+import sys
+import itertools
+import io
+
+hfs_block_size = 512
+window_size = 65536
+
+class DecompressionError(Exception):
+ pass
+
+def block_copy(dest, dest_offset, src, src_offset, size):
+ if size == 0:
+ return
+ dest[dest_offset:dest_offset+size] = src[src_offset:src_offset+size]
+
+
+# Inserts bytes into sliding window ring buffer, returns new window position
+def insert_sl(sl, sl_pos, bytes_to_insert, insert_src_offset, size):
+ available = window_size - sl_pos
+ if available < size:
+ block_copy(sl, sl_pos, bytes_to_insert, insert_src_offset, available)
+ sl_pos = 0
+ sl_pos = insert_sl(sl, sl_pos, bytes_to_insert, insert_src_offset + available, size - available)
+ else:
+ block_copy(sl, sl_pos, bytes_to_insert, insert_src_offset, size)
+ sl_pos = sl_pos + size
+
+ return sl_pos
+
+# Reads bytes from sliding window ring buffer
+def read_sl(sl, sl_pos, out_buf, out_buf_pos, size):
+ available = window_size - sl_pos
+ if available < size:
+ block_copy(out_buf, out_buf_pos, sl, sl_pos, available)
+ read_sl(sl, 0, out_buf, out_buf_pos + available, size - available)
+ else:
+ block_copy(out_buf, out_buf_pos, sl, sl_pos, size)
+
+def read_lz(sl, sl_pos, out_buf, out_buf_pos, coded_offset, length):
+ actual_offset = coded_offset + 1
+
+ read_pos = (sl_pos + window_size - actual_offset) % window_size;
+
+ while actual_offset < length:
+ # Repeating sequence
+ read_sl(sl, read_pos, out_buf, out_buf_pos, actual_offset)
+ out_buf_pos += actual_offset
+ length -= actual_offset
+
+ # Copy
+ read_sl(sl, read_pos, out_buf, out_buf_pos, length)
+
+def decompress(in_f, out_f, compressed_data_size):
+ sl = bytearray(window_size)
+ lz_bytes = bytearray(128)
+ sl_pos = 0
+ chunk_size = 0
+ output_data = 0
+
+ while compressed_data_size > 0:
+ code_byte_0 = in_f.read(1)[0]
+
+ compressed_data_size -= 1
+
+ if (code_byte_0 & 0x80):
+ # Literal
+ chunk_size = (code_byte_0 & 0x7f) + 1
+
+ if chunk_size > compressed_data_size:
+ raise DecompressionError()
+
+ output_data = in_f.read(chunk_size)
+
+ compressed_data_size -= chunk_size
+ elif (code_byte_0 & 0x40):
+ # Large offset
+ if compressed_data_size < 2:
+ raise DecompressionError()
+
+ code_bytes_12 = in_f.read(2)
+
+ compressed_data_size -= 2
+
+ chunk_size = (code_byte_0 & 0x3f) + 4
+ coded_offset = (code_bytes_12[0] << 8) + code_bytes_12[1]
+
+ read_lz(sl, sl_pos, lz_bytes, 0, coded_offset, chunk_size)
+ output_data = lz_bytes
+ else:
+ # Small offset
+ if compressed_data_size < 1:
+ raise DecompressionError()
+
+ code_byte_1 = in_f.read(1)[0]
+
+ compressed_data_size -= 1
+
+ chunk_size = ((code_byte_0 & 0x3c) >> 2) + 3
+ coded_offset = ((code_byte_0 & 0x3) << 8) + code_byte_1
+
+ read_lz(sl, sl_pos, lz_bytes, 0, coded_offset, chunk_size)
+ output_data = lz_bytes
+
+ out_f.write(output_data[0:chunk_size])
+ new_offset = out_f.tell()
+
+ sl_pos = insert_sl(sl, sl_pos, output_data, 0, chunk_size)
+
+def bulk_copy(in_f, out_f, amount):
+ chunk_size = 4096
+ while (amount > 0):
+ block_amount = chunk_size
+ if (block_amount > amount):
+ block_amount = amount
+
+ block = in_f.read(block_amount)
+ out_f.write(block)
+
+ amount -= block_amount
+
+
+
+def main(argv):
+ if (len(argv) != 3):
+ print("decompress-image.py: Converts an ADC-compressed Disk Copy 6 image to an uncompressed image")
+ print("Usage: decompress-image.py <input> <output>")
+ return -1
+
+ in_f = io.open(argv[1], "rb")
+
+ in_f.seek(-hfs_block_size, 2)
+
+ alt_mdb_loc = in_f.tell()
+
+ block_buffer = in_f.read(hfs_block_size)
+
+ if (block_buffer[0] != 66 or block_buffer[1] != 68):
+ print("The specified file doesn't look like a disk image")
+ return -1
+
+ num_allocation_blocks = (block_buffer[18] << 8) + block_buffer[19]
+ allocation_block_size = (block_buffer[20] << 24) + (block_buffer[21] << 16) + (block_buffer[22] << 8) + block_buffer[23]
+ first_allocation_block = (block_buffer[28] << 8) + block_buffer[29]
+
+ compressed_data_start = first_allocation_block * allocation_block_size
+ compressed_data_end = alt_mdb_loc # ???
+
+ in_f.seek(0)
+
+ out_f = io.open(argv[2], "wb")
+
+ bulk_copy(in_f, out_f, compressed_data_start)
+
+ compressed_amount = compressed_data_end - compressed_data_start
+
+ decompress(in_f, out_f, compressed_amount)
+
+ in_f.seek(alt_mdb_loc)
+ bulk_copy(in_f, out_f, hfs_block_size)
+
+ in_f.close()
+ out_f.close()
+
+
+main(sys.argv)
More information about the Scummvm-git-logs
mailing list