[3662b5]: infinity / formats / plt.py  Maximize  Restore  History

Download this file

127 lines (95 with data), 3.8 kB

  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
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# -*-python-*-
# ie_shell.py - Simple shell for Infinity Engine-based game files
# Copyright (C) 2004 by Jaroslav Benkovsky, <edheldil@users.sf.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# XXConforming to IESDP 4.2.2009
import struct
import sys
from infinity.format import Format, register_format
from infinity.image import Image
class PLT_Format (Format, Image):
header_desc = (
{ 'key': 'signature',
'type': 'STR4',
'off': 0x0000,
'label': 'Signature' },
{ 'key': 'version',
'type': 'STR4',
'off':0x0004,
'label': 'Version'},
{ 'key': 'unknown_08',
'type': 'WORD',
'off': 0x0008,
'label': 'Unknown 08' },
{ 'key': 'unknown_0A',
'type': 'WORD',
'off': 0x000A,
'label': 'Unknown 0A' },
{ 'key': 'unknown_0C',
'type': 'WORD',
'off': 0x000C,
'label': 'Unknown 0C' },
{ 'key': 'unknown_0E',
'type': 'WORD',
'off': 0x000E,
'label': 'Unknown 0E' },
{ 'key': 'width',
'type': 'DWORD',
'off': 0x0010,
'label': 'Width' },
{ 'key': 'height',
'type': 'DWORD',
'off': 0x0014,
'label': 'Height' },
)
def __init__ (self):
Format.__init__ (self)
Image.__init__ (self)
self.expect_signature = 'PLT'
self.palettes = None
def read (self, stream):
self.read_header (stream)
size = self.header['width'] * self.header['height']
self.raw_pixels = stream.read_blob (0x0018, size * 2)
self.decode()
def decode (self):
size = self.header['width'] * self.header['height']
data = [ '\0\0\0\0' ] * size
pixels = self.raw_pixels
for i in range (size):
intensity = ord (pixels[2*i])
palindex = ord (pixels[2*i+1])
a = (255, 0)[intensity == 255]
# FIXME: shadows have full alpha
if self.palettes:
(r, g, b) = self.palettes[palindex][intensity]
pix = '%c%c%c%c' %(r, g, b, a)
else:
pix = '%c%c%c%c' %(intensity, intensity, intensity, a)
x = i % self.header['width']
y = self.header['height'] - i / self.header['width'] -1
data[y * self.header['width'] + x] = pix
self.pixels = ''.join (data)
def write (self, stream):
self.write_header (stream)
size = self.header['width'] * self.header['height']
stream.write_blob (self.raw_pixels, 0x0018, size * 2)
def printme (self):
self.print_header ()
if self.get_option ('format.plt.print_bitmap'):
self.print_bitmap ()
print()
register_format ('PLT', 'V1', PLT_Format)