mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-26 01:46:18 +03:00
Merge branch 'main' into arena-thread-safe
This commit is contained in:
commit
8a54f58ac6
|
@ -3,7 +3,7 @@
|
|||
BasedOnStyle: Google
|
||||
AlwaysBreakAfterReturnType: All
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AlignAfterOpenBracket: AlwaysBreak
|
||||
AlignAfterOpenBracket: BlockIndent
|
||||
BinPackArguments: false
|
||||
BinPackParameters: false
|
||||
BreakBeforeBraces: Attach
|
||||
|
|
2
.github/workflows/cifuzz.yml
vendored
2
.github/workflows/cifuzz.yml
vendored
|
@ -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
|
||||
|
|
27
.github/workflows/wheels.yml
vendored
27
.github/workflows/wheels.yml
vendored
|
@ -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:
|
||||
|
@ -227,6 +236,7 @@ jobs:
|
|||
path: winbuild\build\bin\fribidi*
|
||||
|
||||
sdist:
|
||||
if: github.event_name != 'schedule'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
@ -245,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]
|
||||
|
|
12
CHANGES.rst
12
CHANGES.rst
|
@ -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]
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
----------------
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
===========
|
||||
|
|
|
@ -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$',
|
||||
]
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()):
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
172
src/_imaging.c
172
src/_imaging.c
|
@ -291,7 +291,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;
|
||||
}
|
||||
|
||||
|
@ -468,7 +469,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:
|
||||
|
@ -519,7 +521,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");
|
||||
|
@ -535,8 +538,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;
|
||||
|
@ -557,7 +560,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;
|
||||
|
@ -568,7 +572,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;
|
||||
|
@ -609,7 +614,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;
|
||||
|
@ -734,7 +740,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;
|
||||
}
|
||||
|
||||
|
@ -749,7 +756,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;
|
||||
}
|
||||
|
||||
|
@ -828,7 +836,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));
|
||||
|
@ -879,7 +888,8 @@ _color_lut_3d(ImagingObject *self, PyObject *args) {
|
|||
&size1D,
|
||||
&size2D,
|
||||
&size3D,
|
||||
&table)) {
|
||||
&table
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -897,7 +907,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;
|
||||
}
|
||||
|
||||
|
@ -914,13 +925,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;
|
||||
|
@ -944,7 +950,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) {
|
||||
|
@ -954,7 +961,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 *
|
||||
|
@ -962,7 +970,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;
|
||||
}
|
||||
|
||||
|
@ -995,7 +1004,8 @@ _convert_matrix(ImagingObject *self, PyObject *args) {
|
|||
m + 8,
|
||||
m + 9,
|
||||
m + 10,
|
||||
m + 11)) {
|
||||
m + 11
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
@ -1056,7 +1066,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;
|
||||
}
|
||||
|
||||
|
@ -1139,7 +1150,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;
|
||||
}
|
||||
|
@ -1233,7 +1245,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;
|
||||
|
||||
|
@ -1393,7 +1406,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;
|
||||
}
|
||||
|
||||
|
@ -1405,14 +1419,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) {
|
||||
|
@ -1730,7 +1746,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;
|
||||
}
|
||||
|
||||
|
@ -1888,7 +1905,8 @@ _resize(ImagingObject *self, PyObject *args) {
|
|||
&box[0],
|
||||
&box[1],
|
||||
&box[2],
|
||||
&box[3])) {
|
||||
&box[3]
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1924,7 +1942,8 @@ _resize(ImagingObject *self, PyObject *args) {
|
|||
imOut = ImagingNewDirty(imIn->mode, 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);
|
||||
}
|
||||
|
@ -1945,14 +1964,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;
|
||||
}
|
||||
|
||||
|
@ -2054,7 +2067,8 @@ _transform(ImagingObject *self, PyObject *args) {
|
|||
&method,
|
||||
&data,
|
||||
&filter,
|
||||
&fill)) {
|
||||
&fill
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -2078,7 +2092,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);
|
||||
|
||||
|
@ -2251,7 +2266,8 @@ _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);
|
||||
|
@ -2317,14 +2333,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);
|
||||
|
@ -2398,7 +2416,8 @@ _merge(PyObject *self, PyObject *args) {
|
|||
&Imaging_Type,
|
||||
&band2,
|
||||
&Imaging_Type,
|
||||
&band3)) {
|
||||
&band3
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -2644,7 +2663,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;
|
||||
}
|
||||
|
||||
|
@ -2802,7 +2822,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;
|
||||
}
|
||||
|
@ -2814,7 +2835,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;
|
||||
}
|
||||
|
@ -2953,7 +2975,8 @@ _draw_arc(ImagingDrawObject *self, PyObject *args) {
|
|||
end,
|
||||
&ink,
|
||||
width,
|
||||
self->blend);
|
||||
self->blend
|
||||
);
|
||||
|
||||
free(xy);
|
||||
|
||||
|
@ -2983,13 +3006,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);
|
||||
|
||||
|
@ -3045,7 +3070,8 @@ _draw_chord(ImagingDrawObject *self, PyObject *args) {
|
|||
&ink,
|
||||
fill,
|
||||
width,
|
||||
self->blend);
|
||||
self->blend
|
||||
);
|
||||
|
||||
free(xy);
|
||||
|
||||
|
@ -3099,7 +3125,8 @@ _draw_ellipse(ImagingDrawObject *self, PyObject *args) {
|
|||
&ink,
|
||||
fill,
|
||||
width,
|
||||
self->blend);
|
||||
self->blend
|
||||
);
|
||||
|
||||
free(xy);
|
||||
|
||||
|
@ -3139,14 +3166,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++) {
|
||||
|
@ -3159,7 +3188,8 @@ _draw_lines(ImagingDrawObject *self, PyObject *args) {
|
|||
(int)p[3],
|
||||
&ink,
|
||||
width,
|
||||
self->blend) < 0) {
|
||||
self->blend
|
||||
) < 0) {
|
||||
free(xy);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -3191,7 +3221,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;
|
||||
}
|
||||
|
@ -3280,7 +3311,8 @@ _draw_pieslice(ImagingDrawObject *self, PyObject *args) {
|
|||
&ink,
|
||||
fill,
|
||||
width,
|
||||
self->blend);
|
||||
self->blend
|
||||
);
|
||||
|
||||
free(xy);
|
||||
|
||||
|
@ -3312,7 +3344,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;
|
||||
}
|
||||
|
@ -3385,7 +3418,8 @@ _draw_rectangle(ImagingDrawObject *self, PyObject *args) {
|
|||
&ink,
|
||||
fill,
|
||||
width,
|
||||
self->blend);
|
||||
self->blend
|
||||
);
|
||||
|
||||
free(xy);
|
||||
|
||||
|
@ -3525,7 +3559,8 @@ _effect_mandelbrot(ImagingObject *self, PyObject *args) {
|
|||
&extent[1],
|
||||
&extent[2],
|
||||
&extent[3],
|
||||
&quality)) {
|
||||
&quality
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -3753,7 +3788,8 @@ _getattr_unsafe_ptrs(ImagingObject *self, void *closure) {
|
|||
"image32",
|
||||
self->image->image32,
|
||||
"image",
|
||||
self->image->image);
|
||||
self->image->image
|
||||
);
|
||||
}
|
||||
|
||||
static struct PyGetSetDef getsetters[] = {
|
||||
|
@ -3763,7 +3799,8 @@ static struct PyGetSetDef getsetters[] = {
|
|||
{"id", (getter)_getattr_id},
|
||||
{"ptr", (getter)_getattr_ptr},
|
||||
{"unsafe_ptrs", (getter)_getattr_unsafe_ptrs},
|
||||
{NULL}};
|
||||
{NULL}
|
||||
};
|
||||
|
||||
/* basic sequence semantics */
|
||||
|
||||
|
@ -4094,7 +4131,7 @@ _set_blocks_max(PyObject *self, PyObject *args) {
|
|||
}
|
||||
|
||||
if ((unsigned long)blocks_max >
|
||||
SIZE_MAX / sizeof(ImagingDefaultArena.blocks_pool[0])) {
|
||||
SIZE_MAX / sizeof(ImagingDefaultArena.blocks_pool[0])) {
|
||||
PyErr_SetString(PyExc_ValueError, "blocks_max is too large");
|
||||
return NULL;
|
||||
}
|
||||
|
@ -4454,7 +4491,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;
|
||||
|
|
|
@ -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*/
|
||||
|
|
|
@ -126,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");
|
||||
|
@ -148,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;
|
||||
}
|
||||
|
@ -166,7 +168,8 @@ getfont(PyObject *self_, PyObject *args, PyObject *kw) {
|
|||
&encoding,
|
||||
&font_bytes,
|
||||
&font_bytes_size,
|
||||
&layout_engine)) {
|
||||
&layout_engine
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
@ -199,7 +202,8 @@ getfont(PyObject *self_, PyObject *args, PyObject *kw) {
|
|||
(FT_Byte *)self->font_bytes,
|
||||
font_bytes_size,
|
||||
index,
|
||||
&self->face);
|
||||
&self->face
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -243,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;
|
||||
|
@ -297,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;
|
||||
}
|
||||
}
|
||||
|
@ -399,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;
|
||||
|
@ -412,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)) {
|
||||
|
@ -459,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);
|
||||
}
|
||||
|
@ -483,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) {
|
||||
|
@ -492,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;
|
||||
}
|
||||
|
@ -514,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;
|
||||
}
|
||||
|
||||
|
@ -556,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 */
|
||||
|
@ -661,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;
|
||||
|
@ -741,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;
|
||||
}
|
||||
|
||||
|
@ -773,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;
|
||||
|
@ -842,7 +858,8 @@ font_render(FontObject *self, PyObject *args) {
|
|||
&anchor,
|
||||
&foreground_ink_long,
|
||||
&x_start,
|
||||
&y_start)) {
|
||||
&y_start
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -889,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;
|
||||
|
@ -929,7 +947,8 @@ font_render(FontObject *self, PyObject *args) {
|
|||
(FT_Fixed)stroke_width * 64,
|
||||
FT_STROKER_LINECAP_ROUND,
|
||||
FT_STROKER_LINEJOIN_ROUND,
|
||||
0);
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1104,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;
|
||||
|
@ -1123,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];
|
||||
|
@ -1149,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;
|
||||
}
|
||||
}
|
||||
|
@ -1425,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) {
|
||||
|
@ -1482,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*/
|
||||
|
@ -1518,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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
45
src/_webp.c
45
src/_webp.c
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
@ -889,7 +890,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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
108
src/encode.c
108
src/encode.c
|
@ -39,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;
|
||||
|
@ -135,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) {
|
||||
|
@ -572,7 +574,8 @@ PyImaging_ZipEncoderNew(PyObject *self, PyObject *args) {
|
|||
&compress_level,
|
||||
&compress_type,
|
||||
&dictionary,
|
||||
&dictionary_size)) {
|
||||
&dictionary_size
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -653,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;
|
||||
}
|
||||
|
||||
|
@ -785,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;
|
||||
}
|
||||
}
|
||||
|
@ -795,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));
|
||||
|
@ -805,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;
|
||||
|
@ -820,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) {
|
||||
|
@ -828,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 */
|
||||
|
@ -838,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) {
|
||||
|
@ -850,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) {
|
||||
|
@ -862,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) {
|
||||
|
@ -874,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) {
|
||||
|
@ -886,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) {
|
||||
|
@ -898,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) {
|
||||
|
@ -910,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) {
|
||||
|
@ -1007,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;
|
||||
}
|
||||
|
@ -1096,7 +1115,8 @@ PyImaging_JpegEncoderNew(PyObject *self, PyObject *args) {
|
|||
&extra,
|
||||
&extra_size,
|
||||
&rawExif,
|
||||
&rawExifLen)) {
|
||||
&rawExifLen
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1266,7 +1286,8 @@ PyImaging_Jpeg2KEncoderNew(PyObject *self, PyObject *args) {
|
|||
&fd,
|
||||
&comment,
|
||||
&comment_size,
|
||||
&plt)) {
|
||||
&plt
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1323,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 */
|
||||
|
@ -1333,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;
|
||||
}
|
||||
|
@ -1341,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;
|
||||
}
|
||||
|
@ -1376,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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
@ -314,11 +318,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
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -59,7 +59,8 @@ ImagingExpand(Imaging imIn, int xmargin, int ymargin) {
|
|||
}
|
||||
|
||||
imOut = ImagingNewDirty(
|
||||
imIn->mode, imIn->xsize + 2 * xmargin, imIn->ysize + 2 * ymargin);
|
||||
imIn->mode, imIn->xsize + 2 * xmargin, imIn->ysize + 2 * ymargin
|
||||
);
|
||||
if (!imOut) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -369,7 +370,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);
|
||||
|
|
|
@ -781,7 +781,8 @@ ImagingGenericTransform(
|
|||
ImagingTransformMap transform,
|
||||
void *transform_data,
|
||||
int filterid,
|
||||
int fill) {
|
||||
int fill
|
||||
) {
|
||||
/* slow generic transformation. use ImagingTransformAffine or
|
||||
ImagingScaleAffine where possible. */
|
||||
|
||||
|
@ -836,14 +837,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;
|
||||
|
@ -936,7 +931,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
|
||||
|
@ -949,7 +945,8 @@ affine_fixed(
|
|||
int y1,
|
||||
double a[6],
|
||||
int filterid,
|
||||
int fill) {
|
||||
int fill
|
||||
) {
|
||||
/* affine transform, nearest neighbour resampling, fixed point
|
||||
arithmetics */
|
||||
|
||||
|
@ -1026,7 +1023,8 @@ ImagingTransformAffine(
|
|||
int y1,
|
||||
double a[6],
|
||||
int filterid,
|
||||
int fill) {
|
||||
int fill
|
||||
) {
|
||||
/* affine transform, nearest neighbour resampling, floating point
|
||||
arithmetics*/
|
||||
|
||||
|
@ -1039,7 +1037,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) {
|
||||
|
@ -1134,13 +1133,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;
|
||||
|
@ -1153,5 +1154,6 @@ ImagingTransform(
|
|||
}
|
||||
|
||||
return ImagingGenericTransform(
|
||||
imOut, imIn, x0, y0, x1, y1, transform, a, filterid, fill);
|
||||
imOut, imIn, x0, y0, x1, y1, transform, a, filterid, fill
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -298,7 +298,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
|
||||
|
@ -313,7 +314,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
|
||||
|
@ -376,7 +378,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
|
||||
|
@ -389,7 +392,8 @@ ImagingColorLUT3D_linear(
|
|||
int size1D,
|
||||
int size2D,
|
||||
int size3D,
|
||||
INT16 *table);
|
||||
INT16 *table
|
||||
);
|
||||
|
||||
extern Imaging
|
||||
ImagingCopy2(Imaging imOut, Imaging imIn);
|
||||
|
@ -443,7 +447,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
|
||||
|
@ -458,7 +463,8 @@ ImagingDrawChord(
|
|||
const void *ink,
|
||||
int fill,
|
||||
int width,
|
||||
int op);
|
||||
int op
|
||||
);
|
||||
extern int
|
||||
ImagingDrawEllipse(
|
||||
Imaging im,
|
||||
|
@ -469,12 +475,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,
|
||||
|
@ -487,12 +495,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,
|
||||
|
@ -503,7 +513,8 @@ ImagingDrawRectangle(
|
|||
const void *ink,
|
||||
int fill,
|
||||
int width,
|
||||
int op);
|
||||
int op
|
||||
);
|
||||
|
||||
/* Level 2 graphics (WORK IN PROGRESS) */
|
||||
extern ImagingOutline
|
||||
|
@ -513,7 +524,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);
|
||||
|
@ -521,7 +533,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]);
|
||||
|
||||
|
@ -548,7 +561,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);
|
||||
|
@ -578,7 +592,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
|
||||
|
@ -589,7 +604,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
|
||||
|
@ -601,7 +617,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
|
||||
|
@ -614,13 +631,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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -12,6 +12,7 @@ quantize_pngquant(
|
|||
Pixel **,
|
||||
uint32_t *,
|
||||
uint32_t **,
|
||||
int);
|
||||
int
|
||||
);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -102,7 +102,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); \
|
||||
} \
|
||||
|
|
|
@ -74,7 +74,8 @@ ImagingRawDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t byt
|
|||
state->shuffle(
|
||||
(UINT8 *)im->image[state->y + state->yoff] + state->xoff * im->pixelsize,
|
||||
ptr,
|
||||
state->xsize);
|
||||
state->xsize
|
||||
);
|
||||
|
||||
ptr += state->bytes;
|
||||
bytes -= state->bytes;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
@ -1427,7 +1461,8 @@ ImagingReduce(Imaging imIn, int xscale, int yscale, int box[4]) {
|
|||
}
|
||||
|
||||
imOut = ImagingNewDirty(
|
||||
imIn->mode, (box[2] + xscale - 1) / xscale, (box[3] + yscale - 1) / yscale);
|
||||
imIn->mode, (box[2] + xscale - 1) / xscale, (box[3] + yscale - 1) / yscale
|
||||
);
|
||||
if (!imOut) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
@ -662,7 +673,8 @@ ImagingResampleInner(
|
|||
imTemp = ImagingNewDirty(imIn->mode, 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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -110,9 +110,8 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
|||
im->linesize = 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;
|
||||
|
@ -229,7 +228,8 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
|
|||
Imaging
|
||||
ImagingNewPrologue(const char *mode, int xsize, int ysize) {
|
||||
return ImagingNewPrologueSubtype(
|
||||
mode, xsize, ysize, sizeof(struct ImagingMemoryInstance));
|
||||
mode, xsize, ysize, sizeof(struct ImagingMemoryInstance)
|
||||
);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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, ...);
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
|
||||
|
|
|
@ -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++;
|
||||
|
||||
|
|
|
@ -72,7 +72,8 @@ PyImaging_MapBuffer(PyObject *self, PyObject *args) {
|
|||
&offset,
|
||||
&mode,
|
||||
&stride,
|
||||
&ystep)) {
|
||||
&ystep
|
||||
)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -489,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;
|
||||
}
|
||||
|
||||
|
@ -570,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;
|
||||
}
|
||||
}
|
||||
|
@ -586,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*/
|
||||
|
|
Loading…
Reference in New Issue
Block a user