| # | 
| # The Python Imaging Library. | 
| # $Id$ | 
| # | 
| # 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) 2008 by Karsten Hiddemann. | 
| # Copyright (c) 1997 by Secret Labs AB. | 
| # Copyright (c) 1995 by Fredrik Lundh. | 
| # | 
| # See the README file for information on usage and redistribution. | 
| # | 
|   | 
|   | 
| __version__ = "0.2" | 
|   | 
|   | 
| 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) or layout == (1, 1, 1): | 
|             self.mode = "L" | 
|         elif layout == (1, 3, 3): | 
|             self.mode = "RGB" | 
|         elif layout == (1, 3, 4): | 
|             self.mode = "RGBA" | 
|         else: | 
|             raise SyntaxError("unsupported SGI image mode") | 
|   | 
|         # size | 
|         self.size = i16(s[6:]), i16(s[8:]) | 
|   | 
|   | 
|         # decoder info | 
|         if compression == 0: | 
|             offset = 512 | 
|             pagesize = self.size[0]*self.size[1]*layout[0] | 
|             self.tile = [] | 
|             for layer in self.mode: | 
|                 self.tile.append(("raw", (0,0)+self.size, offset, (layer,0,-1))) | 
|                 offset = offset + pagesize | 
|         elif 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? |