1#
2# The Python Imaging Library.
3# $Id$
4#
5# DCX file handling
6#
7# DCX is a container file format defined by Intel, commonly used
8# for fax applications. Each DCX file consists of a directory
9# (a list of file offsets) followed by a set of (usually 1-bit)
10# PCX files.
11#
12# History:
13# 1995-09-09 fl Created
14# 1996-03-20 fl Properly derived from PcxImageFile.
15# 1998-07-15 fl Renamed offset attribute to avoid name clash
16# 2002-07-30 fl Fixed file handling
17#
18# Copyright (c) 1997-98 by Secret Labs AB.
19# Copyright (c) 1995-96 by Fredrik Lundh.
20#
21# See the README file for information on usage and redistribution.
22#
23from __future__ import annotations
24
25from . import Image
26from ._binary import i32le as i32
27from .PcxImagePlugin import PcxImageFile
28
29MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then?
30
31
32def _accept(prefix: bytes) -> bool:
33 return len(prefix) >= 4 and i32(prefix) == MAGIC
34
35
36##
37# Image plugin for the Intel DCX format.
38
39
40class DcxImageFile(PcxImageFile):
41 format = "DCX"
42 format_description = "Intel DCX"
43 _close_exclusive_fp_after_loading = False
44
45 def _open(self) -> None:
46 # Header
47 s = self.fp.read(4)
48 if not _accept(s):
49 msg = "not a DCX file"
50 raise SyntaxError(msg)
51
52 # Component directory
53 self._offset = []
54 for i in range(1024):
55 offset = i32(self.fp.read(4))
56 if not offset:
57 break
58 self._offset.append(offset)
59
60 self._fp = self.fp
61 self.frame = -1
62 self.n_frames = len(self._offset)
63 self.is_animated = self.n_frames > 1
64 self.seek(0)
65
66 def seek(self, frame: int) -> None:
67 if not self._seek_check(frame):
68 return
69 self.frame = frame
70 self.fp = self._fp
71 self.fp.seek(self._offset[frame])
72 PcxImageFile._open(self)
73
74 def tell(self) -> int:
75 return self.frame
76
77
78Image.register_open(DcxImageFile.format, DcxImageFile, _accept)
79
80Image.register_extension(DcxImageFile.format, ".dcx")