Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,15 @@ frequencyio = false
getpass = false
gifio = false
gnss = false
hashlib = false
hashlib = true
hostnetwork = false
i2cdisplaybus = true # Zephyr board has busio
i2cioexpander = false
i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down Expand Up @@ -117,4 +117,4 @@ watchdog = false
wifi = false
zephyr_display = false
zephyr_kernel = false
zlib = false
zlib = true
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = true # Zephyr networking enabled
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
2 changes: 1 addition & 1 deletion ports/zephyr-cp/boards/nordic/nrf7002dk/circuitpython.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ CIRCUITPY_BUILD_EXTENSIONS = ["elf"]
USB_VID=0x239A
USB_PID=0x8168
BLOBS=["nrf_wifi"]
DISABLED_MODULES=["aesio", "adafruit_bus_device", "zlib"]
DISABLED_MODULES=["aesio", "adafruit_bus_device", "zlib", "jpegio"]
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = true # Zephyr networking enabled
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = true # Zephyr networking enabled
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = true # Zephyr networking enabled
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ i2ctarget = false
imagecapture = false
ipaddress = false
is31fl3741 = false
jpegio = false
jpegio = true
keypad = false
keypad_demux = false
locale = false
Expand Down
2 changes: 2 additions & 0 deletions ports/zephyr-cp/cptools/build_circuitpython.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
"hashlib",
"zlib",
"adafruit_bus_device",
"jpegio",
]
# Flags that don't match with with a *bindings module. Some used by adafruit_requests
MPCONFIG_FLAGS = ["array", "errno", "io", "json", "math"]
Expand Down Expand Up @@ -118,6 +119,7 @@
"lib/uzlib/adler32.c",
"lib/uzlib/crc32.c",
],
"jpegio": ["lib/tjpgd/src/tjpgd.c"],
}

SHARED_MODULE_AND_COMMON_HAL = ["_bleio", "os", "rotaryio"]
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added ports/zephyr-cp/tests/zephyr_display/test.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
87 changes: 87 additions & 0 deletions ports/zephyr-cp/tests/zephyr_display/test_jpegio.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# SPDX-FileCopyrightText: 2026 Scott Shawcroft for Adafruit Industries
# SPDX-License-Identifier: MIT

import shutil
from pathlib import Path

import pytest
from PIL import Image


_TEST_JPG_PATH = Path(__file__).parent / "test.jpg"
_TEST_JPG_BYTES = _TEST_JPG_PATH.read_bytes()


def _read_image(path: Path) -> tuple[int, int, bytes]:
with Image.open(path) as img:
rgb = img.convert("RGB")
return rgb.width, rgb.height, rgb.tobytes()


def _golden_compare_or_update(request, captures, golden_path):
if not captures or not captures[0].exists():
pytest.skip("display capture was not produced")

if request.config.getoption("--update-goldens"):
golden_path.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(captures[0], golden_path)
return

gw, gh, gpx = _read_image(golden_path)
dw, dh, dpx = _read_image(captures[0])
assert (dw, dh) == (gw, gh)
assert gpx == dpx


JPEGIO_DECODE_CODE = """\
import board
import displayio
import time
from jpegio import JpegDecoder

decoder = JpegDecoder()
width, height = decoder.open("/test.jpg")
print('size', width, height)

bitmap = displayio.Bitmap(width, height, 65535)
decoder.decode(bitmap)

for i in range(min(width, 8)):
print('px', i, hex(bitmap[i, 0]))

scale = 10
tg = displayio.TileGrid(
bitmap,
pixel_shader=displayio.ColorConverter(
input_colorspace=displayio.Colorspace.RGB565_SWAPPED
),
)
g = displayio.Group(scale=scale)
g.x = (board.DISPLAY.width - width * scale) // 2
g.y = (board.DISPLAY.height - height * scale) // 2
g.append(tg)

board.DISPLAY.auto_refresh = False
board.DISPLAY.root_group = g
board.DISPLAY.refresh()
print('rendered')
while True:
time.sleep(1)
"""


_JPEGIO_DRIVE = {"code.py": JPEGIO_DECODE_CODE, "test.jpg": _TEST_JPG_BYTES}


@pytest.mark.circuitpy_drive(_JPEGIO_DRIVE)
@pytest.mark.display(capture_times_ns=[14_000_000_000])
@pytest.mark.duration(18)
def test_jpegio_decode(request, circuitpython):
circuitpython.wait_until_done()

output = circuitpython.serial.all_output
assert "size 20 20" in output
assert "rendered" in output

golden = Path(__file__).parent / "golden" / "jpegio_test_pattern_320x240.png"
_golden_compare_or_update(request, circuitpython.display_capture_paths(), golden)
9 changes: 7 additions & 2 deletions shared-bindings/jpegio/JpegDecoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,18 @@
//| Example::
//|
//| from jpegio import JpegDecoder
//| from displayio import Bitmap
//| from displayio import Bitmap, TileGrid, ColorConverter, Colorspace
//| import supervisor
//|
//| decoder = JpegDecoder()
//| width, height = decoder.open("/sd/example.jpg")
//| bitmap = Bitmap(width, height, 65535)
//| decoder.decode(bitmap)
//| # .. do something with bitmap
//| tg = TileGrid(bitmap, pixel_shader=ColorConverter(input_colorspace=Colorspace.RGB565_SWAPPED))
//| supervisor.runtime.display.root_group = tg
//| while True:
//| pass
//|
//| """
//|
//| def __init__(self) -> None:
Expand Down
Loading