Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Tests/test_file_gbr.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def test_multiple_load_operations() -> None:
assert_image_equal_tofile(im, "Tests/images/gbr.png")


def create_gbr_image(info: dict[str, int] = {}, magic_number=b"") -> BytesIO:
def create_gbr_image(info: dict[str, int] = {}, magic_number: bytes = b"") -> BytesIO:
return BytesIO(
b"".join(
_binary.o32be(i)
Expand Down
2 changes: 1 addition & 1 deletion Tests/test_file_iptc.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@


def create_iptc_image(info: dict[str, int] = {}) -> BytesIO:
def field(tag, value):
def field(tag: tuple[int, int], value: bytes) -> bytes:
return bytes((0x1C,) + tag + (0, len(value))) + value

data = field((3, 60), bytes((info.get("layers", 1), info.get("component", 0))))
Expand Down
11 changes: 11 additions & 0 deletions Tests/test_imagetext.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ def test_get_length(font: ImageFont.FreeTypeFont) -> None:
assert ImageText.Text("y", font).get_length() == 12
assert ImageText.Text("a", font).get_length() == 12

text = ImageText.Text("\n", font)
with pytest.raises(ValueError, match="can't measure length of multiline text"):
text.get_length()


def test_get_bbox(font: ImageFont.FreeTypeFont) -> None:
assert ImageText.Text("A", font).get_bbox() == (0, 4, 12, 16)
Expand All @@ -45,13 +49,20 @@ def test_standard_embedded_color(layout_engine: ImageFont.Layout) -> None:
font = ImageFont.truetype(FONT_PATH, 40, layout_engine=layout_engine)
text = ImageText.Text("Hello World!", font)
text.embed_color()
assert text.get_length() == 288

im = Image.new("RGB", (300, 64), "white")
draw = ImageDraw.Draw(im)
draw.text((10, 10), text, "#fa6")

assert_image_similar_tofile(im, "Tests/images/standard_embedded.png", 3.1)

text = ImageText.Text("", mode="1")
with pytest.raises(
ValueError, match="Embedded color supported only in RGB and RGBA modes"
):
text.embed_color()


@skip_unless_feature("freetype2")
def test_stroke() -> None:
Expand Down
12 changes: 7 additions & 5 deletions src/PIL/ImageText.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ def _get_fontmode(self) -> str:
else:
return "L"

def get_length(self):
def get_length(self) -> float:
"""
Returns length (in pixels with 1/64 precision) of text.

Expand Down Expand Up @@ -130,8 +130,11 @@ def get_length(self):

:return: Either width for horizontal text, or height for vertical text.
"""
split_character = "\n" if isinstance(self.text, str) else b"\n"
if split_character in self.text:
if isinstance(self.text, str):
multiline = "\n" in self.text
else:
multiline = b"\n" in self.text
if multiline:
msg = "can't measure length of multiline text"
raise ValueError(msg)
return self.font.getlength(
Expand Down Expand Up @@ -313,6 +316,5 @@ def get_bbox(
max(bbox[3], bbox_line[3]),
)

if bbox is None:
return xy[0], xy[1], xy[0], xy[1]
assert bbox is not None
return bbox
Loading