Merge branch 'main' into multiband

This commit is contained in:
Andrew Murray 2024-07-19 22:28:46 +10:00 committed by GitHub
commit b6ce6ab137
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
95 changed files with 3083 additions and 957 deletions

View File

@ -3,7 +3,7 @@
BasedOnStyle: Google
AlwaysBreakAfterReturnType: All
AllowShortIfStatementsOnASingleLine: false
AlignAfterOpenBracket: AlwaysBreak
AlignAfterOpenBracket: BlockIndent
BinPackArguments: false
BinPackParameters: false
BreakBeforeBraces: Attach

View File

@ -24,6 +24,8 @@ concurrency:
jobs:
Fuzzing:
# Disabled until google/oss-fuzz#11419 upgrades Python to 3.9+
if: false
runs-on: ubuntu-latest
steps:
- name: Build Fuzzers

View File

@ -12,8 +12,14 @@ elif [ "${AUDITWHEEL_POLICY::9}" == "musllinux" ]; then
else
yum install -y fribidi
fi
if [ "${AUDITWHEEL_POLICY::9}" != "musllinux" ]; then
# TODO Update condition when NumPy supports free-threading
if [ $(python3 -c "import sysconfig;print(sysconfig.get_config_var('Py_GIL_DISABLED'))") == "1" ]; then
python3 -m pip install numpy --index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple
else
python3 -m pip install numpy
fi
fi
if [ ! -d "test-images-main" ]; then

View File

