mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-15 20:06:28 +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
|
||||
if fourcc == D3DFMT.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:
|
||||
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:
|
||||
self.pixel_format = "DXT5"
|
||||
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"
|
||||
tile = Image.Tile("bcn", (0, 0) + self.size, data_start, (3, self.pixel_format))
|
||||
elif fourcc == D3DFMT.ATI1:
|
||||
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"
|
||||
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:
|
||||
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"
|
||||
elif fourcc == D3DFMT.DX10:
|
||||
data_start += 20
|
||||
|
@ -369,33 +369,33 @@ class DdsImageFile(ImageFile.ImageFile):
|
|||
self.fp.read(16)
|
||||
if dxgi_format in (DXGI_FORMAT.BC5_TYPELESS, DXGI_FORMAT.BC5_UNORM):
|
||||
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"
|
||||
elif dxgi_format == DXGI_FORMAT.BC5_SNORM:
|
||||
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"
|
||||
elif dxgi_format == DXGI_FORMAT.BC6H_UF16:
|
||||
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"
|
||||
elif dxgi_format == DXGI_FORMAT.BC6H_SF16:
|
||||
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"
|
||||
elif dxgi_format in (DXGI_FORMAT.BC7_TYPELESS, DXGI_FORMAT.BC7_UNORM):
|
||||
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:
|
||||
self.pixel_format = "BC7"
|
||||
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 (
|
||||
DXGI_FORMAT.R8G8B8A8_TYPELESS,
|
||||
DXGI_FORMAT.R8G8B8A8_UNORM,
|
||||
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:
|
||||
self.info["gamma"] = 1 / 2.2
|
||||
else:
|
||||
|
@ -457,7 +457,7 @@ def _save(im, fp, filename):
|
|||
if im.mode == "RGBA":
|
||||
r, g, b, a = im.split()
|
||||
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):
|
||||
|
|
|
@ -38,6 +38,7 @@ import warnings
|
|||
from collections.abc import Callable, MutableMapping
|
||||
from enum import IntEnum
|
||||
from pathlib import Path
|
||||
from typing import NamedTuple, Tuple, List
|
||||
|
||||
try:
|
||||
import defusedxml.ElementTree as ElementTree
|
||||
|
@ -206,6 +207,14 @@ if hasattr(core, "DEFAULT_STRATEGY"):
|
|||
RLE = core.RLE
|
||||
FIXED = core.FIXED
|
||||
|
||||
Tile = NamedTuple('Tile',
|
||||
[
|
||||
('encoder_name', str),
|
||||
('extents', Tuple[int, int, int, int]),
|
||||
('offset', int),
|
||||
('tile_args', Tuple)
|
||||
]
|
||||
)
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# Registries
|
||||
|
@ -692,6 +701,7 @@ class Image:
|
|||
|
||||
def __setstate__(self, state):
|
||||
Image.__init__(self)
|
||||
self.tile: List[Tile] = []
|
||||
info, mode, size, palette, data = state
|
||||
self.info = info
|
||||
self.mode = mode
|
||||
|
|
|
@ -31,6 +31,7 @@ import io
|
|||
import itertools
|
||||
import struct
|
||||
import sys
|
||||
from typing import List
|
||||
|
||||
from . import Image
|
||||
from ._util import is_path
|
||||
|
@ -521,13 +522,13 @@ def _save(im, fp, tile, bufsize=0):
|
|||
fp.flush()
|
||||
|
||||
|
||||
def _encode_tile(im, fp, tile, bufsize, fh, exc=None):
|
||||
for e, b, o, a in tile:
|
||||
if o > 0:
|
||||
fp.seek(o)
|
||||
encoder = Image._getencoder(im.mode, e, a, im.encoderconfig)
|
||||
def _encode_tile(im, fp, tile: List[Image.Tile], bufsize, fh, exc=None):
|
||||
for encoder_name, extents, offset, tile_args in tile:
|
||||
if offset > 0:
|
||||
fp.seek(offset)
|
||||
encoder = Image._getencoder(im.mode, encoder_name, tile_args, im.encoderconfig)
|
||||
try:
|
||||
encoder.setimage(im.im, b)
|
||||
encoder.setimage(im.im, extents)
|
||||
if encoder.pushes_fd:
|
||||
encoder.setfd(fp)
|
||||
errcode = encoder.encode_to_pyfd()[1]
|
||||
|
|
Loading…
Reference in New Issue
Block a user