/usr/share/quickly/templates/ubuntu-flash-game/internal/SWF.py is in quickly-ubuntu-template 12.08.1-0ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | import struct, zlib
class SWFNotASWF(Exception): pass
class SWFNoDimensions(Exception): pass
def parse(input):
"""Parses the header information from an SWF file.
Code from http://pypi.python.org/pypi/hexagonit.swfheader, GPL licenced."""
if hasattr(input, 'read'):
input.seek(0)
else:
input = open(input, 'rb')
def read_ui8(c):
return struct.unpack('<B', c)[0]
def read_ui16(c):
return struct.unpack('<H', c)[0]
def read_ui32(c):
return struct.unpack('<I', c)[0]
header = {}
# Read the 3-byte signature field
signature = ''.join(struct.unpack('<3c', input.read(3)))
if signature not in ('FWS', 'CWS'):
raise ValueError('Invalid SWF signature: %s' % signature)
# Compression
header['compressed'] = signature.startswith('C')
# Version
header['version'] = read_ui8(input.read(1))
# File size (stored as a 32-bit integer)
header['size'] = read_ui32(input.read(4))
# Payload
buffer = input.read(header['size'])
if header['compressed']:
# Unpack the zlib compression
buffer = zlib.decompress(buffer)
# Containing rectangle (struct RECT)
# The number of bits used to store the each of the RECT values are
# stored in first five bits of the first byte.
nbits = read_ui8(buffer[0]) >> 3
current_byte, buffer = read_ui8(buffer[0]), buffer[1:]
bit_cursor = 5
for item in 'xmin', 'xmax', 'ymin', 'ymax':
value = 0
for value_bit in range(nbits-1, -1, -1): # == reversed(range(nbits))
if (current_byte << bit_cursor) & 0x80:
value |= 1 << value_bit
# Advance the bit cursor to the next bit
bit_cursor += 1
if bit_cursor > 7:
# We've exhausted the current byte, consume the next one
# from the buffer.
current_byte, buffer = read_ui8(buffer[0]), buffer[1:]
bit_cursor = 0
# Convert value from TWIPS to a pixel value
header[item] = value / 20
header['width'] = header['xmax'] - header['xmin']
header['height'] = header['ymax'] - header['ymin']
header['frames'] = read_ui16(buffer[0:2])
header['fps'] = read_ui16(buffer[2:4])
input.close()
return header
def dimensions(swf):
"""Read the dimensions of a SWF, as per the Adobe spec.
Spec downloaded from http://www.adobe.com/devnet/swf.html."""
try:
details = parse(swf)
except:
raise SWFNotASWF
try:
return (details["width"], details["height"])
except:
raise SWFNoDimensions
|