@ -1,6 +1,14 @@
name: Wheels
on:
schedule:
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
# │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
# │ │ │ │ │
- cron: "42 1 * * 0,3"
push:
paths:
- ".ci/requirements-cibw.txt"
@ -33,6 +41,7 @@ env:
jobs:
build-1-QEMU-emulated-wheels:
if: github.event_name != 'schedule' && github.event_name != 'workflow_dispatch'
name: aarch64 ${{ matrix.python-version }} ${{ matrix.spec }}
runs-on: ubuntu-latest
strategy:
@ -129,6 +138,7 @@ jobs:
env:
CIBW_ARCHS: ${{ matrix.cibw_arch }}
CIBW_BUILD: ${{ matrix.build }}
CIBW_FREE_THREADED_SUPPORT: True
CIBW_MANYLINUX_PYPY_X86_64_IMAGE: ${{ matrix.manylinux }}
CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.manylinux }}
CIBW_PRERELEASE_PYTHONS: True
@ -201,6 +211,7 @@ jobs:
CIBW_ARCHS: ${{ matrix.cibw_arch }}
CIBW_BEFORE_ALL: "{package}\\winbuild\\build\\build_dep_all.cmd"
CIBW_CACHE_PATH: "C:\\cibw"
CIBW_FREE_THREADED_SUPPORT: True
CIBW_PRERELEASE_PYTHONS: True
CIBW_TEST_SKIP: "*-win_arm64"
CIBW_TEST_COMMAND: 'docker run --rm
@ -225,6 +236,7 @@ jobs:
path: winbuild\build\bin\fribidi*
sdist:
if: github.event_name != 'schedule'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
@ -243,6 +255,23 @@ jobs:
name: dist-sdist
path: dist/*.tar.gz
scientific-python-nightly-wheels-publish:
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
needs: [build-2-native-wheels, windows]
runs-on: ubuntu-latest
name: Upload wheels to scientific-python-nightly-wheels
steps:
- uses: actions/download-artifact@v4
with:
pattern: dist-*
path: dist
merge-multiple: true
- name: Upload wheels to scientific-python-nightly-wheels
uses: scientific-python/upload-nightly-action@b67d7fcc0396e1128a474d1ab2b48aa94680f9fc # 0.5.0
with:
artifacts_path: dist
anaconda_nightly_upload_token: ${{ secrets.ANACONDA_ORG_UPLOAD_TOKEN }}
pypi-publish:
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
needs: [build-1-QEMU-emulated-wheels, build-2-native-wheels, windows, sdist]

View File

@ -5,6 +5,18 @@ Changelog (Pillow)
11.0.0 (unreleased)
-------------------
- Deprecate ImageMath lambda_eval and unsafe_eval options argument #8242
[radarhere]
- Changed ContainerIO to subclass IO #8240
[radarhere]
- Move away from APIs that use borrowed references under the free-threaded build #8216
[hugovk, lysnikolaou]
- Allow size argument to resize() to be a NumPy array #8201
[radarhere]
- Drop support for Python 3.8 #8183
[hugovk, radarhere]

View File

@ -1,7 +1,5 @@
from __future__ import annotations
from typing import Literal
import pytest
from PIL import ContainerIO, Image
@ -23,6 +21,13 @@ def test_isatty() -> None:
assert container.isatty() is False
def test_seekable() -> None:
with hopper() as im:
container = ContainerIO.ContainerIO(im, 0, 0)
assert container.seekable() is True
@pytest.mark.parametrize(
"mode, expected_position",
(
@ -31,7 +36,7 @@ def test_isatty() -> None:
(2, 100),
),
)
def test_seek_mode(mode: Literal[0, 1, 2], expected_position: int) -> None:
def test_seek_mode(mode: int, expected_position: int) -> None:
# Arrange
with open(TEST_FILE, "rb") as fh:
container = ContainerIO.ContainerIO(fh, 22, 100)
@ -44,6 +49,14 @@ def test_seek_mode(mode: Literal[0, 1, 2], expected_position: int) -> None:
assert container.tell() == expected_position
@pytest.mark.parametrize("bytesmode", (True, False))
def test_readable(bytesmode: bool) -> None:
with open(TEST_FILE, "rb" if bytesmode else "r") as fh:
container = ContainerIO.ContainerIO(fh, 0, 120)
assert container.readable() is True
@pytest.mark.parametrize("bytesmode", (True, False))
def test_read_n0(bytesmode: bool) -> None:
# Arrange
@ -51,7 +64,7 @@ def test_read_n0(bytesmode: bool) -> None:
container = ContainerIO.ContainerIO(fh, 22, 100)
# Act
container.seek(81)
assert container.seek(81) == 81
data = container.read()
# Assert
@ -67,7 +80,7 @@ def test_read_n(bytesmode: bool) -> None:
container = ContainerIO.ContainerIO(fh, 22, 100)
# Act
container.seek(81)
assert container.seek(81) == 81
data = container.read(3)
# Assert
@ -83,7 +96,7 @@ def test_read_eof(bytesmode: bool) -> None:
container = ContainerIO.ContainerIO(fh, 22, 100)
# Act
container.seek(100)
assert container.seek(100) == 100
data = container.read()
# Assert
@ -94,21 +107,65 @@ def test_read_eof(bytesmode: bool) -> None:
@pytest.mark.parametrize("bytesmode", (True, False))
def test_readline(bytesmode: bool) -> None:
# Arrange
with open(TEST_FILE, "rb" if bytesmode else "r") as fh:
container = ContainerIO.ContainerIO(fh, 0, 120)
# Act
data = container.readline()
# Assert
if bytesmode:
data = data.decode()
assert data == "This is line 1\n"
data = container.readline(4)
if bytesmode:
data = data.decode()
assert data == "This"
@pytest.mark.parametrize("bytesmode", (True, False))
def test_readlines(bytesmode: bool) -> None:
expected = [
"This is line 1\n",
"This is line 2\n",
"This is line 3\n",
"This is line 4\n",
"This is line 5\n",
"This is line 6\n",
"This is line 7\n",
"This is line 8\n",
]
with open(TEST_FILE, "rb" if bytesmode else "r") as fh:
container = ContainerIO.ContainerIO(fh, 0, 120)
data = container.readlines()
if bytesmode:
data = [line.decode() for line in data]
assert data == expected
assert container.seek(0) == 0
data = container.readlines(2)
if bytesmode:
data = [line.decode() for line in data]
assert data == expected[:2]
@pytest.mark.parametrize("bytesmode", (True, False))
def test_write(bytesmode: bool) -> None:
with open(TEST_FILE, "rb" if bytesmode else "r") as fh:
container = ContainerIO.ContainerIO(fh, 0, 120)
assert container.writable() is False
with pytest.raises(NotImplementedError):
container.write(b"" if bytesmode else "")
with pytest.raises(NotImplementedError):
container.writelines([])
with pytest.raises(NotImplementedError):
container.truncate()
@pytest.mark.parametrize("bytesmode", (True, False))
def test_iter(bytesmode: bool) -> None:
# Arrange
expected = [
"This is line 1\n",
@ -124,9 +181,21 @@ def test_readlines(bytesmode: bool) -> None:
container = ContainerIO.ContainerIO(fh, 0, 120)
# Act
data = container.readlines()
data = []
for line in container:
data.append(line)
# Assert
if bytesmode:
data = [line.decode() for line in data]
assert data == expected
@pytest.mark.parametrize("bytesmode", (True, False))
def test_file(bytesmode: bool) -> None:
with open(TEST_FILE, "rb" if bytesmode else "r") as fh:
container = ContainerIO.ContainerIO(fh, 0, 120)
assert isinstance(container.fileno(), int)
container.flush()
container.close()

View File

@ -41,7 +41,7 @@ MAGIC = PngImagePlugin._MAGIC
def chunk(cid: bytes, *data: bytes) -> bytes:
test_file = BytesIO()
PngImagePlugin.putchunk(*(test_file, cid) + data)
PngImagePlugin.putchunk(test_file, cid, *data)
return test_file.getvalue()

View File

@ -127,7 +127,7 @@ class TestImageFile:
def test_raise_typeerror(self) -> None:
with pytest.raises(TypeError):
parser = ImageFile.Parser()
parser.feed(1)
parser.feed(1) # type: ignore[arg-type]
def test_negative_stride(self) -> None:
with open("Tests/images/raw_negative_stride.bin", "rb") as f:
@ -305,7 +305,7 @@ class TestPyDecoder(CodecsTest):
im.load()
def test_decode(self) -> None:
decoder = ImageFile.PyDecoder(None)
decoder = ImageFile.PyDecoder("")
with pytest.raises(NotImplementedError):
decoder.decode(b"")
@ -383,7 +383,7 @@ class TestPyEncoder(CodecsTest):
)
def test_encode(self) -> None:
encoder = ImageFile.PyEncoder(None)
encoder = ImageFile.PyEncoder("")
with pytest.raises(NotImplementedError):
encoder.encode(0)

View File

@ -1,5 +1,9 @@
from __future__ import annotations
from typing import Any
import pytest
from PIL import Image, ImageMath
@ -19,7 +23,7 @@ I = Image.new("I", (1, 1), 4) # noqa: E741
A2 = A.resize((2, 2))
B2 = B.resize((2, 2))
images = {"A": A, "B": B, "F": F, "I": I}
images: dict[str, Any] = {"A": A, "B": B, "F": F, "I": I}
def test_sanity() -> None:
@ -30,13 +34,13 @@ def test_sanity() -> None:
== "I 3"
)
assert (
pixel(ImageMath.lambda_eval(lambda args: args["A"] + args["B"], images))
pixel(ImageMath.lambda_eval(lambda args: args["A"] + args["B"], **images))
== "I 3"
)
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["float"](args["A"]) + args["B"], images
lambda args: args["float"](args["A"]) + args["B"], **images
)
)
== "F 3.0"
@ -44,42 +48,47 @@ def test_sanity() -> None:
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["int"](args["float"](args["A"]) + args["B"]), images
lambda args: args["int"](args["float"](args["A"]) + args["B"]), **images
)
)
== "I 3"
)
def test_options_deprecated() -> None:
with pytest.warns(DeprecationWarning):
assert ImageMath.lambda_eval(lambda args: 1, images) == 1
def test_ops() -> None:
assert pixel(ImageMath.lambda_eval(lambda args: args["A"] * -1, images)) == "I -1"
assert pixel(ImageMath.lambda_eval(lambda args: args["A"] * -1, **images)) == "I -1"
assert (
pixel(ImageMath.lambda_eval(lambda args: args["A"] + args["B"], images))
pixel(ImageMath.lambda_eval(lambda args: args["A"] + args["B"], **images))
== "I 3"
)
assert (
pixel(ImageMath.lambda_eval(lambda args: args["A"] - args["B"], images))
pixel(ImageMath.lambda_eval(lambda args: args["A"] - args["B"], **images))
== "I -1"
)
assert (
pixel(ImageMath.lambda_eval(lambda args: args["A"] * args["B"], images))
pixel(ImageMath.lambda_eval(lambda args: args["A"] * args["B"], **images))
== "I 2"
)
assert (
pixel(ImageMath.lambda_eval(lambda args: args["A"] / args["B"], images))
pixel(ImageMath.lambda_eval(lambda args: args["A"] / args["B"], **images))
== "I 0"
)
assert pixel(ImageMath.lambda_eval(lambda args: args["B"] ** 2, images)) == "I 4"
assert pixel(ImageMath.lambda_eval(lambda args: args["B"] ** 2, **images)) == "I 4"
assert (
pixel(ImageMath.lambda_eval(lambda args: args["B"] ** 33, images))
pixel(ImageMath.lambda_eval(lambda args: args["B"] ** 33, **images))
== "I 2147483647"
)
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["float"](args["A"]) + args["B"], images
lambda args: args["float"](args["A"]) + args["B"], **images
)
)
== "F 3.0"
@ -87,7 +96,7 @@ def test_ops() -> None:
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["float"](args["A"]) - args["B"], images
lambda args: args["float"](args["A"]) - args["B"], **images
)
)
== "F -1.0"
@ -95,7 +104,7 @@ def test_ops() -> None:
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["float"](args["A"]) * args["B"], images
lambda args: args["float"](args["A"]) * args["B"], **images
)
)
== "F 2.0"
@ -103,31 +112,33 @@ def test_ops() -> None:
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["float"](args["A"]) / args["B"], images
lambda args: args["float"](args["A"]) / args["B"], **images
)
)
== "F 0.5"
)
assert (
pixel(ImageMath.lambda_eval(lambda args: args["float"](args["B"]) ** 2, images))
pixel(
ImageMath.lambda_eval(lambda args: args["float"](args["B"]) ** 2, **images)
)
== "F 4.0"
)
assert (
pixel(
ImageMath.lambda_eval(lambda args: args["float"](args["B"]) ** 33, images)
ImageMath.lambda_eval(lambda args: args["float"](args["B"]) ** 33, **images)
)
== "F 8589934592.0"
)
def test_logical() -> None:
assert pixel(ImageMath.lambda_eval(lambda args: not args["A"], images)) == 0
assert pixel(ImageMath.lambda_eval(lambda args: not args["A"], **images)) == 0
assert (
pixel(ImageMath.lambda_eval(lambda args: args["A"] and args["B"], images))
pixel(ImageMath.lambda_eval(lambda args: args["A"] and args["B"], **images))
== "L 2"
)
assert (
pixel(ImageMath.lambda_eval(lambda args: args["A"] or args["B"], images))
pixel(ImageMath.lambda_eval(lambda args: args["A"] or args["B"], **images))
== "L 1"
)
@ -136,7 +147,7 @@ def test_convert() -> None:
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["convert"](args["A"] + args["B"], "L"), images
lambda args: args["convert"](args["A"] + args["B"], "L"), **images
)
)
== "L 3"
@ -144,7 +155,7 @@ def test_convert() -> None:
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["convert"](args["A"] + args["B"], "1"), images
lambda args: args["convert"](args["A"] + args["B"], "1"), **images
)
)
== "1 0"
@ -152,7 +163,7 @@ def test_convert() -> None:
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["convert"](args["A"] + args["B"], "RGB"), images
lambda args: args["convert"](args["A"] + args["B"], "RGB"), **images
)
)
== "RGB (3, 3, 3)"
@ -163,7 +174,7 @@ def test_compare() -> None:
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["min"](args["A"], args["B"]), images
lambda args: args["min"](args["A"], args["B"]), **images
)
)
== "I 1"
@ -171,13 +182,13 @@ def test_compare() -> None:
assert (
pixel(
ImageMath.lambda_eval(
lambda args: args["max"](args["A"], args["B"]), images
lambda args: args["max"](args["A"], args["B"]), **images
)
)
== "I 2"
)
assert pixel(ImageMath.lambda_eval(lambda args: args["A"] == 1, images)) == "I 1"
assert pixel(ImageMath.lambda_eval(lambda args: args["A"] == 2, images)) == "I 0"
assert pixel(ImageMath.lambda_eval(lambda args: args["A"] == 1, **images)) == "I 1"
assert pixel(ImageMath.lambda_eval(lambda args: args["A"] == 2, **images)) == "I 0"
def test_one_image_larger() -> None:

View File

@ -1,5 +1,7 @@
from __future__ import annotations
from typing import Any
import pytest
from PIL import Image, ImageMath
@ -21,16 +23,16 @@ I = Image.new("I", (1, 1), 4) # noqa: E741
A2 = A.resize((2, 2))
B2 = B.resize((2, 2))
images = {"A": A, "B": B, "F": F, "I": I}
images: dict[str, Any] = {"A": A, "B": B, "F": F, "I": I}
def test_sanity() -> None:
assert ImageMath.unsafe_eval("1") == 1
assert ImageMath.unsafe_eval("1+A", A=2) == 3
assert pixel(ImageMath.unsafe_eval("A+B", A=A, B=B)) == "I 3"
assert pixel(ImageMath.unsafe_eval("A+B", images)) == "I 3"
assert pixel(ImageMath.unsafe_eval("float(A)+B", images)) == "F 3.0"
assert pixel(ImageMath.unsafe_eval("int(float(A)+B)", images)) == "I 3"
assert pixel(ImageMath.unsafe_eval("A+B", **images)) == "I 3"
assert pixel(ImageMath.unsafe_eval("float(A)+B", **images)) == "F 3.0"
assert pixel(ImageMath.unsafe_eval("int(float(A)+B)", **images)) == "I 3"
def test_eval_deprecated() -> None:
@ -38,23 +40,28 @@ def test_eval_deprecated() -> None:
assert ImageMath.eval("1") == 1
def test_options_deprecated() -> None:
with pytest.warns(DeprecationWarning):
assert ImageMath.unsafe_eval("1", images) == 1
def test_ops() -> None:
assert pixel(ImageMath.unsafe_eval("-A", images)) == "I -1"
assert pixel(ImageMath.unsafe_eval("+B", images)) == "L 2"
assert pixel(ImageMath.unsafe_eval("-A", **images)) == "I -1"
assert pixel(ImageMath.unsafe_eval("+B", **images)) == "L 2"
assert pixel(ImageMath.unsafe_eval("A+B", images)) == "I 3"
assert pixel(ImageMath.unsafe_eval("A-B", images)) == "I -1"
assert pixel(ImageMath.unsafe_eval("A*B", images)) == "I 2"
assert pixel(ImageMath.unsafe_eval("A/B", images)) == "I 0"
assert pixel(ImageMath.unsafe_eval("B**2", images)) == "I 4"
assert pixel(ImageMath.unsafe_eval("B**33", images)) == "I 2147483647"
assert pixel(ImageMath.unsafe_eval("A+B", **images)) == "I 3"
assert pixel(ImageMath.unsafe_eval("A-B", **images)) == "I -1"
assert pixel(ImageMath.unsafe_eval("A*B", **images)) == "I 2"
assert pixel(ImageMath.unsafe_eval("A/B", **images)) == "I 0"
assert pixel(ImageMath.unsafe_eval("B**2", **images)) == "I 4"
assert pixel(ImageMath.unsafe_eval("B**33", **images)) == "I 2147483647"
assert pixel(ImageMath.unsafe_eval("float(A)+B", images)) == "F 3.0"
assert pixel(ImageMath.unsafe_eval("float(A)-B", images)) == "F -1.0"
assert pixel(ImageMath.unsafe_eval("float(A)*B", images)) == "F 2.0"
assert pixel(ImageMath.unsafe_eval("float(A)/B", images)) == "F 0.5"
assert pixel(ImageMath.unsafe_eval("float(B)**2", images)) == "F 4.0"
assert pixel(ImageMath.unsafe_eval("float(B)**33", images)) == "F 8589934592.0"
assert pixel(ImageMath.unsafe_eval("float(A)+B", **images)) == "F 3.0"
assert pixel(ImageMath.unsafe_eval("float(A)-B", **images)) == "F -1.0"
assert pixel(ImageMath.unsafe_eval("float(A)*B", **images)) == "F 2.0"
assert pixel(ImageMath.unsafe_eval("float(A)/B", **images)) == "F 0.5"
assert pixel(ImageMath.unsafe_eval("float(B)**2", **images)) == "F 4.0"
assert pixel(ImageMath.unsafe_eval("float(B)**33", **images)) == "F 8589934592.0"
@pytest.mark.parametrize(
@ -72,33 +79,33 @@ def test_prevent_exec(expression: str) -> None:
def test_prevent_double_underscores() -> None:
with pytest.raises(ValueError):
ImageMath.unsafe_eval("1", {"__": None})
ImageMath.unsafe_eval("1", __=None)
def test_prevent_builtins() -> None:
with pytest.raises(ValueError):
ImageMath.unsafe_eval("(lambda: exec('exit()'))()", {"exec": None})
ImageMath.unsafe_eval("(lambda: exec('exit()'))()", exec=None)
def test_logical() -> None:
assert pixel(ImageMath.unsafe_eval("not A", images)) == 0
assert pixel(ImageMath.unsafe_eval("A and B", images)) == "L 2"
assert pixel(ImageMath.unsafe_eval("A or B", images)) == "L 1"
assert pixel(ImageMath.unsafe_eval("not A", **images)) == 0
assert pixel(ImageMath.unsafe_eval("A and B", **images)) == "L 2"
assert pixel(ImageMath.unsafe_eval("A or B", **images)) == "L 1"
def test_convert() -> None:
assert pixel(ImageMath.unsafe_eval("convert(A+B, 'L')", images)) == "L 3"
assert pixel(ImageMath.unsafe_eval("convert(A+B, '1')", images)) == "1 0"
assert pixel(ImageMath.unsafe_eval("convert(A+B, 'L')", **images)) == "L 3"
assert pixel(ImageMath.unsafe_eval("convert(A+B, '1')", **images)) == "1 0"
assert (
pixel(ImageMath.unsafe_eval("convert(A+B, 'RGB')", images)) == "RGB (3, 3, 3)"
pixel(ImageMath.unsafe_eval("convert(A+B, 'RGB')", **images)) == "RGB (3, 3, 3)"
)
def test_compare() -> None:
assert pixel(ImageMath.unsafe_eval("min(A, B)", images)) == "I 1"
assert pixel(ImageMath.unsafe_eval("max(A, B)", images)) == "I 2"
assert pixel(ImageMath.unsafe_eval("A == 1", images)) == "I 1"
assert pixel(ImageMath.unsafe_eval("A == 2", images)) == "I 0"
assert pixel(ImageMath.unsafe_eval("min(A, B)", **images)) == "I 1"
assert pixel(ImageMath.unsafe_eval("max(A, B)", **images)) == "I 2"
assert pixel(ImageMath.unsafe_eval("A == 1", **images)) == "I 1"
assert pixel(ImageMath.unsafe_eval("A == 2", **images)) == "I 0"
def test_one_image_larger() -> None:

View File

@ -57,6 +57,9 @@ class TestImageWinDib:
# Assert
assert dib.size == (128, 128)
with pytest.raises(ValueError):
ImageWin.Dib(mode)
def test_dib_paste(self) -> None:
# Arrange
im = hopper()

View File

@ -109,6 +109,15 @@ ImageDraw.getdraw hints parameter
The ``hints`` parameter in :py:meth:`~PIL.ImageDraw.getdraw()` has been deprecated.
ImageMath.lambda_eval and ImageMath.unsafe_eval options parameter
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. deprecated:: 11.0.0
The ``options`` parameter in :py:meth:`~PIL.ImageMath.lambda_eval()` and
:py:meth:`~PIL.ImageMath.unsafe_eval()` has been deprecated. One or more keyword
arguments can be used instead.
Removed features
----------------

View File

@ -31,20 +31,21 @@ Example: Using the :py:mod:`~PIL.ImageMath` module
b=im2
)
.. py:function:: lambda_eval(expression, options)
.. py:function:: lambda_eval(expression, options, **kw)
Returns the result of an image function.
:param expression: A function that receives a dictionary.
:param options: Values to add to the function's dictionary, mapping image
names to Image instances. You can use one or more keyword
arguments instead of a dictionary, as shown in the above
example. Note that the names must be valid Python
identifiers.
:param options: Values to add to the function's dictionary. Note that the names
must be valid Python identifiers. Deprecated.
You can instead use one or more keyword arguments, as
shown in the above example.
:param \**kw: Values to add to the function's dictionary, mapping image names to
Image instances.
:return: An image, an integer value, a floating point value,
or a pixel tuple, depending on the expression.
.. py:function:: unsafe_eval(expression, options)
.. py:function:: unsafe_eval(expression, options, **kw)
Evaluates an image expression.
@ -61,11 +62,12 @@ Example: Using the :py:mod:`~PIL.ImageMath` module
:param expression: A string which uses the standard Python expression
syntax. In addition to the standard operators, you can
also use the functions described below.
:param options: Values to add to the function's dictionary, mapping image
names to Image instances. You can use one or more keyword
arguments instead of a dictionary, as shown in the above
example. Note that the names must be valid Python
identifiers.
:param options: Values to add to the evaluation context. Note that the names must
be valid Python identifiers. Deprecated.
You can instead use one or more keyword arguments, as
shown in the above example.
:param \**kw: Values to add to the evaluation context, mapping image names to Image
instances.
:return: An image, an integer value, a floating point value,
or a pixel tuple, depending on the expression.

View File

@ -43,10 +43,12 @@ similarly removed.
Deprecations
============
TODO
^^^^
ImageMath.lambda_eval and ImageMath.unsafe_eval options parameter
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TODO
The ``options`` parameter in :py:meth:`~PIL.ImageMath.lambda_eval()` and
:py:meth:`~PIL.ImageMath.unsafe_eval()` has been deprecated. One or more
keyword arguments can be used instead.
API Changes
===========

View File

@ -161,5 +161,4 @@ exclude = [
'^Tests/test_qt_image_qapplication.py$',
'^Tests/test_font_pcf_charsets.py$',
'^Tests/test_font_pcf.py$',
'^Tests/test_file_tar.py$',
]

View File

@ -16,10 +16,11 @@
from __future__ import annotations
import io
from typing import IO, AnyStr, Generic, Literal
from collections.abc import Iterable
from typing import IO, AnyStr, NoReturn
class ContainerIO(Generic[AnyStr]):
class ContainerIO(IO[AnyStr]):
"""
A file object that provides read access to a part of an existing
file (for example a TAR file).
@ -45,7 +46,10 @@ class ContainerIO(Generic[AnyStr]):
def isatty(self) -> bool:
return False
def seek(self, offset: int, mode: Literal[0, 1, 2] = io.SEEK_SET) -> None:
def seekable(self) -> bool:
return True
def seek(self, offset: int, mode: int = io.SEEK_SET) -> int:
"""
Move file pointer.
@ -53,6 +57,7 @@ class ContainerIO(Generic[AnyStr]):
:param mode: Starting position. Use 0 for beginning of region, 1
for current offset, and 2 for end of region. You cannot move
the pointer outside the defined region.
:returns: Offset from start of region, in bytes.
"""
if mode == 1:
self.pos = self.pos + offset
@ -63,6 +68,7 @@ class ContainerIO(Generic[AnyStr]):
# clamp
self.pos = max(0, min(self.pos, self.length))
self.fh.seek(self.offset + self.pos)
return self.pos
def tell(self) -> int:
"""
@ -72,27 +78,32 @@ class ContainerIO(Generic[AnyStr]):
"""
return self.pos
def read(self, n: int = 0) -> AnyStr:
def readable(self) -> bool:
return True
def read(self, n: int = -1) -> AnyStr:
"""
Read data.
:param n: Number of bytes to read. If omitted or zero,
:param n: Number of bytes to read. If omitted, zero or negative,
read until end of region.
:returns: An 8-bit string.
"""
if n:
if n > 0:
n = min(n, self.length - self.pos)
else:
n = self.length - self.pos
if not n: # EOF
if n <= 0: # EOF
return b"" if "b" in self.fh.mode else "" # type: ignore[return-value]
self.pos = self.pos + n
return self.fh.read(n)
def readline(self) -> AnyStr:
def readline(self, n: int = -1) -> AnyStr:
"""
Read a line of text.
:param n: Number of bytes to read. If omitted, zero or negative,
read until end of line.
:returns: An 8-bit string.
"""
s: AnyStr = b"" if "b" in self.fh.mode else "" # type: ignore[assignment]
@ -102,14 +113,16 @@ class ContainerIO(Generic[AnyStr]):
if not c:
break
s = s + c
if c == newline_character:
if c == newline_character or len(s) == n:
break
return s
def readlines(self) -> list[AnyStr]:
def readlines(self, n: int | None = -1) -> list[AnyStr]:
"""
Read multiple lines of text.
:param n: Number of lines to read. If omitted, zero, negative or None,
read until end of region.
:returns: A list of 8-bit strings.
"""
lines = []
@ -118,4 +131,43 @@ class ContainerIO(Generic[AnyStr]):
if not s:
break
lines.append(s)
if len(lines) == n:
break
return lines
def writable(self) -> bool:
return False
def write(self, b: AnyStr) -> NoReturn:
raise NotImplementedError()
def writelines(self, lines: Iterable[AnyStr]) -> NoReturn:
raise NotImplementedError()
def truncate(self, size: int | None = None) -> int:
raise NotImplementedError()
def __enter__(self) -> ContainerIO[AnyStr]:
return self
def __exit__(self, *args: object) -> None:
self.close()
def __iter__(self) -> ContainerIO[AnyStr]:
return self
def __next__(self) -> AnyStr:
line = self.readline()
if not line:
msg = "end of region"
raise StopIteration(msg)
return line
def fileno(self) -> int:
return self.fh.fileno()
def flush(self) -> None:
self.fh.flush()
def close(self) -> None:
self.fh.close()

View File

@ -65,7 +65,7 @@ def has_ghostscript() -> bool:
return gs_binary is not False
def Ghostscript(tile, size, fp, scale=1, transparency=False):
def Ghostscript(tile, size, fp, scale=1, transparency: bool = False) -> Image.Image:
"""Render an image using Ghostscript"""
global gs_binary
if not has_ghostscript():

View File

@ -25,7 +25,7 @@ from __future__ import annotations
import warnings
from io import BytesIO
from math import ceil, log
from typing import IO
from typing import IO, NamedTuple
from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin
from ._binary import i16le as i16
@ -119,8 +119,22 @@ def _accept(prefix: bytes) -> bool:
return prefix[:4] == _MAGIC
class IconHeader(NamedTuple):
width: int
height: int
nb_color: int
reserved: int
planes: int
bpp: int
size: int
offset: int
dim: tuple[int, int]
square: int
color_depth: int
class IcoFile:
def __init__(self, buf) -> None:
def __init__(self, buf: IO[bytes]) -> None:
"""
Parse image from file-like object containing ico file data
"""
@ -141,51 +155,44 @@ class IcoFile:
for i in range(self.nb_items):
s = buf.read(16)
icon_header = {
"width": s[0],
"height": s[1],
"nb_color": s[2], # No. of colors in image (0 if >=8bpp)
"reserved": s[3],
"planes": i16(s, 4),
"bpp": i16(s, 6),
"size": i32(s, 8),
"offset": i32(s, 12),
}
# See Wikipedia
for j in ("width", "height"):
if not icon_header[j]:
icon_header[j] = 256
width = s[0] or 256
height = s[1] or 256
# See Wikipedia notes about color depth.
# We need this just to differ images with equal sizes
icon_header["color_depth"] = (
icon_header["bpp"]
or (
icon_header["nb_color"] != 0
and ceil(log(icon_header["nb_color"], 2))
)
or 256
# No. of colors in image (0 if >=8bpp)
nb_color = s[2]
bpp = i16(s, 6)
icon_header = IconHeader(
width=width,
height=height,
nb_color=nb_color,
reserved=s[3],
planes=i16(s, 4),
bpp=i16(s, 6),
size=i32(s, 8),
offset=i32(s, 12),
dim=(width, height),
square=width * height,
# See Wikipedia notes about color depth.
# We need this just to differ images with equal sizes
color_depth=bpp or (nb_color != 0 and ceil(log(nb_color, 2))) or 256,
)
icon_header["dim"] = (icon_header["width"], icon_header["height"])
icon_header["square"] = icon_header["width"] * icon_header["height"]
self.entry.append(icon_header)
self.entry = sorted(self.entry, key=lambda x: x["color_depth"])
self.entry = sorted(self.entry, key=lambda x: x.color_depth)
# ICO images are usually squares
self.entry = sorted(self.entry, key=lambda x: x["square"], reverse=True)
self.entry = sorted(self.entry, key=lambda x: x.square, reverse=True)
def sizes(self) -> set[tuple[int, int]]:
"""
Get a list of all available icon sizes and color depths.
Get a set of all available icon sizes and color depths.
"""
return {(h["width"], h["height"]) for h in self.entry}
return {(h.width, h.height) for h in self.entry}
def getentryindex(self, size: tuple[int, int], bpp: int | bool = False) -> int:
for i, h in enumerate(self.entry):
if size == h["dim"] and (bpp is False or bpp == h["color_depth"]):
if size == h.dim and (bpp is False or bpp == h.color_depth):
return i
return 0
@ -202,9 +209,9 @@ class IcoFile:
header = self.entry[idx]
self.buf.seek(header["offset"])
self.buf.seek(header.offset)
data = self.buf.read(8)
self.buf.seek(header["offset"])
self.buf.seek(header.offset)
im: Image.Image
if data[:8] == PngImagePlugin._MAGIC:
@ -222,8 +229,7 @@ class IcoFile:
im.tile[0] = d, (0, 0) + im.size, o, a
# figure out where AND mask image starts
bpp = header["bpp"]
if 32 == bpp:
if header.bpp == 32:
# 32-bit color depth icon image allows semitransparent areas
# PIL's DIB format ignores transparency bits, recover them.
# The DIB is packed in BGRX byte order where X is the alpha
@ -253,7 +259,7 @@ class IcoFile:
# padded row size * height / bits per char
total_bytes = int((w * im.size[1]) / 8)
and_mask_offset = header["offset"] + header["size"] - total_bytes
and_mask_offset = header.offset + header.size - total_bytes
self.buf.seek(and_mask_offset)
mask_data = self.buf.read(total_bytes)
@ -307,7 +313,7 @@ class IcoImageFile(ImageFile.ImageFile):
def _open(self) -> None:
self.ico = IcoFile(self.fp)
self.info["sizes"] = self.ico.sizes()
self.size = self.ico.entry[0]["dim"]
self.size = self.ico.entry[0].dim
self.load()
@property

View File

@ -3286,7 +3286,7 @@ def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image:
return frombuffer(mode, size, obj, "raw", rawmode, 0, 1)
def fromqimage(im):
def fromqimage(im) -> ImageFile.ImageFile:
"""Creates an image instance from a QImage image"""
from . import ImageQt
@ -3296,7 +3296,7 @@ def fromqimage(im):
return ImageQt.fromqimage(im)
def fromqpixmap(im):
def fromqpixmap(im) -> ImageFile.ImageFile:
"""Creates an image instance from a QPixmap image"""
from . import ImageQt
@ -3867,7 +3867,7 @@ class Exif(_ExifBase):
# returns a dict with any single item tuples/lists as individual values
return {k: self._fixup(v) for k, v in src_dict.items()}
def _get_ifd_dict(self, offset, group=None):
def _get_ifd_dict(self, offset: int, group=None):
try:
# an offset pointer to the location of the nested embedded IFD.
# It should be a long, but may be corrupted.
@ -3881,7 +3881,7 @@ class Exif(_ExifBase):
info.load(self.fp)
return self._fixup_dict(info)
def _get_head(self):
def _get_head(self) -> bytes:
version = b"\x2B" if self.bigtiff else b"\x2A"
if self.endian == "<":
head = b"II" + version + b"\x00" + o32le(8)
@ -4102,16 +4102,16 @@ class Exif(_ExifBase):
keys.update(self._info)
return len(keys)
def __getitem__(self, tag):
def __getitem__(self, tag: int):
if self._info is not None and tag not in self._data and tag in self._info:
self._data[tag] = self._fixup(self._info[tag])
del self._info[tag]
return self._data[tag]
def __contains__(self, tag) -> bool:
def __contains__(self, tag: object) -> bool:
return tag in self._data or (self._info is not None and tag in self._info)
def __setitem__(self, tag, value) -> None:
def __setitem__(self, tag: int, value) -> None:
if self._info is not None and tag in self._info:
del self._info[tag]
self._data[tag] = value

View File

@ -86,7 +86,7 @@ def raise_oserror(error: int) -> OSError:
raise _get_oserror(error, encoder=False)
def _tilesort(t):
def _tilesort(t) -> int:
# sort on offset
return t[2]
@ -163,7 +163,7 @@ class ImageFile(Image.Image):
return Image.MIME.get(self.format.upper())
return None
def __setstate__(self, state):
def __setstate__(self, state) -> None:
self.tile = []
super().__setstate__(state)
@ -335,14 +335,14 @@ class ImageFile(Image.Image):
# def load_read(self, read_bytes: int) -> bytes:
# pass
def _seek_check(self, frame):
def _seek_check(self, frame: int) -> bool:
if (
frame < self._min_frame
# Only check upper limit on frames if additional seek operations
# are not required to do so
or (
not (hasattr(self, "_n_frames") and self._n_frames is None)
and frame >= self.n_frames + self._min_frame
and frame >= getattr(self, "n_frames") + self._min_frame
)
):
msg = "attempt to seek outside sequence"
@ -372,7 +372,7 @@ class StubImageFile(ImageFile):
msg = "StubImageFile subclass must implement _open"
raise NotImplementedError(msg)
def load(self):
def load(self) -> Image.core.PixelAccess | None:
loader = self._load()
if loader is None:
msg = f"cannot find loader for this {self.format} file"
@ -380,7 +380,7 @@ class StubImageFile(ImageFile):
image = loader.load(self)
assert image is not None
# become the other object (!)
self.__class__ = image.__class__
self.__class__ = image.__class__ # type: ignore[assignment]
self.__dict__ = image.__dict__
return image.load()
@ -398,8 +398,8 @@ class Parser:
incremental = None
image: Image.Image | None = None
data = None
decoder = None
data: bytes | None = None
decoder: Image.core.ImagingDecoder | PyDecoder | None = None
offset = 0
finished = 0
@ -411,7 +411,7 @@ class Parser:
"""
assert self.data is None, "cannot reuse parsers"
def feed(self, data):
def feed(self, data: bytes) -> None:
"""
(Consumer) Feed data to the parser.
@ -493,7 +493,7 @@ class Parser:
def __exit__(self, *args: object) -> None:
self.close()
def close(self):
def close(self) -> Image.Image:
"""
(Consumer) Close the stream.
@ -527,7 +527,7 @@ class Parser:
# --------------------------------------------------------------------
def _save(im, fp, tile, bufsize=0) -> None:
def _save(im, fp, tile, bufsize: int = 0) -> None:
"""Helper to save image based on tile list
:param im: Image object.
@ -555,7 +555,9 @@ def _save(im, fp, tile, bufsize=0) -> None:
fp.flush()
def _encode_tile(im, fp, tile: list[_Tile], bufsize, fh, exc=None):
def _encode_tile(
im, fp: IO[bytes], tile: list[_Tile], bufsize: int, fh, exc=None
) -> None:
for encoder_name, extents, offset, args in tile:
if offset > 0:
fp.seek(offset)
@ -631,18 +633,18 @@ class PyCodecState:
class PyCodec:
fd: IO[bytes] | None
def __init__(self, mode, *args):
self.im = None
def __init__(self, mode: str, *args: Any) -> None:
self.im: Image.core.ImagingCore | None = None
self.state = PyCodecState()
self.fd = None
self.mode = mode
self.init(args)
def init(self, args) -> None:
def init(self, args: tuple[Any, ...]) -> None:
"""
Override to perform codec specific initialization
:param args: Array of args items from the tile entry
:param args: Tuple of arg items from the tile entry
:returns: None
"""
self.args = args
@ -655,7 +657,7 @@ class PyCodec:
"""
pass
def setfd(self, fd) -> None:
def setfd(self, fd: IO[bytes]) -> None:
"""
Called from ImageFile to set the Python file-like object
@ -664,7 +666,7 @@ class PyCodec:
"""
self.fd = fd
def setimage(self, im, extents: tuple[int, int, int, int] | None = None) -> None:
def setimage(self, im, extents=None):
"""
Called from ImageFile to set the core output image for the codec

View File

@ -249,14 +249,21 @@ def lambda_eval(
:py:func:`~PIL.Image.merge` function.
:param expression: A function that receives a dictionary.
:param options: Values to add to the function's dictionary. You
can either use a dictionary, or one or more keyword
arguments.
:param options: Values to add to the function's dictionary. Deprecated.
You can instead use one or more keyword arguments.
:param **kw: Values to add to the function's dictionary.
:return: The expression result. This is usually an image object, but can
also be an integer, a floating point value, or a pixel tuple,
depending on the expression.
"""
if options:
deprecate(
"ImageMath.lambda_eval options",
12,
"ImageMath.lambda_eval keyword arguments",
)
args: dict[str, Any] = ops.copy()
args.update(options)
args.update(kw)
@ -287,14 +294,21 @@ def unsafe_eval(
:py:func:`~PIL.Image.merge` function.
:param expression: A string containing a Python-style expression.
:param options: Values to add to the evaluation context. You
can either use a dictionary, or one or more keyword
arguments.
:param options: Values to add to the evaluation context. Deprecated.
You can instead use one or more keyword arguments.
:param **kw: Values to add to the evaluation context.
:return: The evaluated expression. This is usually an image object, but can
also be an integer, a floating point value, or a pixel tuple,
depending on the expression.
"""
if options:
deprecate(
"ImageMath.unsafe_eval options",
12,
"ImageMath.unsafe_eval keyword arguments",
)
# build execution namespace
args: dict[str, Any] = ops.copy()
for k in list(options.keys()) + list(kw.keys()):

View File

@ -19,11 +19,14 @@ from __future__ import annotations
import sys
from io import BytesIO
from typing import Callable
from typing import TYPE_CHECKING, Callable
from . import Image
from ._util import is_path
if TYPE_CHECKING:
from . import ImageFile
qt_version: str | None
qt_versions = [
["6", "PyQt6"],
@ -90,11 +93,11 @@ def fromqimage(im):
return Image.open(b)
def fromqpixmap(im):
def fromqpixmap(im) -> ImageFile.ImageFile:
return fromqimage(im)
def align8to32(bytes, width, mode):
def align8to32(bytes: bytes, width: int, mode: str) -> bytes:
"""
converts each scanline of data from 8 bit to 32 bit aligned
"""
@ -172,7 +175,7 @@ def _toqclass_helper(im):
if qt_is_installed:
class ImageQt(QImage):
def __init__(self, im):
def __init__(self, im) -> None:
"""
An PIL image wrapper for Qt. This is a subclass of PyQt's QImage
class.

View File

@ -33,7 +33,7 @@ class Iterator:
:param im: An image object.
"""
def __init__(self, im: Image.Image):
def __init__(self, im: Image.Image) -> None:
if not hasattr(im, "seek"):
msg = "im must have seek method"
raise AttributeError(msg)

View File

@ -70,11 +70,14 @@ class Dib:
"""
def __init__(
self, image: Image.Image | str, size: tuple[int, int] | list[int] | None = None
self, image: Image.Image | str, size: tuple[int, int] | None = None
) -> None:
if isinstance(image, str):
mode = image
image = ""
if size is None:
msg = "If first argument is mode, size is required"
raise ValueError(msg)
else:
mode = image.mode
size = image.size
@ -105,7 +108,12 @@ class Dib:
result = self.image.expose(handle)
return result
def draw(self, handle, dst, src=None):
def draw(
self,
handle,
dst: tuple[int, int, int, int],
src: tuple[int, int, int, int] | None = None,
):
"""
Same as expose, but allows you to specify where to draw the image, and
what part of it to draw.
@ -115,7 +123,7 @@ class Dib:
the destination have different sizes, the image is resized as
necessary.
"""
if not src:
if src is None:
src = (0, 0) + self.size
if isinstance(handle, HWND):
dc = self.image.getdc(handle)
@ -202,22 +210,22 @@ class Window:
title, self.__dispatcher, width or 0, height or 0
)
def __dispatcher(self, action, *args):
def __dispatcher(self, action: str, *args):
return getattr(self, f"ui_handle_{action}")(*args)
def ui_handle_clear(self, dc, x0, y0, x1, y1):
def ui_handle_clear(self, dc, x0, y0, x1, y1) -> None:
pass
def ui_handle_damage(self, x0, y0, x1, y1):
def ui_handle_damage(self, x0, y0, x1, y1) -> None:
pass
def ui_handle_destroy(self) -> None:
pass
def ui_handle_repair(self, dc, x0, y0, x1, y1):
def ui_handle_repair(self, dc, x0, y0, x1, y1) -> None:
pass
def ui_handle_resize(self, width, height):
def ui_handle_resize(self, width, height) -> None:
pass
def mainloop(self) -> None:
@ -227,12 +235,12 @@ class Window:
class ImageWindow(Window):
"""Create an image window which displays the given image."""
def __init__(self, image, title="PIL"):
def __init__(self, image, title: str = "PIL") -> None:
if not isinstance(image, Dib):
image = Dib(image)
self.image = image
width, height = image.size
super().__init__(title, width=width, height=height)
def ui_handle_repair(self, dc, x0, y0, x1, y1):
def ui_handle_repair(self, dc, x0, y0, x1, y1) -> None:
self.image.draw(dc, (x0, y0, x1, y1))

View File

@ -18,6 +18,7 @@ from __future__ import annotations
from collections.abc import Sequence
from io import BytesIO
from typing import cast
from . import Image, ImageFile
from ._binary import i16be as i16
@ -184,7 +185,7 @@ Image.register_open(IptcImageFile.format, IptcImageFile)
Image.register_extension(IptcImageFile.format, ".iim")
def getiptcinfo(im):
def getiptcinfo(im: ImageFile.ImageFile):
"""
Get IPTC information from TIFF, JPEG, or IPTC file.
@ -221,16 +222,17 @@ def getiptcinfo(im):
class FakeImage:
pass
im = FakeImage()
im.__class__ = IptcImageFile
fake_im = FakeImage()
fake_im.__class__ = IptcImageFile # type: ignore[assignment]
iptc_im = cast(IptcImageFile, fake_im)
# parse the IPTC information chunk
im.info = {}
im.fp = BytesIO(data)
iptc_im.info = {}
iptc_im.fp = BytesIO(data)
try:
im._open()
iptc_im._open()
except (IndexError, KeyError):
pass # expected failure
return im.info
return iptc_im.info

View File

@ -685,7 +685,11 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
raise ValueError(msg)
subsampling = get_sampling(im)
def validate_qtables(qtables):
def validate_qtables(
qtables: (
str | tuple[list[int], ...] | list[list[int]] | dict[int, list[int]] | None
)
) -> list[list[int]] | None:
if qtables is None:
return qtables
if isinstance(qtables, str):
@ -715,12 +719,12 @@ def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
if len(table) != 64:
msg = "Invalid quantization table"
raise TypeError(msg)
table = array.array("H", table)
table_array = array.array("H", table)
except TypeError as e:
msg = "Invalid quantization table"
raise ValueError(msg) from e
else:
qtables[idx] = list(table)
qtables[idx] = list(table_array)
return qtables
if qtables == "keep":
@ -827,11 +831,11 @@ def _save_cjpeg(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
##
# Factory for making JPEG and MPO instances
def jpeg_factory(fp=None, filename=None):
def jpeg_factory(fp: IO[bytes] | None = None, filename: str | bytes | None = None):
im = JpegImageFile(fp, filename)
try:
mpheader = im._getmp()
if mpheader[45057] > 1:
if mpheader is not None and mpheader[45057] > 1:
for segment, content in im.applist:
if segment == "APP1" and b' hdrgm:Version="' in content:
# Ultra HDR images are not yet supported

View File

@ -174,12 +174,15 @@ def _write_image(im, filename, existing_pdf, image_refs):
return image_ref, procset
def _save(im, fp, filename, save_all=False):
def _save(
im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False
) -> None:
is_appending = im.encoderinfo.get("append", False)
filename_str = filename.decode() if isinstance(filename, bytes) else filename
if is_appending:
existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b")
existing_pdf = PdfParser.PdfParser(f=fp, filename=filename_str, mode="r+b")
else:
existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b")
existing_pdf = PdfParser.PdfParser(f=fp, filename=filename_str, mode="w+b")
dpi = im.encoderinfo.get("dpi")
if dpi:
@ -228,12 +231,7 @@ def _save(im, fp, filename, save_all=False):
for im in ims:
im_number_of_pages = 1
if save_all:
try:
im_number_of_pages = im.n_frames
except AttributeError:
# Image format does not have n_frames.
# It is a single frame image
pass
im_number_of_pages = getattr(im, "n_frames", 1)
number_of_pages += im_number_of_pages
for i in range(im_number_of_pages):
image_refs.append(existing_pdf.next_object_id(0))
@ -250,7 +248,9 @@ def _save(im, fp, filename, save_all=False):
page_number = 0
for im_sequence in ims:
im_pages = ImageSequence.Iterator(im_sequence) if save_all else [im_sequence]
im_pages: ImageSequence.Iterator | list[Image.Image] = (
ImageSequence.Iterator(im_sequence) if save_all else [im_sequence]
)
for im in im_pages:
image_ref, procset = _write_image(im, filename, existing_pdf, image_refs)

View File

@ -39,7 +39,7 @@ import struct
import warnings
import zlib
from enum import IntEnum
from typing import IO, TYPE_CHECKING, Any, NoReturn
from typing import IO, TYPE_CHECKING, Any, NamedTuple, NoReturn
from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence
from ._binary import i16be as i16
@ -144,7 +144,7 @@ def _safe_zlib_decompress(s):
return plaintext
def _crc32(data, seed=0):
def _crc32(data: bytes, seed: int = 0) -> int:
return zlib.crc32(data, seed) & 0xFFFFFFFF
@ -191,7 +191,7 @@ class ChunkStream:
assert self.queue is not None
self.queue.append((cid, pos, length))
def call(self, cid, pos, length):
def call(self, cid: bytes, pos: int, length: int) -> bytes:
"""Call the appropriate chunk handler"""
logger.debug("STREAM %r %s %s", cid, pos, length)
@ -1091,21 +1091,21 @@ _OUTMODES = {
}
def putchunk(fp, cid, *data):
def putchunk(fp: IO[bytes], cid: bytes, *data: bytes) -> None:
"""Write a PNG chunk (including CRC field)"""
data = b"".join(data)
byte_data = b"".join(data)
fp.write(o32(len(data)) + cid)
fp.write(data)
crc = _crc32(data, _crc32(cid))
fp.write(o32(len(byte_data)) + cid)
fp.write(byte_data)
crc = _crc32(byte_data, _crc32(cid))
fp.write(o32(crc))
class _idat:
# wrap output from the encoder in IDAT chunks
def __init__(self, fp, chunk):
def __init__(self, fp, chunk) -> None:
self.fp = fp
self.chunk = chunk
@ -1116,7 +1116,7 @@ class _idat:
class _fdat:
# wrap encoder output in fdAT chunks
def __init__(self, fp, chunk, seq_num):
def __init__(self, fp: IO[bytes], chunk, seq_num: int) -> None:
self.fp = fp
self.chunk = chunk
self.seq_num = seq_num
@ -1126,7 +1126,21 @@ class _fdat:
self.seq_num += 1
def _write_multiple_frames(im, fp, chunk, mode, rawmode, default_image, append_images):
class _Frame(NamedTuple):
im: Image.Image
bbox: tuple[int, int, int, int] | None
encoderinfo: dict[str, Any]
def _write_multiple_frames(
im: Image.Image,
fp: IO[bytes],
chunk,
mode: str,
rawmode: str,
default_image: Image.Image | None,
append_images: list[Image.Image],
) -> Image.Image | None:
duration = im.encoderinfo.get("duration")
loop = im.encoderinfo.get("loop", im.info.get("loop", 0))
disposal = im.encoderinfo.get("disposal", im.info.get("disposal", Disposal.OP_NONE))
@ -1137,7 +1151,7 @@ def _write_multiple_frames(im, fp, chunk, mode, rawmode, default_image, append_i
else:
chain = itertools.chain([im], append_images)
im_frames = []
im_frames: list[_Frame] = []
frame_count = 0
for im_seq in chain:
for im_frame in ImageSequence.Iterator(im_seq):
@ -1158,24 +1172,24 @@ def _write_multiple_frames(im, fp, chunk, mode, rawmode, default_image, append_i
if im_frames:
previous = im_frames[-1]
prev_disposal = previous["encoderinfo"].get("disposal")
prev_blend = previous["encoderinfo"].get("blend")
prev_disposal = previous.encoderinfo.get("disposal")
prev_blend = previous.encoderinfo.get("blend")
if prev_disposal == Disposal.OP_PREVIOUS and len(im_frames) < 2:
prev_disposal = Disposal.OP_BACKGROUND
if prev_disposal == Disposal.OP_BACKGROUND:
base_im = previous["im"].copy()
base_im = previous.im.copy()
dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0))
bbox = previous["bbox"]
bbox = previous.bbox
if bbox:
dispose = dispose.crop(bbox)
else:
bbox = (0, 0) + im.size
base_im.paste(dispose, bbox)
elif prev_disposal == Disposal.OP_PREVIOUS:
base_im = im_frames[-2]["im"]
base_im = im_frames[-2].im
else:
base_im = previous["im"]
base_im = previous.im
delta = ImageChops.subtract_modulo(
im_frame.convert("RGBA"), base_im.convert("RGBA")
)
@ -1186,14 +1200,14 @@ def _write_multiple_frames(im, fp, chunk, mode, rawmode, default_image, append_i
and prev_blend == encoderinfo.get("blend")
and "duration" in encoderinfo
):
previous["encoderinfo"]["duration"] += encoderinfo["duration"]
previous.encoderinfo["duration"] += encoderinfo["duration"]
continue
else:
bbox = None
im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo})
im_frames.append(_Frame(im_frame, bbox, encoderinfo))
if len(im_frames) == 1 and not default_image:
return im_frames[0]["im"]
return im_frames[0].im
# animation control
chunk(
@ -1211,14 +1225,14 @@ def _write_multiple_frames(im, fp, chunk, mode, rawmode, default_image, append_i
seq_num = 0
for frame, frame_data in enumerate(im_frames):
im_frame = frame_data["im"]
if not frame_data["bbox"]:
im_frame = frame_data.im
if not frame_data.bbox:
bbox = (0, 0) + im_frame.size
else:
bbox = frame_data["bbox"]
bbox = frame_data.bbox
im_frame = im_frame.crop(bbox)
size = im_frame.size
encoderinfo = frame_data["encoderinfo"]
encoderinfo = frame_data.encoderinfo
frame_duration = int(round(encoderinfo.get("duration", 0)))
frame_disposal = encoderinfo.get("disposal", disposal)
frame_blend = encoderinfo.get("blend", blend)
@ -1253,13 +1267,16 @@ def _write_multiple_frames(im, fp, chunk, mode, rawmode, default_image, append_i
[("zip", (0, 0) + im_frame.size, 0, rawmode)],
)
seq_num = fdat_chunks.seq_num
return None
def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None:
_save(im, fp, filename, save_all=True)
def _save(im, fp, filename, chunk=putchunk, save_all=False):
def _save(
im: Image.Image, fp, filename: str | bytes, chunk=putchunk, save_all: bool = False
) -> None:
# save an image to disk (called by the save method)
if save_all:
@ -1435,12 +1452,15 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False):
exif = exif[6:]
chunk(fp, b"eXIf", exif)
single_im: Image.Image | None = im
if save_all:
im = _write_multiple_frames(
single_im = _write_multiple_frames(
im, fp, chunk, mode, rawmode, default_image, append_images
)
if im:
ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)])
if single_im:
ImageFile._save(
single_im, _idat(fp, chunk), [("zip", (0, 0) + single_im.size, 0, rawmode)]
)
if info:
for info_chunk in info.chunks:
@ -1461,7 +1481,7 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False):
# PNG chunk converter
def getchunks(im, **params):
def getchunks(im: Image.Image, **params: Any) -> list[tuple[bytes, bytes, bytes]]:
"""Return a list of PNG chunks representing this image."""
class collector:
@ -1470,19 +1490,19 @@ def getchunks(im, **params):
def write(self, data: bytes) -> None:
pass
def append(self, chunk: bytes) -> None:
def append(self, chunk: tuple[bytes, bytes, bytes]) -> None:
self.data.append(chunk)
def append(fp, cid, *data):
data = b"".join(data)
crc = o32(_crc32(data, _crc32(cid)))
fp.append((cid, data, crc))
def append(fp: collector, cid: bytes, *data: bytes) -> None:
byte_data = b"".join(data)
crc = o32(_crc32(byte_data, _crc32(cid)))
fp.append((cid, byte_data, crc))
fp = collector()
try:
im.encoderinfo = params
_save(im, fp, None, append)
_save(im, fp, "", append)
finally:
del im.encoderinfo

View File

@ -55,13 +55,3 @@ class TarIO(ContainerIO.ContainerIO[bytes]):
# Open region
super().__init__(self.fh, self.fh.tell(), size)
# Context manager support
def __enter__(self) -> TarIO:
return self
def __exit__(self, *args: object) -> None:
self.close()
def close(self) -> None:
self.fh.close()

View File

@ -380,12 +380,13 @@ class IFDRational(Rational):
__slots__ = ("_numerator", "_denominator", "_val")
def __init__(self, value, denominator=1):
def __init__(self, value, denominator: int = 1) -> None:
"""
:param value: either an integer numerator, a
float/rational/other number, or an IFDRational
:param denominator: Optional integer denominator
"""
self._val: Fraction | float
if isinstance(value, IFDRational):
self._numerator = value.numerator
self._denominator = value.denominator
@ -682,13 +683,13 @@ class ImageFileDirectory_v2(_IFDv2Base):
val = (val,)
return val
def __contains__(self, tag):
def __contains__(self, tag: object) -> bool:
return tag in self._tags_v2 or tag in self._tagdata
def __setitem__(self, tag, value):
def __setitem__(self, tag, value) -> None:
self._setitem(tag, value, self.legacy_api)
def _setitem(self, tag, value, legacy_api):
def _setitem(self, tag, value, legacy_api) -> None:
basetypes = (Number, bytes, str)
info = TiffTags.lookup(tag, self.group)
@ -804,7 +805,7 @@ class ImageFileDirectory_v2(_IFDv2Base):
return data
@_register_writer(1) # Basic type, except for the legacy API.
def write_byte(self, data):
def write_byte(self, data) -> bytes:
if isinstance(data, IFDRational):
data = int(data)
if isinstance(data, int):
@ -818,7 +819,7 @@ class ImageFileDirectory_v2(_IFDv2Base):
return data.decode("latin-1", "replace")
@_register_writer(2)
def write_string(self, value):
def write_string(self, value) -> bytes:
# remerge of https://github.com/python-pillow/Pillow/pull/1416
if isinstance(value, int):
value = str(value)
@ -836,7 +837,7 @@ class ImageFileDirectory_v2(_IFDv2Base):
return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2]))
@_register_writer(5)
def write_rational(self, *values):
def write_rational(self, *values) -> bytes:
return b"".join(
self._pack("2L", *_limit_rational(frac, 2**32 - 1)) for frac in values
)
@ -846,7 +847,7 @@ class ImageFileDirectory_v2(_IFDv2Base):
return data
@_register_writer(7)
def write_undefined(self, value):
def write_undefined(self, value) -> bytes:
if isinstance(value, IFDRational):
value = int(value)
if isinstance(value, int):
@ -863,13 +864,13 @@ class ImageFileDirectory_v2(_IFDv2Base):
return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2]))
@_register_writer(10)
def write_signed_rational(self, *values):
def write_signed_rational(self, *values) -> bytes:
return b"".join(
self._pack("2l", *_limit_signed_rational(frac, 2**31 - 1, -(2**31)))
for frac in values
)
def _ensure_read(self, fp, size):
def _ensure_read(self, fp: IO[bytes], size: int) -> bytes:
ret = fp.read(size)
if len(ret) != size:
msg = (
@ -1023,7 +1024,7 @@ class ImageFileDirectory_v2(_IFDv2Base):
return result
def save(self, fp):
def save(self, fp: IO[bytes]) -> int:
if fp.tell() == 0: # skip TIFF header on subsequent pages
# tiff header -- PIL always starts the first IFD at offset 8
fp.write(self._prefix + self._pack("HL", 42, 8))
@ -1063,7 +1064,7 @@ class ImageFileDirectory_v1(ImageFileDirectory_v2):
.. deprecated:: 3.0.0
"""
def __init__(self, *args, **kwargs):
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
self._legacy_api = True
@ -1075,7 +1076,7 @@ class ImageFileDirectory_v1(ImageFileDirectory_v2):
"""Dictionary of tag types"""
@classmethod
def from_v2(cls, original):
def from_v2(cls, original) -> ImageFileDirectory_v1:
"""Returns an
:py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
instance with the same data as is contained in the original
@ -1109,7 +1110,7 @@ class ImageFileDirectory_v1(ImageFileDirectory_v2):
ifd._tags_v2 = dict(self._tags_v2)
return ifd
def __contains__(self, tag):
def __contains__(self, tag: object) -> bool:
return tag in self._tags_v1 or tag in self._tagdata
def __len__(self) -> int:
@ -1118,7 +1119,7 @@ class ImageFileDirectory_v1(ImageFileDirectory_v2):
def __iter__(self):
return iter(set(self._tagdata) | set(self._tags_v1))
def __setitem__(self, tag, value):
def __setitem__(self, tag, value) -> None:
for legacy_api in (False, True):
self._setitem(tag, value, legacy_api)
@ -1168,7 +1169,7 @@ class TiffImageFile(ImageFile.ImageFile):
self.tag_v2 = ImageFileDirectory_v2(ifh)
# legacy IFD entries will be filled in later
self.ifd = None
self.ifd: ImageFileDirectory_v1 | None = None
# setup frame pointers
self.__first = self.__next = self.tag_v2.next
@ -1389,7 +1390,7 @@ class TiffImageFile(ImageFile.ImageFile):
return Image.Image.load(self)
def _setup(self):
def _setup(self) -> None:
"""Setup this image object based on current tags"""
if 0xBC01 in self.tag_v2:
@ -1578,13 +1579,13 @@ class TiffImageFile(ImageFile.ImageFile):
# adjust stride width accordingly
stride /= bps_count
a = (tile_rawmode, int(stride), 1)
args = (tile_rawmode, int(stride), 1)
self.tile.append(
(
self._compression,
(x, y, min(x + w, xsize), min(y + h, ysize)),
offset,
a,
args,
)
)
x = x + w
@ -1979,7 +1980,7 @@ class AppendingTiffWriter:
521, # JPEGACTables
}
def __init__(self, fn, new=False):
def __init__(self, fn, new: bool = False) -> None:
if hasattr(fn, "read"):
self.f = fn
self.close_fp = False
@ -2056,7 +2057,7 @@ class AppendingTiffWriter:
def tell(self) -> int:
return self.f.tell() - self.offsetOfNewPage
def seek(self, offset, whence=io.SEEK_SET):
def seek(self, offset: int, whence=io.SEEK_SET) -> int:
if whence == os.SEEK_SET:
offset += self.offsetOfNewPage

View File

@ -24,8 +24,11 @@ and has been tested with a few sample files found using google.
"""
from __future__ import annotations
from typing import IO
from . import Image, ImageFile
from ._binary import i32le as i32
from ._typing import StrOrBytesPath
class WalImageFile(ImageFile.ImageFile):
@ -58,7 +61,7 @@ class WalImageFile(ImageFile.ImageFile):
return Image.Image.load(self)
def open(filename):
def open(filename: StrOrBytesPath | IO[bytes]) -> WalImageFile:
"""
Load texture from a Quake2 WAL texture file.

View File

@ -80,7 +80,8 @@ typedef struct Tcl_Command_ *Tcl_Command;
typedef void *ClientData;
typedef int(Tcl_CmdProc)(
ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]);
ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]
);
typedef void(Tcl_CmdDeleteProc)(ClientData clientData);
/* Typedefs derived from function signatures in Tcl header */
@ -90,7 +91,8 @@ typedef Tcl_Command (*Tcl_CreateCommand_t)(
const char *cmdName,
Tcl_CmdProc *proc,
ClientData clientData,
Tcl_CmdDeleteProc *deleteProc);
Tcl_CmdDeleteProc *deleteProc
);
/* Tcl_AppendResult */
typedef void (*Tcl_AppendResult_t)(Tcl_Interp *interp, ...);
@ -127,7 +129,8 @@ typedef int (*Tk_PhotoPutBlock_t)(
int y,
int width,
int height,
int compRule);
int compRule
);
/* Tk_FindPhoto */
typedef Tk_PhotoHandle (*Tk_FindPhoto_t)(Tcl_Interp *interp, const char *imageName);
/* Tk_PhotoGetImage */

