mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-26 18:06:18 +03:00
Merge branch 'main' into apng
This commit is contained in:
commit
58e0dd7df9
2
.github/workflows/test-mingw.yml
vendored
2
.github/workflows/test-mingw.yml
vendored
|
@ -80,7 +80,7 @@ jobs:
|
||||||
pushd depends && ./install_extra_test_images.sh && popd
|
pushd depends && ./install_extra_test_images.sh && popd
|
||||||
|
|
||||||
- name: Build Pillow
|
- name: Build Pillow
|
||||||
run: CFLAGS="-coverage" python3 -m pip install --global-option="build_ext" .
|
run: SETUPTOOLS_USE_DISTUTILS="stdlib" CFLAGS="-coverage" python3 -m pip install --global-option="build_ext" .
|
||||||
|
|
||||||
- name: Test Pillow
|
- name: Test Pillow
|
||||||
run: |
|
run: |
|
||||||
|
|
|
@ -57,7 +57,7 @@ repos:
|
||||||
- id: sphinx-lint
|
- id: sphinx-lint
|
||||||
|
|
||||||
- repo: https://github.com/tox-dev/tox-ini-fmt
|
- repo: https://github.com/tox-dev/tox-ini-fmt
|
||||||
rev: 1.0.0
|
rev: 1.3.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: tox-ini-fmt
|
- id: tox-ini-fmt
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,12 @@ Changelog (Pillow)
|
||||||
10.0.0 (unreleased)
|
10.0.0 (unreleased)
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|
- Support float font sizes #7107
|
||||||
|
[radarhere]
|
||||||
|
|
||||||
|
- Use later value for duplicate xref entries in PdfParser #7102
|
||||||
|
[radarhere]
|
||||||
|
|
||||||
- Load before getting size in __getstate__ #7105
|
- Load before getting size in __getstate__ #7105
|
||||||
[bigcat88, radarhere]
|
[bigcat88, radarhere]
|
||||||
|
|
||||||
|
|
BIN
Tests/images/duplicate_xref_entry.pdf
Normal file
BIN
Tests/images/duplicate_xref_entry.pdf
Normal file
Binary file not shown.
|
@ -191,6 +191,16 @@ def test_getlength(
|
||||||
assert length == length_raqm
|
assert length == length_raqm
|
||||||
|
|
||||||
|
|
||||||
|
def test_float_size():
|
||||||
|
lengths = []
|
||||||
|
for size in (48, 48.5, 49):
|
||||||
|
f = ImageFont.truetype(
|
||||||
|
"Tests/fonts/NotoSans-Regular.ttf", size, layout_engine=layout_engine
|
||||||
|
)
|
||||||
|
lengths.append(f.getlength("text"))
|
||||||
|
assert lengths[0] != lengths[1] != lengths[2]
|
||||||
|
|
||||||
|
|
||||||
def test_render_multiline(font):
|
def test_render_multiline(font):
|
||||||
im = Image.new(mode="RGB", size=(300, 100))
|
im = Image.new(mode="RGB", size=(300, 100))
|
||||||
draw = ImageDraw.Draw(im)
|
draw = ImageDraw.Draw(im)
|
||||||
|
|
|
@ -117,3 +117,9 @@ def test_pdf_repr():
|
||||||
assert pdf_repr(b"a)/b\\(c") == rb"(a\)/b\\\(c)"
|
assert pdf_repr(b"a)/b\\(c") == rb"(a\)/b\\\(c)"
|
||||||
assert pdf_repr([123, True, {"a": PdfName(b"b")}]) == b"[ 123 true <<\n/a /b\n>> ]"
|
assert pdf_repr([123, True, {"a": PdfName(b"b")}]) == b"[ 123 true <<\n/a /b\n>> ]"
|
||||||
assert pdf_repr(PdfBinary(b"\x90\x1F\xA0")) == b"<901FA0>"
|
assert pdf_repr(PdfBinary(b"\x90\x1F\xA0")) == b"<901FA0>"
|
||||||
|
|
||||||
|
|
||||||
|
def test_duplicate_xref_entry():
|
||||||
|
pdf = PdfParser("Tests/images/duplicate_xref_entry.pdf")
|
||||||
|
assert pdf.xref_table.existing_entries[6][0] == 1197
|
||||||
|
pdf.close()
|
||||||
|
|
|
@ -957,13 +957,10 @@ class PdfParser:
|
||||||
check_format_condition(m, "xref entry not found")
|
check_format_condition(m, "xref entry not found")
|
||||||
offset = m.end()
|
offset = m.end()
|
||||||
is_free = m.group(3) == b"f"
|
is_free = m.group(3) == b"f"
|
||||||
generation = int(m.group(2))
|
|
||||||
if not is_free:
|
if not is_free:
|
||||||
|
generation = int(m.group(2))
|
||||||
new_entry = (int(m.group(1)), generation)
|
new_entry = (int(m.group(1)), generation)
|
||||||
check_format_condition(
|
if i not in self.xref_table:
|
||||||
i not in self.xref_table or self.xref_table[i] == new_entry,
|
|
||||||
"xref entry duplicated (and not identical)",
|
|
||||||
)
|
|
||||||
self.xref_table[i] = new_entry
|
self.xref_table[i] = new_entry
|
||||||
return offset
|
return offset
|
||||||
|
|
||||||
|
|
|
@ -116,7 +116,9 @@ getfont(PyObject *self_, PyObject *args, PyObject *kw) {
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
char *filename = NULL;
|
char *filename = NULL;
|
||||||
Py_ssize_t size;
|
float size;
|
||||||
|
FT_Size_RequestRec req;
|
||||||
|
FT_Long width;
|
||||||
Py_ssize_t index = 0;
|
Py_ssize_t index = 0;
|
||||||
Py_ssize_t layout_engine = 0;
|
Py_ssize_t layout_engine = 0;
|
||||||
unsigned char *encoding;
|
unsigned char *encoding;
|
||||||
|
@ -133,7 +135,7 @@ getfont(PyObject *self_, PyObject *args, PyObject *kw) {
|
||||||
if (!PyArg_ParseTupleAndKeywords(
|
if (!PyArg_ParseTupleAndKeywords(
|
||||||
args,
|
args,
|
||||||
kw,
|
kw,
|
||||||
"etn|nsy#n",
|
"etf|nsy#n",
|
||||||
kwlist,
|
kwlist,
|
||||||
Py_FileSystemDefaultEncoding,
|
Py_FileSystemDefaultEncoding,
|
||||||
&filename,
|
&filename,
|
||||||
|
@ -179,7 +181,13 @@ getfont(PyObject *self_, PyObject *args, PyObject *kw) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!error) {
|
if (!error) {
|
||||||
error = FT_Set_Pixel_Sizes(self->face, 0, size);
|
width = size * 64;
|
||||||
|
req.type = FT_SIZE_REQUEST_TYPE_NOMINAL;
|
||||||
|
req.width = width;
|
||||||
|
req.height = width;
|
||||||
|
req.horiResolution = 0;
|
||||||
|
req.vertResolution = 0;
|
||||||
|
error = FT_Request_Size(self->face, &req);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!error && encoding && strlen((char *)encoding) == 4) {
|
if (!error && encoding && strlen((char *)encoding) == 4) {
|
||||||
|
|
7
tox.ini
7
tox.ini
|
@ -1,6 +1,7 @@
|
||||||
[tox]
|
[tox]
|
||||||
minversion = 1.9
|
requires =
|
||||||
envlist =
|
tox>=4.2
|
||||||
|
env_list =
|
||||||
lint
|
lint
|
||||||
py{py3, 311, 310, 39, 38}
|
py{py3, 311, 310, 39, 38}
|
||||||
|
|
||||||
|
@ -23,7 +24,7 @@ skip_install = true
|
||||||
deps =
|
deps =
|
||||||
check-manifest
|
check-manifest
|
||||||
pre-commit
|
pre-commit
|
||||||
passenv =
|
pass_env =
|
||||||
PRE_COMMIT_COLOR
|
PRE_COMMIT_COLOR
|
||||||
commands =
|
commands =
|
||||||
pre-commit run --all-files --show-diff-on-failure
|
pre-commit run --all-files --show-diff-on-failure
|
||||||
|
|
Loading…
Reference in New Issue
Block a user