mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 16:07:30 +03:00 
			
		
		
		
	Add Tile namedtuple for code readability.
Add typing info to Image.tile
This commit is contained in:
		
							parent
							
								
									f2d91fcdaa
								
							
						
					
					
						commit
						de2b4be9b9
					
				|  | @ -343,24 +343,24 @@ class DdsImageFile(ImageFile.ImageFile): | ||||||
|             data_start = header_size + 4 |             data_start = header_size + 4 | ||||||
|             if fourcc == D3DFMT.DXT1: |             if fourcc == D3DFMT.DXT1: | ||||||
|                 self.pixel_format = "DXT1" |                 self.pixel_format = "DXT1" | ||||||
|                 tile = ("bcn", (0, 0) + self.size, data_start, (1, self.pixel_format)) |                 tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (1, self.pixel_format)) | ||||||
|             elif fourcc == D3DFMT.DXT3: |             elif fourcc == D3DFMT.DXT3: | ||||||
|                 self.pixel_format = "DXT3" |                 self.pixel_format = "DXT3" | ||||||
|                 tile = ("bcn", (0, 0) + self.size, data_start, (2, self.pixel_format)) |                 tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (2, self.pixel_format)) | ||||||
|             elif fourcc == D3DFMT.DXT5: |             elif fourcc == D3DFMT.DXT5: | ||||||
|                 self.pixel_format = "DXT5" |                 self.pixel_format = "DXT5" | ||||||
|                 tile = ("bcn", (0, 0) + self.size, data_start, (3, self.pixel_format)) |                 tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (3, self.pixel_format)) | ||||||
|             elif fourcc == D3DFMT.BC5S: |  | ||||||
|                 self.pixel_format = "BC5S" |  | ||||||
|                 tile = ("bcn", (0, 0) + self.size, data_start, (5, self.pixel_format)) |  | ||||||
|                 self.mode = "RGB" |  | ||||||
|             elif fourcc == D3DFMT.ATI1: |             elif fourcc == D3DFMT.ATI1: | ||||||
|                 self.pixel_format = "BC4" |                 self.pixel_format = "BC4" | ||||||
|                 tile = ("bcn", (0, 0) + self.size, data_start, (4, self.pixel_format)) |                 tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (4, self.pixel_format)) | ||||||
|                 self.mode = "L" |                 self.mode = "L" | ||||||
|  |             elif fourcc == D3DFMT.BC5S: | ||||||
|  |                 self.pixel_format = "BC5S" | ||||||
|  |                 tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (5, self.pixel_format)) | ||||||
|  |                 self.mode = "RGB" | ||||||
|             elif fourcc == D3DFMT.ATI2: |             elif fourcc == D3DFMT.ATI2: | ||||||
|                 self.pixel_format = "BC5" |                 self.pixel_format = "BC5" | ||||||
|                 tile = ("bcn", (0, 0) + self.size, data_start, (5, self.pixel_format)) |                 tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (5, self.pixel_format)) | ||||||
|                 self.mode = "RGB" |                 self.mode = "RGB" | ||||||
|             elif fourcc == D3DFMT.DX10: |             elif fourcc == D3DFMT.DX10: | ||||||
|                 data_start += 20 |                 data_start += 20 | ||||||
|  | @ -369,33 +369,33 @@ class DdsImageFile(ImageFile.ImageFile): | ||||||
|                 self.fp.read(16) |                 self.fp.read(16) | ||||||
|                 if dxgi_format in (DXGI_FORMAT.BC5_TYPELESS, DXGI_FORMAT.BC5_UNORM): |                 if dxgi_format in (DXGI_FORMAT.BC5_TYPELESS, DXGI_FORMAT.BC5_UNORM): | ||||||
|                     self.pixel_format = "BC5" |                     self.pixel_format = "BC5" | ||||||
|                     tile = ("bcn", (0, 0) + self.size, data_start, (5, self.pixel_format)) |                     tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (5, self.pixel_format)) | ||||||
|                     self.mode = "RGB" |                     self.mode = "RGB" | ||||||
|                 elif dxgi_format == DXGI_FORMAT.BC5_SNORM: |                 elif dxgi_format == DXGI_FORMAT.BC5_SNORM: | ||||||
|                     self.pixel_format = "BC5S" |                     self.pixel_format = "BC5S" | ||||||
|                     tile = ("bcn", (0, 0) + self.size, data_start, (5, self.pixel_format)) |                     tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (5, self.pixel_format)) | ||||||
|                     self.mode = "RGB" |                     self.mode = "RGB" | ||||||
|                 elif dxgi_format == DXGI_FORMAT.BC6H_UF16: |                 elif dxgi_format == DXGI_FORMAT.BC6H_UF16: | ||||||
|                     self.pixel_format = "BC6H" |                     self.pixel_format = "BC6H" | ||||||
|                     tile = ("bcn", (0, 0) + self.size, data_start, (6, self.pixel_format)) |                     tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (6, self.pixel_format)) | ||||||
|                     self.mode = "RGB" |                     self.mode = "RGB" | ||||||
|                 elif dxgi_format == DXGI_FORMAT.BC6H_SF16: |                 elif dxgi_format == DXGI_FORMAT.BC6H_SF16: | ||||||
|                     self.pixel_format = "BC6HS" |                     self.pixel_format = "BC6HS" | ||||||
|                     tile = ("bcn", (0, 0) + self.size, data_start, (6, self.pixel_format)) |                     tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (6, self.pixel_format)) | ||||||
|                     self.mode = "RGB" |                     self.mode = "RGB" | ||||||
|                 elif dxgi_format in (DXGI_FORMAT.BC7_TYPELESS, DXGI_FORMAT.BC7_UNORM): |                 elif dxgi_format in (DXGI_FORMAT.BC7_TYPELESS, DXGI_FORMAT.BC7_UNORM): | ||||||
|                     self.pixel_format = "BC7" |                     self.pixel_format = "BC7" | ||||||
|                     tile = ("bcn", (0, 0) + self.size, data_start, (7, self.pixel_format)) |                     tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (7, self.pixel_format)) | ||||||
|                 elif dxgi_format == DXGI_FORMAT.BC7_UNORM_SRGB: |                 elif dxgi_format == DXGI_FORMAT.BC7_UNORM_SRGB: | ||||||
|                     self.pixel_format = "BC7" |                     self.pixel_format = "BC7" | ||||||
|                     self.info["gamma"] = 1 / 2.2 |                     self.info["gamma"] = 1 / 2.2 | ||||||
|                     tile = ("bcn", (0, 0) + self.size, data_start, (7, self.pixel_format)) |                     tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (7, self.pixel_format)) | ||||||
|                 elif dxgi_format in ( |                 elif dxgi_format in ( | ||||||
|                     DXGI_FORMAT.R8G8B8A8_TYPELESS, |                     DXGI_FORMAT.R8G8B8A8_TYPELESS, | ||||||
|                     DXGI_FORMAT.R8G8B8A8_UNORM, |                     DXGI_FORMAT.R8G8B8A8_UNORM, | ||||||
|                     DXGI_FORMAT.R8G8B8A8_UNORM_SRGB, |                     DXGI_FORMAT.R8G8B8A8_UNORM_SRGB, | ||||||
|                 ): |                 ): | ||||||
|                     tile = ("raw", (0, 0) + self.size, 0, ("RGBA", 0, 1)) |                     tile = Image.Tile("raw", (0, 0) + self.size, 0, ("RGBA", 0, 1)) | ||||||
|                     if dxgi_format == DXGI_FORMAT.R8G8B8A8_UNORM_SRGB: |                     if dxgi_format == DXGI_FORMAT.R8G8B8A8_UNORM_SRGB: | ||||||
|                         self.info["gamma"] = 1 / 2.2 |                         self.info["gamma"] = 1 / 2.2 | ||||||
|                 else: |                 else: | ||||||
|  | @ -457,7 +457,7 @@ def _save(im, fp, filename): | ||||||
|     if im.mode == "RGBA": |     if im.mode == "RGBA": | ||||||
|         r, g, b, a = im.split() |         r, g, b, a = im.split() | ||||||
|         im = Image.merge("RGBA", (a, r, g, b)) |         im = Image.merge("RGBA", (a, r, g, b)) | ||||||
|     ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) |     ImageFile._save(im, fp, [Image.Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))]) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def _accept(prefix): | def _accept(prefix): | ||||||
|  |  | ||||||
|  | @ -38,6 +38,7 @@ import warnings | ||||||
| from collections.abc import Callable, MutableMapping | from collections.abc import Callable, MutableMapping | ||||||
| from enum import IntEnum | from enum import IntEnum | ||||||
| from pathlib import Path | from pathlib import Path | ||||||
|  | from typing import NamedTuple, Tuple, List | ||||||
| 
 | 
 | ||||||