View File

@ -73,14 +73,16 @@ ImagingFind(const char *name) {
static int
PyImagingPhotoPut(
ClientData clientdata, Tcl_Interp *interp, int argc, const char **argv) {
ClientData clientdata, Tcl_Interp *interp, int argc, const char **argv
) {
Imaging im;
Tk_PhotoHandle photo;
Tk_PhotoImageBlock block;
if (argc != 3) {
TCL_APPEND_RESULT(
interp, "usage: ", argv[0], " destPhoto srcImage", (char *)NULL);
interp, "usage: ", argv[0], " destPhoto srcImage", (char *)NULL
);
return TCL_ERROR;
}
@ -128,14 +130,16 @@ PyImagingPhotoPut(
block.pixelPtr = (unsigned char *)im->block;
TK_PHOTO_PUT_BLOCK(
interp, photo, &block, 0, 0, block.width, block.height, TK_PHOTO_COMPOSITE_SET);
interp, photo, &block, 0, 0, block.width, block.height, TK_PHOTO_COMPOSITE_SET
);
return TCL_OK;
}
static int
PyImagingPhotoGet(
ClientData clientdata, Tcl_Interp *interp, int argc, const char **argv) {
ClientData clientdata, Tcl_Interp *interp, int argc, const char **argv
) {
Imaging im;
Tk_PhotoHandle photo;
Tk_PhotoImageBlock block;
@ -143,7 +147,8 @@ PyImagingPhotoGet(
if (argc != 3) {
TCL_APPEND_RESULT(
interp, "usage: ", argv[0], " srcPhoto destImage", (char *)NULL);
interp, "usage: ", argv[0], " srcPhoto destImage", (char *)NULL
);
return TCL_ERROR;
}
@ -183,13 +188,15 @@ TkImaging_Init(Tcl_Interp *interp) {
"PyImagingPhoto",
PyImagingPhotoPut,
(ClientData)0,
(Tcl_CmdDeleteProc *)NULL);
(Tcl_CmdDeleteProc *)NULL
);
TCL_CREATE_COMMAND(
interp,
"PyImagingPhotoGet",
PyImagingPhotoGet,
(ClientData)0,
(Tcl_CmdDeleteProc *)NULL);
(Tcl_CmdDeleteProc *)NULL
);
}
/*
@ -394,7 +401,8 @@ _func_loader(void *lib) {
}
return (
(TK_PHOTO_PUT_BLOCK = (Tk_PhotoPutBlock_t)_dfunc(lib, "Tk_PhotoPutBlock")) ==
NULL);
NULL
);
}
int

View File

@ -290,7 +290,8 @@ ImagingError_ModeError(void) {
void *
ImagingError_ValueError(const char *message) {
PyErr_SetString(
PyExc_ValueError, (message) ? (char *)message : "unrecognized argument value");
PyExc_ValueError, (message) ? (char *)message : "unrecognized argument value"
);
return NULL;
}
@ -501,7 +502,8 @@ getpixel(Imaging im, ImagingAccess access, int x, int y) {
return Py_BuildValue("BBB", pixel.b[0], pixel.b[1], pixel.b[2]);
case 4:
return Py_BuildValue(
"BBBB", pixel.b[0], pixel.b[1], pixel.b[2], pixel.b[3]);
"BBBB", pixel.b[0], pixel.b[1], pixel.b[2], pixel.b[3]
);
}
break;
case IMAGING_TYPE_INT32:
@ -552,7 +554,8 @@ getink(PyObject *color, Imaging im, char *ink) {
rIsInt = 1;
} else if (im->bands == 1) {
PyErr_SetString(
PyExc_TypeError, "color must be int or single-element tuple");
PyExc_TypeError, "color must be int or single-element tuple"
);
return NULL;
} else if (tupleSize == -1) {
PyErr_SetString(PyExc_TypeError, "color must be int or tuple");
@ -568,8 +571,8 @@ getink(PyObject *color, Imaging im, char *ink) {
if (rIsInt != 1) {
if (tupleSize != 1) {
PyErr_SetString(
PyExc_TypeError,
"color must be int or single-element tuple");
PyExc_TypeError, "color must be int or single-element tuple"
);
return NULL;
} else if (!PyArg_ParseTuple(color, "L", &r)) {
return NULL;
@ -590,7 +593,8 @@ getink(PyObject *color, Imaging im, char *ink) {
if (tupleSize != 1 && tupleSize != 2) {
PyErr_SetString(
PyExc_TypeError,
"color must be int, or tuple of one or two elements");
"color must be int, or tuple of one or two elements"
);
return NULL;
} else if (!PyArg_ParseTuple(color, "L|i", &r, &a)) {
return NULL;
@ -601,7 +605,8 @@ getink(PyObject *color, Imaging im, char *ink) {
PyErr_SetString(
PyExc_TypeError,
"color must be int, or tuple of one, three or four "
"elements");
"elements"
);
return NULL;
} else if (!PyArg_ParseTuple(color, "Lii|i", &r, &g, &b, &a)) {
return NULL;
@ -642,7 +647,8 @@ getink(PyObject *color, Imaging im, char *ink) {
} else if (tupleSize != 3) {
PyErr_SetString(
PyExc_TypeError,
"color must be int, or tuple of one or three elements");
"color must be int, or tuple of one or three elements"
);
return NULL;
} else if (!PyArg_ParseTuple(color, "iiL", &b, &g, &r)) {
return NULL;
@ -768,7 +774,8 @@ _alpha_composite(ImagingObject *self, PyObject *args) {
ImagingObject *imagep2;
if (!PyArg_ParseTuple(
args, "O!O!", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2)) {
args, "O!O!", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2
)) {
return NULL;
}
@ -783,7 +790,8 @@ _blend(ImagingObject *self, PyObject *args) {
alpha = 0.5;
if (!PyArg_ParseTuple(
args, "O!O!|d", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2, &alpha)) {
args, "O!O!|d", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2, &alpha
)) {
return NULL;
}
@ -862,7 +870,8 @@ _prepare_lut_table(PyObject *table, Py_ssize_t table_size) {
break;
case TYPE_FLOAT32:
memcpy(
&item, ((char *)table_data) + i * sizeof(FLOAT32), sizeof(FLOAT32));
&item, ((char *)table_data) + i * sizeof(FLOAT32), sizeof(FLOAT32)
);
break;
case TYPE_DOUBLE:
memcpy(&dtmp, ((char *)table_data) + i * sizeof(dtmp), sizeof(dtmp));
@ -913,7 +922,8 @@ _color_lut_3d(ImagingObject *self, PyObject *args) {
&size1D,
&size2D,
&size3D,
&table)) {
&table
)) {
return NULL;
}
@ -931,7 +941,8 @@ _color_lut_3d(ImagingObject *self, PyObject *args) {
if (2 > size1D || size1D > 65 || 2 > size2D || size2D > 65 || 2 > size3D ||
size3D > 65) {
PyErr_SetString(
PyExc_ValueError, "Table size in any dimension should be from 2 to 65");
PyExc_ValueError, "Table size in any dimension should be from 2 to 65"
);
return NULL;
}
@ -949,13 +960,8 @@ _color_lut_3d(ImagingObject *self, PyObject *args) {
}
if (!ImagingColorLUT3D_linear(
imOut,
self->image,
table_channels,
size1D,
size2D,
size3D,
prepared_table)) {
imOut, self->image, table_channels, size1D, size2D, size3D, prepared_table
)) {
free(prepared_table);
ImagingDelete(imOut);
return NULL;
@ -979,7 +985,8 @@ _convert(ImagingObject *self, PyObject *args) {
if (!PyImaging_Check(paletteimage)) {
PyObject_Print((PyObject *)paletteimage, stderr, 0);
PyErr_SetString(
PyExc_ValueError, "palette argument must be image with mode 'P'");
PyExc_ValueError, "palette argument must be image with mode 'P'"
);
return NULL;
}
if (paletteimage->image->palette == NULL) {
@ -989,7 +996,8 @@ _convert(ImagingObject *self, PyObject *args) {
}
return PyImagingNew(ImagingConvert(
self->image, mode, paletteimage ? paletteimage->image->palette : NULL, dither));
self->image, mode, paletteimage ? paletteimage->image->palette : NULL, dither
));
}
static PyObject *
@ -997,7 +1005,8 @@ _convert2(ImagingObject *self, PyObject *args) {
ImagingObject *imagep1;
ImagingObject *imagep2;
if (!PyArg_ParseTuple(
args, "O!O!", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2)) {
args, "O!O!", &Imaging_Type, &imagep1, &Imaging_Type, &imagep2
)) {
return NULL;
}
@ -1030,7 +1039,8 @@ _convert_matrix(ImagingObject *self, PyObject *args) {
m + 8,
m + 9,
m + 10,
m + 11)) {
m + 11
)) {
return NULL;
}
}
@ -1091,7 +1101,8 @@ _filter(ImagingObject *self, PyObject *args) {
float divisor, offset;
PyObject *kernel = NULL;
if (!PyArg_ParseTuple(
args, "(ii)ffO", &xsize, &ysize, &divisor, &offset, &kernel)) {
args, "(ii)ffO", &xsize, &ysize, &divisor, &offset, &kernel
)) {
return NULL;
}
@ -1174,7 +1185,8 @@ _getpalette(ImagingObject *self, PyObject *args) {
}
pack(
(UINT8 *)PyBytes_AsString(palette), self->image->palette->palette, palettesize);
(UINT8 *)PyBytes_AsString(palette), self->image->palette->palette, palettesize
);
return palette;
}
@ -1268,7 +1280,8 @@ union hist_extrema {
static union hist_extrema *
parse_histogram_extremap(
ImagingObject *self, PyObject *extremap, union hist_extrema *ep) {
ImagingObject *self, PyObject *extremap, union hist_extrema *ep
) {
int i0, i1;
double f0, f1;
@ -1428,7 +1441,8 @@ _paste(ImagingObject *self, PyObject *args) {
int x0, y0, x1, y1;
ImagingObject *maskp = NULL;
if (!PyArg_ParseTuple(
args, "O(iiii)|O!", &source, &x0, &y0, &x1, &y1, &Imaging_Type, &maskp)) {
args, "O(iiii)|O!", &source, &x0, &y0, &x1, &y1, &Imaging_Type, &maskp
)) {
return NULL;
}
@ -1440,14 +1454,16 @@ _paste(ImagingObject *self, PyObject *args) {
x0,
y0,
x1,
y1);
y1
);
} else {
if (!getink(source, self->image, ink)) {
return NULL;
}
status = ImagingFill2(
self->image, ink, (maskp) ? maskp->image : NULL, x0, y0, x1, y1);
self->image, ink, (maskp) ? maskp->image : NULL, x0, y0, x1, y1
);
}
if (status < 0) {
@ -1766,7 +1782,8 @@ _putpalette(ImagingObject *self, PyObject *args) {
UINT8 *palette;
Py_ssize_t palettesize;
if (!PyArg_ParseTuple(
args, "ssy#", &palette_mode, &rawmode, &palette, &palettesize)) {
args, "ssy#", &palette_mode, &rawmode, &palette, &palettesize
)) {
return NULL;
}
@ -1924,7 +1941,8 @@ _resize(ImagingObject *self, PyObject *args) {
&box[0],
&box[1],
&box[2],
&box[3])) {
&box[3]
)) {
return NULL;
}
@ -1960,7 +1978,8 @@ _resize(ImagingObject *self, PyObject *args) {
imOut = ImagingNewDirty(imIn->mode, (ImagingNewParams){xsize, ysize});
imOut = ImagingTransform(
imOut, imIn, IMAGING_TRANSFORM_AFFINE, 0, 0, xsize, ysize, a, filter, 1);
imOut, imIn, IMAGING_TRANSFORM_AFFINE, 0, 0, xsize, ysize, a, filter, 1
);
} else {
imOut = ImagingResample(imIn, xsize, ysize, filter, box);
}
@ -1981,14 +2000,8 @@ _reduce(ImagingObject *self, PyObject *args) {
box[3] = imIn->ysize;
if (!PyArg_ParseTuple(
args,
"(ii)|(iiii)",
&xscale,
&yscale,
&box[0],
&box[1],
&box[2],
&box[3])) {
args, "(ii)|(iiii)", &xscale, &yscale, &box[0], &box[1], &box[2], &box[3]
)) {
return NULL;
}
@ -2090,7 +2103,8 @@ _transform(ImagingObject *self, PyObject *args) {
&method,
&data,
&filter,
&fill)) {
&fill
)) {
return NULL;
}
@ -2114,7 +2128,8 @@ _transform(ImagingObject *self, PyObject *args) {
}
imOut = ImagingTransform(
self->image, imagep->image, method, x0, y0, x1, y1, a, filter, fill);
self->image, imagep->image, method, x0, y0, x1, y1, a, filter, fill
);
free(a);
@ -2291,7 +2306,13 @@ _getcolors(ImagingObject *self, PyObject *args) {
for (i = 0; i < colors; i++) {
ImagingColorItem *v = &items[i];
PyObject *item = Py_BuildValue(
"iN", v->count, getpixel(self->image, self->access, v->x, v->y));
"iN", v->count, getpixel(self->image, self->access, v->x, v->y)
);
if (item == NULL) {
Py_DECREF(out);
free(items);
return NULL;
}
PyList_SetItem(out, i, item);
}
}
@ -2352,14 +2373,16 @@ _getprojection(ImagingObject *self) {
}
ImagingGetProjection(
self->image, (unsigned char *)xprofile, (unsigned char *)yprofile);
self->image, (unsigned char *)xprofile, (unsigned char *)yprofile
);
result = Py_BuildValue(
"y#y#",
xprofile,
(Py_ssize_t)self->image->xsize,
yprofile,
(Py_ssize_t)self->image->ysize);
(Py_ssize_t)self->image->ysize
);
free(xprofile);
free(yprofile);
@ -2433,7 +2456,8 @@ _merge(PyObject *self, PyObject *args) {
&Imaging_Type,
&band2,
&Imaging_Type,
&band3)) {
&band3
)) {
return NULL;
}
@ -2679,7 +2703,8 @@ _font_new(PyObject *self_, PyObject *args) {
unsigned char *glyphdata;
Py_ssize_t glyphdata_length;
if (!PyArg_ParseTuple(
args, "O!y#", &Imaging_Type, &imagep, &glyphdata, &glyphdata_length)) {
args, "O!y#", &Imaging_Type, &imagep, &glyphdata, &glyphdata_length
)) {
return NULL;
}
@ -2838,7 +2863,8 @@ _font_getmask(ImagingFontObject *self, PyObject *args) {
if (i == 0 || text[i] != text[i - 1]) {
ImagingDelete(bitmap);
bitmap = ImagingCrop(
self->bitmap, glyph->sx0, glyph->sy0, glyph->sx1, glyph->sy1);
self->bitmap, glyph->sx0, glyph->sy0, glyph->sx1, glyph->sy1
);
if (!bitmap) {
goto failed;
}
@ -2850,7 +2876,8 @@ _font_getmask(ImagingFontObject *self, PyObject *args) {
glyph->dx0 + x,
glyph->dy0 + b,
glyph->dx1 + x,
glyph->dy1 + b);
glyph->dy1 + b
);
if (status < 0) {
goto failed;
}
@ -2989,7 +3016,8 @@ _draw_arc(ImagingDrawObject *self, PyObject *args) {
end,
&ink,
width,
self->blend);
self->blend
);
free(xy);
@ -3019,13 +3047,15 @@ _draw_bitmap(ImagingDrawObject *self, PyObject *args) {
}
if (n != 1) {
PyErr_SetString(
PyExc_TypeError, "coordinate list must contain exactly 1 coordinate");
PyExc_TypeError, "coordinate list must contain exactly 1 coordinate"
);
free(xy);
return NULL;
}
n = ImagingDrawBitmap(
self->image->image, (int)xy[0], (int)xy[1], bitmap->image, &ink, self->blend);
self->image->image, (int)xy[0], (int)xy[1], bitmap->image, &ink, self->blend
);
free(xy);
@ -3081,7 +3111,8 @@ _draw_chord(ImagingDrawObject *self, PyObject *args) {
&ink,
fill,
width,
self->blend);
self->blend
);
free(xy);
@ -3135,7 +3166,8 @@ _draw_ellipse(ImagingDrawObject *self, PyObject *args) {
&ink,
fill,
width,
self->blend);
self->blend
);
free(xy);
@ -3175,14 +3207,16 @@ _draw_lines(ImagingDrawObject *self, PyObject *args) {
(int)p[2],
(int)p[3],
&ink,
self->blend) < 0) {
self->blend
) < 0) {
free(xy);
return NULL;
}
}
if (p) { /* draw last point */
ImagingDrawPoint(
self->image->image, (int)p[2], (int)p[3], &ink, self->blend);
self->image->image, (int)p[2], (int)p[3], &ink, self->blend
);
}
} else {
for (i = 0; i < n - 1; i++) {
@ -3195,7 +3229,8 @@ _draw_lines(ImagingDrawObject *self, PyObject *args) {
(int)p[3],
&ink,
width,
self->blend) < 0) {
self->blend
) < 0) {
free(xy);
return NULL;
}
@ -3227,7 +3262,8 @@ _draw_points(ImagingDrawObject *self, PyObject *args) {
for (i = 0; i < n; i++) {
double *p = &xy[i + i];
if (ImagingDrawPoint(
self->image->image, (int)p[0], (int)p[1], &ink, self->blend) < 0) {
self->image->image, (int)p[0], (int)p[1], &ink, self->blend
) < 0) {
free(xy);
return NULL;
}
@ -3316,7 +3352,8 @@ _draw_pieslice(ImagingDrawObject *self, PyObject *args) {
&ink,
fill,
width,
self->blend);
self->blend
);
free(xy);
@ -3348,7 +3385,8 @@ _draw_polygon(ImagingDrawObject *self, PyObject *args) {
}
if (n < 2) {
PyErr_SetString(
PyExc_TypeError, "coordinate list must contain at least 2 coordinates");
PyExc_TypeError, "coordinate list must contain at least 2 coordinates"
);
free(xy);
return NULL;
}
@ -3421,7 +3459,8 @@ _draw_rectangle(ImagingDrawObject *self, PyObject *args) {
&ink,
fill,
width,
self->blend);
self->blend
);
free(xy);
@ -3561,7 +3600,8 @@ _effect_mandelbrot(ImagingObject *self, PyObject *args) {
&extent[1],
&extent[2],
&extent[3],
&quality)) {
&quality
)) {
return NULL;
}
@ -3789,7 +3829,8 @@ _getattr_unsafe_ptrs(ImagingObject *self, void *closure) {
"image32",
self->image->image32,
"image",
self->image->image);
self->image->image
);
}
static struct PyGetSetDef getsetters[] = {
@ -3799,7 +3840,8 @@ static struct PyGetSetDef getsetters[] = {
{"id", (getter)_getattr_id},
{"ptr", (getter)_getattr_ptr},
{"unsafe_ptrs", (getter)_getattr_unsafe_ptrs},
{NULL}};
{NULL}
};
/* basic sequence semantics */
@ -4108,9 +4150,8 @@ _set_blocks_max(PyObject *self, PyObject *args) {
if (blocks_max < 0) {
PyErr_SetString(PyExc_ValueError, "blocks_max should be greater than 0");
return NULL;
} else if (
(unsigned long)blocks_max >
SIZE_MAX / sizeof(ImagingDefaultArena.blocks_pool[0])) {
} else if ((unsigned long)blocks_max >
SIZE_MAX / sizeof(ImagingDefaultArena.blocks_pool[0])) {
PyErr_SetString(PyExc_ValueError, "blocks_max is too large");
return NULL;
}
@ -4465,7 +4506,8 @@ setup_module(PyObject *m) {
PyObject *pillow_version = PyUnicode_FromString(version);
PyDict_SetItemString(
d, "PILLOW_VERSION", pillow_version ? pillow_version : Py_None);
d, "PILLOW_VERSION", pillow_version ? pillow_version : Py_None
);
Py_XDECREF(pillow_version);
return 0;
@ -4490,5 +4532,9 @@ PyInit__imaging(void) {
return NULL;
}
#ifdef Py_GIL_DISABLED
PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);
#endif
return m;
}

View File

@ -331,7 +331,8 @@ pyCMScopyAux(cmsHTRANSFORM hTransform, Imaging imDst, const Imaging imSrc) {
memcpy(
pDstExtras + x * dstChunkSize,
pSrcExtras + x * srcChunkSize,
channelSize);
channelSize
);
}
}
}
@ -373,7 +374,8 @@ _buildTransform(
char *sInMode,
char *sOutMode,
int iRenderingIntent,
cmsUInt32Number cmsFLAGS) {
cmsUInt32Number cmsFLAGS
) {
cmsHTRANSFORM hTransform;
Py_BEGIN_ALLOW_THREADS
@ -385,7 +387,8 @@ _buildTransform(
hOutputProfile,
findLCMStype(sOutMode),
iRenderingIntent,
cmsFLAGS);
cmsFLAGS
);
Py_END_ALLOW_THREADS;
@ -405,7 +408,8 @@ _buildProofTransform(
char *sOutMode,
int iRenderingIntent,
int iProofIntent,
cmsUInt32Number cmsFLAGS) {
cmsUInt32Number cmsFLAGS
) {
cmsHTRANSFORM hTransform;
Py_BEGIN_ALLOW_THREADS
@ -419,7 +423,8 @@ _buildProofTransform(
hProofProfile,
iRenderingIntent,
iProofIntent,
cmsFLAGS);
cmsFLAGS
);
Py_END_ALLOW_THREADS;
@ -454,7 +459,8 @@ buildTransform(PyObject *self, PyObject *args) {
&sInMode,
&sOutMode,
&iRenderingIntent,
&cmsFLAGS)) {
&cmsFLAGS
)) {
return NULL;
}
@ -464,7 +470,8 @@ buildTransform(PyObject *self, PyObject *args) {
sInMode,
sOutMode,
iRenderingIntent,
cmsFLAGS);
cmsFLAGS
);
if (!transform) {
return NULL;
@ -499,7 +506,8 @@ buildProofTransform(PyObject *self, PyObject *args) {
&sOutMode,
&iRenderingIntent,
&iProofIntent,
&cmsFLAGS)) {
&cmsFLAGS
)) {
return NULL;
}
@ -511,7 +519,8 @@ buildProofTransform(PyObject *self, PyObject *args) {
sOutMode,
iRenderingIntent,
iProofIntent,
cmsFLAGS);
cmsFLAGS
);
if (!transform) {
return NULL;
@ -563,7 +572,8 @@ createProfile(PyObject *self, PyObject *args) {
PyErr_SetString(
PyExc_ValueError,
"ERROR: Could not calculate white point from color temperature "
"provided, must be float in degrees Kelvin");
"provided, must be float in degrees Kelvin"
);
return NULL;
}
hProfile = cmsCreateLab2Profile(&whitePoint);
@ -624,7 +634,8 @@ cms_get_display_profile_win32(PyObject *self, PyObject *args) {
HANDLE handle = 0;
int is_dc = 0;
if (!PyArg_ParseTuple(
args, "|" F_HANDLE "i:get_display_profile", &handle, &is_dc)) {
args, "|" F_HANDLE "i:get_display_profile", &handle, &is_dc
)) {
return NULL;
}
@ -729,7 +740,8 @@ _xyz_py(cmsCIEXYZ *XYZ) {
cmsCIExyY xyY;
cmsXYZ2xyY(&xyY, XYZ);
return Py_BuildValue(
"((d,d,d),(d,d,d))", XYZ->X, XYZ->Y, XYZ->Z, xyY.x, xyY.y, xyY.Y);
"((d,d,d),(d,d,d))", XYZ->X, XYZ->Y, XYZ->Z, xyY.x, xyY.y, xyY.Y
);
}
static PyObject *
@ -758,7 +770,8 @@ _xyz3_py(cmsCIEXYZ *XYZ) {
xyY[1].Y,
xyY[2].x,
xyY[2].y,
xyY[2].Y);
xyY[2].Y
);
}
static PyObject *
@ -809,7 +822,8 @@ _profile_read_ciexyy_triple(CmsProfileObject *self, cmsTagSignature info) {
triple->Green.Y,
triple->Blue.x,
triple->Blue.y,
triple->Blue.Y);
triple->Blue.Y
);
}
static PyObject *
@ -873,7 +887,8 @@ _calculate_rgb_primaries(CmsProfileObject *self, cmsCIEXYZTRIPLE *result) {
hXYZ,
TYPE_XYZ_DBL,
INTENT_RELATIVE_COLORIMETRIC,
cmsFLAGS_NOCACHE | cmsFLAGS_NOOPTIMIZE);
cmsFLAGS_NOCACHE | cmsFLAGS_NOOPTIMIZE
);
cmsCloseProfile(hXYZ);
if (hTransform == NULL) {
return 0;
@ -889,7 +904,8 @@ _check_intent(
int clut,
cmsHPROFILE hProfile,
cmsUInt32Number Intent,
cmsUInt32Number UsedDirection) {
cmsUInt32Number UsedDirection
) {
if (clut) {
return cmsIsCLUT(hProfile, Intent, UsedDirection);
} else {
@ -934,7 +950,8 @@ _is_intent_supported(CmsProfileObject *self, int clut) {
_check_intent(clut, self->profile, intent, LCMS_USED_AS_OUTPUT) ? Py_True
: Py_False,
_check_intent(clut, self->profile, intent, LCMS_USED_AS_PROOF) ? Py_True
: Py_False);
: Py_False
);
if (id == NULL || entry == NULL) {
Py_XDECREF(id);
Py_XDECREF(entry);
@ -968,7 +985,8 @@ static PyMethodDef pyCMSdll_methods[] = {
{"get_display_profile_win32", cms_get_display_profile_win32, METH_VARARGS},
#endif
{NULL, NULL}};
{NULL, NULL}
};
static struct PyMethodDef cms_profile_methods[] = {
{"is_intent_supported", (PyCFunction)cms_profile_is_intent_supported, METH_VARARGS},
@ -1028,7 +1046,8 @@ cms_profile_getattr_creation_date(CmsProfileObject *self, void *closure) {
}
return PyDateTime_FromDateAndTime(
1900 + ct.tm_year, ct.tm_mon, ct.tm_mday, ct.tm_hour, ct.tm_min, ct.tm_sec, 0);
1900 + ct.tm_year, ct.tm_mon, ct.tm_mday, ct.tm_hour, ct.tm_min, ct.tm_sec, 0
);
}
static PyObject *
@ -1106,13 +1125,15 @@ cms_profile_getattr_colorimetric_intent(CmsProfileObject *self, void *closure) {
static PyObject *
cms_profile_getattr_perceptual_rendering_intent_gamut(
CmsProfileObject *self, void *closure) {
CmsProfileObject *self, void *closure
) {
return _profile_read_signature(self, cmsSigPerceptualRenderingIntentGamutTag);
}
static PyObject *
cms_profile_getattr_saturation_rendering_intent_gamut(
CmsProfileObject *self, void *closure) {
CmsProfileObject *self, void *closure
) {
return _profile_read_signature(self, cmsSigSaturationRenderingIntentGamutTag);
}
@ -1145,7 +1166,8 @@ cms_profile_getattr_blue_colorant(CmsProfileObject *self, void *closure) {
static PyObject *
cms_profile_getattr_media_white_point_temperature(
CmsProfileObject *self, void *closure) {
CmsProfileObject *self, void *closure
) {
cmsCIEXYZ *XYZ;
cmsCIExyY xyY;
cmsFloat64Number tempK;
@ -1329,7 +1351,8 @@ cms_profile_getattr_icc_measurement_condition(CmsProfileObject *self, void *clos
"flare",
mc->Flare,
"illuminant_type",
_illu_map(mc->IlluminantType));
_illu_map(mc->IlluminantType)
);
}
static PyObject *
@ -1359,7 +1382,8 @@ cms_profile_getattr_icc_viewing_condition(CmsProfileObject *self, void *closure)
vc->SurroundXYZ.Y,
vc->SurroundXYZ.Z,
"illuminant_type",
_illu_map(vc->IlluminantType));
_illu_map(vc->IlluminantType)
);
}
static struct PyGetSetDef cms_profile_getsetters[] = {
@ -1407,11 +1431,12 @@ static struct PyGetSetDef cms_profile_getsetters[] = {
{"colorant_table_out", (getter)cms_profile_getattr_colorant_table_out},
{"intent_supported", (getter)cms_profile_getattr_is_intent_supported},
{"clut", (getter)cms_profile_getattr_is_clut},
{"icc_measurement_condition",
(getter)cms_profile_getattr_icc_measurement_condition},
{"icc_measurement_condition", (getter)cms_profile_getattr_icc_measurement_condition
},
{"icc_viewing_condition", (getter)cms_profile_getattr_icc_viewing_condition},
{NULL}};
{NULL}
};
static PyTypeObject CmsProfile_Type = {
PyVarObject_HEAD_INIT(NULL, 0) "PIL.ImageCms.core.CmsProfile", /*tp_name*/
@ -1538,5 +1563,9 @@ PyInit__imagingcms(void) {
PyDateTime_IMPORT;
#ifdef Py_GIL_DISABLED
PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);
#endif
return m;
}

