# 
 | 
# The Python Imaging Library. 
 | 
# $Id$ 
 | 
# 
 | 
# DCX file handling 
 | 
# 
 | 
# DCX is a container file format defined by Intel, commonly used 
 | 
# for fax applications.  Each DCX file consists of a directory 
 | 
# (a list of file offsets) followed by a set of (usually 1-bit) 
 | 
# PCX files. 
 | 
# 
 | 
# History: 
 | 
# 1995-09-09 fl   Created 
 | 
# 1996-03-20 fl   Properly derived from PcxImageFile. 
 | 
# 1998-07-15 fl   Renamed offset attribute to avoid name clash 
 | 
# 2002-07-30 fl   Fixed file handling 
 | 
# 
 | 
# Copyright (c) 1997-98 by Secret Labs AB. 
 | 
# Copyright (c) 1995-96 by Fredrik Lundh. 
 | 
# 
 | 
# See the README file for information on usage and redistribution. 
 | 
# 
 | 
  
 | 
__version__ = "0.2" 
 | 
  
 | 
import Image 
 | 
  
 | 
from PcxImagePlugin import PcxImageFile 
 | 
  
 | 
MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? 
 | 
  
 | 
def i32(c): 
 | 
    return ord(c[0]) + (ord(c[1])<<8) + (ord(c[2])<<16) + (ord(c[3])<<24) 
 | 
  
 | 
def _accept(prefix): 
 | 
    return i32(prefix) == MAGIC 
 | 
  
 | 
## 
 | 
# Image plugin for the Intel DCX format. 
 | 
  
 | 
class DcxImageFile(PcxImageFile): 
 | 
  
 | 
    format = "DCX" 
 | 
    format_description = "Intel DCX" 
 | 
  
 | 
    def _open(self): 
 | 
  
 | 
        # Header 
 | 
        s = self.fp.read(4) 
 | 
        if i32(s) != MAGIC: 
 | 
            raise SyntaxError, "not a DCX file" 
 | 
  
 | 
        # Component directory 
 | 
        self._offset = [] 
 | 
        for i in range(1024): 
 | 
            offset = i32(self.fp.read(4)) 
 | 
            if not offset: 
 | 
                break 
 | 
            self._offset.append(offset) 
 | 
  
 | 
        self.__fp = self.fp 
 | 
        self.seek(0) 
 | 
  
 | 
    def seek(self, frame): 
 | 
        if frame >= len(self._offset): 
 | 
            raise EOFError("attempt to seek outside DCX directory") 
 | 
        self.frame = frame 
 | 
        self.fp = self.__fp 
 | 
        self.fp.seek(self._offset[frame]) 
 | 
        PcxImageFile._open(self) 
 | 
  
 | 
    def tell(self): 
 | 
        return self.frame 
 | 
  
 | 
  
 | 
Image.register_open("DCX", DcxImageFile, _accept) 
 | 
  
 | 
Image.register_extension("DCX", ".dcx") 
 |