mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-11-04 09:57:43 +03:00 
			
		
		
		
	Added WalImageFile class
This commit is contained in:
		
							parent
							
								
									696b82e440
								
							
						
					
					
						commit
						a9fccfada1
					
				
							
								
								
									
										
											BIN
										
									
								
								Tests/images/hopper_wal.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Tests/images/hopper_wal.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 6.3 KiB  | 
| 
						 | 
					@ -1,15 +1,21 @@
 | 
				
			||||||
from PIL import WalImageFile
 | 
					from PIL import WalImageFile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from .helper import assert_image_equal_tofile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_open():
 | 
					def test_open():
 | 
				
			||||||
    # Arrange
 | 
					    # Arrange
 | 
				
			||||||
    TEST_FILE = "Tests/images/hopper.wal"
 | 
					    TEST_FILE = "Tests/images/hopper.wal"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Act
 | 
					    # Act
 | 
				
			||||||
    im = WalImageFile.open(TEST_FILE)
 | 
					    with WalImageFile.open(TEST_FILE) as im:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Assert
 | 
					        # Assert
 | 
				
			||||||
        assert im.format == "WAL"
 | 
					        assert im.format == "WAL"
 | 
				
			||||||
        assert im.format_description == "Quake2 Texture"
 | 
					        assert im.format_description == "Quake2 Texture"
 | 
				
			||||||
        assert im.mode == "P"
 | 
					        assert im.mode == "P"
 | 
				
			||||||
        assert im.size == (128, 128)
 | 
					        assert im.size == (128, 128)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert isinstance(im, WalImageFile.WalImageFile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_image_equal_tofile(im, "Tests/images/hopper_wal.png")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,12 +23,44 @@ and has been tested with a few sample files found using google.
 | 
				
			||||||
    To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead.
 | 
					    To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead.
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import builtins
 | 
					from . import Image, ImageFile
 | 
				
			||||||
 | 
					 | 
				
			||||||
from . import Image
 | 
					 | 
				
			||||||
from ._binary import i32le as i32
 | 
					from ._binary import i32le as i32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class WalImageFile(ImageFile.ImageFile):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    format = "WAL"
 | 
				
			||||||
 | 
					    format_description = "Quake2 Texture"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _open(self):
 | 
				
			||||||
 | 
					        self.mode = "P"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # read header fields
 | 
				
			||||||
 | 
					        header = self.fp.read(32 + 24 + 32 + 12)
 | 
				
			||||||
 | 
					        self._size = i32(header, 32), i32(header, 36)
 | 
				
			||||||
 | 
					        Image._decompression_bomb_check(self.size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # load pixel data
 | 
				
			||||||
 | 
					        offset = i32(header, 40)
 | 
				
			||||||
 | 
					        self.fp.seek(offset)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # strings are null-terminated
 | 
				
			||||||
 | 
					        self.info["name"] = header[:32].split(b"\0", 1)[0]
 | 
				
			||||||
 | 
					        next_name = header[56 : 56 + 32].split(b"\0", 1)[0]
 | 
				
			||||||
 | 
					        if next_name:
 | 
				
			||||||
 | 
					            self.info["next_name"] = next_name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def load(self):
 | 
				
			||||||
 | 
					        if self.im:
 | 
				
			||||||
 | 
					            # Already loaded
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.im = Image.core.new(self.mode, self.size)
 | 
				
			||||||
 | 
					        self.frombytes(self.fp.read(self.size[0] * self.size[1]))
 | 
				
			||||||
 | 
					        self.putpalette(quake2palette)
 | 
				
			||||||
 | 
					        Image.Image.load(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def open(filename):
 | 
					def open(filename):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    Load texture from a Quake2 WAL texture file.
 | 
					    Load texture from a Quake2 WAL texture file.
 | 
				
			||||||
| 
						 | 
					@ -39,38 +71,7 @@ def open(filename):
 | 
				
			||||||
    :param filename: WAL file name, or an opened file handle.
 | 
					    :param filename: WAL file name, or an opened file handle.
 | 
				
			||||||
    :returns: An image instance.
 | 
					    :returns: An image instance.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    # FIXME: modify to return a WalImageFile instance instead of
 | 
					    return WalImageFile(filename)
 | 
				
			||||||
    # plain Image object ?
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def imopen(fp):
 | 
					 | 
				
			||||||
        # read header fields
 | 
					 | 
				
			||||||
        header = fp.read(32 + 24 + 32 + 12)
 | 
					 | 
				
			||||||
        size = i32(header, 32), i32(header, 36)
 | 
					 | 
				
			||||||
        offset = i32(header, 40)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # load pixel data
 | 
					 | 
				
			||||||
        fp.seek(offset)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Image._decompression_bomb_check(size)
 | 
					 | 
				
			||||||
        im = Image.frombytes("P", size, fp.read(size[0] * size[1]))
 | 
					 | 
				
			||||||
        im.putpalette(quake2palette)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        im.format = "WAL"
 | 
					 | 
				
			||||||
        im.format_description = "Quake2 Texture"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # strings are null-terminated
 | 
					 | 
				
			||||||
        im.info["name"] = header[:32].split(b"\0", 1)[0]
 | 
					 | 
				
			||||||
        next_name = header[56 : 56 + 32].split(b"\0", 1)[0]
 | 
					 | 
				
			||||||
        if next_name:
 | 
					 | 
				
			||||||
            im.info["next_name"] = next_name
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return im
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if hasattr(filename, "read"):
 | 
					 | 
				
			||||||
        return imopen(filename)
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        with builtins.open(filename, "rb") as fp:
 | 
					 | 
				
			||||||
            return imopen(fp)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
quake2palette = (
 | 
					quake2palette = (
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user