View File

@ -20,6 +20,7 @@
#define PY_SSIZE_T_CLEAN
#include "Python.h"
#include "thirdparty/pythoncapi_compat.h"
#include "libImaging/Imaging.h"
#include <ft2build.h>
@ -125,7 +126,8 @@ getfont(PyObject *self_, PyObject *args, PyObject *kw) {
unsigned char *font_bytes;
Py_ssize_t font_bytes_size = 0;
static char *kwlist[] = {
"filename", "size", "index", "encoding", "font_bytes", "layout_engine", NULL};
"filename", "size", "index", "encoding", "font_bytes", "layout_engine", NULL
};
if (!library) {
PyErr_SetString(PyExc_OSError, "failed to initialize FreeType library");
@ -147,7 +149,8 @@ getfont(PyObject *self_, PyObject *args, PyObject *kw) {
&encoding,
&font_bytes,
&font_bytes_size,
&layout_engine)) {
&layout_engine
)) {
PyConfig_Clear(&config);
return NULL;
}
@ -165,7 +168,8 @@ getfont(PyObject *self_, PyObject *args, PyObject *kw) {
&encoding,
&font_bytes,
&font_bytes_size,
&layout_engine)) {
&layout_engine
)) {
return NULL;
}
#endif
@ -198,7 +202,8 @@ getfont(PyObject *self_, PyObject *args, PyObject *kw) {
(FT_Byte *)self->font_bytes,
font_bytes_size,
index,
&self->face);
&self->face
);
}
}
@ -242,7 +247,8 @@ text_layout_raqm(
const char *dir,
PyObject *features,
const char *lang,
GlyphInfo **glyph_info) {
GlyphInfo **glyph_info
) {
size_t i = 0, count = 0, start = 0;
raqm_t *rq;
raqm_glyph_t *glyphs = NULL;
@ -296,13 +302,14 @@ text_layout_raqm(
#if !defined(RAQM_VERSION_ATLEAST)
/* RAQM_VERSION_ATLEAST was added in Raqm 0.7.0 */
PyErr_SetString(
PyExc_ValueError,
"libraqm 0.7 or greater required for 'ttb' direction");
PyExc_ValueError, "libraqm 0.7 or greater required for 'ttb' direction"
);
goto failed;
#endif
} else {
PyErr_SetString(
PyExc_ValueError, "direction must be either 'rtl', 'ltr' or 'ttb'");
PyExc_ValueError, "direction must be either 'rtl', 'ltr' or 'ttb'"
);
goto failed;
}
}
@ -398,7 +405,8 @@ text_layout_fallback(
const char *lang,
GlyphInfo **glyph_info,
int mask,
int color) {
int color
) {
int error, load_flags, i;
char *buffer = NULL;
FT_ULong ch;
@ -411,7 +419,8 @@ text_layout_fallback(
PyErr_SetString(
PyExc_KeyError,
"setting text direction, language or font features is not supported "
"without libraqm");
"without libraqm"
);
}
if (PyUnicode_Check(string)) {
@ -458,7 +467,8 @@ text_layout_fallback(
last_index,
(*glyph_info)[i].index,
ft_kerning_default,
&delta) == 0) {
&delta
) == 0) {
(*glyph_info)[i - 1].x_advance += PIXEL(delta.x);
(*glyph_info)[i - 1].y_advance += PIXEL(delta.y);
}
@ -482,7 +492,8 @@ text_layout(
const char *lang,
GlyphInfo **glyph_info,
int mask,
int color) {
int color
) {
size_t count;
#ifdef HAVE_RAQM
if (have_raqm && self->layout_engine == LAYOUT_RAQM) {
@ -491,7 +502,8 @@ text_layout(
#endif
{
count = text_layout_fallback(
string, self, dir, features, lang, glyph_info, mask, color);
string, self, dir, features, lang, glyph_info, mask, color
);
}
return count;
}
@ -513,7 +525,8 @@ font_getlength(FontObject *self, PyObject *args) {
/* calculate size and bearing for a given string */
if (!PyArg_ParseTuple(
args, "O|zzOz:getlength", &string, &mode, &dir, &features, &lang)) {
args, "O|zzOz:getlength", &string, &mode, &dir, &features, &lang
)) {
return NULL;
}
@ -555,7 +568,8 @@ bounding_box_and_anchors(
int *width,
int *height,
int *x_offset,
int *y_offset) {
int *y_offset
) {
int position; /* pen position along primary axis, in 26.6 precision */
int advanced; /* pen position along primary axis, in pixels */
int px, py; /* position of current glyph, in pixels */
@ -660,7 +674,8 @@ bounding_box_and_anchors(
case 'm': // middle (ascender + descender) / 2
y_anchor = PIXEL(
(face->size->metrics.ascender + face->size->metrics.descender) /
2);
2
);
break;
case 's': // horizontal baseline
y_anchor = 0;
@ -740,7 +755,8 @@ font_getsize(FontObject *self, PyObject *args) {
/* calculate size and bearing for a given string */
if (!PyArg_ParseTuple(
args, "O|zzOzz:getsize", &string, &mode, &dir, &features, &lang, &anchor)) {
args, "O|zzOzz:getsize", &string, &mode, &dir, &features, &lang, &anchor
)) {
return NULL;
}
@ -772,7 +788,8 @@ font_getsize(FontObject *self, PyObject *args) {
&width,
&height,
&x_offset,
&y_offset);
&y_offset
);
if (glyph_info) {
PyMem_Free(glyph_info);
glyph_info = NULL;
@ -841,7 +858,8 @@ font_render(FontObject *self, PyObject *args) {
&anchor,
&foreground_ink_long,
&x_start,
&y_start)) {
&y_start
)) {
return NULL;
}
@ -888,7 +906,8 @@ font_render(FontObject *self, PyObject *args) {
&width,
&height,
&x_offset,
&y_offset);
&y_offset
);
if (error) {
PyMem_Del(glyph_info);
return NULL;
@ -928,7 +947,8 @@ font_render(FontObject *self, PyObject *args) {
(FT_Fixed)stroke_width * 64,
FT_STROKER_LINECAP_ROUND,
FT_STROKER_LINEJOIN_ROUND,
0);
0
);
}
/*
@ -1103,8 +1123,8 @@ font_render(FontObject *self, PyObject *args) {
BLEND(src_alpha, target[k * 4 + 2], src_blue, tmp);
target[k * 4 + 3] = CLIP8(
src_alpha +
MULDIV255(
target[k * 4 + 3], (255 - src_alpha), tmp));
MULDIV255(target[k * 4 + 3], (255 - src_alpha), tmp)
);
} else {
/* paste unpremultiplied RGBA values */
target[k * 4 + 0] = src_red;
@ -1122,15 +1142,20 @@ font_render(FontObject *self, PyObject *args) {
if (src_alpha > 0) {
if (target[k * 4 + 3] > 0) {
target[k * 4 + 0] = BLEND(
src_alpha, target[k * 4 + 0], ink[0], tmp);
src_alpha, target[k * 4 + 0], ink[0], tmp
);
target[k * 4 + 1] = BLEND(
src_alpha, target[k * 4 + 1], ink[1], tmp);
src_alpha, target[k * 4 + 1], ink[1], tmp
);
target[k * 4 + 2] = BLEND(
src_alpha, target[k * 4 + 2], ink[2], tmp);
src_alpha, target[k * 4 + 2], ink[2], tmp
);
target[k * 4 + 3] = CLIP8(
src_alpha +
MULDIV255(
target[k * 4 + 3], (255 - src_alpha), tmp));
target[k * 4 + 3], (255 - src_alpha), tmp
)
);
} else {
target[k * 4 + 0] = ink[0];
target[k * 4 + 1] = ink[1];
@ -1148,7 +1173,9 @@ font_render(FontObject *self, PyObject *args) {
? CLIP8(
src_alpha +
MULDIV255(
target[k], (255 - src_alpha), tmp))
target[k], (255 - src_alpha), tmp
)
)
: src_alpha;
}
}
@ -1209,30 +1236,49 @@ font_getvarnames(FontObject *self) {
return NULL;
}
int *list_names_filled = PyMem_Malloc(num_namedstyles * sizeof(int));
if (list_names_filled == NULL) {
Py_DECREF(list_names);
FT_Done_MM_Var(library, master);
return PyErr_NoMemory();
}
for (int i = 0; i < num_namedstyles; i++) {
list_names_filled[i] = 0;
}
name_count = FT_Get_Sfnt_Name_Count(self->face);
for (i = 0; i < name_count; i++) {
error = FT_Get_Sfnt_Name(self->face, i, &name);
if (error) {
PyMem_Free(list_names_filled);
Py_DECREF(list_names);
FT_Done_MM_Var(library, master);
return geterror(error);
}
for (j = 0; j < num_namedstyles; j++) {
if (PyList_GetItem(list_names, j) != NULL) {
if (list_names_filled[j]) {
continue;
}
if (master->namedstyle[j].strid == name.name_id) {
list_name = Py_BuildValue("y#", name.string, name.string_len);
if (list_name == NULL) {
PyMem_Free(list_names_filled);
Py_DECREF(list_names);
FT_Done_MM_Var(library, master);
return NULL;
}
PyList_SetItem(list_names, j, list_name);
list_names_filled[j] = 1;
break;
}
}
}
PyMem_Free(list_names_filled);
FT_Done_MM_Var(library, master);
return list_names;
}
@ -1289,9 +1335,14 @@ font_getvaraxes(FontObject *self) {
if (name.name_id == axis.strid) {
axis_name = Py_BuildValue("y#", name.string, name.string_len);
PyDict_SetItemString(
list_axis, "name", axis_name ? axis_name : Py_None);
Py_XDECREF(axis_name);
if (axis_name == NULL) {
Py_DECREF(list_axis);
Py_DECREF(list_axes);
FT_Done_MM_Var(library, master);
return NULL;
}
PyDict_SetItemString(list_axis, "name", axis_name);
Py_DECREF(axis_name);
break;
}
}
@ -1345,7 +1396,12 @@ font_setvaraxes(FontObject *self, PyObject *args) {
return PyErr_NoMemory();
}
for (i = 0; i < num_coords; i++) {
item = PyList_GET_ITEM(axes, i);
item = PyList_GetItemRef(axes, i);
if (item == NULL) {
free(coords);
return NULL;
}
if (PyFloat_Check(item)) {
coord = PyFloat_AS_DOUBLE(item);
} else if (PyLong_Check(item)) {
@ -1353,10 +1409,12 @@ font_setvaraxes(FontObject *self, PyObject *args) {
} else if (PyNumber_Check(item)) {
coord = PyFloat_AsDouble(item);
} else {
Py_DECREF(item);
free(coords);
PyErr_SetString(PyExc_TypeError, "list must contain numbers");
return NULL;
}
Py_DECREF(item);
coords[i] = coord * 65536;
}
@ -1393,7 +1451,8 @@ static PyMethodDef font_methods[] = {
{"setvarname", (PyCFunction)font_setvarname, METH_VARARGS},
{"setvaraxes", (PyCFunction)font_setvaraxes, METH_VARARGS},
#endif
{NULL, NULL}};
{NULL, NULL}
};
static PyObject *
font_getattr_family(FontObject *self, void *closure) {
@ -1450,7 +1509,8 @@ static struct PyGetSetDef font_getsetters[] = {
{"x_ppem", (getter)font_getattr_x_ppem},
{"y_ppem", (getter)font_getattr_y_ppem},
{"glyphs", (getter)font_getattr_glyphs},
{NULL}};
{NULL}
};
static PyTypeObject Font_Type = {
PyVarObject_HEAD_INIT(NULL, 0) "Font", /*tp_name*/
@ -1486,7 +1546,8 @@ static PyTypeObject Font_Type = {
};
static PyMethodDef _functions[] = {
{"getfont", (PyCFunction)getfont, METH_VARARGS | METH_KEYWORDS}, {NULL, NULL}};
{"getfont", (PyCFunction)getfont, METH_VARARGS | METH_KEYWORDS}, {NULL, NULL}
};
static int
setup_module(PyObject *m) {
@ -1576,5 +1637,9 @@ PyInit__imagingft(void) {
return NULL;
}
#ifdef Py_GIL_DISABLED
PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);
#endif
return m;
}

View File

@ -209,7 +209,8 @@ _binop(PyObject *self, PyObject *args) {
}
static PyMethodDef _functions[] = {
{"unop", _unop, 1}, {"binop", _binop, 1}, {NULL, NULL}};
{"unop", _unop, 1}, {"binop", _binop, 1}, {NULL, NULL}
};
static void
install(PyObject *d, char *name, void *value) {
@ -290,5 +291,9 @@ PyInit__imagingmath(void) {
return NULL;
}
#ifdef Py_GIL_DISABLED
PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);
#endif
return m;
}

View File

@ -253,7 +253,8 @@ static PyMethodDef functions[] = {
{"apply", (PyCFunction)apply, METH_VARARGS, NULL},
{"get_on_pixels", (PyCFunction)get_on_pixels, METH_VARARGS, NULL},
{"match", (PyCFunction)match, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}};
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
PyInit__imagingmorph(void) {
@ -269,5 +270,9 @@ PyInit__imagingmorph(void) {
m = PyModule_Create(&module_def);
#ifdef Py_GIL_DISABLED
PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);
#endif
return m;
}

View File

@ -62,5 +62,10 @@ PyInit__imagingtk(void) {
Py_DECREF(m);
return NULL;
}
#ifdef Py_GIL_DISABLED
PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);
#endif
return m;
}

View File

@ -42,7 +42,8 @@ static const char *const kErrorMessages[-WEBP_MUX_NOT_ENOUGH_DATA + 1] = {
"WEBP_MUX_INVALID_ARGUMENT",
"WEBP_MUX_BAD_DATA",
"WEBP_MUX_MEMORY_ERROR",
"WEBP_MUX_NOT_ENOUGH_DATA"};
"WEBP_MUX_NOT_ENOUGH_DATA"
};
PyObject *
HandleMuxError(WebPMuxError err, char *chunk) {
@ -61,7 +62,8 @@ HandleMuxError(WebPMuxError err, char *chunk) {
sprintf(message, "could not assemble chunks: %s", kErrorMessages[-err]);
} else {
message_len = sprintf(
message, "could not set %.4s chunk: %s", chunk, kErrorMessages[-err]);
message, "could not set %.4s chunk: %s", chunk, kErrorMessages[-err]
);
}
if (message_len < 0) {
PyErr_SetString(PyExc_RuntimeError, "failed to construct error message");
@ -138,7 +140,8 @@ _anim_encoder_new(PyObject *self, PyObject *args) {
&kmin,
&kmax,
&allow_mixed,
&verbose)) {
&verbose
)) {
return NULL;
}
@ -214,7 +217,8 @@ _anim_encoder_add(PyObject *self, PyObject *args) {
&lossless,
&quality_factor,
&alpha_quality_factor,
&method)) {
&method
)) {
return NULL;
}
@ -283,7 +287,8 @@ _anim_encoder_assemble(PyObject *self, PyObject *args) {
&exif_bytes,
&exif_size,
&xmp_bytes,
&xmp_size)) {
&xmp_size
)) {
return NULL;
}
@ -421,7 +426,8 @@ _anim_decoder_get_info(PyObject *self) {
info->loop_count,
info->bgcolor,
info->frame_count,
decp->mode);
decp->mode
);
}
PyObject *
@ -466,7 +472,8 @@ _anim_decoder_get_next(PyObject *self) {
}
bytes = PyBytes_FromStringAndSize(
(char *)buf, decp->info.canvas_width * 4 * decp->info.canvas_height);
(char *)buf, decp->info.canvas_width * 4 * decp->info.canvas_height
);
ret = Py_BuildValue("Si", bytes, timestamp);
@ -621,7 +628,8 @@ WebPEncode_wrapper(PyObject *self, PyObject *args) {
&exif_bytes,
&exif_size,
&xmp_bytes,
&xmp_size)) {
&xmp_size
)) {
return NULL;
}
@ -828,12 +836,14 @@ WebPDecode_wrapper(PyObject *self, PyObject *args) {
if (WEBP_MUX_OK == WebPMuxGetChunk(mux, "ICCP", &icc_profile_data)) {
icc_profile = PyBytes_FromStringAndSize(
(const char *)icc_profile_data.bytes, icc_profile_data.size);
(const char *)icc_profile_data.bytes, icc_profile_data.size
);
}
if (WEBP_MUX_OK == WebPMuxGetChunk(mux, "EXIF", &exif_data)) {
exif = PyBytes_FromStringAndSize(
(const char *)exif_data.bytes, exif_data.size);
(const char *)exif_data.bytes, exif_data.size
);
}
WebPDataClear(&image.bitstream);
@ -848,12 +858,14 @@ WebPDecode_wrapper(PyObject *self, PyObject *args) {
if (config.output.colorspace < MODE_YUV) {
bytes = PyBytes_FromStringAndSize(
(char *)config.output.u.RGBA.rgba, config.output.u.RGBA.size);
(char *)config.output.u.RGBA.rgba, config.output.u.RGBA.size
);
} else {
// Skipping YUV for now. Need Test Images.
// UNDONE -- unclear if we'll ever get here if we set mode_rgb*
bytes = PyBytes_FromStringAndSize(
(char *)config.output.u.YUVA.y, config.output.u.YUVA.y_size);
(char *)config.output.u.YUVA.y, config.output.u.YUVA.y_size
);
}
pymode = PyUnicode_FromString(mode);
@ -864,7 +876,8 @@ WebPDecode_wrapper(PyObject *self, PyObject *args) {
config.output.height,
pymode,
NULL == icc_profile ? Py_None : icc_profile,
NULL == exif ? Py_None : exif);
NULL == exif ? Py_None : exif
);
end:
WebPFreeDecBuffer(&config.output);
@ -898,7 +911,8 @@ WebPDecoderVersion_str(void) {
"%d.%d.%d",
version_number >> 16,
(version_number >> 8) % 0x100,
version_number % 0x100);
version_number % 0x100
);
return version;
}
@ -932,7 +946,8 @@ static PyMethodDef webpMethods[] = {
WebPDecoderBuggyAlpha_wrapper,
METH_NOARGS,
"WebPDecoderBuggyAlpha"},
{NULL, NULL}};
{NULL, NULL}
};
void
addMuxFlagToModule(PyObject *m) {
@ -1005,5 +1020,9 @@ PyInit__webp(void) {
return NULL;
}
#ifdef Py_GIL_DISABLED
PyUnstable_Module_SetGIL(m, Py_MOD_GIL_NOT_USED);
#endif
return m;
}

View File

@ -46,7 +46,8 @@
typedef struct {
PyObject_HEAD int (*decode)(
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes
);
int (*cleanup)(ImagingCodecState state);
struct ImagingCodecStateInstance state;
Imaging im;
@ -938,7 +939,8 @@ PyImaging_Jpeg2KDecoderNew(PyObject *self, PyObject *args) {
PY_LONG_LONG length = -1;
if (!PyArg_ParseTuple(
args, "ss|iiiL", &mode, &format, &reduce, &layers, &fd, &length)) {
args, "ss|iiiL", &mode, &format, &reduce, &layers, &fd, &length
)) {
return NULL;
}

View File

@ -105,7 +105,8 @@ _draw(ImagingDisplayObject *display, PyObject *args) {
src + 0,
src + 1,
src + 2,
src + 3)) {
src + 3
)) {
return NULL;
}
@ -221,7 +222,8 @@ _tobytes(ImagingDisplayObject *display, PyObject *args) {
}
return PyBytes_FromStringAndSize(
display->dib->bits, display->dib->ysize * display->dib->linesize);
display->dib->bits, display->dib->ysize * display->dib->linesize
);
}
static struct PyMethodDef methods[] = {
@ -247,7 +249,8 @@ _getattr_size(ImagingDisplayObject *self, void *closure) {
}
static struct PyGetSetDef getsetters[] = {
{"mode", (getter)_getattr_mode}, {"size", (getter)_getattr_size}, {NULL}};
{"mode", (getter)_getattr_mode}, {"size", (getter)_getattr_size}, {NULL}
};
static PyTypeObject ImagingDisplayType = {
PyVarObject_HEAD_INIT(NULL, 0) "ImagingDisplay", /*tp_name*/
@ -341,9 +344,8 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) {
// added in Windows 10 (1607)
// loaded dynamically to avoid link errors
user32 = LoadLibraryA("User32.dll");
SetThreadDpiAwarenessContext_function =
(Func_SetThreadDpiAwarenessContext)GetProcAddress(
user32, "SetThreadDpiAwarenessContext");
SetThreadDpiAwarenessContext_function = (Func_SetThreadDpiAwarenessContext
)GetProcAddress(user32, "SetThreadDpiAwarenessContext");
if (SetThreadDpiAwarenessContext_function != NULL) {
// DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = ((DPI_CONTEXT_HANDLE)-3)
dpiAwareness = SetThreadDpiAwarenessContext_function((HANDLE)-3);
@ -403,7 +405,8 @@ PyImaging_GrabScreenWin32(PyObject *self, PyObject *args) {
height,
PyBytes_AS_STRING(buffer),
(BITMAPINFO *)&core,
DIB_RGB_COLORS)) {
DIB_RGB_COLORS
)) {
goto error;
}
@ -547,7 +550,8 @@ windowCallback(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) {
ps.rcPaint.left,
ps.rcPaint.top,
ps.rcPaint.right,
ps.rcPaint.bottom);
ps.rcPaint.bottom
);
if (result) {
Py_DECREF(result);
} else {
@ -562,7 +566,8 @@ windowCallback(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) {
0,
0,
rect.right - rect.left,
rect.bottom - rect.top);
rect.bottom - rect.top
);
if (result) {
Py_DECREF(result);
} else {
@ -577,7 +582,8 @@ windowCallback(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) {
0,
0,
rect.right - rect.left,
rect.bottom - rect.top);
rect.bottom - rect.top
);
if (result) {
Py_DECREF(result);
} else {
@ -591,7 +597,8 @@ windowCallback(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) {
case WM_SIZE:
/* resize window */
result = PyObject_CallFunction(
callback, "sii", "resize", LOWORD(lParam), HIWORD(lParam));
callback, "sii", "resize", LOWORD(lParam), HIWORD(lParam)
);
if (result) {
InvalidateRect(wnd, NULL, 1);
Py_DECREF(result);
@ -670,7 +677,8 @@ PyImaging_CreateWindowWin32(PyObject *self, PyObject *args) {
HWND_DESKTOP,
NULL,
NULL,
NULL);
NULL
);
if (!wnd) {
PyErr_SetString(PyExc_OSError, "failed to create window");
@ -732,7 +740,8 @@ PyImaging_DrawWmf(PyObject *self, PyObject *args) {
&x0,
&x1,
&y0,
&y1)) {
&y1
)) {
return NULL;
}
@ -844,7 +853,8 @@ PyImaging_GrabScreenX11(PyObject *self, PyObject *args) {
PyErr_Format(
PyExc_OSError,
"X connection failed: error %i",
xcb_connection_has_error(connection));
xcb_connection_has_error(connection)
);
xcb_disconnect(connection);
return NULL;
}
@ -878,8 +888,10 @@ PyImaging_GrabScreenX11(PyObject *self, PyObject *args) {
0,
width,
height,
0x00ffffff),
&error);
0x00ffffff
),
&error
);
if (reply == NULL) {
PyErr_Format(
PyExc_OSError,
@ -887,7 +899,8 @@ PyImaging_GrabScreenX11(PyObject *self, PyObject *args) {
error->error_code,
error->major_code,
error->minor_code,
error->resource_id);
error->resource_id
);
free(error);
xcb_disconnect(connection);
return NULL;
@ -897,7 +910,8 @@ PyImaging_GrabScreenX11(PyObject *self, PyObject *args) {
if (reply->depth == 24) {
buffer = PyBytes_FromStringAndSize(
(char *)xcb_get_image_data(reply), xcb_get_image_data_length(reply));
(char *)xcb_get_image_data(reply), xcb_get_image_data_length(reply)
);
} else {
PyErr_Format(PyExc_OSError, "unsupported bit depth: %i", reply->depth);
}

View File

@ -25,6 +25,7 @@
#define PY_SSIZE_T_CLEAN
#include "Python.h"
#include "thirdparty/pythoncapi_compat.h"
#include "libImaging/Imaging.h"
#include "libImaging/Gif.h"
@ -38,7 +39,8 @@
typedef struct {
PyObject_HEAD int (*encode)(
Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes
);
int (*cleanup)(ImagingCodecState state);
struct ImagingCodecStateInstance state;
Imaging im;
@ -134,7 +136,8 @@ _encode(ImagingEncoderObject *encoder, PyObject *args) {
}
status = encoder->encode(
encoder->im, &encoder->state, (UINT8 *)PyBytes_AsString(buf), bufsize);
encoder->im, &encoder->state, (UINT8 *)PyBytes_AsString(buf), bufsize
);
/* adjust string length to avoid slicing in encoder */
if (_PyBytes_Resize(&buf, (status > 0) ? status : 0) < 0) {
@ -571,7 +574,8 @@ PyImaging_ZipEncoderNew(PyObject *self, PyObject *args) {
&compress_level,
&compress_type,
&dictionary,
&dictionary_size)) {
&dictionary_size
)) {
return NULL;
}
@ -652,15 +656,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
PyObject *item;
if (!PyArg_ParseTuple(
args,
"sssnsOO",
&mode,
&rawmode,
&compname,
&fp,
&filename,
&tags,
&types)) {
args, "sssnsOO", &mode, &rawmode, &compname, &fp, &filename, &tags, &types
)) {
return NULL;
}
@ -671,11 +668,17 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
tags_size = PyList_Size(tags);
TRACE(("tags size: %d\n", (int)tags_size));
for (pos = 0; pos < tags_size; pos++) {
item = PyList_GetItem(tags, pos);
item = PyList_GetItemRef(tags, pos);
if (item == NULL) {
return NULL;
}
if (!PyTuple_Check(item) || PyTuple_Size(item) != 2) {
Py_DECREF(item);
PyErr_SetString(PyExc_ValueError, "Invalid tags list");
return NULL;
}
Py_DECREF(item);
}
pos = 0;
}
@ -703,11 +706,17 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
num_core_tags = sizeof(core_tags) / sizeof(int);
for (pos = 0; pos < tags_size; pos++) {
item = PyList_GetItem(tags, pos);
item = PyList_GetItemRef(tags, pos);
if (item == NULL) {
return NULL;
}
// We already checked that tags is a 2-tuple list.
key = PyTuple_GetItem(item, 0);
key = PyTuple_GET_ITEM(item, 0);
key_int = (int)PyLong_AsLong(key);
value = PyTuple_GetItem(item, 1);
value = PyTuple_GET_ITEM(item, 1);
Py_DECREF(item);
status = 0;
is_core_tag = 0;
is_var_length = 0;
@ -721,7 +730,10 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
}
if (!is_core_tag) {
PyObject *tag_type = PyDict_GetItem(types, key);
PyObject *tag_type;
if (PyDict_GetItemRef(types, key, &tag_type) < 0) {
return NULL; // Exception has been already set
}
if (tag_type) {
int type_int = PyLong_AsLong(tag_type);
if (type_int >= TIFF_BYTE && type_int <= TIFF_DOUBLE) {
@ -769,7 +781,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
is_var_length = 1;
}
if (ImagingLibTiffMergeFieldInfo(
&encoder->state, type, key_int, is_var_length)) {
&encoder->state, type, key_int, is_var_length
)) {
continue;
}
}
@ -779,7 +792,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
&encoder->state,
(ttag_t)key_int,
PyBytes_Size(value),
PyBytes_AsString(value));
PyBytes_AsString(value)
);
} else if (is_var_length) {
Py_ssize_t len, i;
TRACE(("Setting from Tuple: %d \n", key_int));
@ -789,7 +803,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
int stride = 256;
if (len != 768) {
PyErr_SetString(
PyExc_ValueError, "Requiring 768 items for Colormap");
PyExc_ValueError, "Requiring 768 items for Colormap"
);
return NULL;
}
UINT16 *av;
@ -804,7 +819,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
(ttag_t)key_int,
av,
av + stride,
av + stride * 2);
av + stride * 2
);
free(av);
}
} else if (key_int == TIFFTAG_YCBCRSUBSAMPLING) {
@ -812,7 +828,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
&encoder->state,
(ttag_t)key_int,
(UINT16)PyLong_AsLong(PyTuple_GetItem(value, 0)),
(UINT16)PyLong_AsLong(PyTuple_GetItem(value, 1)));
(UINT16)PyLong_AsLong(PyTuple_GetItem(value, 1))
);
} else if (type == TIFF_SHORT) {
UINT16 *av;
/* malloc check ok, calloc checks for overflow */
@ -822,7 +839,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
av[i] = (UINT16)PyLong_AsLong(PyTuple_GetItem(value, i));
}
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, len, av);
&encoder->state, (ttag_t)key_int, len, av
);
free(av);
}
} else if (type == TIFF_LONG) {
@ -834,7 +852,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
av[i] = (UINT32)PyLong_AsLong(PyTuple_GetItem(value, i));
}
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, len, av);
&encoder->state, (ttag_t)key_int, len, av
);
free(av);
}
} else if (type == TIFF_SBYTE) {
@ -846,7 +865,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
av[i] = (INT8)PyLong_AsLong(PyTuple_GetItem(value, i));
}
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, len, av);
&encoder->state, (ttag_t)key_int, len, av
);
free(av);
}
} else if (type == TIFF_SSHORT) {
@ -858,7 +878,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
av[i] = (INT16)PyLong_AsLong(PyTuple_GetItem(value, i));
}
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, len, av);
&encoder->state, (ttag_t)key_int, len, av
);
free(av);
}
} else if (type == TIFF_SLONG) {
@ -870,7 +891,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
av[i] = (INT32)PyLong_AsLong(PyTuple_GetItem(value, i));
}
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, len, av);
&encoder->state, (ttag_t)key_int, len, av
);
free(av);
}
} else if (type == TIFF_FLOAT) {
@ -882,7 +904,8 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
av[i] = (FLOAT32)PyFloat_AsDouble(PyTuple_GetItem(value, i));
}
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, len, av);
&encoder->state, (ttag_t)key_int, len, av
);
free(av);
}
} else if (type == TIFF_DOUBLE) {
@ -894,43 +917,54 @@ PyImaging_LibTiffEncoderNew(PyObject *self, PyObject *args) {
av[i] = PyFloat_AsDouble(PyTuple_GetItem(value, i));
}
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, len, av);
&encoder->state, (ttag_t)key_int, len, av
);
free(av);
}
}
} else {
if (type == TIFF_SHORT) {
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (UINT16)PyLong_AsLong(value));
&encoder->state, (ttag_t)key_int, (UINT16)PyLong_AsLong(value)
);
} else if (type == TIFF_LONG) {
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, PyLong_AsLongLong(value));
&encoder->state, (ttag_t)key_int, PyLong_AsLongLong(value)
);
} else if (type == TIFF_SSHORT) {
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (INT16)PyLong_AsLong(value));
&encoder->state, (ttag_t)key_int, (INT16)PyLong_AsLong(value)
);
} else if (type == TIFF_SLONG) {
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (INT32)PyLong_AsLong(value));
&encoder->state, (ttag_t)key_int, (INT32)PyLong_AsLong(value)
);
} else if (type == TIFF_FLOAT) {
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (FLOAT32)PyFloat_AsDouble(value));
&encoder->state, (ttag_t)key_int, (FLOAT32)PyFloat_AsDouble(value)
);
} else if (type == TIFF_DOUBLE) {
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (FLOAT64)PyFloat_AsDouble(value));
&encoder->state, (ttag_t)key_int, (FLOAT64)PyFloat_AsDouble(value)
);
} else if (type == TIFF_SBYTE) {
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (INT8)PyLong_AsLong(value));
&encoder->state, (ttag_t)key_int, (INT8)PyLong_AsLong(value)
);
} else if (type == TIFF_ASCII) {
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, PyBytes_AsString(value));
&encoder->state, (ttag_t)key_int, PyBytes_AsString(value)
);
} else if (type == TIFF_RATIONAL) {
status = ImagingLibTiffSetField(
&encoder->state, (ttag_t)key_int, (FLOAT64)PyFloat_AsDouble(value));
&encoder->state, (ttag_t)key_int, (FLOAT64)PyFloat_AsDouble(value)
);
} else {
TRACE(
("Unhandled type for key %d : %s \n",
key_int,
PyBytes_AsString(PyObject_Str(value))));
PyBytes_AsString(PyObject_Str(value)))
);
}
}
if (!status) {
@ -991,7 +1025,8 @@ get_qtables_arrays(PyObject *qtables, int *qtablesLen) {
if (num_tables < 1 || num_tables > NUM_QUANT_TBLS) {
PyErr_SetString(
PyExc_ValueError,
"Not a valid number of quantization tables. Should be between 1 and 4.");
"Not a valid number of quantization tables. Should be between 1 and 4."
);
Py_DECREF(tables);
return NULL;
}
@ -1080,7 +1115,8 @@ PyImaging_JpegEncoderNew(PyObject *self, PyObject *args) {
&extra,
&extra_size,
&rawExif,
&rawExifLen)) {
&rawExifLen
)) {
return NULL;
}
@ -1250,7 +1286,8 @@ PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) {
&fd,
&comment,
&comment_size,
&plt)) {
&plt
)) {
return NULL;
}
@ -1307,7 +1344,8 @@ PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) {
j2k_decode_coord_tuple(offset, &context->offset_x, &context->offset_y);
j2k_decode_coord_tuple(
tile_offset, &context->tile_offset_x, &context->tile_offset_y);
tile_offset, &context->tile_offset_x, &context->tile_offset_y
);
j2k_decode_coord_tuple(tile_size, &context->tile_size_x, &context->tile_size_y);
/* Error on illegal tile offsets */
@ -1317,7 +1355,8 @@ PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) {
PyErr_SetString(
PyExc_ValueError,
"JPEG 2000 tile offset too small; top left tile must "
"intersect image area");
"intersect image area"
);
Py_DECREF(encoder);
return NULL;
}
@ -1325,8 +1364,8 @@ PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) {
if (context->tile_offset_x > context->offset_x ||
context->tile_offset_y > context->offset_y) {
PyErr_SetString(
PyExc_ValueError,
"JPEG 2000 tile offset too large to cover image area");
PyExc_ValueError, "JPEG 2000 tile offset too large to cover image area"
);
Py_DECREF(encoder);
return NULL;
}
@ -1360,7 +1399,8 @@ PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) {
j2k_decode_coord_tuple(cblk_size, &context->cblk_width, &context->cblk_height);
j2k_decode_coord_tuple(
precinct_size, &context->precinct_width, &context->precinct_height);
precinct_size, &context->precinct_width, &context->precinct_height
);
context->irreversible = PyObject_IsTrue(irreversible);
context->progression = prog_order;

