Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/PIL/SgiImagePlugin.py
diff options
context:
space:
mode:
Diffstat (limited to 'PIL/SgiImagePlugin.py')
-rw-r--r--PIL/SgiImagePlugin.py91
1 files changed, 91 insertions, 0 deletions
diff --git a/PIL/SgiImagePlugin.py b/PIL/SgiImagePlugin.py
new file mode 100644
index 0000000..0ab741e
--- /dev/null
+++ b/PIL/SgiImagePlugin.py
@@ -0,0 +1,91 @@
+#
+# The Python Imaging Library.
+# $Id: SgiImagePlugin.py 2134 2004-10-06 08:55:20Z fredrik $
+#
+# SGI image file handling
+#
+# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli.
+# <ftp://ftp.sgi.com/graphics/SGIIMAGESPEC>
+#
+# History:
+# 1995-09-10 fl Created
+#
+# Copyright (c) Secret Labs AB 1997.
+# Copyright (c) Fredrik Lundh 1995.
+#
+# See the README file for information on usage and redistribution.
+#
+
+
+__version__ = "0.1"
+
+
+import string
+import Image, ImageFile
+
+
+def i16(c):
+ return ord(c[1]) + (ord(c[0])<<8)
+
+def i32(c):
+ return ord(c[3]) + (ord(c[2])<<8) + (ord(c[1])<<16) + (ord(c[0])<<24)
+
+
+def _accept(prefix):
+ return i16(prefix) == 474
+
+##
+# Image plugin for SGI images.
+
+class SgiImageFile(ImageFile.ImageFile):
+
+ format = "SGI"
+ format_description = "SGI Image File Format"
+
+ def _open(self):
+
+ # HEAD
+ s = self.fp.read(512)
+ if i16(s) != 474:
+ raise SyntaxError, "not an SGI image file"
+
+ # relevant header entries
+ compression = ord(s[2])
+
+ # bytes, dimension, zsize
+ layout = ord(s[3]), i16(s[4:]), i16(s[10:])
+
+ # determine mode from bytes/zsize
+ if layout == (1, 2, 1):
+ self.mode = "L"
+ elif layout == (1, 3, 3):
+ self.mode = "RGB"
+ else:
+ raise SyntaxError, "unsupported SGI image mode"
+
+ # size
+ self.size = i16(s[6:]), i16(s[8:])
+
+ # decoder info
+ if compression == 0:
+ if self.mode == "RGB":
+ # RGB images are band interleaved
+ size = self.size[0]*self.size[1]
+ self.tile = [("raw", (0,0)+self.size, 512, ("R",0,1)),
+ ("raw", (0,0)+self.size, 512+size, ("G",0,1)),
+ ("raw", (0,0)+self.size, 512+2*size, ("B",0,1))]
+ else:
+ self.tile = [("raw", (0,0)+self.size, 512, (self.mode, 0, 1))]
+ if compression == 1:
+ self.tile = [("sgi_rle", (0,0)+self.size, 512, (self.mode, 0, 1))]
+
+#
+# registry
+
+Image.register_open("SGI", SgiImageFile, _accept)
+
+Image.register_extension("SGI", ".bw")
+Image.register_extension("SGI", ".rgb")
+Image.register_extension("SGI", ".rgba")
+
+Image.register_extension("SGI", ".sgi") # really?