Skip to content

Commit

Permalink
Tests, lifetime changes
Browse files Browse the repository at this point in the history
  • Loading branch information
wiredfool committed Aug 25, 2024
1 parent f7df464 commit 38013ac
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 6 deletions.
65 changes: 65 additions & 0 deletions Tests/test_arrow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
from __future__ import annotations

import warnings

import pytest

from PIL import Image

from .helper import assert_deep_equal, assert_image, hopper, skip_unless_feature

from typing import Any # undone

pyarrow = pytest.importorskip("pyarrow", reason="PyArrow not installed")

TEST_IMAGE_SIZE = (10, 10)
from numbers import Number


def _test_img_equals_pyarray(img: Image.Image, arr: Any, mask) -> None:
assert img.height * img.width == len(arr)
px = img.load()
assert px is not None
for x in range(0, img.size[0], int(img.size[0] / 10)):
for y in range(0, img.size[1], int(img.size[1] / 10)):
if mask:
for ix, elt in enumerate(mask):
assert px[x,y][ix] == arr[y * img.width + x].as_py()[elt]
else:
assert_deep_equal(px[x, y], arr[y * img.width + x].as_py())


# really hard to get a non-nullable list type
fl_uint8_4_type = pyarrow.field("_",
pyarrow.list_(
pyarrow.field("_",
pyarrow.uint8()
).with_nullable(False)
,4)
).type

@pytest.mark.parametrize(
"mode, dtype, mask",
(
("L", pyarrow.uint8(), None),
("I", pyarrow.int32(), None),
("F", pyarrow.float32(), None),
("LA", fl_uint8_4_type, [0,3]),
("RGB", fl_uint8_4_type, [0,1,2]),
("RGBA", fl_uint8_4_type, None),
("RGBX", fl_uint8_4_type, None),
("CMYK", fl_uint8_4_type, None),
("YCbCr", fl_uint8_4_type, [0,1,2]),
("HSV", fl_uint8_4_type, [0,1,2]),
),
)
def test_to_array(mode: str, dtype: Any, mask: Any ) -> None:
img = hopper(mode)

# Resize to non-square
img = img.crop((3, 0, 124, 127))
assert img.size == (121, 127)

arr = pyarrow.array(img)
_test_img_equals_pyarray(img, arr, mask)
assert arr.type == dtype
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ optional-dependencies.tests = [
"pytest",
"pytest-cov",
"pytest-timeout",
"pyarrow",
]
optional-dependencies.typing = [
"typing-extensions; python_version<'3.10'",
Expand Down
2 changes: 1 addition & 1 deletion src/libImaging/Arrow.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ void export_uint32_array(const uint32_t* data, int64_t nitems,

static void release_const_array(struct ArrowArray* array) {
Imaging im = (Imaging)array->private_data;
im->arrow_borrow--;

ImagingDelete(im);

//assert(array->n_buffers == 2);
Expand Down
12 changes: 7 additions & 5 deletions src/libImaging/Storage.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ ImagingNewPrologueSubtype(const char *mode, int xsize, int ysize, int size) {
/* Setup image descriptor */
im->xsize = xsize;
im->ysize = ysize;

im->arrow_borrow = 1;
im->type = IMAGING_TYPE_UINT8;
strcpy(im->arrow_band_format, "C");

Expand Down Expand Up @@ -298,15 +298,17 @@ ImagingDelete(Imaging im) {
return;
}

im->arrow_borrow--;

if (im->arrow_borrow>0) {
return;
}

if (im->palette) {
ImagingPaletteDelete(im->palette);
im->palette = NULL;
}

if (im->arrow_borrow) {
return;
}

if (im->destroy) {
im->destroy(im);
}
Expand Down

0 comments on commit 38013ac

Please sign in to comment.