View File

@ -36,7 +36,8 @@ add_item(const char *mode) {
"AccessInit: hash collision: %d for both %s and %s\n",
i,
mode,
access_table[i].mode);
access_table[i].mode
);
exit(1);
}
access_table[i].mode = mode;

View File

@ -243,7 +243,8 @@ static const bc7_mode_info bc7_modes[] = {
{1, 0, 2, 1, 5, 6, 0, 0, 2, 3},
{1, 0, 2, 0, 7, 8, 0, 0, 2, 2},
{1, 0, 0, 0, 7, 7, 1, 0, 4, 0},
{2, 6, 0, 0, 5, 5, 1, 0, 2, 0}};
{2, 6, 0, 0, 5, 5, 1, 0, 2, 0}
};
/* Subset indices:
Table.P2, 1 bit per index */
@ -254,7 +255,8 @@ static const UINT16 bc7_si2[] = {
0x718e, 0x399c, 0xaaaa, 0xf0f0, 0x5a5a, 0x33cc, 0x3c3c, 0x55aa, 0x9696, 0xa55a,
0x73ce, 0x13c8, 0x324c, 0x3bdc, 0x6996, 0xc33c, 0x9966, 0x0660, 0x0272, 0x04e4,
0x4e40, 0x2720, 0xc936, 0x936c, 0x39c6, 0x639c, 0x9336, 0x9cc6, 0x817e, 0xe718,
0xccf0, 0x0fcc, 0x7744, 0xee22};
0xccf0, 0x0fcc, 0x7744, 0xee22
};
/* Table.P3, 2 bits per index */
static const UINT32 bc7_si3[] = {
@ -267,20 +269,23 @@ static const UINT32 bc7_si3[] = {
0x66660000, 0xa5a0a5a0, 0x50a050a0, 0x69286928, 0x44aaaa44, 0x66666600, 0xaa444444,
0x54a854a8, 0x95809580, 0x96969600, 0xa85454a8, 0x80959580, 0xaa141414, 0x96960000,
0xaaaa1414, 0xa05050a0, 0xa0a5a5a0, 0x96000000, 0x40804080, 0xa9a8a9a8, 0xaaaaaa44,
0x2a4a5254};
0x2a4a5254
};
/* Anchor indices:
Table.A2 */
static const char bc7_ai0[] = {
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 8, 2, 2, 8,
8, 15, 2, 8, 2, 2, 8, 8, 2, 2, 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2,
2, 15, 15, 6, 6, 2, 6, 8, 15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15};
static const char bc7_ai0[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
15, 15, 15, 15, 2, 8, 2, 2, 8, 8, 15, 2, 8,
2, 2, 8, 8, 2, 2, 15, 15, 6, 8, 2, 8, 15,
15, 2, 8, 2, 2, 2, 15, 15, 6, 6, 2, 6, 8,
15, 15, 2, 2, 15, 15, 15, 15, 15, 2, 2, 15};
/* Table.A3a */
static const char bc7_ai1[] = {
3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8, 15, 3, 3,
6, 10, 5, 8, 8, 6, 8, 5, 15, 15, 8, 15, 3, 5, 6, 10, 8, 15, 15, 3, 15, 5,
15, 15, 15, 15, 3, 15, 5, 5, 5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3};
static const char bc7_ai1[] = {3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6,
5, 3, 3, 3, 3, 8, 15, 3, 3, 6, 10, 5, 8,
8, 6, 8, 5, 15, 15, 8, 15, 3, 5, 6, 10, 8,
15, 15, 3, 15, 5, 15, 15, 15, 15, 3, 15, 5, 5,
5, 8, 5, 10, 5, 10, 8, 13, 15, 12, 3, 3};
/* Table.A3b */
static const char bc7_ai2[] = {15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 15,
@ -293,7 +298,8 @@ static const char bc7_ai2[] = {15, 8, 8, 3, 15, 15, 3, 8, 15, 15, 15, 15, 1
static const char bc7_weights2[] = {0, 21, 43, 64};
static const char bc7_weights3[] = {0, 9, 18, 27, 37, 46, 55, 64};
static const char bc7_weights4[] = {
0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64};
0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64
};
static const char *
bc7_get_weights(int n) {
@ -526,7 +532,8 @@ static const bc6_mode_info bc6_modes[] = {
{1, 0, 0, 10, 10, 10, 10},
{1, 1, 0, 11, 9, 9, 9},
{1, 1, 0, 12, 8, 8, 8},
{1, 1, 0, 16, 4, 4, 4}};
{1, 1, 0, 16, 4, 4, 4}
};
/* Table.F, encoded as a sequence of bit indices */
static const UINT8 bc6_bit_packings[][75] = {
@ -591,7 +598,8 @@ static const UINT8 bc6_bit_packings[][75] = {
64, 65, 66, 67, 68, 69, 70, 71, 27, 26, 80, 81, 82, 83, 84, 85, 86, 87, 43, 42},
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 48, 49, 50, 51, 15, 14, 13, 12, 11, 10,
64, 65, 66, 67, 31, 30, 29, 28, 27, 26, 80, 81, 82, 83, 47, 46, 45, 44, 43, 42}};
64, 65, 66, 67, 31, 30, 29, 28, 27, 26, 80, 81, 82, 83, 47, 46, 45, 44, 43, 42}
};
static void
bc6_sign_extend(UINT16 *v, int prec) {
@ -830,7 +838,8 @@ decode_bcn(
int bytes,
int N,
int C,
char *pixel_format) {
char *pixel_format
) {
int ymax = state->ysize + state->yoff;
const UINT8 *ptr = src;
switch (N) {

View File

@ -13,7 +13,8 @@ void static inline ImagingLineBoxBlur32(
int edgeA,
int edgeB,
UINT32 ww,
UINT32 fw) {
UINT32 fw
) {
int x;
UINT32 acc[4];
UINT32 bulk[4];
@ -109,7 +110,8 @@ void static inline ImagingLineBoxBlur8(
int edgeA,
int edgeB,
UINT32 ww,
UINT32 fw) {
UINT32 fw
) {
int x;
UINT32 acc;
UINT32 bulk;
@ -198,7 +200,8 @@ ImagingHorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) {
edgeA,
edgeB,
ww,
fw);
fw
);
if (imIn == imOut) {
// Commit.
memcpy(imOut->image8[y], lineOut, imIn->xsize);
@ -214,7 +217,8 @@ ImagingHorizontalBoxBlur(Imaging imOut, Imaging imIn, float floatRadius) {
edgeA,
edgeB,
ww,
fw);
fw
);
if (imIn == imOut) {
// Commit.
memcpy(imOut->image32[y], lineOut, imIn->xsize * 4);
@ -315,11 +319,13 @@ _gaussian_blur_radius(float radius, int passes) {
Imaging
ImagingGaussianBlur(
Imaging imOut, Imaging imIn, float xradius, float yradius, int passes) {
Imaging imOut, Imaging imIn, float xradius, float yradius, int passes
) {
return ImagingBoxBlur(
imOut,
imIn,
_gaussian_blur_radius(xradius, passes),
_gaussian_blur_radius(yradius, passes),
passes);
passes
);
}

View File

@ -142,7 +142,8 @@ ImagingChopSoftLight(Imaging imIn1, Imaging imIn2) {
CHOP2(
(((255 - in1[x]) * (in1[x] * in2[x])) / 65536) +
(in1[x] * (255 - ((255 - in1[x]) * (255 - in2[x]) / 255))) / 255,
NULL);
NULL
);
}
Imaging
@ -150,7 +151,8 @@ ImagingChopHardLight(Imaging imIn1, Imaging imIn2) {
CHOP2(
(in2[x] < 128) ? ((in1[x] * in2[x]) / 127)
: 255 - (((255 - in2[x]) * (255 - in1[x])) / 127),
NULL);
NULL
);
}
Imaging
@ -158,5 +160,6 @@ ImagingOverlay(Imaging imIn1, Imaging imIn2) {
CHOP2(
(in1[x] < 128) ? ((in1[x] * in2[x]) / 127)
: 255 - (((255 - in1[x]) * (255 - in2[x])) / 127),
NULL);
NULL
);
}

View File

@ -63,7 +63,8 @@ ImagingColorLUT3D_linear(
int size1D,
int size2D,
int size3D,
INT16 *table) {
INT16 *table
) {
/* This float to int conversion doesn't have rounding
error compensation (+0.5) for two reasons:
1. As we don't hit the highest value,
@ -112,7 +113,8 @@ ImagingColorLUT3D_linear(
index2D >> SCALE_BITS,
index3D >> SCALE_BITS,
size1D,
size1D_2D);
size1D_2D
);
INT16 result[4], left[4], right[4];
INT16 leftleft[4], leftright[4], rightleft[4], rightright[4];
@ -123,19 +125,22 @@ ImagingColorLUT3D_linear(
leftright,
&table[idx + size1D * 3],
&table[idx + size1D * 3 + 3],
shift1D);
shift1D
);
interpolate3(left, leftleft, leftright, shift2D);
interpolate3(
rightleft,
&table[idx + size1D_2D * 3],
&table[idx + size1D_2D * 3 + 3],
shift1D);
shift1D
);
interpolate3(
rightright,
&table[idx + size1D_2D * 3 + size1D * 3],
&table[idx + size1D_2D * 3 + size1D * 3 + 3],
shift1D);
shift1D
);
interpolate3(right, rightleft, rightright, shift2D);
interpolate3(result, left, right, shift3D);
@ -144,7 +149,8 @@ ImagingColorLUT3D_linear(
clip8(result[0]),
clip8(result[1]),
clip8(result[2]),
rowIn[x * 4 + 3]);
rowIn[x * 4 + 3]
);
memcpy(rowOut + x * sizeof(v), &v, sizeof(v));
}
@ -155,19 +161,22 @@ ImagingColorLUT3D_linear(
leftright,
&table[idx + size1D * 4],
&table[idx + size1D * 4 + 4],
shift1D);
shift1D
);
interpolate4(left, leftleft, leftright, shift2D);
interpolate4(
rightleft,
&table[idx + size1D_2D * 4],
&table[idx + size1D_2D * 4 + 4],
shift1D);
shift1D
);
interpolate4(
rightright,
&table[idx + size1D_2D * 4 + size1D * 4],
&table[idx + size1D_2D * 4 + size1D * 4 + 4],
shift1D);
shift1D
);
interpolate4(right, rightleft, rightright, shift2D);
interpolate4(result, left, right, shift3D);
@ -176,7 +185,8 @@ ImagingColorLUT3D_linear(
clip8(result[0]),
clip8(result[1]),
clip8(result[2]),
clip8(result[3]));
clip8(result[3])
);
memcpy(rowOut + x * sizeof(v), &v, sizeof(v));
}
}

View File

@ -1044,7 +1044,8 @@ static struct {
{"I;16L", "F", I16L_F},
{"I;16B", "F", I16B_F},
{NULL}};
{NULL}
};
/* FIXME: translate indexed versions to pointer versions below this line */
@ -1316,7 +1317,8 @@ frompalette(Imaging imOut, Imaging imIn, const char *mode) {
(UINT8 *)imOut->image[y],
(UINT8 *)imIn->image[y],
imIn->xsize,
imIn->palette);
imIn->palette
);
}
ImagingSectionLeave(&cookie);
@ -1328,11 +1330,8 @@ frompalette(Imaging imOut, Imaging imIn, const char *mode) {
#endif
static Imaging
topalette(
Imaging imOut,
Imaging imIn,
const char *mode,
ImagingPalette inpalette,
int dither) {
Imaging imOut, Imaging imIn, const char *mode, ImagingPalette inpalette, int dither
) {
ImagingSectionCookie cookie;
int alpha;
int x, y;
@ -1623,7 +1622,8 @@ tobilevel(Imaging imOut, Imaging imIn) {
static Imaging
convert(
Imaging imOut, Imaging imIn, const char *mode, ImagingPalette palette, int dither) {
Imaging imOut, Imaging imIn, const char *mode, ImagingPalette palette, int dither
) {
ImagingSectionCookie cookie;
ImagingShuffler convert;
int y;
@ -1677,7 +1677,8 @@ convert(
#else
static char buf[100];
snprintf(
buf, 100, "conversion from %.10s to %.10s not supported", imIn->mode, mode);
buf, 100, "conversion from %.10s to %.10s not supported", imIn->mode, mode
);
return (Imaging)ImagingError_ValueError(buf);
#endif
}
@ -1727,18 +1728,16 @@ ImagingConvertTransparent(Imaging imIn, const char *mode, int r, int g, int b) {
if (strcmp(mode, "RGBa") == 0) {
premultiplied = 1;
}
} else if (
strcmp(imIn->mode, "RGB") == 0 &&
(strcmp(mode, "LA") == 0 || strcmp(mode, "La") == 0)) {
} else if (strcmp(imIn->mode, "RGB") == 0 &&
(strcmp(mode, "LA") == 0 || strcmp(mode, "La") == 0)) {
convert = rgb2la;
source_transparency = 1;
if (strcmp(mode, "La") == 0) {
premultiplied = 1;
}
} else if (
(strcmp(imIn->mode, "1") == 0 || strcmp(imIn->mode, "I") == 0 ||
strcmp(imIn->mode, "I;16") == 0 || strcmp(imIn->mode, "L") == 0) &&
(strcmp(mode, "RGBA") == 0 || strcmp(mode, "LA") == 0)) {
} else if ((strcmp(imIn->mode, "1") == 0 || strcmp(imIn->mode, "I") == 0 ||
strcmp(imIn->mode, "I;16") == 0 || strcmp(imIn->mode, "L") == 0) &&
(strcmp(mode, "RGBA") == 0 || strcmp(mode, "LA") == 0)) {
if (strcmp(imIn->mode, "1") == 0) {
convert = bit2rgb;
} else if (strcmp(imIn->mode, "I") == 0) {
@ -1756,7 +1755,8 @@ ImagingConvertTransparent(Imaging imIn, const char *mode, int r, int g, int b) {
100,
"conversion from %.10s to %.10s not supported in convert_transparent",
imIn->mode,
mode);
mode
);
return (Imaging)ImagingError_ValueError(buf);
}

View File

@ -47,7 +47,8 @@ static INT16 Y_R[] = {
4019, 4038, 4057, 4076, 4095, 4114, 4133, 4153, 4172, 4191, 4210, 4229, 4248, 4267,
4286, 4306, 4325, 4344, 4363, 4382, 4401, 4420, 4440, 4459, 4478, 4497, 4516, 4535,
4554, 4574, 4593, 4612, 4631, 4650, 4669, 4688, 4707, 4727, 4746, 4765, 4784, 4803,
4822, 4841, 4861, 4880};
4822, 4841, 4861, 4880
};
static INT16 Y_G[] = {
0, 38, 75, 113, 150, 188, 225, 263, 301, 338, 376, 413, 451, 488,
@ -68,7 +69,8 @@ static INT16 Y_G[] = {
7889, 7927, 7964, 8002, 8040, 8077, 8115, 8152, 8190, 8227, 8265, 8303, 8340, 8378,
8415, 8453, 8490, 8528, 8566, 8603, 8641, 8678, 8716, 8753, 8791, 8828, 8866, 8904,
8941, 8979, 9016, 9054, 9091, 9129, 9167, 9204, 9242, 9279, 9317, 9354, 9392, 9430,
9467, 9505, 9542, 9580};
9467, 9505, 9542, 9580
};
static INT16 Y_B[] = {
0, 7, 15, 22, 29, 36, 44, 51, 58, 66, 73, 80, 88, 95,
@ -89,7 +91,8 @@ static INT16 Y_B[] = {
1532, 1539, 1547, 1554, 1561, 1569, 1576, 1583, 1591, 1598, 1605, 1612, 1620, 1627,
1634, 1642, 1649, 1656, 1663, 1671, 1678, 1685, 1693, 1700, 1707, 1715, 1722, 1729,
1736, 1744, 1751, 1758, 1766, 1773, 1780, 1788, 1795, 1802, 1809, 1817, 1824, 1831,
1839, 1846, 1853, 1860};
1839, 1846, 1853, 1860
};
static INT16 Cb_R[] = {
0, -10, -21, -31, -42, -53, -64, -75, -85, -96, -107, -118,
@ -113,7 +116,8 @@ static INT16 Cb_R[] = {
-2332, -2342, -2353, -2364, -2375, -2386, -2396, -2407, -2418, -2429, -2440, -2450,
-2461, -2472, -2483, -2494, -2504, -2515, -2526, -2537, -2548, -2558, -2569, -2580,
-2591, -2602, -2612, -2623, -2634, -2645, -2656, -2666, -2677, -2688, -2699, -2710,
-2720, -2731, -2742, -2753};
-2720, -2731, -2742, -2753
};
static INT16 Cb_G[] = {
0, -20, -41, -63, -84, -105, -126, -147, -169, -190, -211, -232,
@ -137,7 +141,8 @@ static INT16 Cb_G[] = {
-4578, -4600, -4621, -4642, -4663, -4684, -4706, -4727, -4748, -4769, -4790, -4812,
-4833, -4854, -4875, -4896, -4918, -4939, -4960, -4981, -5002, -5024, -5045, -5066,
-5087, -5108, -5130, -5151, -5172, -5193, -5214, -5236, -5257, -5278, -5299, -5320,
-5342, -5363, -5384, -5405};
-5342, -5363, -5384, -5405
};
static INT16 Cb_B[] = {
0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416,
@ -158,7 +163,8 @@ static INT16 Cb_B[] = {
6720, 6752, 6784, 6816, 6848, 6880, 6912, 6944, 6976, 7008, 7040, 7072, 7104, 7136,
7168, 7200, 7232, 7264, 7296, 7328, 7360, 7392, 7424, 7456, 7488, 7520, 7552, 7584,
7616, 7648, 7680, 7712, 7744, 7776, 7808, 7840, 7872, 7904, 7936, 7968, 8000, 8032,
8064, 8096, 8128, 8160};
8064, 8096, 8128, 8160
};
#define Cr_R Cb_B
@ -184,7 +190,8 @@ static INT16 Cr_G[] = {
-5787, -5814, -5841, -5867, -5894, -5921, -5948, -5975, -6001, -6028, -6055, -6082,
-6109, -6135, -6162, -6189, -6216, -6243, -6269, -6296, -6323, -6350, -6376, -6403,
-6430, -6457, -6484, -6510, -6537, -6564, -6591, -6618, -6644, -6671, -6698, -6725,
-6752, -6778, -6805, -6832};
-6752, -6778, -6805, -6832
};
static INT16 Cr_B[] = {
0, -4, -9, -15, -20, -25, -30, -35, -41, -46, -51, -56,
@ -208,7 +215,8 @@ static INT16 Cr_B[] = {
-1123, -1128, -1133, -1139, -1144, -1149, -1154, -1159, -1165, -1170, -1175, -1180,
-1185, -1191, -1196, -1201, -1206, -1211, -1217, -1222, -1227, -1232, -1238, -1243,
-1248, -1253, -1258, -1264, -1269, -1274, -1279, -1284, -1290, -1295, -1300, -1305,
-1310, -1316, -1321, -1326};
-1310, -1316, -1321, -1326
};
static INT16 R_Cr[] = {
-11484, -11394, -11305, -11215, -11125, -11036, -10946, -10856, -10766, -10677,
@ -236,7 +244,8 @@ static INT16 R_Cr[] = {
8255, 8345, 8434, 8524, 8614, 8704, 8793, 8883, 8973, 9063,
9152, 9242, 9332, 9421, 9511, 9601, 9691, 9780, 9870, 9960,
10050, 10139, 10229, 10319, 10408, 10498, 10588, 10678, 10767, 10857,
10947, 11037, 11126, 11216, 11306, 11395};
10947, 11037, 11126, 11216, 11306, 11395
};
static INT16 G_Cb[] = {
2819, 2797, 2775, 2753, 2731, 2709, 2687, 2665, 2643, 2621, 2599, 2577,
@ -260,7 +269,8 @@ static INT16 G_Cb[] = {
-1937, -1959, -1981, -2003, -2025, -2047, -2069, -2091, -2113, -2135, -2157, -2179,
-2201, -2224, -2246, -2268, -2290, -2312, -2334, -2356, -2378, -2400, -2422, -2444,
-2466, -2488, -2510, -2532, -2554, -2576, -2598, -2620, -2642, -2664, -2686, -2708,
-2730, -2752, -2774, -2796};
-2730, -2752, -2774, -2796
};
static INT16 G_Cr[] = {
5850, 5805, 5759, 5713, 5667, 5622, 5576, 5530, 5485, 5439, 5393, 5347,
@ -284,7 +294,8 @@ static INT16 G_Cr[] = {
-4021, -4067, -4112, -4158, -4204, -4250, -4295, -4341, -4387, -4432, -4478, -4524,
-4569, -4615, -4661, -4707, -4752, -4798, -4844, -4889, -4935, -4981, -5027, -5072,
-5118, -5164, -5209, -5255, -5301, -5346, -5392, -5438, -5484, -5529, -5575, -5621,
-5666, -5712, -5758, -5804};
-5666, -5712, -5758, -5804
};
static INT16 B_Cb[] = {
-14515, -14402, -14288, -14175, -14062, -13948, -13835, -13721, -13608, -13495,
@ -312,7 +323,8 @@ static INT16 B_Cb[] = {
10434, 10547, 10660, 10774, 10887, 11001, 11114, 11227, 11341, 11454,
11568, 11681, 11794, 11908, 12021, 12135, 12248, 12361, 12475, 12588,
12702, 12815, 12929, 13042, 13155, 13269, 13382, 13496, 13609, 13722,
13836, 13949, 14063, 14176, 14289, 14403};
13836, 13949, 14063, 14176, 14289, 14403
};
void
ImagingConvertRGB2YCbCr(UINT8 *out, const UINT8 *in, int pixels) {

View File

@ -95,7 +95,8 @@ ImagingNewDIB(const char *mode, int xsize, int ysize) {
}
dib->bitmap = CreateDIBSection(
dib->dc, dib->info, DIB_RGB_COLORS, (void **)&dib->bits, NULL, 0);
dib->dc, dib->info, DIB_RGB_COLORS, (void **)&dib->bits, NULL, 0
);
if (!dib->bitmap) {
free(dib->info);
free(dib);
@ -218,7 +219,8 @@ ImagingPasteDIB(ImagingDIB dib, Imaging im, int xy[4]) {
dib->bits + dib->linesize * (dib->ysize - (xy[1] + y) - 1) +
xy[0] * dib->pixelsize,
im->image[y],
im->xsize);
im->xsize
);
}
}
@ -251,7 +253,8 @@ ImagingDrawDIB(ImagingDIB dib, void *dc, int dst[4], int src[4]) {
dib->bits,
dib->info,
DIB_RGB_COLORS,
SRCCOPY);
SRCCOPY
);
} else {
/* stretchblt (displays) */
if (dib->palette != 0) {
@ -268,7 +271,8 @@ ImagingDrawDIB(ImagingDIB dib, void *dc, int dst[4], int src[4]) {
src[1],
src[2] - src[0],
src[3] - src[1],
SRCCOPY);
SRCCOPY
);
}
}