| try: | try: | ||||||
|     import defusedxml.ElementTree as ElementTree |     import defusedxml.ElementTree as ElementTree | ||||||
|  | @ -206,6 +207,14 @@ if hasattr(core, "DEFAULT_STRATEGY"): | ||||||
|     RLE = core.RLE |     RLE = core.RLE | ||||||
|     FIXED = core.FIXED |     FIXED = core.FIXED | ||||||
| 
 | 
 | ||||||
|  | Tile = NamedTuple('Tile', | ||||||
|  |                   [ | ||||||
|  |                       ('encoder_name', str), | ||||||
|  |                       ('extents', Tuple[int, int, int, int]), | ||||||
|  |                       ('offset', int), | ||||||
|  |                       ('tile_args', Tuple) | ||||||
|  |                   ] | ||||||
|  |                   ) | ||||||
| 
 | 
 | ||||||
| # -------------------------------------------------------------------- | # -------------------------------------------------------------------- | ||||||
| # Registries | # Registries | ||||||
|  | @ -692,6 +701,7 @@ class Image: | ||||||
| 
 | 
 | ||||||
|     def __setstate__(self, state): |     def __setstate__(self, state): | ||||||
|         Image.__init__(self) |         Image.__init__(self) | ||||||
|  |         self.tile: List[Tile] = [] | ||||||
|         info, mode, size, palette, data = state |         info, mode, size, palette, data = state | ||||||
|         self.info = info |         self.info = info | ||||||
|         self.mode = mode |         self.mode = mode | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ import io | ||||||
| import itertools | import itertools | ||||||
| import struct | import struct | ||||||
| import sys | import sys | ||||||
|  | from typing import List | ||||||
| 
 | 
 | ||||||
