[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