View File

@ -120,9 +120,8 @@ hline8(Imaging im, int x0, int y0, int x1, int ink) {
if (x0 <= x1) {
pixelwidth = strncmp(im->mode, "I;16", 4) == 0 ? 2 : 1;
memset(
im->image8[y0] + x0 * pixelwidth,
(UINT8)ink,
(x1 - x0 + 1) * pixelwidth);
im->image8[y0] + x0 * pixelwidth, (UINT8)ink, (x1 - x0 + 1) * pixelwidth
);
}
}
}
@ -408,7 +407,8 @@ x_cmp(const void *x0, const void *x1) {
static void
draw_horizontal_lines(
Imaging im, int n, Edge *e, int ink, int *x_pos, int y, hline_handler hline) {
Imaging im, int n, Edge *e, int ink, int *x_pos, int y, hline_handler hline
) {
int i;
for (i = 0; i < n; i++) {
if (e[i].ymin == y && e[i].ymin == e[i].ymax) {
@ -440,13 +440,8 @@ draw_horizontal_lines(
*/
static inline int
polygon_generic(
Imaging im,
int n,
Edge *e,
int ink,
int eofill,
hline_handler hline,
int hasAlpha) {
Imaging im, int n, Edge *e, int ink, int eofill, hline_handler hline, int hasAlpha
) {
Edge **edge_table;
float *xx;
int edge_count = 0;
@ -530,25 +525,29 @@ polygon_generic(
other_edge->x0;
if (ymin == current->ymax) {
if (current->dx > 0) {
xx[k] = fmax(
adjacent_line_x,
adjacent_line_x_other_edge) +
1;
xx[k] =
fmax(
adjacent_line_x, adjacent_line_x_other_edge
) +
1;
} else {
xx[k] = fmin(
adjacent_line_x,
adjacent_line_x_other_edge) -
1;
xx[k] =
fmin(
adjacent_line_x, adjacent_line_x_other_edge
) -
1;
}
} else {
if (current->dx > 0) {
xx[k] = fmin(
adjacent_line_x, adjacent_line_x_other_edge);
adjacent_line_x, adjacent_line_x_other_edge
);
} else {
xx[k] = fmax(
adjacent_line_x,
adjacent_line_x_other_edge) +
1;
xx[k] =
fmax(
adjacent_line_x, adjacent_line_x_other_edge
) +
1;
}
}
break;
@ -699,7 +698,8 @@ ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void *ink_, in
int
ImagingDrawWideLine(
Imaging im, int x0, int y0, int x1, int y1, const void *ink_, int width, int op) {
Imaging im, int x0, int y0, int x1, int y1, const void *ink_, int width, int op
) {
DRAW *draw;
INT32 ink;
int dx, dy;
@ -730,7 +730,8 @@ ImagingDrawWideLine(
{x0 - dxmin, y0 + dymax},
{x1 - dxmin, y1 + dymax},
{x1 + dxmax, y1 - dymin},
{x0 + dxmax, y0 - dymin}};
{x0 + dxmax, y0 - dymin}
};
add_edge(e + 0, vertices[0][0], vertices[0][1], vertices[1][0], vertices[1][1]);
add_edge(e + 1, vertices[1][0], vertices[1][1], vertices[2][0], vertices[2][1]);
@ -752,7 +753,8 @@ ImagingDrawRectangle(
const void *ink_,
int fill,
int width,
int op) {
int op
) {
int i;
int y;
int tmp;
@ -800,7 +802,8 @@ ImagingDrawRectangle(
int
ImagingDrawPolygon(
Imaging im, int count, int *xy, const void *ink_, int fill, int width, int op) {
Imaging im, int count, int *xy, const void *ink_, int fill, int width, int op
) {
int i, n, x0, y0, x1, y1;
DRAW *draw;
INT32 ink;
@ -851,7 +854,8 @@ ImagingDrawPolygon(
if (width == 1) {
for (i = 0; i < count - 1; i++) {
draw->line(
im, xy[i * 2], xy[i * 2 + 1], xy[i * 2 + 2], xy[i * 2 + 3], ink);
im, xy[i * 2], xy[i * 2 + 1], xy[i * 2 + 2], xy[i * 2 + 3], ink
);
}
draw->line(im, xy[i * 2], xy[i * 2 + 1], xy[0], xy[1], ink);
} else {
@ -864,10 +868,12 @@ ImagingDrawPolygon(
xy[i * 2 + 3],
ink_,
width,
op);
op
);
}
ImagingDrawWideLine(
im, xy[i * 2], xy[i * 2 + 1], xy[0], xy[1], ink_, width, op);
im, xy[i * 2], xy[i * 2 + 1], xy[0], xy[1], ink_, width, op
);
}
}
@ -877,7 +883,8 @@ ImagingDrawPolygon(
int
ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void *ink, int op) {
return ImagingFill2(
im, ink, bitmap, x0, y0, x0 + bitmap->xsize, y0 + bitmap->ysize);
im, ink, bitmap, x0, y0, x0 + bitmap->xsize, y0 + bitmap->ysize
);
}
/* -------------------------------------------------------------------- */
@ -1086,7 +1093,8 @@ clip_tree_transpose(clip_node *root) {
// segments, i.e. something like correct bracket sequences.
int
clip_tree_do_clip(
clip_node *root, int32_t x0, int32_t y, int32_t x1, event_list **ret) {
clip_node *root, int32_t x0, int32_t y, int32_t x1, event_list **ret
) {
if (root == NULL) {
event_list *start = malloc(sizeof(event_list));
if (!start) {
@ -1223,7 +1231,8 @@ typedef struct {
} clip_ellipse_state;
typedef void (*clip_ellipse_init)(
clip_ellipse_state *, int32_t, int32_t, int32_t, float, float);
clip_ellipse_state *, int32_t, int32_t, int32_t, float, float
);
void
debug_clip_tree(clip_node *root, int space) {
@ -1335,7 +1344,8 @@ arc_init(clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float
// A chord line.
void
chord_line_init(
clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float ar) {
clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float ar
) {
ellipse_init(&s->st, a, b, a + b + 1);
s->head = NULL;
@ -1362,7 +1372,8 @@ chord_line_init(
// Pie side.
void
pie_side_init(
clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float _) {
clip_ellipse_state *s, int32_t a, int32_t b, int32_t w, float al, float _
) {
ellipse_init(&s->st, a, b, a + b + 1);
s->head = NULL;
@ -1478,7 +1489,8 @@ clip_ellipse_free(clip_ellipse_state *s) {
int8_t
clip_ellipse_next(
clip_ellipse_state *s, int32_t *ret_x0, int32_t *ret_y, int32_t *ret_x1) {
clip_ellipse_state *s, int32_t *ret_x0, int32_t *ret_y, int32_t *ret_x1
) {
int32_t x0, y, x1;
while (s->head == NULL && ellipse_next(&s->st, &x0, &y, &x1) >= 0) {
if (clip_tree_do_clip(s->root, x0, y, x1, &s->head) < 0) {
@ -1512,7 +1524,8 @@ ellipseNew(
const void *ink_,
int fill,
int width,
int op) {
int op
) {
DRAW *draw;
INT32 ink;
DRAWINIT();
@ -1547,7 +1560,8 @@ clipEllipseNew(
const void *ink_,
int width,
int op,
clip_ellipse_init init) {
clip_ellipse_init init
) {
DRAW *draw;
INT32 ink;
DRAWINIT();
@ -1580,7 +1594,8 @@ arcNew(
float end,
const void *ink_,
int width,
int op) {
int op
) {
return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, arc_init);
}
@ -1595,7 +1610,8 @@ chordNew(
float end,
const void *ink_,
int width,
int op) {
int op
) {
return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, chord_init);
}
@ -1610,9 +1626,11 @@ chordLineNew(
float end,
const void *ink_,
int width,
int op) {
int op
) {
return clipEllipseNew(
im, x0, y0, x1, y1, start, end, ink_, width, op, chord_line_init);
im, x0, y0, x1, y1, start, end, ink_, width, op, chord_line_init
);
}
static int
@ -1626,7 +1644,8 @@ pieNew(
float end,
const void *ink_,
int width,
int op) {
int op
) {
return clipEllipseNew(im, x0, y0, x1, y1, start, end, ink_, width, op, pie_init);
}
@ -1640,7 +1659,8 @@ pieSideNew(
float start,
const void *ink_,
int width,
int op) {
int op
) {
return clipEllipseNew(im, x0, y0, x1, y1, start, 0, ink_, width, op, pie_side_init);
}
@ -1654,7 +1674,8 @@ ImagingDrawEllipse(
const void *ink,
int fill,
int width,
int op) {
int op
) {
return ellipseNew(im, x0, y0, x1, y1, ink, fill, width, op);
}
@ -1669,7 +1690,8 @@ ImagingDrawArc(
float end,
const void *ink,
int width,
int op) {
int op
) {
normalize_angles(&start, &end);
if (start + 360 == end) {
return ImagingDrawEllipse(im, x0, y0, x1, y1, ink, 0, width, op);
@ -1692,7 +1714,8 @@ ImagingDrawChord(
const void *ink,
int fill,
int width,
int op) {
int op
) {
normalize_angles(&start, &end);
if (start + 360 == end) {
return ImagingDrawEllipse(im, x0, y0, x1, y1, ink, fill, width, op);
@ -1722,7 +1745,8 @@ ImagingDrawPieslice(
const void *ink,
int fill,
int width,
int op) {
int op
) {
normalize_angles(&start, &end);
if (start + 360 == end) {
return ellipseNew(im, x0, y0, x1, y1, ink, fill, width, op);
@ -1850,13 +1874,8 @@ ImagingOutlineLine(ImagingOutline outline, float x1, float y1) {
int
ImagingOutlineCurve(
ImagingOutline outline,
float x1,
float y1,
float x2,
float y2,
float x3,
float y3) {
ImagingOutline outline, float x1, float y1, float x2, float y2, float x3, float y3
) {
Edge *e;
int i;
float xo, yo;
@ -1970,7 +1989,8 @@ ImagingOutlineTransform(ImagingOutline outline, double a[6]) {
int
ImagingDrawOutline(
Imaging im, ImagingOutline outline, const void *ink_, int fill, int op) {
Imaging im, ImagingOutline outline, const void *ink_, int fill, int op
) {
DRAW *draw;
INT32 ink;

View File

@ -118,8 +118,8 @@ ImagingFillRadialGradient(const char *mode) {
for (y = 0; y < 256; y++) {
for (x = 0; x < 256; x++) {
d = (int)sqrt(
(double)((x - 128) * (x - 128) + (y - 128) * (y - 128)) * 2.0);
d = (int
)sqrt((double)((x - 128) * (x - 128) + (y - 128) * (y - 128)) * 2.0);
if (d >= 255) {
d = 255;
}

View File

@ -60,7 +60,8 @@ ImagingExpand(Imaging imIn, int xmargin, int ymargin) {
imOut = ImagingNewDirty(
imIn->mode,
(ImagingNewParams){imIn->xsize + 2 * xmargin, imIn->ysize + 2 * ymargin});
(ImagingNewParams){imIn->xsize + 2 * xmargin, imIn->ysize + 2 * ymargin}
);
if (!imOut) {
return NULL;
}
@ -370,7 +371,8 @@ ImagingFilter5x5(Imaging imOut, Imaging im, const float *kernel, float offset) {
}
}
memcpy(
out + x * sizeof(UINT32), in0 + x * sizeof(UINT32), sizeof(UINT32) * 2);
out + x * sizeof(UINT32), in0 + x * sizeof(UINT32), sizeof(UINT32) * 2
);
}
}
memcpy(imOut->image[y], im->image[y], im->linesize);

View File

@ -720,7 +720,8 @@ ImagingGenericTransform(
ImagingTransformMap transform,
void *transform_data,
int filterid,
int fill) {
int fill
) {
/* slow generic transformation. use ImagingTransformAffine or
ImagingScaleAffine where possible. */
@ -775,14 +776,8 @@ ImagingGenericTransform(
static Imaging
ImagingScaleAffine(
Imaging imOut,
Imaging imIn,
int x0,
int y0,
int x1,
int y1,
double a[6],
int fill) {
Imaging imOut, Imaging imIn, int x0, int y0, int x1, int y1, double a[6], int fill
) {
/* scale, nearest neighbour resampling */
ImagingSectionCookie cookie;
@ -875,7 +870,8 @@ static inline int
check_fixed(double a[6], int x, int y) {
return (
fabs(x * a[0] + y * a[1] + a[2]) < 32768.0 &&
fabs(x * a[3] + y * a[4] + a[5]) < 32768.0);
fabs(x * a[3] + y * a[4] + a[5]) < 32768.0
);
}
static inline Imaging
@ -888,7 +884,8 @@ affine_fixed(
int y1,
double a[6],
int filterid,
int fill) {
int fill
) {
/* affine transform, nearest neighbour resampling, fixed point
arithmetics */
@ -965,7 +962,8 @@ ImagingTransformAffine(
int y1,
double a[6],
int filterid,
int fill) {
int fill
) {
/* affine transform, nearest neighbour resampling, floating point
arithmetics*/
@ -978,7 +976,8 @@ ImagingTransformAffine(
if (filterid || imIn->type == IMAGING_TYPE_SPECIAL) {
return ImagingGenericTransform(
imOut, imIn, x0, y0, x1, y1, affine_transform, a, filterid, fill);
imOut, imIn, x0, y0, x1, y1, affine_transform, a, filterid, fill
);
}
if (a[1] == 0 && a[3] == 0) {
@ -1073,13 +1072,15 @@ ImagingTransform(
int y1,
double a[8],
int filterid,
int fill) {
int fill
) {
ImagingTransformMap transform;
switch (method) {
case IMAGING_TRANSFORM_AFFINE:
return ImagingTransformAffine(
imOut, imIn, x0, y0, x1, y1, a, filterid, fill);
imOut, imIn, x0, y0, x1, y1, a, filterid, fill
);
break;
case IMAGING_TRANSFORM_PERSPECTIVE:
transform = perspective_transform;
@ -1092,5 +1093,6 @@ ImagingTransform(
}
return ImagingGenericTransform(
imOut, imIn, x0, y0, x1, y1, transform, a, filterid, fill);
imOut, imIn, x0, y0, x1, y1, transform, a, filterid, fill
);
}

View File

@ -58,11 +58,10 @@ ImagingGetBBox(Imaging im, int bbox[4], int alpha_only) {
INT32 mask = 0xffffffff;
if (im->bands == 3) {
((UINT8 *)&mask)[3] = 0;
} else if (
alpha_only &&
(strcmp(im->mode, "RGBa") == 0 || strcmp(im->mode, "RGBA") == 0 ||
strcmp(im->mode, "La") == 0 || strcmp(im->mode, "LA") == 0 ||
strcmp(im->mode, "PA") == 0)) {
} else if (alpha_only &&
(strcmp(im->mode, "RGBa") == 0 || strcmp(im->mode, "RGBA") == 0 ||
strcmp(im->mode, "La") == 0 || strcmp(im->mode, "LA") == 0 ||
strcmp(im->mode, "PA") == 0)) {
#ifdef WORDS_BIGENDIAN
mask = 0x000000ff;
#else
@ -246,13 +245,14 @@ getcolors32(Imaging im, int maxcolors, int *size) {
code in Python 2.1.3; the exact implementation is borrowed from
Python's Unicode property database (written by yours truly) /F */
static int SIZES[] = {
4, 3, 8, 3, 16, 3, 32, 5, 64, 3,
128, 3, 256, 29, 512, 17, 1024, 9, 2048, 5,
4096, 83, 8192, 27, 16384, 43, 32768, 3, 65536, 45,
131072, 9, 262144, 39, 524288, 39, 1048576, 9, 2097152, 5,
4194304, 3, 8388608, 33, 16777216, 27, 33554432, 9, 67108864, 71,
134217728, 39, 268435456, 9, 536870912, 5, 1073741824, 83, 0};
static int SIZES[] = {4, 3, 8, 3, 16, 3, 32, 5,
64, 3, 128, 3, 256, 29, 512, 17,
1024, 9, 2048, 5, 4096, 83, 8192, 27,
16384, 43, 32768, 3, 65536, 45, 131072, 9,
262144, 39, 524288, 39, 1048576, 9, 2097152, 5,
4194304, 3, 8388608, 33, 16777216, 27, 33554432, 9,
67108864, 71, 134217728, 39, 268435456, 9, 536870912, 5,
1073741824, 83, 0};
code_size = code_poly = code_mask = 0;

View File

@ -79,7 +79,8 @@ glzwe(
UINT8 *out_ptr,
UINT32 *in_avail,
UINT32 *out_avail,
UINT32 end_of_data) {
UINT32 end_of_data
) {
switch (st->entry_state) {
case LZW_TRY_IN1:
get_first_byte:
@ -312,7 +313,8 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
state->buffer,
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->xsize);
state->xsize
);
state->x = 0;
/* step forward, according to the interlace settings */
@ -348,7 +350,8 @@ ImagingGifEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
ptr,
&in_avail,
&out_avail,
state->state == FINISH);
state->state == FINISH
);
out_used = sub_block_limit - ptr - out_avail;
*sub_block_ptr += out_used;
ptr += out_used;

View File

@ -49,7 +49,8 @@ ImagingHexDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt
if (++state->x >= state->bytes) {
/* Got a full line, unpack it */
state->shuffle(
(UINT8 *)im->image[state->y], state->buffer, state->xsize);
(UINT8 *)im->image[state->y], state->buffer, state->xsize
);
state->x = 0;

View File

@ -316,7 +316,8 @@ extern Imaging
ImagingFill(Imaging im, const void *ink);
extern int
ImagingFill2(
Imaging into, const void *ink, Imaging mask, int x0, int y0, int x1, int y1);
Imaging into, const void *ink, Imaging mask, int x0, int y0, int x1, int y1
);
extern Imaging
ImagingFillBand(Imaging im, int band, int color);
extern Imaging
@ -331,7 +332,8 @@ extern Imaging
ImagingFlipTopBottom(Imaging imOut, Imaging imIn);
extern Imaging
ImagingGaussianBlur(
Imaging imOut, Imaging imIn, float xradius, float yradius, int passes);
Imaging imOut, Imaging imIn, float xradius, float yradius, int passes
);
extern Imaging
ImagingGetBand(Imaging im, int band);
extern Imaging
@ -394,7 +396,8 @@ ImagingTransform(
int y1,
double a[8],
int filter,
int fill);
int fill
);
extern Imaging
ImagingUnsharpMask(Imaging imOut, Imaging im, float radius, int percent, int threshold);
extern Imaging
@ -407,7 +410,8 @@ ImagingColorLUT3D_linear(
int size1D,
int size2D,
int size3D,
INT16 *table);
INT16 *table
);
extern Imaging
ImagingCopy2(Imaging imOut, Imaging imIn);
@ -461,7 +465,8 @@ ImagingDrawArc(
float end,
const void *ink,
int width,
int op);
int op
);
extern int
ImagingDrawBitmap(Imaging im, int x0, int y0, Imaging bitmap, const void *ink, int op);
extern int
@ -476,7 +481,8 @@ ImagingDrawChord(
const void *ink,
int fill,
int width,
int op);
int op
);
extern int
ImagingDrawEllipse(
Imaging im,
@ -487,12 +493,14 @@ ImagingDrawEllipse(
const void *ink,
int fill,
int width,
int op);
int op
);
extern int
ImagingDrawLine(Imaging im, int x0, int y0, int x1, int y1, const void *ink, int op);
extern int
ImagingDrawWideLine(
Imaging im, int x0, int y0, int x1, int y1, const void *ink, int width, int op);
Imaging im, int x0, int y0, int x1, int y1, const void *ink, int width, int op
);
extern int
ImagingDrawPieslice(
Imaging im,
@ -505,12 +513,14 @@ ImagingDrawPieslice(
const void *ink,
int fill,
int width,
int op);
int op
);
extern int
ImagingDrawPoint(Imaging im, int x, int y, const void *ink, int op);
extern int
ImagingDrawPolygon(
Imaging im, int points, int *xy, const void *ink, int fill, int width, int op);
Imaging im, int points, int *xy, const void *ink, int fill, int width, int op
);
extern int
ImagingDrawRectangle(
Imaging im,
@ -521,7 +531,8 @@ ImagingDrawRectangle(
const void *ink,
int fill,
int width,
int op);
int op
);
/* Level 2 graphics (WORK IN PROGRESS) */
extern ImagingOutline
@ -531,7 +542,8 @@ ImagingOutlineDelete(ImagingOutline outline);
extern int
ImagingDrawOutline(
Imaging im, ImagingOutline outline, const void *ink, int fill, int op);
Imaging im, ImagingOutline outline, const void *ink, int fill, int op
);
extern int
ImagingOutlineMove(ImagingOutline outline, float x, float y);
@ -539,7 +551,8 @@ extern int
ImagingOutlineLine(ImagingOutline outline, float x, float y);
extern int
ImagingOutlineCurve(
ImagingOutline outline, float x1, float y1, float x2, float y2, float x3, float y3);
ImagingOutline outline, float x1, float y1, float x2, float y2, float x3, float y3
);
extern int
ImagingOutlineTransform(ImagingOutline outline, double a[6]);
@ -566,7 +579,8 @@ ImagingSavePPM(Imaging im, const char *filename);
/* Codecs */
typedef struct ImagingCodecStateInstance *ImagingCodecState;
typedef int (*ImagingCodec)(
Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes
);
extern int
ImagingBcnDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
@ -596,7 +610,8 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes)
#ifdef HAVE_OPENJPEG
extern int
ImagingJpeg2KDecode(
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes
);
extern int
ImagingJpeg2KDecodeCleanup(ImagingCodecState state);
extern int
@ -607,7 +622,8 @@ ImagingJpeg2KEncodeCleanup(ImagingCodecState state);
#ifdef HAVE_LIBTIFF
extern int
ImagingLibTiffDecode(
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes
);
extern int
ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
#endif
@ -619,7 +635,8 @@ extern int
ImagingMspDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
extern int
ImagingPackbitsDecode(
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes
);
extern int
ImagingPcdDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
extern int
@ -632,13 +649,16 @@ extern int
ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
extern int
ImagingSgiRleDecode(
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes
);
extern int
ImagingSunRleDecode(
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes
);
extern int
ImagingTgaRleDecode(
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes);
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes
);
extern int
ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int bytes);
extern int

View File

@ -67,7 +67,8 @@ j2k_skip(OPJ_OFF_T p_nb_bytes, void *p_user_data) {
/* -------------------------------------------------------------------- */
typedef void (*j2k_unpacker_t)(
opj_image_t *in, const JPEG2KTILEINFO *tileInfo, const UINT8 *data, Imaging im);
opj_image_t *in, const JPEG2KTILEINFO *tileInfo, const UINT8 *data, Imaging im
);
struct j2k_decode_unpacker {
const char *mode;
@ -89,10 +90,8 @@ j2ku_shift(unsigned x, int n) {
static void
j2ku_gray_l(
opj_image_t *in,
const JPEG2KTILEINFO *tileinfo,
const UINT8 *tiledata,
Imaging im) {
opj_image_t *in, const JPEG2KTILEINFO *tileinfo, const UINT8 *tiledata, Imaging im
) {
unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0;
unsigned w = tileinfo->x1 - tileinfo->x0;
unsigned h = tileinfo->y1 - tileinfo->y0;
@ -145,10 +144,8 @@ j2ku_gray_l(
static void
j2ku_gray_i(
opj_image_t *in,
const JPEG2KTILEINFO *tileinfo,
const UINT8 *tiledata,
Imaging im) {
opj_image_t *in, const JPEG2KTILEINFO *tileinfo, const UINT8 *tiledata, Imaging im
) {
unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0;
unsigned w = tileinfo->x1 - tileinfo->x0;
unsigned h = tileinfo->y1 - tileinfo->y0;
@ -204,10 +201,8 @@ j2ku_gray_i(
static void
j2ku_gray_rgb(
opj_image_t *in,
const JPEG2KTILEINFO *tileinfo,
const UINT8 *tiledata,
Imaging im) {
opj_image_t *in, const JPEG2KTILEINFO *tileinfo, const UINT8 *tiledata, Imaging im
) {
unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0;
unsigned w = tileinfo->x1 - tileinfo->x0;
unsigned h = tileinfo->y1 - tileinfo->y0;
@ -268,10 +263,8 @@ j2ku_gray_rgb(
static void
j2ku_graya_la(
opj_image_t *in,
const JPEG2KTILEINFO *tileinfo,
const UINT8 *tiledata,
Imaging im) {
opj_image_t *in, const JPEG2KTILEINFO *tileinfo, const UINT8 *tiledata, Imaging im
) {
unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0;
unsigned w = tileinfo->x1 - tileinfo->x0;
unsigned h = tileinfo->y1 - tileinfo->y0;
@ -347,10 +340,8 @@ j2ku_graya_la(
static void
j2ku_srgb_rgb(
opj_image_t *in,
const JPEG2KTILEINFO *tileinfo,
const UINT8 *tiledata,
Imaging im) {
opj_image_t *in, const JPEG2KTILEINFO *tileinfo, const UINT8 *tiledata, Imaging im
) {
unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0;
unsigned w = tileinfo->x1 - tileinfo->x0;
unsigned h = tileinfo->y1 - tileinfo->y0;
@ -413,10 +404,8 @@ j2ku_srgb_rgb(
static void
j2ku_sycc_rgb(
opj_image_t *in,
const JPEG2KTILEINFO *tileinfo,
const UINT8 *tiledata,
Imaging im) {
opj_image_t *in, const JPEG2KTILEINFO *tileinfo, const UINT8 *tiledata, Imaging im
) {
unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0;
unsigned w = tileinfo->x1 - tileinfo->x0;
unsigned h = tileinfo->y1 - tileinfo->y0;
@ -482,10 +471,8 @@ j2ku_sycc_rgb(
static void
j2ku_srgba_rgba(
opj_image_t *in,
const JPEG2KTILEINFO *tileinfo,
const UINT8 *tiledata,
Imaging im) {
opj_image_t *in, const JPEG2KTILEINFO *tileinfo, const UINT8 *tiledata, Imaging im
) {
unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0;
unsigned w = tileinfo->x1 - tileinfo->x0;
unsigned h = tileinfo->y1 - tileinfo->y0;
@ -547,10 +534,8 @@ j2ku_srgba_rgba(
static void
j2ku_sycca_rgba(
opj_image_t *in,
const JPEG2KTILEINFO *tileinfo,
const UINT8 *tiledata,
Imaging im) {
opj_image_t *in, const JPEG2KTILEINFO *tileinfo, const UINT8 *tiledata, Imaging im
) {
unsigned x0 = tileinfo->x0 - in->x0, y0 = tileinfo->y0 - in->y0;
unsigned w = tileinfo->x1 - tileinfo->x0;
unsigned h = tileinfo->y1 - tileinfo->y0;
@ -815,7 +800,8 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) {
&tile_info.x1,
&tile_info.y1,
&tile_info.nb_comps,
&should_continue)) {
&should_continue
)) {
state->errcode = IMAGING_CODEC_BROKEN;
state->state = J2K_STATE_FAILED;
goto quick_exit;
@ -906,7 +892,8 @@ j2k_decode_entry(Imaging im, ImagingCodecState state) {
tile_info.tile_index,
(OPJ_BYTE *)state->buffer,
tile_info.data_size,
stream)) {
stream
)) {
state->errcode = IMAGING_CODEC_BROKEN;
state->state = J2K_STATE_FAILED;
goto quick_exit;

View File

@ -89,7 +89,8 @@ j2k_seek(OPJ_OFF_T p_nb_bytes, void *p_user_data) {
/* -------------------------------------------------------------------- */
typedef void (*j2k_pack_tile_t)(
Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h);
Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h
);
static void
j2k_pack_l(Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h) {
@ -157,7 +158,8 @@ j2k_pack_rgb(Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsig
static void
j2k_pack_rgba(
Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h) {
Imaging im, UINT8 *buf, unsigned x0, unsigned y0, unsigned w, unsigned h
) {
UINT8 *pr = buf;
UINT8 *pg = pr + w * h;
UINT8 *pb = pg + w * h;
@ -205,8 +207,8 @@ j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) {
if (params->cp_cinema == OPJ_CINEMA4K_24) {
float max_rate =
((float)(components * im->xsize * im->ysize * 8) /
(CINEMA_24_CS_LENGTH * 8));
((float)(components * im->xsize * im->ysize * 8) / (CINEMA_24_CS_LENGTH * 8)
);
params->POC[0].tile = 1;
params->POC[0].resno0 = 0;
@ -241,8 +243,8 @@ j2k_set_cinema_params(Imaging im, int components, opj_cparameters_t *params) {
params->max_comp_size = COMP_24_CS_MAX_LENGTH;
} else {
float max_rate =
((float)(components * im->xsize * im->ysize * 8) /
(CINEMA_48_CS_LENGTH * 8));
((float)(components * im->xsize * im->ysize * 8) / (CINEMA_48_CS_LENGTH * 8)
);
for (n = 0; n < params->tcp_numlayers; ++n) {
rate = 0;

View File

@ -206,9 +206,8 @@ ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t by
context->cinfo.out_color_space = JCS_EXT_RGBX;
}
#endif
else if (
strcmp(context->rawmode, "CMYK") == 0 ||
strcmp(context->rawmode, "CMYK;I") == 0) {
else if (strcmp(context->rawmode, "CMYK") == 0 ||
strcmp(context->rawmode, "CMYK;I") == 0) {
context->cinfo.out_color_space = JCS_CMYK;
} else if (strcmp(context->rawmode, "YCbCr") == 0) {
context->cinfo.out_color_space = JCS_YCbCr;
@ -256,7 +255,8 @@ ImagingJpegDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t by
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->buffer,
state->xsize);
state->xsize
);
state->y++;
}
if (ok != 1) {

View File

@ -175,7 +175,8 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
i,
&context->qtables[i * DCTSIZE2],
quality,
FALSE);
FALSE
);
context->cinfo.comp_info[i].quant_tbl_no = i;
last_q = i;
}
@ -183,7 +184,8 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
// jpeg_set_defaults created two qtables internally, but we only
// wanted one.
jpeg_add_quant_table(
&context->cinfo, 1, &context->qtables[0], quality, FALSE);
&context->cinfo, 1, &context->qtables[0], quality, FALSE
);
}
for (i = last_q; i < context->cinfo.num_components; i++) {
context->cinfo.comp_info[i].quant_tbl_no = last_q;
@ -273,7 +275,8 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
&context->cinfo,
JPEG_APP0 + 1,
(unsigned char *)context->rawExif,
context->rawExifLen);
context->rawExifLen
);
}
state->state++;
@ -289,7 +292,8 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
memcpy(
context->destination.pub.next_output_byte,
context->extra + context->extra_offset,
n);
n
);
context->destination.pub.next_output_byte += n;
context->destination.pub.free_in_buffer -= n;
context->extra_offset += n;
@ -309,7 +313,8 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
&context->cinfo,
JPEG_COM,
(unsigned char *)context->comment,
context->comment_size);
context->comment_size
);
}
state->state++;
@ -324,7 +329,8 @@ ImagingJpegEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
state->buffer,
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->xsize);
state->xsize
);
ok = jpeg_write_scanlines(&context->cinfo, &state->buffer, 1);
if (ok != 1) {
break;

View File

@ -17,7 +17,8 @@
int
ImagingPackbitsDecode(
Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) {
Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes
) {
UINT8 n;
UINT8 *ptr;
int i;
@ -79,7 +80,8 @@ ImagingPackbitsDecode(
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->buffer,
state->xsize);
state->xsize
);
state->x = 0;

View File

@ -33,7 +33,8 @@ paste(
int sy,
int xsize,
int ysize,
int pixelsize) {
int pixelsize
) {
/* paste opaque region */
int y;
@ -59,7 +60,8 @@ paste_mask_1(
int sy,
int xsize,
int ysize,
int pixelsize) {
int pixelsize
) {
/* paste with mode "1" mask */
int x, y;
@ -120,7 +122,8 @@ paste_mask_L(
int sy,
int xsize,
int ysize,
int pixelsize) {
int pixelsize
) {
/* paste with mode "L" matte */
int x, y;
@ -167,7 +170,8 @@ paste_mask_RGBA(
int sy,
int xsize,
int ysize,
int pixelsize) {
int pixelsize
) {
/* paste with mode "RGBA" matte */
int x, y;
@ -214,7 +218,8 @@ paste_mask_RGBa(
int sy,
int xsize,
int ysize,
int pixelsize) {
int pixelsize
) {
/* paste with mode "RGBa" matte */
int x, y;
@ -252,7 +257,8 @@ paste_mask_RGBa(
int
ImagingPaste(
Imaging imOut, Imaging imIn, Imaging imMask, int dx0, int dy0, int dx1, int dy1) {
Imaging imOut, Imaging imIn, Imaging imMask, int dx0, int dy0, int dx1, int dy1
) {
int xsize, ysize;
int pixelsize;
int sx0, sy0;
@ -315,13 +321,15 @@ ImagingPaste(
} else if (strcmp(imMask->mode, "LA") == 0 || strcmp(imMask->mode, "RGBA") == 0) {
ImagingSectionEnter(&cookie);
paste_mask_RGBA(
imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize
);
ImagingSectionLeave(&cookie);
} else if (strcmp(imMask->mode, "RGBa") == 0) {
ImagingSectionEnter(&cookie);
paste_mask_RGBa(
imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize);
imOut, imIn, imMask, dx0, dy0, sx0, sy0, xsize, ysize, pixelsize
);
ImagingSectionLeave(&cookie);
} else {
@ -334,13 +342,8 @@ ImagingPaste(
static inline void
fill(
Imaging imOut,
const void *ink_,
int dx,
int dy,
int xsize,
int ysize,
int pixelsize) {
Imaging imOut, const void *ink_, int dx, int dy, int xsize, int ysize, int pixelsize
) {
/* fill opaque region */
int x, y;
@ -378,7 +381,8 @@ fill_mask_1(
int sy,
int xsize,
int ysize,
int pixelsize) {
int pixelsize
) {
/* fill with mode "1" mask */
int x, y;
@ -425,7 +429,8 @@ fill_mask_L(
int sy,
int xsize,
int ysize,
int pixelsize) {
int pixelsize
) {
/* fill with mode "L" matte */
int x, y, i;
@ -484,7 +489,8 @@ fill_mask_RGBA(
int sy,
int xsize,
int ysize,
int pixelsize) {
int pixelsize
) {
/* fill with mode "RGBA" matte */
int x, y, i;
@ -529,7 +535,8 @@ fill_mask_RGBa(
int sy,
int xsize,
int ysize,
int pixelsize) {
int pixelsize
) {
/* fill with mode "RGBa" matte */
int x, y, i;
@ -565,13 +572,8 @@ fill_mask_RGBa(
int
ImagingFill2(
Imaging imOut,
const void *ink,
Imaging imMask,
int dx0,
int dy0,
int dx1,
int dy1) {
Imaging imOut, const void *ink, Imaging imMask, int dx0, int dy0, int dx1, int dy1
) {
ImagingSectionCookie cookie;
int xsize, ysize;
int pixelsize;

View File

@ -68,7 +68,8 @@ ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt
memmove(
&state->buffer[i * state->xsize],
&state->buffer[i * stride],
state->xsize);
state->xsize
);
}
}
/* Got a full line, unpack it */
@ -76,7 +77,8 @@ ImagingPcxDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->buffer,
state->xsize);
state->xsize
);
state->x = 0;

View File

@ -71,7 +71,8 @@ ImagingPcxEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
state->buffer,
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->xsize);
state->xsize
);
state->y += 1;

View File

@ -197,8 +197,8 @@ ImagingPoint(Imaging imIn, const char *mode, const void *table) {
return imOut;
mode_mismatch:
return (Imaging)ImagingError_ValueError(
"point operation not supported for this mode");
return (Imaging
)ImagingError_ValueError("point operation not supported for this mode");
}
Imaging

View File

@ -103,7 +103,8 @@ static uint32_t
pixel_hash(const HashTable *h, const Pixel pixel) {
PixelHashData *d = (PixelHashData *)hashtable_get_user_data(h);
return PIXEL_HASH(
pixel.c.r >> d->scale, pixel.c.g >> d->scale, pixel.c.b >> d->scale);
pixel.c.r >> d->scale, pixel.c.g >> d->scale, pixel.c.b >> d->scale
);
}
static int
@ -111,9 +112,11 @@ pixel_cmp(const HashTable *h, const Pixel pixel1, const Pixel pixel2) {
PixelHashData *d = (PixelHashData *)hashtable_get_user_data(h);
uint32_t A, B;
A = PIXEL_HASH(
pixel1.c.r >> d->scale, pixel1.c.g >> d->scale, pixel1.c.b >> d->scale);
pixel1.c.r >> d->scale, pixel1.c.g >> d->scale, pixel1.c.b >> d->scale
);
B = PIXEL_HASH(
pixel2.c.r >> d->scale, pixel2.c.g >> d->scale, pixel2.c.b >> d->scale);
pixel2.c.r >> d->scale, pixel2.c.g >> d->scale, pixel2.c.b >> d->scale
);
return (A == B) ? 0 : ((A < B) ? -1 : 1);
}
@ -129,7 +132,8 @@ new_count_func(const HashTable *h, const Pixel key, uint32_t *val) {
static void
rehash_collide(
const HashTable *h, Pixel *keyp, uint32_t *valp, Pixel newkey, uint32_t newval) {
const HashTable *h, Pixel *keyp, uint32_t *valp, Pixel newkey, uint32_t newval
) {
*valp += newval;
}
@ -157,7 +161,8 @@ create_pixel_hash(Pixel *pixelData, uint32_t nPixels) {
#endif
for (i = 0; i < nPixels; i++) {
if (!hashtable_insert_or_update_computed(
hash, pixelData[i], new_count_func, exists_count_func)) {
hash, pixelData[i], new_count_func, exists_count_func
)) {
;
}
while (hashtable_get_count(hash) > MAX_HASH_ENTRIES) {
@ -335,7 +340,8 @@ splitlists(
PixelList *nt[2][3],
uint32_t nCount[2],
int axis,
uint32_t pixelCount) {
uint32_t pixelCount
) {
uint32_t left;
PixelList *l, *r, *c, *n;
@ -387,7 +393,8 @@ splitlists(
_prevCount[2],
_nextCount[0],
_nextCount[1],
_nextCount[2]);
_nextCount[2]
);
exit(1);
}
}
@ -531,12 +538,14 @@ split(BoxNode *node) {
if (node->tail[_i]->next[_i]) {
printf("tail is not tail\n");
printf(
"node->tail[%d]->next[%d]=%p\n", _i, _i, node->tail[_i]->next[_i]);
"node->tail[%d]->next[%d]=%p\n", _i, _i, node->tail[_i]->next[_i]
);
}
if (node->head[_i]->prev[_i]) {
printf("head is not head\n");
printf(
"node->head[%d]->prev[%d]=%p\n", _i, _i, node->head[_i]->prev[_i]);
"node->head[%d]->prev[%d]=%p\n", _i, _i, node->head[_i]->prev[_i]
);
}
}
@ -573,14 +582,16 @@ split(BoxNode *node) {
_prevCount[2],
_nextCount[0],
_nextCount[1],
_nextCount[2]);
_nextCount[2]
);
}
}
}
#endif
node->axis = axis;
if (!splitlists(
node->head, node->tail, heads, tails, newCounts, axis, node->pixelCount)) {
node->head, node->tail, heads, tails, newCounts, axis, node->pixelCount
)) {
#ifndef NO_OUTPUT
printf("list split failed.\n");
#endif
@ -772,7 +783,8 @@ _distance_index_cmp(const void *a, const void *b) {
static int
resort_distance_tables(
uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries) {
uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries
) {
uint32_t i, j, k;
uint32_t **skRow;
uint32_t *skElt;
@ -801,7 +813,8 @@ resort_distance_tables(
static int
build_distance_tables(
uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries) {
uint32_t *avgDist, uint32_t **avgDistSortKey, Pixel *p, uint32_t nEntries
) {
uint32_t i, j;
DistanceWithIndex *dwi;
@ -841,7 +854,8 @@ map_image_pixels(
uint32_t nPaletteEntries,
uint32_t *avgDist,
uint32_t **avgDistSortKey,
uint32_t *pixelArray) {
uint32_t *pixelArray
) {
uint32_t *aD, **aDSK;
uint32_t idx;
uint32_t i, j;
@ -888,7 +902,8 @@ map_image_pixels_from_quantized_pixels(
uint32_t **avgDistSortKey,
uint32_t *pixelArray,
uint32_t *avg[3],
uint32_t *count) {
uint32_t *count
) {
uint32_t *aD, **aDSK;
uint32_t idx;
uint32_t i, j;
@ -946,7 +961,8 @@ map_image_pixels_from_median_box(
HashTable *medianBoxHash,
uint32_t *avgDist,
uint32_t **avgDistSortKey,
uint32_t *pixelArray) {
uint32_t *pixelArray
) {
uint32_t *aD, **aDSK;
uint32_t idx;
uint32_t i, j;
@ -998,7 +1014,8 @@ compute_palette_from_median_cut(
uint32_t nPixels,
HashTable *medianBoxHash,
Pixel **palette,
uint32_t nPaletteEntries) {
uint32_t nPaletteEntries
) {
uint32_t i;
uint32_t paletteEntry;
Pixel *p;
@ -1055,7 +1072,8 @@ compute_palette_from_median_cut(
printf(
"panic - paletteEntry>=nPaletteEntries (%d>=%d)\n",
(int)paletteEntry,
(int)nPaletteEntries);
(int)nPaletteEntries
);
#endif
for (i = 0; i < 3; i++) {
free(avg[i]);
@ -1092,7 +1110,8 @@ compute_palette_from_median_cut(
static int
recompute_palette_from_averages(
Pixel *palette, uint32_t nPaletteEntries, uint32_t *avg[3], uint32_t *count) {
Pixel *palette, uint32_t nPaletteEntries, uint32_t *avg[3], uint32_t *count
) {
uint32_t i;
for (i = 0; i < nPaletteEntries; i++) {
@ -1111,7 +1130,8 @@ compute_palette_from_quantized_pixels(
uint32_t nPaletteEntries,
uint32_t *avg[3],
uint32_t *count,
uint32_t *qp) {
uint32_t *qp
) {
uint32_t i;
memset(count, 0, sizeof(uint32_t) * nPaletteEntries);
@ -1145,7 +1165,8 @@ k_means(
Pixel *paletteData,
uint32_t nPaletteEntries,
uint32_t *qp,
int threshold) {
int threshold
) {
uint32_t *avg[3];
uint32_t *count;
uint32_t i;
@ -1194,16 +1215,19 @@ k_means(
while (1) {
if (!built) {
compute_palette_from_quantized_pixels(
pixelData, nPixels, paletteData, nPaletteEntries, avg, count, qp);
pixelData, nPixels, paletteData, nPaletteEntries, avg, count, qp
);
if (!build_distance_tables(
avgDist, avgDistSortKey, paletteData, nPaletteEntries)) {
avgDist, avgDistSortKey, paletteData, nPaletteEntries
)) {
goto error_3;
}
built = 1;
} else {
recompute_palette_from_averages(paletteData, nPaletteEntries, avg, count);
resort_distance_tables(
avgDist, avgDistSortKey, paletteData, nPaletteEntries);
avgDist, avgDistSortKey, paletteData, nPaletteEntries
);
}
changes = map_image_pixels_from_quantized_pixels(
pixelData,
@ -1214,7 +1238,8 @@ k_means(
avgDistSortKey,
qp,
avg,
count);
count
);
if (changes < 0) {
goto error_3;
}
@ -1273,7 +1298,8 @@ quantize(
Pixel **palette,
uint32_t *paletteLength,
uint32_t **quantizedPixels,
int kmeans) {
int kmeans
) {
PixelList *hl[3];
HashTable *h;
BoxNode *root;
@ -1399,7 +1425,8 @@ quantize(
}
if (!map_image_pixels_from_median_box(
pixelData, nPixels, p, nPaletteEntries, h, avgDist, avgDistSortKey, qp)) {
pixelData, nPixels, p, nPaletteEntries, h, avgDist, avgDistSortKey, qp
)) {
goto error_7;
}
@ -1445,7 +1472,8 @@ quantize(
_SQR(pixelData[i].c.b - p[qp[i]].c.b))),
sqrt((double)(_SQR(pixelData[i].c.r - p[bestmatch].c.r) +
_SQR(pixelData[i].c.g - p[bestmatch].c.g) +
_SQR(pixelData[i].c.b - p[bestmatch].c.b))));
_SQR(pixelData[i].c.b - p[bestmatch].c.b)))
);
}
}
hashtable_free(h2);
@ -1545,7 +1573,8 @@ quantize2(
Pixel **palette,
uint32_t *paletteLength,
uint32_t **quantizedPixels,
int kmeans) {
int kmeans
) {
HashTable *h;
uint32_t i;
uint32_t mean[3];
@ -1609,7 +1638,8 @@ quantize2(
}
if (!map_image_pixels(
pixelData, nPixels, p, nQuantPixels, avgDist, avgDistSortKey, qp)) {
pixelData, nPixels, p, nQuantPixels, avgDist, avgDistSortKey, qp
)) {
goto error_4;
}
if (kmeans > 0) {
@ -1752,7 +1782,8 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
&palette,
&paletteLength,
&newData,
kmeans);
kmeans
);
break;
case 1:
/* maximum coverage */
@ -1763,7 +1794,8 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
&palette,
&paletteLength,
&newData,
kmeans);
kmeans
);
break;
case 2:
result = quantize_octree(
@ -1773,7 +1805,8 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
&palette,
&paletteLength,
&newData,
withAlpha);
withAlpha
);
break;
case 3:
#ifdef HAVE_LIBIMAGEQUANT
@ -1785,7 +1818,8 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
&palette,
&paletteLength,
&newData,
withAlpha);
withAlpha
);
#else
result = -1;
#endif
@ -1836,7 +1870,8 @@ ImagingQuantize(Imaging im, int colors, int mode, int kmeans) {
if (result == -1) {
return (Imaging)ImagingError_ValueError(
"dependency required by this method was not "
"enabled at compile time");
"enabled at compile time"
);
}
return (Imaging)ImagingError_ValueError("quantization error");

View File

@ -132,7 +132,8 @@ _hashtable_resize(HashTable *h) {
static int
_hashtable_insert_node(
HashTable *h, HashNode *node, int resize, int update, CollisionFunc cf) {
HashTable *h, HashNode *node, int resize, int update, CollisionFunc cf
) {
uint32_t hash = h->hashFunc(h, node->key) % h->length;
HashNode **n, *nv;
int i;
@ -207,7 +208,8 @@ _hashtable_insert(HashTable *h, HashKey_t key, HashVal_t val, int resize, int up
int
hashtable_insert_or_update_computed(
HashTable *h, HashKey_t key, ComputeFunc newFunc, ComputeFunc existsFunc) {
HashTable *h, HashKey_t key, ComputeFunc newFunc, ComputeFunc existsFunc
) {
HashNode **n, *nv;
HashNode *t;
int i;

View File

@ -20,13 +20,12 @@ typedef uint32_t HashVal_t;
typedef uint32_t (*HashFunc)(const HashTable *, const HashKey_t);
typedef int (*HashCmpFunc)(const HashTable *, const HashKey_t, const HashKey_t);
typedef void (*IteratorFunc)(
const HashTable *, const HashKey_t, const HashVal_t, void *);
typedef void (*IteratorUpdateFunc)(
const HashTable *, const HashKey_t, HashVal_t *, void *);
typedef void (*IteratorFunc)(const HashTable *, const HashKey_t, const HashVal_t, void *);
typedef void (*IteratorUpdateFunc)(const HashTable *, const HashKey_t, HashVal_t *, void *);
typedef void (*ComputeFunc)(const HashTable *, const HashKey_t, HashVal_t *);
typedef void (*CollisionFunc)(
const HashTable *, HashKey_t *, HashVal_t *, HashKey_t, HashVal_t);
const HashTable *, HashKey_t *, HashVal_t *, HashKey_t, HashVal_t
);
HashTable *
hashtable_new(HashFunc hf, HashCmpFunc cf);
@ -42,7 +41,8 @@ int
hashtable_lookup(const HashTable *h, const HashKey_t key, HashVal_t *valp);
int
hashtable_insert_or_update_computed(
HashTable *h, HashKey_t key, ComputeFunc newFunc, ComputeFunc existsFunc);
HashTable *h, HashKey_t key, ComputeFunc newFunc, ComputeFunc existsFunc
);
void *
hashtable_set_user_data(HashTable *h, void *data);
void *

View File

@ -107,11 +107,8 @@ free_color_cube(ColorCube cube) {
static long
color_bucket_offset_pos(
const ColorCube cube,
unsigned int r,
unsigned int g,
unsigned int b,
unsigned int a) {
const ColorCube cube, unsigned int r, unsigned int g, unsigned int b, unsigned int a
) {
return r << cube->rOffset | g << cube->gOffset | b << cube->bOffset |
a << cube->aOffset;
}
@ -191,7 +188,8 @@ create_sorted_color_palette(const ColorCube cube) {
buckets,
cube->size,
sizeof(struct _ColorBucket),
(int (*)(void const *, void const *)) & compare_bucket_count);
(int (*)(void const *, void const *)) & compare_bucket_count
);
return buckets;
}
@ -212,7 +210,8 @@ copy_color_cube(
unsigned int rBits,
unsigned int gBits,
unsigned int bBits,
unsigned int aBits) {
unsigned int aBits
) {
unsigned int r, g, b, a;
long src_pos, dst_pos;
unsigned int src_reduce[4] = {0}, dst_reduce[4] = {0};
@ -262,15 +261,18 @@ copy_color_cube(
r >> src_reduce[0],
g >> src_reduce[1],
b >> src_reduce[2],
a >> src_reduce[3]);
a >> src_reduce[3]
);
dst_pos = color_bucket_offset_pos(
result,
r >> dst_reduce[0],
g >> dst_reduce[1],
b >> dst_reduce[2],
a >> dst_reduce[3]);
a >> dst_reduce[3]
);
add_bucket_values(
&cube->buckets[src_pos], &result->buckets[dst_pos]);
&cube->buckets[src_pos], &result->buckets[dst_pos]
);
}
}
}
@ -328,7 +330,8 @@ combined_palette(
ColorBucket bucketsA,
unsigned long nBucketsA,
ColorBucket bucketsB,
unsigned long nBucketsB) {
unsigned long nBucketsB
) {
ColorBucket result;
if (nBucketsA > LONG_MAX - nBucketsB ||
(nBucketsA + nBucketsB) > LONG_MAX / sizeof(struct _ColorBucket)) {
@ -366,7 +369,8 @@ map_image_pixels(
const Pixel *pixelData,
uint32_t nPixels,
const ColorCube lookupCube,
uint32_t *pixelArray) {
uint32_t *pixelArray
) {
long i;
for (i = 0; i < nPixels; i++) {
pixelArray[i] = lookup_color(lookupCube, &pixelData[i]);
@ -384,7 +388,8 @@ quantize_octree(
Pixel **palette,
uint32_t *paletteLength,
uint32_t **quantizedPixels,
int withAlpha) {
int withAlpha
) {
ColorCube fineCube = NULL;
ColorCube coarseCube = NULL;
ColorCube lookupCube = NULL;
@ -461,7 +466,8 @@ quantize_octree(
subtract_color_buckets(
coarseCube,
&paletteBucketsFine[nAlreadySubtracted],
nFineColors - nAlreadySubtracted);
nFineColors - nAlreadySubtracted
);
}
/* create our palette buckets with fine and coarse combined */
@ -470,7 +476,8 @@ quantize_octree(
goto error;
}
paletteBuckets = combined_palette(
paletteBucketsCoarse, nCoarseColors, paletteBucketsFine, nFineColors);
paletteBucketsCoarse, nCoarseColors, paletteBucketsFine, nFineColors
);
free(paletteBucketsFine);
paletteBucketsFine = NULL;
@ -491,7 +498,8 @@ quantize_octree(
/* expand coarse cube (64) to larger fine cube (4k). the value of each
coarse bucket is then present in the according 64 fine buckets. */
lookupCube = copy_color_cube(
coarseLookupCube, cubeBits[0], cubeBits[1], cubeBits[2], cubeBits[3]);
coarseLookupCube, cubeBits[0], cubeBits[1], cubeBits[2], cubeBits[3]
);
if (!lookupCube) {
goto error;
}

View File

@ -26,7 +26,8 @@ quantize_pngquant(
Pixel **palette,
uint32_t *paletteLength,
uint32_t **quantizedPixels,
int withAlpha) {
int withAlpha
) {
int result = 0;
liq_image *image = NULL;
liq_attr *attr = NULL;

View File

@ -12,6 +12,7 @@ quantize_pngquant(
Pixel **,
uint32_t *,
uint32_t **,
int);
int
);
#endif

View File

@ -103,7 +103,8 @@ MakeRankFunction(UINT8) MakeRankFunction(INT32) MakeRankFunction(FLOAT32)
memcpy( \
buf + i * size, \
&IMAGING_PIXEL_##type(im, x, y + i), \
size * sizeof(type)); \
size * sizeof(type) \
); \
} \
IMAGING_PIXEL_##type(imOut, x, y) = Rank##type(buf, size2, rank); \
} \

View File

@ -75,7 +75,8 @@ ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt
(UINT8 *)im->image[state->y + state->yoff] + state->xoff * im->pixelsize,
ptr,
im,
state);
state
);
ptr += state->bytes;
bytes -= state->bytes;

View File

@ -65,7 +65,8 @@ ImagingRawEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
state->shuffle(
ptr,
(UINT8 *)im->image[state->y + state->yoff] + state->xoff * im->pixelsize,
state->xsize);
state->xsize
);
if (state->bytes > state->count) {
/* zero-pad the buffer, if necessary */

View File

@ -82,7 +82,8 @@ ImagingReduceNxN(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale
}
}
v = MAKE_UINT32(
(ss0 * multiplier) >> 24, 0, 0, (ss3 * multiplier) >> 24);
(ss0 * multiplier) >> 24, 0, 0, (ss3 * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else if (imIn->bands == 3) {
@ -124,7 +125,8 @@ ImagingReduceNxN(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale
(ss0 * multiplier) >> 24,
(ss1 * multiplier) >> 24,
(ss2 * multiplier) >> 24,
0);
0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -171,7 +173,8 @@ ImagingReduceNxN(Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale
(ss0 * multiplier) >> 24,
(ss1 * multiplier) >> 24,
(ss2 * multiplier) >> 24,
(ss3 * multiplier) >> 24);
(ss3 * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -226,7 +229,8 @@ ImagingReduce1xN(Imaging imOut, Imaging imIn, int box[4], int yscale) {
ss3 += line[xx * 4 + 3];
}
v = MAKE_UINT32(
(ss0 * multiplier) >> 24, 0, 0, (ss3 * multiplier) >> 24);
(ss0 * multiplier) >> 24, 0, 0, (ss3 * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else if (imIn->bands == 3) {
@ -251,7 +255,8 @@ ImagingReduce1xN(Imaging imOut, Imaging imIn, int box[4], int yscale) {
(ss0 * multiplier) >> 24,
(ss1 * multiplier) >> 24,
(ss2 * multiplier) >> 24,
0);
0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -278,7 +283,8 @@ ImagingReduce1xN(Imaging imOut, Imaging imIn, int box[4], int yscale) {
(ss0 * multiplier) >> 24,
(ss1 * multiplier) >> 24,
(ss2 * multiplier) >> 24,
(ss3 * multiplier) >> 24);
(ss3 * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -329,7 +335,8 @@ ImagingReduceNx1(Imaging imOut, Imaging imIn, int box[4], int xscale) {
ss3 += line[xx * 4 + 3];
}
v = MAKE_UINT32(
(ss0 * multiplier) >> 24, 0, 0, (ss3 * multiplier) >> 24);
(ss0 * multiplier) >> 24, 0, 0, (ss3 * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else if (imIn->bands == 3) {
@ -351,7 +358,8 @@ ImagingReduceNx1(Imaging imOut, Imaging imIn, int box[4], int xscale) {
(ss0 * multiplier) >> 24,
(ss1 * multiplier) >> 24,
(ss2 * multiplier) >> 24,
0);
0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -375,7 +383,8 @@ ImagingReduceNx1(Imaging imOut, Imaging imIn, int box[4], int xscale) {
(ss0 * multiplier) >> 24,
(ss1 * multiplier) >> 24,
(ss2 * multiplier) >> 24,
(ss3 * multiplier) >> 24);
(ss3 * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -425,7 +434,8 @@ ImagingReduce1x2(Imaging imOut, Imaging imIn, int box[4]) {
ss1 = line0[xx * 4 + 1] + line1[xx * 4 + 1];
ss2 = line0[xx * 4 + 2] + line1[xx * 4 + 2];
v = MAKE_UINT32(
(ss0 + amend) >> 1, (ss1 + amend) >> 1, (ss2 + amend) >> 1, 0);
(ss0 + amend) >> 1, (ss1 + amend) >> 1, (ss2 + amend) >> 1, 0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -440,7 +450,8 @@ ImagingReduce1x2(Imaging imOut, Imaging imIn, int box[4]) {
(ss0 + amend) >> 1,
(ss1 + amend) >> 1,
(ss2 + amend) >> 1,
(ss3 + amend) >> 1);
(ss3 + amend) >> 1
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -488,7 +499,8 @@ ImagingReduce2x1(Imaging imOut, Imaging imIn, int box[4]) {
ss1 = line0[xx * 4 + 1] + line0[xx * 4 + 5];
ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6];
v = MAKE_UINT32(
(ss0 + amend) >> 1, (ss1 + amend) >> 1, (ss2 + amend) >> 1, 0);
(ss0 + amend) >> 1, (ss1 + amend) >> 1, (ss2 + amend) >> 1, 0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -503,7 +515,8 @@ ImagingReduce2x1(Imaging imOut, Imaging imIn, int box[4]) {
(ss0 + amend) >> 1,
(ss1 + amend) >> 1,
(ss2 + amend) >> 1,
(ss3 + amend) >> 1);
(ss3 + amend) >> 1
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -558,7 +571,8 @@ ImagingReduce2x2(Imaging imOut, Imaging imIn, int box[4]) {
ss2 = line0[xx * 4 + 2] + line0[xx * 4 + 6] + line1[xx * 4 + 2] +
line1[xx * 4 + 6];
v = MAKE_UINT32(
(ss0 + amend) >> 2, (ss1 + amend) >> 2, (ss2 + amend) >> 2, 0);
(ss0 + amend) >> 2, (ss1 + amend) >> 2, (ss2 + amend) >> 2, 0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -577,7 +591,8 @@ ImagingReduce2x2(Imaging imOut, Imaging imIn, int box[4]) {
(ss0 + amend) >> 2,
(ss1 + amend) >> 2,
(ss2 + amend) >> 2,
(ss3 + amend) >> 2);
(ss3 + amend) >> 2
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -623,7 +638,8 @@ ImagingReduce1x3(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
0,
0,
((ss3 + amend) * multiplier) >> 24);
((ss3 + amend) * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else if (imIn->bands == 3) {
@ -637,7 +653,8 @@ ImagingReduce1x3(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
((ss1 + amend) * multiplier) >> 24,
((ss2 + amend) * multiplier) >> 24,
0);
0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -652,7 +669,8 @@ ImagingReduce1x3(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
((ss1 + amend) * multiplier) >> 24,
((ss2 + amend) * multiplier) >> 24,
((ss3 + amend) * multiplier) >> 24);
((ss3 + amend) * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -694,7 +712,8 @@ ImagingReduce3x1(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
0,
0,
((ss3 + amend) * multiplier) >> 24);
((ss3 + amend) * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else if (imIn->bands == 3) {
@ -708,7 +727,8 @@ ImagingReduce3x1(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
((ss1 + amend) * multiplier) >> 24,
((ss2 + amend) * multiplier) >> 24,
0);
0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -723,7 +743,8 @@ ImagingReduce3x1(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
((ss1 + amend) * multiplier) >> 24,
((ss2 + amend) * multiplier) >> 24,
((ss3 + amend) * multiplier) >> 24);
((ss3 + amend) * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -775,7 +796,8 @@ ImagingReduce3x3(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
0,
0,
((ss3 + amend) * multiplier) >> 24);
((ss3 + amend) * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else if (imIn->bands == 3) {
@ -795,7 +817,8 @@ ImagingReduce3x3(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
((ss1 + amend) * multiplier) >> 24,
((ss2 + amend) * multiplier) >> 24,
0);
0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -818,7 +841,8 @@ ImagingReduce3x3(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
((ss1 + amend) * multiplier) >> 24,
((ss2 + amend) * multiplier) >> 24,
((ss3 + amend) * multiplier) >> 24);
((ss3 + amend) * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -900,7 +924,8 @@ ImagingReduce4x4(Imaging imOut, Imaging imIn, int box[4]) {
line3[xx * 4 + 2] + line3[xx * 4 + 6] + line3[xx * 4 + 10] +
line3[xx * 4 + 14];
v = MAKE_UINT32(
(ss0 + amend) >> 4, (ss1 + amend) >> 4, (ss2 + amend) >> 4, 0);
(ss0 + amend) >> 4, (ss1 + amend) >> 4, (ss2 + amend) >> 4, 0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -935,7 +960,8 @@ ImagingReduce4x4(Imaging imOut, Imaging imIn, int box[4]) {
(ss0 + amend) >> 4,
(ss1 + amend) >> 4,
(ss2 + amend) >> 4,
(ss3 + amend) >> 4);
(ss3 + amend) >> 4
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -1007,7 +1033,8 @@ ImagingReduce5x5(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
0,
0,
((ss3 + amend) * multiplier) >> 24);
((ss3 + amend) * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else if (imIn->bands == 3) {
@ -1045,7 +1072,8 @@ ImagingReduce5x5(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
((ss1 + amend) * multiplier) >> 24,
((ss2 + amend) * multiplier) >> 24,
0);
0
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
} else { // bands == 4
@ -1092,7 +1120,8 @@ ImagingReduce5x5(Imaging imOut, Imaging imIn, int box[4]) {
((ss0 + amend) * multiplier) >> 24,
((ss1 + amend) * multiplier) >> 24,
((ss2 + amend) * multiplier) >> 24,
((ss3 + amend) * multiplier) >> 24);
((ss3 + amend) * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -1181,7 +1210,8 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int ys
(ss0 * multiplier) >> 24,
(ss1 * multiplier) >> 24,
(ss2 * multiplier) >> 24,
(ss3 * multiplier) >> 24);
(ss3 * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -1207,7 +1237,8 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int ys
(ss0 * multiplier) >> 24,
(ss1 * multiplier) >> 24,
(ss2 * multiplier) >> 24,
(ss3 * multiplier) >> 24);
(ss3 * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -1232,7 +1263,8 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int ys
(ss0 * multiplier) >> 24,
(ss1 * multiplier) >> 24,
(ss2 * multiplier) >> 24,
(ss3 * multiplier) >> 24);
(ss3 * multiplier) >> 24
);
memcpy(imOut->image[y] + x * sizeof(v), &v, sizeof(v));
}
}
@ -1240,7 +1272,8 @@ ImagingReduceCorners(Imaging imOut, Imaging imIn, int box[4], int xscale, int ys
void
ImagingReduceNxN_32bpc(
Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) {
Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale
) {
/* The most general implementation for any xscale and yscale
*/
int x, y, xx, yy;
@ -1313,7 +1346,8 @@ ImagingReduceNxN_32bpc(
void
ImagingReduceCorners_32bpc(
Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale) {
Imaging imOut, Imaging imIn, int box[4], int xscale, int yscale
) {
/* Fill the last row and the last column for any xscale and yscale.
*/
int x, y, xx, yy;
@ -1429,7 +1463,8 @@ ImagingReduce(Imaging imIn, int xscale, int yscale, int box[4]) {
imOut = ImagingNewDirty(
imIn->mode,
(ImagingNewParams){
(box[2] + xscale - 1) / xscale, (box[3] + yscale - 1) / yscale});
(box[2] + xscale - 1) / xscale, (box[3] + yscale - 1) / yscale}
);
if (!imOut) {
return NULL;
}

View File

@ -186,7 +186,8 @@ precompute_coeffs(
int outSize,
struct filter *filterp,
int **boundsp,
double **kkp) {
double **kkp
) {
double support, scale, filterscale;
double center, ww, ss;
int xx, x, ksize, xmin, xmax;
@ -284,7 +285,8 @@ normalize_coeffs_8bpc(int outSize, int ksize, double *prekk) {
void
ImagingResampleHorizontal_8bpc(
Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *prekk) {
Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *prekk
) {
ImagingSectionCookie cookie;
int ss0, ss1, ss2, ss3;
int xx, yy, x, xmin, xmax;
@ -376,7 +378,8 @@ ImagingResampleHorizontal_8bpc(
void
ImagingResampleVertical_8bpc(
Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *prekk) {
Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *prekk
) {
ImagingSectionCookie cookie;
int ss0, ss1, ss2, ss3;
int xx, yy, y, ymin, ymax;
@ -459,7 +462,8 @@ ImagingResampleVertical_8bpc(
void
ImagingResampleHorizontal_32bpc(
Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *kk) {
Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *kk
) {
ImagingSectionCookie cookie;
double ss;
int xx, yy, x, xmin, xmax;
@ -502,7 +506,8 @@ ImagingResampleHorizontal_32bpc(
void
ImagingResampleVertical_32bpc(
Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *kk) {
Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *kk
) {
ImagingSectionCookie cookie;
double ss;
int xx, yy, y, ymin, ymax;
@ -544,7 +549,8 @@ ImagingResampleVertical_32bpc(
}
typedef void (*ResampleFunction)(
Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *kk);
Imaging imOut, Imaging imIn, int offset, int ksize, int *bounds, double *kk
);
Imaging
ImagingResampleInner(
@ -554,7 +560,8 @@ ImagingResampleInner(
struct filter *filterp,
float box[4],
ResampleFunction ResampleHorizontal,
ResampleFunction ResampleVertical);
ResampleFunction ResampleVertical
);
Imaging
ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]) {
@ -609,7 +616,8 @@ ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float box[4]) {
}
return ImagingResampleInner(
imIn, xsize, ysize, filterp, box, ResampleHorizontal, ResampleVertical);
imIn, xsize, ysize, filterp, box, ResampleHorizontal, ResampleVertical
);
}
Imaging
@ -620,7 +628,8 @@ ImagingResampleInner(
struct filter *filterp,
float box[4],
ResampleFunction ResampleHorizontal,
ResampleFunction ResampleVertical) {
ResampleFunction ResampleVertical
) {
Imaging imTemp = NULL;
Imaging imOut = NULL;
@ -634,13 +643,15 @@ ImagingResampleInner(
need_vertical = ysize != imIn->ysize || box[1] || box[3] != ysize;
ksize_horiz = precompute_coeffs(
imIn->xsize, box[0], box[2], xsize, filterp, &bounds_horiz, &kk_horiz);
imIn->xsize, box[0], box[2], xsize, filterp, &bounds_horiz, &kk_horiz
);
if (!ksize_horiz) {
return NULL;
}
ksize_vert = precompute_coeffs(
imIn->ysize, box[1], box[3], ysize, filterp, &bounds_vert, &kk_vert);
imIn->ysize, box[1], box[3], ysize, filterp, &bounds_vert, &kk_vert
);
if (!ksize_vert) {
free(bounds_horiz);
free(kk_horiz);
@ -663,7 +674,8 @@ ImagingResampleInner(
imIn->mode, (ImagingNewParams){xsize, ybox_last - ybox_first});
if (imTemp) {
ResampleHorizontal(
imTemp, imIn, ybox_first, ksize_horiz, bounds_horiz, kk_horiz);
imTemp, imIn, ybox_first, ksize_horiz, bounds_horiz, kk_horiz
);
}
free(bounds_horiz);
free(kk_horiz);

View File

@ -114,7 +114,8 @@ expandrow(UINT8 *dest, UINT8 *src, int n, int z, int xsize, UINT8 *end_of_buffer
static int
expandrow2(
UINT8 *dest, const UINT8 *src, int n, int z, int xsize, UINT8 *end_of_buffer) {
UINT8 *dest, const UINT8 *src, int n, int z, int xsize, UINT8 *end_of_buffer
) {
UINT8 pixel, count;
int x = 0;
@ -252,7 +253,8 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t
c->rlelength,
im->bands,
im->xsize,
&ptr[c->bufsize - 1]);
&ptr[c->bufsize - 1]
);
} else {
status = expandrow2(
&state->buffer[c->channo * 2],
@ -260,7 +262,8 @@ ImagingSgiRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t
c->rlelength,
im->bands,
im->xsize,
&ptr[c->bufsize - 1]);
&ptr[c->bufsize - 1]
);
}
if (status == -1) {
state->errcode = IMAGING_CODEC_OVERRUN;

View File

@ -110,9 +110,8 @@ ImagingNewPrologueSubtype(const char *mode, ImagingNewParams p, int size) {
im->linesize = p.xsize * 4;
im->type = IMAGING_TYPE_INT32;
} else if (
strcmp(mode, "I;16") == 0 || strcmp(mode, "I;16L") == 0 ||
strcmp(mode, "I;16B") == 0 || strcmp(mode, "I;16N") == 0) {
} else if (strcmp(mode, "I;16") == 0 || strcmp(mode, "I;16L") == 0 ||
strcmp(mode, "I;16B") == 0 || strcmp(mode, "I;16N") == 0) {
/* EXPERIMENTAL */
/* 16-bit raw integer images */
im->bands = 1;
@ -237,7 +236,9 @@ ImagingNewPrologueSubtype(const char *mode, ImagingNewParams p, int size) {
Imaging
ImagingNewPrologue(const char *mode, ImagingNewParams p) {
return ImagingNewPrologueSubtype(mode, p, sizeof(struct ImagingMemoryInstance));
return ImagingNewPrologueSubtype(
mode, p, sizeof(struct ImagingMemoryInstance)
);
}
void

View File

@ -107,7 +107,8 @@ ImagingSunRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->buffer,
state->xsize);
state->xsize
);
state->x = 0;

View File

@ -93,7 +93,8 @@ ImagingTgaRleDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->buffer,
state->xsize);
state->xsize
);
state->x = 0;

View File

@ -63,7 +63,8 @@ ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes)
state->buffer,
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->xsize);
state->xsize
);
}
row = state->buffer;
@ -146,7 +147,8 @@ ImagingTgaRleEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes)
}
memcpy(
dst, state->buffer + (state->x * bytesPerPixel - state->count), flushCount);
dst, state->buffer + (state->x * bytesPerPixel - state->count), flushCount
);
dst += flushCount;
bytes -= flushCount;

View File

@ -44,7 +44,8 @@ dump_state(const TIFFSTATE *state) {
(int)state->size,
(uint)state->eof,
state->data,
state->ifd));
state->ifd)
);
}
/*
@ -64,7 +65,8 @@ _tiffReadProc(thandle_t hdata, tdata_t buf, tsize_t size) {
"_tiffReadProc",
"Invalid Read at loc %" PRIu64 ", eof: %" PRIu64,
state->loc,
state->eof);
state->eof
);
return 0;
}
to_read = min(size, min(state->size, (tsize_t)state->eof) - (tsize_t)state->loc);
@ -200,13 +202,15 @@ ImagingLibTiffInit(ImagingCodecState state, int fp, uint32_t offset) {
state->state,
state->x,
state->y,
state->ystep));
state->ystep)
);
TRACE(
("State: xsize %d, ysize %d, xoff %d, yoff %d \n",
state->xsize,
state->ysize,
state->xoff,
state->yoff));
state->yoff)
);
TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes));
TRACE(("State: context %p \n", state->context));
@ -226,7 +230,8 @@ _pickUnpackers(
ImagingCodecState state,
TIFF *tiff,
uint16_t planarconfig,
ImagingShuffler *unpackers) {
ImagingShuffler *unpackers
) {
// if number of bands is 1, there is no difference with contig case
if (planarconfig == PLANARCONFIG_SEPARATE && im->bands > 1) {
uint16_t bits_per_sample = 8;
@ -356,7 +361,8 @@ _decodeAsRGBA(Imaging im, ImagingCodecState state, TIFF *tiff) {
(UINT8 *)im->image[state->y + state->yoff + current_row] +
state->xoff * im->pixelsize,
state->buffer + current_row * row_byte_size,
state->xsize);
state->xsize
);
}
}
@ -374,7 +380,8 @@ _decodeTile(
ImagingCodecState state,
TIFF *tiff,
int planes,
ImagingShuffler *unpackers) {
ImagingShuffler *unpackers
) {
INT32 x, y, tile_y, current_tile_length, current_tile_width;
UINT32 tile_width, tile_length;
tsize_t tile_bytes_size, row_byte_size;
@ -453,7 +460,8 @@ _decodeTile(
("Writing tile data at %dx%d using tile_width: %d; \n",
tile_y + y,
x,
current_tile_width));
current_tile_width)
);
// UINT8 * bbb = state->buffer + tile_y * row_byte_size;
// TRACE(("chars: %x%x%x%x\n", ((UINT8 *)bbb)[0], ((UINT8 *)bbb)[1],
@ -462,7 +470,8 @@ _decodeTile(
shuffler(
(UINT8 *)im->image[tile_y + y] + x * im->pixelsize,
state->buffer + tile_y * row_byte_size,
current_tile_width);
current_tile_width
);
}
}
}
@ -477,7 +486,8 @@ _decodeStrip(
ImagingCodecState state,
TIFF *tiff,
int planes,
ImagingShuffler *unpackers) {
ImagingShuffler *unpackers
) {
INT32 strip_row = 0;
UINT8 *new_data;
UINT32 rows_per_strip;
@ -544,9 +554,10 @@ _decodeStrip(
tiff,
TIFFComputeStrip(tiff, state->y, plane),
(tdata_t)state->buffer,
strip_size) == -1) {
TRACE(
("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0)));
strip_size
) == -1) {
TRACE(("Decode Error, strip %d\n", TIFFComputeStrip(tiff, state->y, 0))
);
state->errcode = IMAGING_CODEC_BROKEN;
return -1;
}
@ -567,7 +578,8 @@ _decodeStrip(
(UINT8 *)im->image[state->y + state->yoff + strip_row] +
state->xoff * im->pixelsize,
state->buffer + strip_row * row_byte_size,
state->xsize);
state->xsize
);
}
}
}
@ -577,7 +589,8 @@ _decodeStrip(
int
ImagingLibTiffDecode(
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes) {
Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t bytes
) {
TIFFSTATE *clientstate = (TIFFSTATE *)state->context;
char *filename = "tempfile.tif";
char *mode = "rC";
@ -602,13 +615,15 @@ ImagingLibTiffDecode(
state->state,
state->x,
state->y,
state->ystep));
state->ystep)
);
TRACE(
("State: xsize %d, ysize %d, xoff %d, yoff %d \n",
state->xsize,
state->ysize,
state->xoff,
state->yoff));
state->yoff)
);
TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes));
TRACE(
("Buffer: %p: %c%c%c%c\n",
@ -616,26 +631,30 @@ ImagingLibTiffDecode(
(char)buffer[0],
(char)buffer[1],
(char)buffer[2],
(char)buffer[3]));
(char)buffer[3])
);
TRACE(
("State->Buffer: %c%c%c%c\n",
(char)state->buffer[0],
(char)state->buffer[1],
(char)state->buffer[2],
(char)state->buffer[3]));
(char)state->buffer[3])
);
TRACE(
("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n",
im->mode,
im->type,
im->bands,
im->xsize,
im->ysize));
im->ysize)
);
TRACE(
("Image: image8 %p, image32 %p, image %p, block %p \n",
im->image8,
im->image32,
im->image,
im->block));
im->block)
);
TRACE(("Image: pixelsize: %d, linesize %d \n", im->pixelsize, im->linesize));
dump_state(clientstate);
@ -665,7 +684,8 @@ ImagingLibTiffDecode(
_tiffCloseProc,
_tiffSizeProc,
_tiffMapProc,
_tiffUnmapProc);
_tiffUnmapProc
);
}
if (!tiff) {
@ -694,7 +714,8 @@ ImagingLibTiffDecode(
state->xsize,
img_width,
state->ysize,
img_height));
img_height)
);
state->errcode = IMAGING_CODEC_BROKEN;
goto decode_err;
}
@ -739,7 +760,8 @@ ImagingLibTiffDecode(
INT32 y;
TIFFGetFieldDefaulted(
tiff, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo);
tiff, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo
);
if (extrasamples >= 1 && (sampleinfo[0] == EXTRASAMPLE_UNSPECIFIED ||
sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA)) {
@ -793,13 +815,15 @@ ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) {
state->state,
state->x,
state->y,
state->ystep));
state->ystep)
);
TRACE(
("State: xsize %d, ysize %d, xoff %d, yoff %d \n",
state->xsize,
state->ysize,
state->xoff,
state->yoff));
state->yoff)
);
TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes));
TRACE(("State: context %p \n", state->context));
@ -839,7 +863,8 @@ ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) {
_tiffCloseProc,
_tiffSizeProc,
_tiffNullMapProc,
_tiffUnmapProc); /*force no mmap*/
_tiffUnmapProc
); /*force no mmap*/
}
if (!clientstate->tiff) {
@ -852,7 +877,8 @@ ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp) {
int
ImagingLibTiffMergeFieldInfo(
ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length) {
ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length
) {
// Refer to libtiff docs (http://www.simplesystems.org/libtiff/addingtags.html)
TIFFSTATE *clientstate = (TIFFSTATE *)state->context;
uint32_t n;
@ -874,7 +900,8 @@ ImagingLibTiffMergeFieldInfo(
FIELD_CUSTOM,
1,
passcount,
"CustomField"}};
"CustomField"}
};
n = sizeof(info) / sizeof(info[0]);
@ -922,13 +949,15 @@ ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int byt
state->state,
state->x,
state->y,
state->ystep));
state->ystep)
);
TRACE(
("State: xsize %d, ysize %d, xoff %d, yoff %d \n",
state->xsize,
state->ysize,
state->xoff,
state->yoff));
state->yoff)
);
TRACE(("State: bits %d, bytes %d \n", state->bits, state->bytes));
TRACE(
("Buffer: %p: %c%c%c%c\n",
@ -936,26 +965,30 @@ ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int byt
(char)buffer[0],
(char)buffer[1],
(char)buffer[2],
(char)buffer[3]));
(char)buffer[3])
);
TRACE(
("State->Buffer: %c%c%c%c\n",
(char)state->buffer[0],
(char)state->buffer[1],
(char)state->buffer[2],
(char)state->buffer[3]));
(char)state->buffer[3])
);
TRACE(
("Image: mode %s, type %d, bands: %d, xsize %d, ysize %d \n",
im->mode,
im->type,
im->bands,
im->xsize,
im->ysize));
im->ysize)
);
TRACE(
("Image: image8 %p, image32 %p, image %p, block %p \n",
im->image8,
im->image32,
im->image,
im->block));
im->block)
);
TRACE(("Image: pixelsize: %d, linesize %d \n", im->pixelsize, im->linesize));
dump_state(clientstate);
@ -967,10 +1000,12 @@ ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int byt
state->buffer,
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->xsize);
state->xsize
);
if (TIFFWriteScanline(
tiff, (tdata_t)(state->buffer), (uint32_t)state->y, 0) == -1) {
tiff, (tdata_t)(state->buffer), (uint32_t)state->y, 0
) == -1) {
TRACE(("Encode Error, row %d\n", state->y));
state->errcode = IMAGING_CODEC_BROKEN;
TIFFClose(tiff);
@ -1013,7 +1048,8 @@ ImagingLibTiffEncode(Imaging im, ImagingCodecState state, UINT8 *buffer, int byt
(char)buffer[0],
(char)buffer[1],
(char)buffer[2],
(char)buffer[3]));
(char)buffer[3])
);
if (clientstate->loc == clientstate->eof) {
TRACE(("Hit EOF, calling an end, freeing data"));
state->errcode = IMAGING_CODEC_END;

View File

@ -41,7 +41,8 @@ extern int
ImagingLibTiffEncodeInit(ImagingCodecState state, char *filename, int fp);
extern int
ImagingLibTiffMergeFieldInfo(
ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length);
ImagingCodecState state, TIFFDataType field_type, int key, int is_var_length
);
extern int
ImagingLibTiffSetField(ImagingCodecState state, ttag_t tag, ...);

View File

@ -104,7 +104,8 @@ static UINT8 BITFLIP[] = {
3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243,
11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251,
7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247,
15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255};
15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255
};
/* Unpack to "1" image */
@ -882,7 +883,8 @@ unpackRGBa16L(UINT8 *_out, const UINT8 *in, int pixels) {
CLIP8(in[1] * 255 / a),
CLIP8(in[3] * 255 / a),
CLIP8(in[5] * 255 / a),
a);
a
);
}
memcpy(_out, &iv, sizeof(iv));
in += 8;
@ -906,7 +908,8 @@ unpackRGBa16B(UINT8 *_out, const UINT8 *in, int pixels) {
CLIP8(in[0] * 255 / a),
CLIP8(in[2] * 255 / a),
CLIP8(in[4] * 255 / a),
a);
a
);
}
memcpy(_out, &iv, sizeof(iv));
in += 8;
@ -930,7 +933,8 @@ unpackRGBa(UINT8 *_out, const UINT8 *in, int pixels) {
CLIP8(in[0] * 255 / a),
CLIP8(in[1] * 255 / a),
CLIP8(in[2] * 255 / a),
a);
a
);
}
memcpy(_out, &iv, sizeof(iv));
in += 4;
@ -954,7 +958,8 @@ unpackRGBaskip1(UINT8 *_out, const UINT8 *in, int pixels) {
CLIP8(in[0] * 255 / a),
CLIP8(in[1] * 255 / a),
CLIP8(in[2] * 255 / a),
a);
a
);
}
in += 5;
}
@ -976,7 +981,8 @@ unpackRGBaskip2(UINT8 *_out, const UINT8 *in, int pixels) {
CLIP8(in[0] * 255 / a),
CLIP8(in[1] * 255 / a),
CLIP8(in[2] * 255 / a),
a);
a
);
}
in += 6;
}
@ -998,7 +1004,8 @@ unpackBGRa(UINT8 *_out, const UINT8 *in, int pixels) {
CLIP8(in[2] * 255 / a),
CLIP8(in[1] * 255 / a),
CLIP8(in[0] * 255 / a),
a);
a
);
}
memcpy(_out, &iv, sizeof(iv));
in += 4;
@ -1029,7 +1036,8 @@ unpackRGBAL(UINT8 *_out, const UINT8 *in, int pixels) {
in[i],
in[i + pixels],
in[i + pixels + pixels],
in[i + pixels + pixels + pixels]);
in[i + pixels + pixels + pixels]
);
memcpy(_out, &iv, sizeof(iv));
}
}