| from . import Image | from . import Image | ||||||
| from ._util import is_path | from ._util import is_path | ||||||
|  | @ -521,13 +522,13 @@ def _save(im, fp, tile, bufsize=0): | ||||||
|         fp.flush() |         fp.flush() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def _encode_tile(im, fp, tile, bufsize, fh, exc=None): | def _encode_tile(im, fp, tile: List[Image.Tile], bufsize, fh, exc=None): | ||||||
|     for e, b, o, a in tile: |     for encoder_name, extents, offset, tile_args in tile: | ||||||
|         if o > 0: |         if offset > 0: | ||||||
|             fp.seek(o) |             fp.seek(offset) | ||||||
|         encoder = Image._getencoder(im.mode, e, a, im.encoderconfig) |         encoder = Image._getencoder(im.mode, encoder_name, tile_args, im.encoderconfig) | ||||||
|         try: |         try: | ||||||
|             encoder.setimage(im.im, b) |             encoder.setimage(im.im, extents) | ||||||
|             if encoder.pushes_fd: |             if encoder.pushes_fd: | ||||||
|                 encoder.setfd(fp) |                 encoder.setfd(fp) | ||||||
|                 errcode = encoder.encode_to_pyfd()[1] |                 errcode = encoder.encode_to_pyfd()[1] | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user