View File

@ -34,7 +34,8 @@ static INT16 L[] = {
261, 262, 264, 265, 266, 268, 269, 270, 272, 273, 274, 276, 277, 278, 280, 281,
283, 284, 285, 287, 288, 289, 291, 292, 293, 295, 296, 297, 299, 300, 302, 303,
304, 306, 307, 308, 310, 311, 312, 314, 315, 317, 318, 319, 321, 322, 323, 325,
326, 327, 329, 330, 331, 333, 334, 336, 337, 338, 340, 341, 342, 344, 345, 346};
326, 327, 329, 330, 331, 333, 334, 336, 337, 338, 340, 341, 342, 344, 345, 346
};
static INT16 CB[] = {
-345, -343, -341, -338, -336, -334, -332, -329, -327, -325, -323, -321, -318, -316,
@ -55,7 +56,8 @@ static INT16 CB[] = {
120, 122, 124, 126, 129, 131, 133, 135, 138, 140, 142, 144, 146, 149,
151, 153, 155, 157, 160, 162, 164, 166, 169, 171, 173, 175, 177, 180,
182, 184, 186, 189, 191, 193, 195, 197, 200, 202, 204, 206, 208, 211,
213, 215, 217, 220};
213, 215, 217, 220
};
static INT16 GB[] = {
67, 67, 66, 66, 65, 65, 65, 64, 64, 63, 63, 62, 62, 62, 61, 61,
@ -73,7 +75,8 @@ static INT16 GB[] = {
-14, -15, -15, -16, -16, -17, -17, -18, -18, -18, -19, -19, -20, -20, -21, -21,
-21, -22, -22, -23, -23, -24, -24, -24, -25, -25, -26, -26, -27, -27, -27, -28,
-28, -29, -29, -30, -30, -30, -31, -31, -32, -32, -33, -33, -33, -34, -34, -35,
-35, -36, -36, -36, -37, -37, -38, -38, -39, -39, -39, -40, -40, -41, -41, -42};
-35, -36, -36, -36, -37, -37, -38, -38, -39, -39, -39, -40, -40, -41, -41, -42
};
static INT16 CR[] = {
-249, -247, -245, -243, -241, -239, -238, -236, -234, -232, -230, -229, -227, -225,
@ -94,7 +97,8 @@ static INT16 CR[] = {
133, 135, 137, 138, 140, 142, 144, 146, 148, 149, 151, 153, 155, 157,
158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 179, 180, 182,
184, 186, 188, 189, 191, 193, 195, 197, 199, 200, 202, 204, 206, 208,
209, 211, 213, 215};
209, 211, 213, 215
};
static INT16 GR[] = {
127, 126, 125, 124, 123, 122, 121, 121, 120, 119, 118, 117, 116, 115, 114,
@ -114,7 +118,8 @@ static INT16 GR[] = {
-67, -68, -69, -69, -70, -71, -72, -73, -74, -75, -76, -77, -78, -79, -80,
-81, -82, -82, -83, -84, -85, -86, -87, -88, -89, -90, -91, -92, -93, -94,
-94, -95, -96, -97, -98, -99, -100, -101, -102, -103, -104, -105, -106, -107, -107,
-108};
-108
};
#define R 0
#define G 1

View File

@ -23,7 +23,8 @@ clip8(int in) {
Imaging
ImagingUnsharpMask(
Imaging imOut, Imaging imIn, float radius, int percent, int threshold) {
Imaging imOut, Imaging imIn, float radius, int percent, int threshold
) {
ImagingSectionCookie cookie;
Imaging result;

View File

@ -40,7 +40,8 @@ ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
state->shuffle(
state->buffer,
(UINT8 *)im->image[state->y + state->yoff] + state->xoff * im->pixelsize,
state->xsize);
state->xsize
);
if (state->y < state->ysize - 1) {
/* any line but the last */

View File

@ -217,7 +217,8 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt
state->shuffle(
(UINT8 *)im->image[state->y] + col * im->pixelsize,
state->buffer + context->prefix + i,
1);
1
);
col += COL_INCREMENT[context->pass];
}
} else {
@ -229,7 +230,8 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt
UINT8 byte = *(state->buffer + context->prefix + (i / 8));
byte <<= (i % 8);
state->shuffle(
(UINT8 *)im->image[state->y] + col * im->pixelsize, &byte, 1);
(UINT8 *)im->image[state->y] + col * im->pixelsize, &byte, 1
);
col += COL_INCREMENT[context->pass];
}
}
@ -253,7 +255,8 @@ ImagingZipDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->buffer + context->prefix,
state->xsize);
state->xsize
);
state->y++;
}

View File

@ -98,7 +98,8 @@ ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
15,
9,
/* compression strategy (image data are filtered)*/
compress_type);
compress_type
);
if (err < 0) {
state->errcode = IMAGING_CODEC_CONFIG;
return -1;
@ -108,7 +109,8 @@ ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
err = deflateSetDictionary(
&context->z_stream,
(unsigned char *)context->dictionary,
context->dictionary_size);
context->dictionary_size
);
if (err < 0) {
state->errcode = IMAGING_CODEC_CONFIG;
return -1;
@ -163,7 +165,8 @@ ImagingZipEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
state->buffer + 1,
(UINT8 *)im->image[state->y + state->yoff] +
state->xoff * im->pixelsize,
state->xsize);
state->xsize
);
state->y++;

View File

@ -75,7 +75,8 @@ PyImaging_MapBuffer(PyObject *self, PyObject *args) {
&stride,
&ystep,
&depth,
&bands)) {
&bands
)) {
return NULL;
}

View File

@ -26,6 +26,7 @@
*/
#include "Python.h"
#include "thirdparty/pythoncapi_compat.h"
#include "libImaging/Imaging.h"
#include <math.h>
@ -179,14 +180,21 @@ PyPath_Flatten(PyObject *data, double **pxy) {
} \
free(xy); \
return -1; \
} \
if (decref) { \
Py_DECREF(op); \
}
/* Copy table to path array */
if (PyList_Check(data)) {
for (i = 0; i < n; i++) {
double x, y;
PyObject *op = PyList_GET_ITEM(data, i);
assign_item_to_array(op, 0);
PyObject *op = PyList_GetItemRef(data, i);
if (op == NULL) {
free(xy);
return -1;
}
assign_item_to_array(op, 1);
}
} else if (PyTuple_Check(data)) {
for (i = 0; i < n; i++) {
@ -209,7 +217,6 @@ PyPath_Flatten(PyObject *data, double **pxy) {
}
}
assign_item_to_array(op, 1);
Py_DECREF(op);
}
}
@ -482,7 +489,8 @@ path_transform(PyPathObject *self, PyObject *args) {
double wrap = 0.0;
if (!PyArg_ParseTuple(
args, "(dddddd)|d:transform", &a, &b, &c, &d, &e, &f, &wrap)) {
args, "(dddddd)|d:transform", &a, &b, &c, &d, &e, &f, &wrap
)) {
return NULL;
}
@ -563,7 +571,8 @@ path_subscript(PyPathObject *self, PyObject *item) {
PyErr_Format(
PyExc_TypeError,
"Path indices must be integers, not %.200s",
Py_TYPE(item)->tp_name);
Py_TYPE(item)->tp_name
);
return NULL;
}
}
@ -579,7 +588,8 @@ static PySequenceMethods path_as_sequence = {
};
static PyMappingMethods path_as_mapping = {
(lenfunc)path_len, (binaryfunc)path_subscript, NULL};
(lenfunc)path_len, (binaryfunc)path_subscript, NULL
};
static PyTypeObject PyPathType = {
PyVarObject_HEAD_INIT(NULL, 0) "Path", /*tp_name*/

1360
src/thirdparty/pythoncapi_compat.h vendored Normal file

File diff suppressed because it is too large Load Diff