From eded79487f42e7094a2bbc2f47bd33fd710bde66 Mon Sep 17 00:00:00 2001 From: Jason Jackson <jake1164@hotmail.com> Date: Sat, 30 Nov 2024 09:31:57 -0500 Subject: [PATCH 1/2] Updated to work with Circuitpython 9.2.x --- src/code.py | 2 +- src/lib/adafruit_bitmap_font/bdf.py | 2 +- src/lib/adafruit_bitmap_font/bitmap_font.py | 2 +- src/lib/adafruit_bitmap_font/glyph_cache.py | 2 +- src/lib/adafruit_bus_device/i2c_device.py | 2 +- src/lib/adafruit_bus_device/spi_device.py | 4 +- src/lib/adafruit_connection_manager.mpy | Bin 0 -> 3541 bytes src/lib/adafruit_display_text/__init__.py | 10 +- src/lib/adafruit_display_text/bitmap_label.py | 19 +- src/lib/adafruit_display_text/label.py | 2 +- .../adafruit_display_text/outlined_label.py | 188 ++++++++ .../adafruit_display_text/scrolling_label.py | 30 +- src/lib/adafruit_display_text/text_box.py | 435 ++++++++++++++++++ src/lib/adafruit_ds3231.mpy | Bin 1229 -> 1225 bytes src/lib/adafruit_imageload/__init__.py | 25 +- src/lib/adafruit_imageload/bmp/__init__.py | 18 +- src/lib/adafruit_imageload/bmp/indexed.py | 24 +- src/lib/adafruit_imageload/bmp/truecolor.py | 26 +- src/lib/adafruit_imageload/displayio_types.py | 6 +- src/lib/adafruit_imageload/gif.py | 34 +- src/lib/adafruit_imageload/jpg.py | 57 +++ src/lib/adafruit_imageload/png.py | 112 ++++- src/lib/adafruit_imageload/pnm/__init__.py | 29 +- src/lib/adafruit_imageload/pnm/pbm_ascii.py | 7 +- src/lib/adafruit_imageload/pnm/pbm_binary.py | 8 +- .../adafruit_imageload/pnm/pgm/__init__.py | 12 +- src/lib/adafruit_imageload/pnm/pgm/ascii.py | 13 +- src/lib/adafruit_imageload/pnm/pgm/binary.py | 13 +- src/lib/adafruit_imageload/pnm/ppm_ascii.py | 14 +- src/lib/adafruit_imageload/pnm/ppm_binary.py | 12 +- .../adafruit_imageload/tilegrid_inflator.py | 13 +- src/lib/adafruit_irremote.mpy | Bin 3069 -> 2977 bytes src/lib/adafruit_ntp.mpy | Bin 855 -> 1245 bytes src/lib/adafruit_register/i2c_bcd_alarm.py | 10 +- src/lib/adafruit_register/i2c_bcd_datetime.py | 2 +- src/lib/adafruit_register/i2c_bit.py | 2 +- src/lib/adafruit_register/i2c_bits.py | 2 +- src/lib/adafruit_register/i2c_struct.py | 2 +- src/lib/adafruit_register/i2c_struct_array.py | 2 +- src/lib/adafruit_requests.mpy | Bin 8578 -> 6944 bytes src/lib/adafruit_ticks.mpy | Bin 0 -> 694 bytes src/network.py | 27 +- 42 files changed, 969 insertions(+), 199 deletions(-) create mode 100644 src/lib/adafruit_connection_manager.mpy create mode 100644 src/lib/adafruit_display_text/outlined_label.py create mode 100644 src/lib/adafruit_display_text/text_box.py create mode 100644 src/lib/adafruit_imageload/jpg.py create mode 100644 src/lib/adafruit_ticks.mpy diff --git a/src/code.py b/src/code.py index be86a7f..aea4432 100644 --- a/src/code.py +++ b/src/code.py @@ -1,6 +1,6 @@ # UPDATE the settings.toml file before starting! -# Following are imported from circuitpython 8.x +# Following are imported from circuitpython 9.x import os import gc import board diff --git a/src/lib/adafruit_bitmap_font/bdf.py b/src/lib/adafruit_bitmap_font/bdf.py index c27175e..4ff14f0 100644 --- a/src/lib/adafruit_bitmap_font/bdf.py +++ b/src/lib/adafruit_bitmap_font/bdf.py @@ -33,7 +33,7 @@ from fontio import Glyph from .glyph_cache import GlyphCache -__version__ = "2.1.0" +__version__ = "2.1.3" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git" diff --git a/src/lib/adafruit_bitmap_font/bitmap_font.py b/src/lib/adafruit_bitmap_font/bitmap_font.py index da11e5d..640b041 100644 --- a/src/lib/adafruit_bitmap_font/bitmap_font.py +++ b/src/lib/adafruit_bitmap_font/bitmap_font.py @@ -31,7 +31,7 @@ except ImportError: pass -__version__ = "2.1.0" +__version__ = "2.1.3" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git" diff --git a/src/lib/adafruit_bitmap_font/glyph_cache.py b/src/lib/adafruit_bitmap_font/glyph_cache.py index 6a8f1a0..2933f89 100644 --- a/src/lib/adafruit_bitmap_font/glyph_cache.py +++ b/src/lib/adafruit_bitmap_font/glyph_cache.py @@ -30,7 +30,7 @@ import gc -__version__ = "2.1.0" +__version__ = "2.1.3" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git" diff --git a/src/lib/adafruit_bus_device/i2c_device.py b/src/lib/adafruit_bus_device/i2c_device.py index 8f6172b..c605290 100644 --- a/src/lib/adafruit_bus_device/i2c_device.py +++ b/src/lib/adafruit_bus_device/i2c_device.py @@ -20,7 +20,7 @@ pass -__version__ = "5.2.7" +__version__ = "5.2.10" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git" diff --git a/src/lib/adafruit_bus_device/spi_device.py b/src/lib/adafruit_bus_device/spi_device.py index 1c599e0..60954e0 100644 --- a/src/lib/adafruit_bus_device/spi_device.py +++ b/src/lib/adafruit_bus_device/spi_device.py @@ -22,7 +22,7 @@ pass -__version__ = "5.2.7" +__version__ = "5.2.10" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git" @@ -89,7 +89,7 @@ def __init__( self.chip_select = chip_select self.cs_active_value = cs_active_value if self.chip_select: - self.chip_select.switch_to_output(value=True) + self.chip_select.switch_to_output(value=not self.cs_active_value) def __enter__(self) -> SPI: while not self.spi.try_lock(): diff --git a/src/lib/adafruit_connection_manager.mpy b/src/lib/adafruit_connection_manager.mpy new file mode 100644 index 0000000000000000000000000000000000000000..002d5cd8538342456ab2f6a200fa11ca3a85fb73 GIT binary patch literal 3541 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%0DWa1r0|7+=sc*&}i) zfU@~pN9?^m%Utn+(T+>n0o3pL;)71@I|9Ppje7>Bi>?P}ZU?<C=ZMP%M78sP5~Fy* z(WN$0LxTg5KA4Fo5YR||n1R6Xk8}*4<bpaXFc!f<Y!R^f?cO)RsF6#0<d?Vq^wpjm zjK_-~30rrd1`j-PkHcAXIb9>6!LoDE8FjnDgJrj)JnSsHLkILUUOs>l*Bko>p7!UD zfWwb;0iKW2-#^xf%xOd(1Chrp@V1cd{dyzN2K4u_#4#OOe)^D}Jqkxbp=ZFT)_J+! zkl{@@1MPD9hZ#yCV_(-BhYybe9p5YD%%jHvBY<gT#S5Oc7c>h4K1bhF$V*V&H%I4T z_<y(lZ`t6vc$0fjkj;+i=<vvJbk-4aJ4Rv(J*|uyo`j-!h8znZRZolGz<PW?5iovx zpv_pp(Fp_($V=Ge<-iWg*2AGtKfXfxKy=?7(#!ZN={tmQn4Q)l15VWvQa%OQRr`A< aZa(<pwrfPeGtkEvPQs|+86^Y1H2Xj2199X4 literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_display_text/__init__.py b/src/lib/adafruit_display_text/__init__.py index 39a83cf..7a46cba 100644 --- a/src/lib/adafruit_display_text/__init__.py +++ b/src/lib/adafruit_display_text/__init__.py @@ -7,7 +7,7 @@ ======================= """ -__version__ = "3.0.5" +__version__ = "3.2.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" from displayio import Group, Palette @@ -246,7 +246,6 @@ def __init__( tab_replacement: Tuple[int, str] = (4, " "), label_direction: str = "LTR", verbose: bool = False, - **kwargs, # pylint: disable=unused-argument ) -> None: # pylint: disable=too-many-arguments, too-many-locals @@ -271,9 +270,6 @@ def __init__( self._tab_text = self._tab_replacement[1] * self._tab_replacement[0] self._verbose = verbose - if "max_glyphs" in kwargs: - print("Please update your code: 'max_glyphs' is not needed anymore.") - self._ascent, self._descent = self._get_ascent_descent() self._bounding_box = None @@ -428,12 +424,12 @@ def bounding_box(self) -> Tuple[int, int]: @property def height(self) -> int: """The height of the label determined from the bounding box.""" - return self._bounding_box[3] - self._bounding_box[1] + return self._bounding_box[3] @property def width(self) -> int: """The width of the label determined from the bounding box.""" - return self._bounding_box[2] - self._bounding_box[0] + return self._bounding_box[2] @property def line_spacing(self) -> float: diff --git a/src/lib/adafruit_display_text/bitmap_label.py b/src/lib/adafruit_display_text/bitmap_label.py index 8b78661..514ae69 100644 --- a/src/lib/adafruit_display_text/bitmap_label.py +++ b/src/lib/adafruit_display_text/bitmap_label.py @@ -23,7 +23,7 @@ """ -__version__ = "3.0.5" +__version__ = "3.2.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" import displayio @@ -183,6 +183,10 @@ def _reset_text( if self._background_tight: box_y = tight_box_y y_offset = tight_y_offset + self._padding_left = 0 + self._padding_right = 0 + self._padding_top = 0 + self._padding_bottom = 0 else: # calculate the box size for a loose background box_y = loose_box_y @@ -288,15 +292,18 @@ def _line_spacing_ypixels(font: FontProtocol, line_spacing: float) -> int: def _text_bounding_box( self, text: str, font: FontProtocol ) -> Tuple[int, int, int, int, int, int]: - # pylint: disable=too-many-locals + # pylint: disable=too-many-locals,too-many-branches - ascender_max, descender_max = self._ascent, self._descent + bbox = font.get_bounding_box() + if len(bbox) == 4: + ascender_max, descender_max = bbox[1], -bbox[3] + else: + ascender_max, descender_max = self._ascent, self._descent lines = 1 - xposition = ( - x_start - ) = yposition = y_start = 0 # starting x and y position (left margin) + # starting x and y position (left margin) + xposition = x_start = yposition = y_start = 0 left = None right = x_start diff --git a/src/lib/adafruit_display_text/label.py b/src/lib/adafruit_display_text/label.py index 09e6d22..7dd64a2 100644 --- a/src/lib/adafruit_display_text/label.py +++ b/src/lib/adafruit_display_text/label.py @@ -22,7 +22,7 @@ """ -__version__ = "3.0.5" +__version__ = "3.2.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" diff --git a/src/lib/adafruit_display_text/outlined_label.py b/src/lib/adafruit_display_text/outlined_label.py new file mode 100644 index 0000000..050ceb9 --- /dev/null +++ b/src/lib/adafruit_display_text/outlined_label.py @@ -0,0 +1,188 @@ +# SPDX-FileCopyrightText: 2023 Tim C +# +# SPDX-License-Identifier: MIT + +""" +`adafruit_display_text.outlined_label` +==================================================== + +Subclass of BitmapLabel that adds outline color and stroke size +functionalities. + +* Author(s): Tim Cocks + +Implementation Notes +-------------------- + +**Hardware:** + +**Software and Dependencies:** + +* Adafruit CircuitPython firmware for the supported boards: + https://circuitpython.org/downloads + +""" +__version__ = "3.2.0" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" + +import bitmaptools +from displayio import Palette, Bitmap +from adafruit_display_text import bitmap_label + +try: + from typing import Optional, Tuple, Union + from fontio import FontProtocol +except ImportError: + pass + + +class OutlinedLabel(bitmap_label.Label): + """ + OutlinedLabel - A BitmapLabel subclass that includes arguments and properties for specifying + outline_size and outline_color to get drawn as a stroke around the text. + + :param Union[Tuple, int] outline_color: The color of the outline stroke as RGB tuple, or hex. + :param int outline_size: The size in pixels of the outline stroke. + + """ + + # pylint: disable=too-many-arguments + def __init__( + self, + font, + outline_color: Union[int, Tuple] = 0x999999, + outline_size: int = 1, + padding_top: Optional[int] = None, + padding_bottom: Optional[int] = None, + padding_left: Optional[int] = None, + padding_right: Optional[int] = None, + **kwargs + ): + if padding_top is None: + padding_top = outline_size + 0 + if padding_bottom is None: + padding_bottom = outline_size + 2 + if padding_left is None: + padding_left = outline_size + 0 + if padding_right is None: + padding_right = outline_size + 0 + + super().__init__( + font, + padding_top=padding_top, + padding_bottom=padding_bottom, + padding_left=padding_left, + padding_right=padding_right, + **kwargs + ) + + _background_color = self._palette[0] + _foreground_color = self._palette[1] + _background_is_transparent = self._palette.is_transparent(0) + self._palette = Palette(3) + self._palette[0] = _background_color + self._palette[1] = _foreground_color + self._palette[2] = outline_color + if _background_is_transparent: + self._palette.make_transparent(0) + + self._outline_size = outline_size + self._stamp_source = Bitmap((outline_size * 2) + 1, (outline_size * 2) + 1, 3) + self._stamp_source.fill(2) + + self._bitmap = None + + self._reset_text( + font=font, + text=self._text, + line_spacing=self._line_spacing, + scale=self.scale, + ) + + def _add_outline(self): + """ + Blit the outline into the labels Bitmap. We will stamp self._stamp_source for each + pixel of the foreground color but skip the foreground color when we blit. + :return: None + """ + if hasattr(self, "_stamp_source"): + for y in range(self.bitmap.height): + for x in range(self.bitmap.width): + if self.bitmap[x, y] == 1: + try: + bitmaptools.blit( + self.bitmap, + self._stamp_source, + x - self._outline_size, + y - self._outline_size, + skip_dest_index=1, + ) + except ValueError as value_error: + raise ValueError( + "Padding must be big enough to fit outline_size " + "all the way around the text. " + "Try using either larger padding sizes, or smaller outline_size." + ) from value_error + + def _place_text( + self, + bitmap: Bitmap, + text: str, + font: FontProtocol, + xposition: int, + yposition: int, + skip_index: int = 0, # set to None to write all pixels, other wise skip this palette index + # when copying glyph bitmaps (this is important for slanted text + # where rectangular glyph boxes overlap) + ) -> Tuple[int, int, int, int]: + """ + Copy the glpyphs that represent the value of the string into the labels Bitmap. + :param bitmap: The bitmap to place text into + :param text: The text to render + :param font: The font to render the text in + :param xposition: x location of the starting point within the bitmap + :param yposition: y location of the starting point within the bitmap + :param skip_index: Color index to skip during rendering instead of covering up + :return Tuple bounding_box: tuple with x, y, width, height values of the bitmap + """ + parent_result = super()._place_text( + bitmap, text, font, xposition, yposition, skip_index=skip_index + ) + + self._add_outline() + + return parent_result + + @property + def outline_color(self): + """Color of the outline to draw around the text.""" + return self._palette[2] + + @outline_color.setter + def outline_color(self, new_outline_color): + self._palette[2] = new_outline_color + + @property + def outline_size(self): + """Stroke size of the outline to draw around the text.""" + return self._outline_size + + @outline_size.setter + def outline_size(self, new_outline_size): + self._outline_size = new_outline_size + + self._padding_top = new_outline_size + 0 + self._padding_bottom = new_outline_size + 2 + self._padding_left = new_outline_size + 0 + self._padding_right = new_outline_size + 0 + + self._stamp_source = Bitmap( + (new_outline_size * 2) + 1, (new_outline_size * 2) + 1, 3 + ) + self._stamp_source.fill(2) + self._reset_text( + font=self._font, + text=self._text, + line_spacing=self._line_spacing, + scale=self.scale, + ) diff --git a/src/lib/adafruit_display_text/scrolling_label.py b/src/lib/adafruit_display_text/scrolling_label.py index f65125d..b4e4e0a 100644 --- a/src/lib/adafruit_display_text/scrolling_label.py +++ b/src/lib/adafruit_display_text/scrolling_label.py @@ -23,10 +23,10 @@ """ -__version__ = "3.0.5" +__version__ = "3.2.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" -import time +import adafruit_ticks from adafruit_display_text import bitmap_label try: @@ -66,7 +66,7 @@ def __init__( self._last_animate_time = -1 self.max_characters = max_characters - if text[-1] != " ": + if text and text[-1] != " ": text = "{} ".format(text) self._full_text = text @@ -81,10 +81,13 @@ def update(self, force: bool = False) -> None: Default is False. :return: None """ - _now = time.monotonic() - if force or self._last_animate_time + self.animate_time <= _now: + _now = adafruit_ticks.ticks_ms() + if force or adafruit_ticks.ticks_less( + self._last_animate_time + int(self.animate_time * 1000), _now + ): if len(self.full_text) <= self.max_characters: - super()._set_text(self.full_text, self.scale) + if self._text != self.full_text: + super()._set_text(self.full_text, self.scale) self._last_animate_time = _now return @@ -120,10 +123,10 @@ def current_index(self) -> int: @current_index.setter def current_index(self, new_index: int) -> None: - if new_index < len(self.full_text): - self._current_index = new_index - else: + if self.full_text: self._current_index = new_index % len(self.full_text) + else: + self._current_index = 0 @property def full_text(self) -> str: @@ -136,11 +139,12 @@ def full_text(self) -> str: @full_text.setter def full_text(self, new_text: str) -> None: - if new_text[-1] != " ": + if new_text and new_text[-1] != " ": new_text = "{} ".format(new_text) - self._full_text = new_text - self.current_index = 0 - self.update() + if new_text != self._full_text: + self._full_text = new_text + self.current_index = 0 + self.update(True) @property def text(self): diff --git a/src/lib/adafruit_display_text/text_box.py b/src/lib/adafruit_display_text/text_box.py new file mode 100644 index 0000000..58f668b --- /dev/null +++ b/src/lib/adafruit_display_text/text_box.py @@ -0,0 +1,435 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +""" +`adafruit_display_text.text_box` +================================================================================ + +Text graphics handling for CircuitPython, including text boxes + + +* Author(s): Tim Cocks + +Implementation Notes +-------------------- + +**Hardware:** + +**Software and Dependencies:** + +* Adafruit CircuitPython firmware for the supported boards: + https://circuitpython.org/downloads + +""" + +__version__ = "3.2.0" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" + +import displayio +from micropython import const + +from adafruit_display_text import wrap_text_to_pixels +from adafruit_display_text import bitmap_label + +try: + from typing import Optional, Tuple + from fontio import FontProtocol +except ImportError: + pass + + +# pylint: disable=too-many-instance-attributes, duplicate-code +class TextBox(bitmap_label.Label): + """ + TextBox has a constrained width and optionally height. + You set the desired size when it's initialized it + will automatically wrap text to fit it within the allotted + size. + + Left, Right, and Center alignment of the text within the + box are supported. + + :param font: The font to use for the TextBox. + :param width: The width of the TextBox in pixels. + :param height: The height of the TextBox in pixels. + :param align: How to align the text within the box, + valid values are ``ALIGN_LEFT``, ``ALIGN_CENTER``, ``ALIGN_RIGHT``. + """ + + ALIGN_LEFT = const(0) + ALIGN_CENTER = const(1) + ALIGN_RIGHT = const(2) + + DYNAMIC_HEIGHT = const(-1) + + def __init__( + self, font: FontProtocol, width: int, height: int, align=ALIGN_LEFT, **kwargs + ) -> None: + self._bitmap = None + self._tilegrid = None + self._prev_label_direction = None + self._width = width + + if height != TextBox.DYNAMIC_HEIGHT: + self._height = height + self.dynamic_height = False + else: + self.dynamic_height = True + + if align not in (TextBox.ALIGN_LEFT, TextBox.ALIGN_CENTER, TextBox.ALIGN_RIGHT): + raise ValueError( + "Align must be one of: ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT" + ) + self._align = align + + self._padding_left = kwargs.get("padding_left", 0) + self._padding_right = kwargs.get("padding_right", 0) + + self.lines = wrap_text_to_pixels( + kwargs.get("text", ""), + self._width - self._padding_left - self._padding_right, + font, + ) + + super(bitmap_label.Label, self).__init__(font, **kwargs) + + print(f"before reset: {self._text}") + + self._text = "\n".join(self.lines) + self._text = self._replace_tabs(self._text) + self._original_text = self._text + + # call the text updater with all the arguments. + self._reset_text( + font=font, + text=self._text, + line_spacing=self._line_spacing, + scale=self.scale, + ) + print(f"after reset: {self._text}") + + def _place_text( + self, + bitmap: displayio.Bitmap, + text: str, + font: FontProtocol, + xposition: int, + yposition: int, + skip_index: int = 0, # set to None to write all pixels, other wise skip this palette index + # when copying glyph bitmaps (this is important for slanted text + # where rectangular glyph boxes overlap) + ) -> Tuple[int, int, int, int]: + # pylint: disable=too-many-arguments, too-many-locals, too-many-statements, too-many-branches + + # placeText - Writes text into a bitmap at the specified location. + # + # Note: scale is pushed up to Group level + original_xposition = xposition + cur_line_index = 0 + cur_line_width = self._text_bounding_box(self.lines[0], self.font)[0] + + if self.align == self.ALIGN_LEFT: + x_start = original_xposition # starting x position (left margin) + if self.align == self.ALIGN_CENTER: + unused_space = self._width - cur_line_width + x_start = original_xposition + unused_space // 2 + if self.align == self.ALIGN_RIGHT: + unused_space = self._width - cur_line_width + x_start = original_xposition + unused_space - self._padding_right + + xposition = x_start # pylint: disable=used-before-assignment + + y_start = yposition + # print(f"start loc {x_start}, {y_start}") + + left = None + right = x_start + top = bottom = y_start + line_spacing = self._line_spacing + + # print(f"cur_line width: {cur_line_width}") + for char in text: + if char == "\n": # newline + cur_line_index += 1 + cur_line_width = self._text_bounding_box( + self.lines[cur_line_index], self.font + )[0] + # print(f"cur_line width: {cur_line_width}") + if self.align == self.ALIGN_LEFT: + x_start = original_xposition # starting x position (left margin) + if self.align == self.ALIGN_CENTER: + unused_space = self._width - cur_line_width + x_start = original_xposition + unused_space // 2 + if self.align == self.ALIGN_RIGHT: + unused_space = self._width - cur_line_width + x_start = original_xposition + unused_space - self._padding_right + xposition = x_start + + yposition = yposition + self._line_spacing_ypixels( + font, line_spacing + ) # Add a newline + + else: + my_glyph = font.get_glyph(ord(char)) + + if my_glyph is None: # Error checking: no glyph found + print("Glyph not found: {}".format(repr(char))) + else: + if xposition == x_start: + if left is None: + left = 0 + else: + left = min(left, my_glyph.dx) + + right = max( + right, + xposition + my_glyph.shift_x, + xposition + my_glyph.width + my_glyph.dx, + ) + if yposition == y_start: # first line, find the Ascender height + top = min(top, -my_glyph.height - my_glyph.dy) + bottom = max(bottom, yposition - my_glyph.dy) + + glyph_offset_x = ( + my_glyph.tile_index * my_glyph.width + ) # for type BuiltinFont, this creates the x-offset in the glyph bitmap. + # for BDF loaded fonts, this should equal 0 + + y_blit_target = yposition - my_glyph.height - my_glyph.dy + + # Clip glyph y-direction if outside the font ascent/descent metrics. + # Note: bitmap.blit will automatically clip the bottom of the glyph. + y_clip = 0 + if y_blit_target < 0: + y_clip = -y_blit_target # clip this amount from top of bitmap + y_blit_target = 0 # draw the clipped bitmap at y=0 + if self._verbose: + print( + 'Warning: Glyph clipped, exceeds Ascent property: "{}"'.format( + char + ) + ) + + if (y_blit_target + my_glyph.height) > bitmap.height: + if self._verbose: + print( + 'Warning: Glyph clipped, exceeds descent property: "{}"'.format( + char + ) + ) + try: + self._blit( + bitmap, + max(xposition + my_glyph.dx, 0), + y_blit_target, + my_glyph.bitmap, + x_1=glyph_offset_x, + y_1=y_clip, + x_2=glyph_offset_x + my_glyph.width, + y_2=my_glyph.height, + skip_index=skip_index, # do not copy over any 0 background pixels + ) + except ValueError: + # ignore index out of bounds error + break + + xposition = xposition + my_glyph.shift_x + + # bounding_box + return left, top, right - left, bottom - top + + def _reset_text( + self, + font: Optional[FontProtocol] = None, + text: Optional[str] = None, + line_spacing: Optional[float] = None, + scale: Optional[int] = None, + ) -> None: + # pylint: disable=too-many-branches, too-many-statements, too-many-locals + + # Store all the instance variables + if font is not None: + self._font = font + if line_spacing is not None: + self._line_spacing = line_spacing + + # if text is not provided as a parameter (text is None), use the previous value. + if text is None: + text = self._text + + self._text = self._replace_tabs(text) + print(f"inside reset_text text: {text}") + + # Check for empty string + if (text == "") or ( + text is None + ): # If empty string, just create a zero-sized bounding box and that's it. + self._bounding_box = ( + 0, + 0, + 0, # zero width with text == "" + 0, # zero height with text == "" + ) + # Clear out any items in the self._local_group Group, in case this is an + # update to the bitmap_label + for _ in self._local_group: + self._local_group.pop(0) + + # Free the bitmap and tilegrid since they are removed + self._bitmap = None + self._tilegrid = None + + else: # The text string is not empty, so create the Bitmap and TileGrid and + # append to the self Group + + # Calculate the text bounding box + + # Calculate both "tight" and "loose" bounding box dimensions to match label for + # anchor_position calculations + ( + box_x, + tight_box_y, + x_offset, + tight_y_offset, + loose_box_y, + loose_y_offset, + ) = self._text_bounding_box( + text, + self._font, + ) # calculate the box size for a tight and loose backgrounds + + if self._background_tight: + box_y = tight_box_y + y_offset = tight_y_offset + self._padding_left = 0 + self._padding_right = 0 + self._padding_top = 0 + self._padding_bottom = 0 + + else: # calculate the box size for a loose background + box_y = loose_box_y + y_offset = loose_y_offset + + # Calculate the background size including padding + tight_box_x = box_x + box_x = box_x + self._padding_left + self._padding_right + box_y = box_y + self._padding_top + self._padding_bottom + + if self.dynamic_height: + print(f"dynamic height, box_y: {box_y}") + self._height = box_y + + # Create the Bitmap unless it can be reused + new_bitmap = None + if ( + self._bitmap is None + or self._bitmap.width != self._width + or self._bitmap.height != self._height + ): + new_bitmap = displayio.Bitmap( + self._width, self._height, len(self._palette) + ) + self._bitmap = new_bitmap + else: + self._bitmap.fill(0) + + # Place the text into the Bitmap + self._place_text( + self._bitmap, + text, + self._font, + self._padding_left - x_offset, + self._padding_top + y_offset, + ) + + if self._base_alignment: + label_position_yoffset = 0 + else: + label_position_yoffset = self._ascent // 2 + + # Create the TileGrid if not created bitmap unchanged + if self._tilegrid is None or new_bitmap: + self._tilegrid = displayio.TileGrid( + self._bitmap, + pixel_shader=self._palette, + width=1, + height=1, + tile_width=self._width, + tile_height=self._height, + default_tile=0, + x=-self._padding_left + x_offset, + y=label_position_yoffset - y_offset - self._padding_top, + ) + # Clear out any items in the local_group Group, in case this is an update to + # the bitmap_label + for _ in self._local_group: + self._local_group.pop(0) + self._local_group.append( + self._tilegrid + ) # add the bitmap's tilegrid to the group + + self._bounding_box = ( + self._tilegrid.x + self._padding_left, + self._tilegrid.y + self._padding_top, + tight_box_x, + tight_box_y, + ) + print(f"end of reset_text bounding box: {self._bounding_box}") + + if ( + scale is not None + ): # Scale will be defined in local_group (Note: self should have scale=1) + self.scale = scale # call the setter + + # set the anchored_position with setter after bitmap is created, sets the + # x,y positions of the label + self.anchored_position = self._anchored_position + + @property + def height(self) -> int: + """The height of the label determined from the bounding box.""" + return self._height + + @property + def width(self) -> int: + """The width of the label determined from the bounding box.""" + return self._width + + @width.setter + def width(self, width: int) -> None: + self._width = width + self.text = self._text + + @height.setter + def height(self, height: int) -> None: + if height != TextBox.DYNAMIC_HEIGHT: + self._height = height + self.dynamic_height = False + else: + self.dynamic_height = True + self.text = self._text + + @bitmap_label.Label.text.setter + def text(self, text: str) -> None: + self.lines = wrap_text_to_pixels( + text, self._width - self._padding_left - self._padding_right, self.font + ) + self._text = self._replace_tabs(text) + self._original_text = self._text + self._text = "\n".join(self.lines) + + self._set_text(self._text, self.scale) + + @property + def align(self): + """Alignment of the text within the TextBox""" + return self._align + + @align.setter + def align(self, align: int) -> None: + if align not in (TextBox.ALIGN_LEFT, TextBox.ALIGN_CENTER, TextBox.ALIGN_RIGHT): + raise ValueError( + "Align must be one of: ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT" + ) + self._align = align diff --git a/src/lib/adafruit_ds3231.mpy b/src/lib/adafruit_ds3231.mpy index 2767c0f9db0ce83e2d3ce1f82db6b912f7d615f4..215d53d28bcefae1fc179d71727e42e86fda0e11 100644 GIT binary patch literal 1225 zcmZXSTW{k;6vxMDnu{@w-Gm{e>DKEyVK=l1b-iK5f|PB71QnO0ELtLgCeGMxjM6x= zC%cNogA*;g6-X4s6HmPCGs?d4ZTJ|xa>h-nA{;sMJLml8T*lK(pq=*w-LkDyf8sJ? z2ZzStL3KPunaxj(X3KfvQU`r-9q&&9Vn@!ZYtSX44bFX+A?;e|J7;dd93RQcSbz!< zQJYvp%Rfiz%Cs%!F!$U+5}S_Q(HTlWWh6o=*F!j9{)93T2~t-wqiR--10=P+<jo@S z<na;IE*~{pElBkUQk|@--vQ@CUhY3$Jg@>1IMf^20g|Haum<kg$gxpz)jE0V+H8O} zhe4m5x_-c*(igmv6gZ5JwwvQ4Tpb6JugB0<L{^!QZo7fiA3DSfs5=~5%=1xh=mm_7 zy{C`~Gv|El_!gV^4$708*8Nk@r_N0mfxe$OKAg@7i3E;m3JdokOs%2YhcrBtCpWFn zFd@rLgdmwfZ(|Rrwtr8GzQ+MluU6uYU^ss=W~i|A1PnTZ6N*e@DK!2kG{{mYk9`lu zVN*2ECg6<F{G;^`2aJt__iME?mklQUD)r85tJ_k0xVnE$*Qam~+fz31M&#-PS78Ub z_<m0pdX2EM2hXQR<-M<(x~+zCtRif!6=OKo4dpoSdNGdUz=?<xI02lDIEj<MsfbfJ z)%{ovJ6ma-4rLL1uN6fsLR<oVy(nR+dn`Uy-u}DQ>>dl>${YC3F2Z*o8A#5UF`Vg8 z;qsgI=b4LUSgJHCjl1yU>puVQwI_|ru|4R0*BkVnr7uLKg5Qxdcu$Gv<jWWJ7~bLZ zGpAchDyM{X0dFhG+~x~_{U{bftQzS#)p+nHIoqz!1^jL#n1TBs5^yq<L@synOE{C? zIH}L$xXkSze|;|Fx%_6EJD;!N+aS+h&OyE#rT76zHxMo;hlXGZxTqAfZyB+O4vjTf zRU?iyh^_;dloCV}oH{f)Q#G+*-U}}`W3RMuV8#~ttq%P<Ef&r2x5gs7O=tHD8%47o z{;un<7WwV=B7Y0soemu+qH2bJfavzKf9PCRa+(>wRJD?>m5#u>+k9}c$m<;S=7U96 grM<LNGQ&T6y+yW6XKDegdiWPlTVCX}I_h@lzo&v#EdT%j literal 1229 zcmZuwU2hsk6rBaHU2Gifz-mKrs!%&PQEKC`LG(k3N(>Keq^g)&jV!gAU6!$#2-wxm z;0X1hW2?@$>{fm1Q>CiU6?yBw>CdS8);qh4i>iRcFz4QL=H7E>ntJMb>1?pIg_dr( zJ@+siGeLU%u6?&!2_{ZM-o68$cJtPqZ(5tQgrt%C+-|n$G4tqcZSCGAr#t4P7r_-~ zd&%ExX-hkh#ubHhnE=B2B_X6oj0+kjIYyGhAxTfLVuX1;;tt$!I2S0*0zFqy!G@}o znDp5PNbap=#Ux;(BTJLUB9sf!WvGw&iLS*(IQ9fdnD3}H3O!s!k1*Q&tF<5x9%|@Y zBWqV`mFmZqMaVG?L19G52C@u7LK^sl?Aw}=ZGENes--M#&(k!1zb{0<KiSziVxm9p zRy=>WGwXWi!OY_(3qA0<JrR8njU_6;cp=(fYwy2q%JOz&yRijdwN}-yv;SRV`wRNm z89I-hv&_q7gwa(Cs!3a@h~G1pJCAmmxOi4iS?0j!f&~5(8e-kl&lPr~$GF=aP~vls z4F<08Lm+MLHd`%laUVSBBqNb^&03#X3!TP;!e#RoBtKBIn9qI&+1Y49Rg6u1F5#?F zyeDh~6As6LP*q&0NHK|U;fgWGtLEw}!|J=7aO(M^9&guAXL7cRo}XOG+5eMMkyy?q ziQI=~HZp-f|52V8S<a3|wAZPhE?5QPxdYY>T>(SHOXkwcpPm}mX1$RotS9=XMsC2n z<dB72w2hTc{b?F_f(`=;ym3fz9!&mHnS2UoFB7;_6X@*f`B}7u299lHA&iY6^noNM zwpP<DW9B8+@>xy=cw(mjPh;Iq!)nbPVJ}!89r~e1=g%cdIlg~D(G_LB8!f+LFDkt~ z4=p+CR}g;7Tb36n_ut!nvo8C!)U;r#mlVHSAS3i*5rBIcBcG8!H_$ZyX#@tvoUY4X z%4PIsTF~3m!dvbVpmVn_7DK<au<>q2{;H(PKl~kuoz!q~O_#ryHg1+TZlYZzr}>TM tKi_wzh3nBqgUvL*5+ye>xwVY^!*M{M8X->6fLi{HOPQLhb#yR0>|cu8XjlLM diff --git a/src/lib/adafruit_imageload/__init__.py b/src/lib/adafruit_imageload/__init__.py index d1e6d5f..1abb630 100644 --- a/src/lib/adafruit_imageload/__init__.py +++ b/src/lib/adafruit_imageload/__init__.py @@ -12,24 +12,25 @@ * Author(s): Scott Shawcroft, Matt Land """ -# pylint: disable=import-outside-toplevel try: + from io import BufferedReader from typing import ( - Tuple, + Iterable, Iterator, - Optional, List, - Iterable, + Optional, + Tuple, Union, ) - from io import BufferedReader - from displayio import Palette, Bitmap - from .displayio_types import PaletteConstructor, BitmapConstructor + + from displayio import Bitmap, ColorConverter, Palette + + from .displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" @@ -37,8 +38,8 @@ def load( file_or_filename: Union[str, BufferedReader], *, bitmap: Optional[BitmapConstructor] = None, - palette: Optional[PaletteConstructor] = None -) -> Tuple[Bitmap, Optional[Palette]]: + palette: Optional[PaletteConstructor] = None, +) -> Tuple[Bitmap, Optional[Union[Palette, ColorConverter]]]: """Load pixel values (indices or colors) into a bitmap and colors into a palette. bitmap is the desired type. It must take width, height and color_depth in the constructor. It @@ -89,4 +90,8 @@ def load( from . import png return png.load(file, bitmap=bitmap, palette=palette) + if header.startswith(b"\xff\xd8"): + from . import jpg + + return jpg.load(file, bitmap=bitmap) raise RuntimeError("Unsupported image format") diff --git a/src/lib/adafruit_imageload/bmp/__init__.py b/src/lib/adafruit_imageload/bmp/__init__.py index 096c5ed..00487b2 100644 --- a/src/lib/adafruit_imageload/bmp/__init__.py +++ b/src/lib/adafruit_imageload/bmp/__init__.py @@ -12,17 +12,18 @@ * Author(s): Scott Shawcroft, Matt Land """ -# pylint: disable=import-outside-toplevel try: - from typing import Tuple, Optional, Set, List from io import BufferedReader - from displayio import Palette, Bitmap - from ..displayio_types import PaletteConstructor, BitmapConstructor + from typing import List, Optional, Set, Tuple, Union + + from displayio import Bitmap, ColorConverter, Palette + + from ..displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" @@ -30,11 +31,12 @@ def load( file: BufferedReader, *, bitmap: Optional[BitmapConstructor] = None, - palette: Optional[PaletteConstructor] = None -) -> Tuple[Optional[Bitmap], Optional[Palette]]: + palette: Optional[PaletteConstructor] = None, +) -> Tuple[Optional[Bitmap], Optional[Union[Palette, ColorConverter]]]: """Loads a bmp image from the open ``file``. - Returns tuple of bitmap object and palette object. + Returns tuple of `displayio.Bitmap` object and + `displayio.Palette` object, or `displayio.ColorConverter` object. :param io.BufferedReader file: Open file handle or compatible (like `io.BytesIO`) with the data of a BMP file. diff --git a/src/lib/adafruit_imageload/bmp/indexed.py b/src/lib/adafruit_imageload/bmp/indexed.py index 7789924..044cd51 100644 --- a/src/lib/adafruit_imageload/bmp/indexed.py +++ b/src/lib/adafruit_imageload/bmp/indexed.py @@ -13,28 +13,29 @@ """ - import sys try: - from typing import Tuple, Optional from io import BufferedReader - from displayio import Palette, Bitmap - from ..displayio_types import PaletteConstructor, BitmapConstructor + from typing import Optional, Tuple + + from displayio import Bitmap, Palette + + from ..displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass try: from bitmaptools import readinto as _bitmap_readinto except ImportError: - _bitmap_readinto = None # pylint: disable=invalid-name # type: Callable + _bitmap_readinto = None -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" -def load( +def load( # noqa: PLR0913, PLR0912, Too many arguments in function definition, Too many branches file: BufferedReader, width: int, height: int, @@ -58,7 +59,6 @@ def load( :param BitmapConstructor bitmap: a function that returns a displayio.Bitmap :param PaletteConstructor palette: a function that returns a displayio.Palette """ - # pylint: disable=too-many-arguments,too-many-locals,too-many-branches palette_obj = None if palette: palette_obj = palette(colors) @@ -78,7 +78,6 @@ def load( minimum_color_depth *= 2 if sys.maxsize > 1073741823: - # pylint: disable=import-outside-toplevel, relative-beyond-top-level from .negative_height_check import negative_height_check # convert unsigned int to signed int when height is negative @@ -121,9 +120,7 @@ def load( for x in range(width): i = x // pixels_per_byte - pixel = ( - chunk[i] >> (8 - color_depth * (x % pixels_per_byte + 1)) - ) & mask + pixel = (chunk[i] >> (8 - color_depth * (x % pixels_per_byte + 1))) & mask bitmap_obj[offset + x] = pixel elif compression in (1, 2): decode_rle( @@ -137,7 +134,7 @@ def load( return bitmap_obj, palette_obj -def decode_rle( +def decode_rle( # noqa: PLR0912 Too many branches bitmap: Bitmap, file: BufferedReader, compression: int, @@ -145,7 +142,6 @@ def decode_rle( width: int, ) -> None: """Helper to decode RLE images""" - # pylint: disable=too-many-locals,too-many-nested-blocks,too-many-branches # RLE algorithm, either 8-bit (1) or 4-bit (2) # diff --git a/src/lib/adafruit_imageload/bmp/truecolor.py b/src/lib/adafruit_imageload/bmp/truecolor.py index 0d4af56..8f17b79 100644 --- a/src/lib/adafruit_imageload/bmp/truecolor.py +++ b/src/lib/adafruit_imageload/bmp/truecolor.py @@ -16,15 +16,16 @@ import sys try: - from typing import Union, Optional, Tuple from io import BufferedReader + from typing import Optional, Tuple, Union + from ..displayio_types import BitmapConstructor except ImportError: pass -from displayio import ColorConverter, Colorspace, Bitmap +from displayio import Bitmap, ColorConverter, Colorspace -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" bitfield_colorspaces = ( @@ -52,7 +53,7 @@ def bitfield_format(bitfield_mask): return None -def load( +def load( # noqa: PLR0912, PLR0913, Too many branches, Too many arguments in function definition file: BufferedReader, width: int, height: int, @@ -73,7 +74,6 @@ def load( :param dict bitfield_masks: The bitfield masks for each color if using bitfield compression :param BitmapConstructor bitmap: a function that returns a displayio.Bitmap """ - # pylint: disable=too-many-arguments,too-many-locals,too-many-branches converter_obj = None bitmap_obj = None if bitmap: @@ -90,12 +90,11 @@ def load( input_colorspace = Colorspace.RGB555 converter_obj = ColorConverter(input_colorspace=input_colorspace) if sys.maxsize > 1073741823: - # pylint: disable=import-outside-toplevel, relative-beyond-top-level from .negative_height_check import negative_height_check # convert unsigned int to signed int when height is negative height = negative_height_check(height) - bitmap_obj = Bitmap(width, abs(height), 65535) + bitmap_obj = bitmap(width, abs(height), 65535) file.seek(data_start) line_size = width * (color_depth // 8) # Set the seek direction based on whether the height value is negative or positive @@ -119,19 +118,14 @@ def load( color = 0 for byte in range(bytes_per_pixel): color |= chunk[i + byte] << (8 * byte) - mask = ( - bitfield_masks["red"] - | bitfield_masks["green"] - | bitfield_masks["blue"] - ) + mask = bitfield_masks["red"] | bitfield_masks["green"] | bitfield_masks["blue"] if color_depth in (24, 32): mask = mask >> 8 pixel = color & mask + elif color_depth == 16: + pixel = chunk[i] | chunk[i + 1] << 8 else: - if color_depth == 16: - pixel = chunk[i] | chunk[i + 1] << 8 - else: - pixel = chunk[i + 2] << 16 | chunk[i + 1] << 8 | chunk[i] + pixel = chunk[i + 2] << 16 | chunk[i + 1] << 8 | chunk[i] bitmap_obj[offset + x] = converter_obj.convert(pixel) return bitmap_obj, ColorConverter(input_colorspace=Colorspace.RGB565) diff --git a/src/lib/adafruit_imageload/displayio_types.py b/src/lib/adafruit_imageload/displayio_types.py index 5a15243..bed5efe 100644 --- a/src/lib/adafruit_imageload/displayio_types.py +++ b/src/lib/adafruit_imageload/displayio_types.py @@ -13,14 +13,16 @@ * Author(s): Matt Land """ + try: from typing import Callable - from displayio import Palette, Bitmap + + from displayio import Bitmap, Palette PaletteConstructor = Callable[[int], Palette] BitmapConstructor = Callable[[int, int, int], Bitmap] except ImportError: pass -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/gif.py b/src/lib/adafruit_imageload/gif.py index f9a07c2..c3099fe 100644 --- a/src/lib/adafruit_imageload/gif.py +++ b/src/lib/adafruit_imageload/gif.py @@ -17,22 +17,21 @@ import struct try: - from typing import Tuple, Iterator, Optional, List from io import BufferedReader - from displayio import Palette, Bitmap - from .displayio_types import PaletteConstructor, BitmapConstructor + from typing import Iterator, List, Optional, Tuple + + from displayio import Bitmap, Palette + + from .displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" def load( - file: BufferedReader, - *, - bitmap: BitmapConstructor, - palette: Optional[PaletteConstructor] = None + file: BufferedReader, *, bitmap: BitmapConstructor, palette: Optional[PaletteConstructor] = None ) -> Tuple[Bitmap, Optional[Palette]]: """Loads a GIF image from the open ``file``. @@ -47,9 +46,7 @@ def load( header = file.read(6) if header not in {b"GIF87a", b"GIF89a"}: raise ValueError("Not a GIF file") - width, height, flags, _, _ = struct.unpack( # pylint: disable=no-member - "<HHBBB", file.read(7) - ) + width, height, flags, _, _ = struct.unpack("<HHBBB", file.read(7)) if (flags & 0x80) != 0: if not palette: raise RuntimeError("palette argument required") @@ -78,9 +75,7 @@ def load( def _read_frame(file: BufferedReader, bitmap: Bitmap) -> None: """Read a single frame and apply it to the bitmap.""" - ddx, ddy, width, _, flags = struct.unpack( # pylint: disable=no-member - "<HHHHB", file.read(9) - ) + ddx, ddy, width, _, flags = struct.unpack("<HHHHB", file.read(9)) if (flags & 0x40) != 0: raise NotImplementedError("Interlacing not supported") if (flags & 0x80) != 0: @@ -145,10 +140,7 @@ def decode(self, code: int) -> bytes: value = self.last + self.last[0:1] if self.last: self.codes.append(self.last + value[0:1]) - if ( - len(self.codes) + self.end_code + 1 >= 1 << self.code_len - and self.code_len < 12 - ): + if len(self.codes) + self.end_code + 1 >= 1 << self.code_len and self.code_len < 12: self.code_len += 1 self.last = value return value @@ -159,7 +151,7 @@ def lzw_decode(data: Iterator[int], code_size: int) -> Iterator[bytes]: dictionary = LZWDict(code_size) bit = 0 try: - byte = next(data) # pylint: disable=stop-iteration-return + byte = next(data) try: while True: code = 0 @@ -168,10 +160,10 @@ def lzw_decode(data: Iterator[int], code_size: int) -> Iterator[bytes]: bit += 1 if bit >= 8: bit = 0 - byte = next(data) # pylint: disable=stop-iteration-return + byte = next(data) yield dictionary.decode(code) except EndOfData: while True: - next(data) # pylint: disable=stop-iteration-return + next(data) except StopIteration: pass diff --git a/src/lib/adafruit_imageload/jpg.py b/src/lib/adafruit_imageload/jpg.py new file mode 100644 index 0000000..0f5d07d --- /dev/null +++ b/src/lib/adafruit_imageload/jpg.py @@ -0,0 +1,57 @@ +# SPDX-FileCopyrightText: 2024 Channing Ramos +# +# SPDX-License-Identifier: MIT + +""" +`adafruit_imageload.jpg` +==================================================== + +Load a JPG into a bitmap by calling the jpegio class. + +* Author(s): Channing Ramos + +""" + +# A separate try for jpegio. Not every board supports it and this import may fail. +# If that happens an ImportError with a proper message needs to be raised +try: + from jpegio import JpegDecoder +except ImportError: + print("jpegio not supported on this board.") + +try: + from io import BufferedReader + from typing import Optional, Tuple + + from .displayio_types import BitmapConstructor +except ImportError: + pass + +from displayio import Bitmap, ColorConverter, Colorspace + +__version__ = "1.23.5" +__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" + + +def load( + file: BufferedReader, + *, + bitmap: BitmapConstructor, +) -> Tuple[Bitmap, Optional[ColorConverter]]: + """ + Loads a JPG image from the open ''file''. + The JPG must be a Baseline JPG, Progressive and Lossless JPG formats are not supported. + + Returns tuple of bitmap object and ColorConverter object. + + :param io.BufferedReader file: Open file handle or compatible (like 'io.BytesIO') + :param object bitmap: Type to store bitmap data. + Must have API similar to 'displayio.Bitmap'. Will be skipped if None. + Will be skipped if None. + """ + decoder = JpegDecoder() + width, height = decoder.open(file) + bitmap_obj = bitmap(width, height, 65535) + decoder.decode(bitmap_obj) + + return bitmap_obj, ColorConverter(input_colorspace=Colorspace.RGB565_SWAPPED) diff --git a/src/lib/adafruit_imageload/png.py b/src/lib/adafruit_imageload/png.py index 587bf9d..55f6226 100644 --- a/src/lib/adafruit_imageload/png.py +++ b/src/lib/adafruit_imageload/png.py @@ -1,5 +1,6 @@ # SPDX-FileCopyrightText: 2022 Radomir Dopieralski # SPDX-FileCopyrightText: 2023 Matt Land +# SPDX-FileCopyrightText: 2024 Channing Ramos # # SPDX-License-Identifier: MIT @@ -10,30 +11,29 @@ Load pixel values (indices or colors) into a bitmap and colors into a palette from a PNG file. -* Author(s): Radomir Dopieralski, Matt Land +* Author(s): Radomir Dopieralski, Matt Land, Channing Ramos """ try: from io import BufferedReader from typing import Optional, Tuple - from displayio import Palette, Bitmap - from .displayio_types import PaletteConstructor, BitmapConstructor + + from displayio import Bitmap, Palette + + from .displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass import struct import zlib -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" -def load( - file: BufferedReader, - *, - bitmap: BitmapConstructor, - palette: Optional[PaletteConstructor] = None +def load( # noqa: PLR0912, PLR0915, Too many branches, Too many statements + file: BufferedReader, *, bitmap: BitmapConstructor, palette: Optional[PaletteConstructor] = None ) -> Tuple[Bitmap, Optional[Palette]]: """ Loads a PNG image from the open ``file``. @@ -48,7 +48,6 @@ def load( :param object palette: Type to store the palette. Must have API similar to `displayio.Palette`. Will be skipped if None. """ - # pylint: disable=too-many-locals,too-many-branches header = file.read(8) if header != b"\x89PNG\r\n\x1a\n": raise ValueError("Not a PNG file") @@ -86,6 +85,14 @@ def load( pal = palette(pal_size) for i in range(pal_size): pal[i] = file.read(3) + elif chunk == b"tRNS": + if size > len(pal): + raise ValueError("More transparency entries than palette entries") + trns_data = file.read(size) + for i in range(len(trns_data)): + if trns_data[i] == 0: + pal.make_transparent(i) + del trns_data elif chunk == b"IDAT": data.extend(file.read(size)) elif chunk == b"IEND": @@ -94,15 +101,84 @@ def load( file.seek(size, 1) # skip unknown chunks file.seek(4, 1) # skip CRC data_bytes = zlib.decompress(data) - bmp = bitmap(width, height, 1 << depth) - scanline = (width * depth + 7) // 8 - mem = memoryview(bmp) + unit = (1, 0, 3, 1, 2, 0, 4)[mode] + scanline = (width * depth * unit + 7) // 8 + if mode == 3: # indexed + bmp = bitmap(width, height, 1 << depth) + pixels_per_byte = 8 // depth + src = 1 + src_b = 1 + pixmask = (1 << depth) - 1 + for y in range(height): + for x in range(0, width, pixels_per_byte): + byte = data_bytes[src_b] + for pixel in range(pixels_per_byte): + bmp[x + pixel, y] = (byte >> ((pixels_per_byte - pixel - 1) * depth)) & pixmask + src_b += 1 + src += scanline + 1 + src_b = src + return bmp, pal + # RGB, RGBA or Grayscale + import displayio + + if depth != 8: + raise ValueError("Must be 8bit depth.") + pal = displayio.ColorConverter(input_colorspace=displayio.Colorspace.RGB888) + bmp = bitmap(width, height, 65536) + prev = bytearray(scanline) + line = bytearray(scanline) for y in range(height): - dst = y * scanline - src = y * (scanline + 1) + 1 - filter_ = data_bytes[src - 1] + src = y * (scanline + 1) + filter_ = data_bytes[src] + src += 1 if filter_ == 0: - mem[dst : dst + scanline] = data_bytes[src : src + scanline] + line[0:scanline] = data_bytes[src : src + scanline] + elif filter_ == 1: # sub + for i in range(scanline): + a = line[i - unit] if i >= unit else 0 + line[i] = (data_bytes[src] + a) & 0xFF + src += 1 + elif filter_ == 2: # up + for i in range(scanline): + b = prev[i] + line[i] = (data_bytes[src] + b) & 0xFF + src += 1 + elif filter_ == 3: # average + for i in range(scanline): + a = line[i - unit] if i >= unit else 0 + b = prev[i] + line[i] = (data_bytes[src] + ((a + b) >> 1)) & 0xFF + src += 1 + elif filter_ == 4: # paeth + for i in range(scanline): + a = line[i - unit] if i >= unit else 0 + b = prev[i] + c = prev[i - unit] if i >= unit else 0 + p = a + b - c + pa = abs(p - a) + pb = abs(p - b) + pc = abs(p - c) + if pa <= pb and pa <= pc: + p = a + elif pb <= pc: + p = b + else: + p = c + line[i] = (data_bytes[src] + p) & 0xFF + src += 1 + else: + raise ValueError("Wrong filter.") + prev, line = line, prev + if mode in (0, 4): # grayscale + for x in range(width): + c = line[x * unit] + bmp[x, y] = pal.convert((c << 16) | (c << 8) | c) + elif mode in {2, 6}: # rgb + for x in range(width): + bmp[x, y] = pal.convert( + (line[x * unit + 0] << 16) | (line[x * unit + 1] << 8) | line[x * unit + 2] + ) else: - raise NotImplementedError("Filters not supported") + raise ValueError("Unsupported color mode.") + pal = displayio.ColorConverter(input_colorspace=displayio.Colorspace.RGB565) return bmp, pal diff --git a/src/lib/adafruit_imageload/pnm/__init__.py b/src/lib/adafruit_imageload/pnm/__init__.py index d78e9aa..971da14 100644 --- a/src/lib/adafruit_imageload/pnm/__init__.py +++ b/src/lib/adafruit_imageload/pnm/__init__.py @@ -14,34 +14,35 @@ * Author(s): Matt Land, Brooke Storm, Sam McGahan """ -# pylint: disable=import-outside-toplevel try: + from io import BufferedReader from typing import ( - Tuple, + Callable, + Iterable, Iterator, - Optional, List, - Iterable, + Optional, + Tuple, Union, - Callable, ) - from io import BufferedReader - from displayio import Palette, Bitmap - from ..displayio_types import PaletteConstructor, BitmapConstructor + + from displayio import Bitmap, Palette + + from ..displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" -def load( +def load( # noqa: PLR0912 Too many branches file: BufferedReader, header: bytes, *, bitmap: Optional[BitmapConstructor] = None, - palette: Optional[PaletteConstructor] = None + palette: Optional[PaletteConstructor] = None, ) -> Tuple[Optional[Bitmap], Optional[Palette]]: """ Scan for netpbm format info, skip over comments, and delegate to a submodule @@ -50,7 +51,6 @@ def load( All other formats have three: width, height, and max color value. This load function will move the file stream pointer to the start of data in all cases. """ - # pylint: disable=too-many-branches magic_number = header[:2] file.seek(2) pnm_header = [] # type: List[int] @@ -100,7 +100,7 @@ def load( palette_obj = None if palette: palette_obj = palette(1) - palette_obj[0] = b"\xFF\xFF\xFF" + palette_obj[0] = b"\xff\xff\xff" if magic_number.startswith(b"P1"): from . import pbm_ascii @@ -124,7 +124,8 @@ def load( next_byte = file.read(1) if next_byte == b"": - raise RuntimeError("Unsupported image format {!r}".format(magic_number)) + # mpy-cross does not support !r in f-string substitution, so ignore ruff rule + raise RuntimeError("Unsupported image format {!r}".format(magic_number)) # noqa: UP032, f-string if next_byte == b"#": # comment found, seek until a newline or EOF is found while file.read(1) not in [b"", b"\n"]: # EOF or NL pass diff --git a/src/lib/adafruit_imageload/pnm/pbm_ascii.py b/src/lib/adafruit_imageload/pnm/pbm_ascii.py index e777f1d..72eefd4 100644 --- a/src/lib/adafruit_imageload/pnm/pbm_ascii.py +++ b/src/lib/adafruit_imageload/pnm/pbm_ascii.py @@ -17,13 +17,14 @@ """ try: - from typing import Tuple, Optional from io import BufferedReader - from displayio import Palette, Bitmap + from typing import Optional, Tuple + + from displayio import Bitmap, Palette except ImportError: pass -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/pnm/pbm_binary.py b/src/lib/adafruit_imageload/pnm/pbm_binary.py index 18beec4..1d52a8e 100644 --- a/src/lib/adafruit_imageload/pnm/pbm_binary.py +++ b/src/lib/adafruit_imageload/pnm/pbm_binary.py @@ -15,14 +15,16 @@ * Author(s): Matt Land, Brooke Storm, Sam McGahan """ + try: - from typing import Tuple, Optional, Iterator from io import BufferedReader - from displayio import Palette, Bitmap + from typing import Iterator, Optional, Tuple + + from displayio import Bitmap, Palette except ImportError: pass -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/pnm/pgm/__init__.py b/src/lib/adafruit_imageload/pnm/pgm/__init__.py index 3ed43f7..8acefb5 100644 --- a/src/lib/adafruit_imageload/pnm/pgm/__init__.py +++ b/src/lib/adafruit_imageload/pnm/pgm/__init__.py @@ -14,12 +14,14 @@ * Author(s): Matt Land, Brooke Storm, Sam McGahan """ -# pylint: disable=import-outside-toplevel + try: - from typing import Tuple, Optional, Set, List from io import BufferedReader - from displayio import Palette, Bitmap - from ...displayio_types import PaletteConstructor, BitmapConstructor + from typing import List, Optional, Set, Tuple + + from displayio import Bitmap, Palette + + from ...displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass @@ -30,7 +32,7 @@ def load( header: List[int], *, bitmap: Optional[BitmapConstructor] = None, - palette: Optional[PaletteConstructor] = None + palette: Optional[PaletteConstructor] = None, ) -> Tuple[Optional[Bitmap], Optional[Palette]]: """ Perform the load of Netpbm greyscale images (P2, P5) diff --git a/src/lib/adafruit_imageload/pnm/pgm/ascii.py b/src/lib/adafruit_imageload/pnm/pgm/ascii.py index 097665f..7c597ca 100644 --- a/src/lib/adafruit_imageload/pnm/pgm/ascii.py +++ b/src/lib/adafruit_imageload/pnm/pgm/ascii.py @@ -14,11 +14,14 @@ * Author(s): Matt Land, Brooke Storm, Sam McGahan """ + try: - from typing import Tuple, Set, Optional from io import BufferedReader - from displayio import Palette, Bitmap - from ...displayio_types import PaletteConstructor, BitmapConstructor + from typing import Optional, Set, Tuple + + from displayio import Bitmap, Palette + + from ...displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass @@ -66,9 +69,7 @@ def load( return bitmap_obj, palette_obj -def build_palette( - palette_class: PaletteConstructor, palette_colors: Set[int] -) -> Palette: # pylint: disable=duplicate-code +def build_palette(palette_class: PaletteConstructor, palette_colors: Set[int]) -> Palette: """ construct the Palette, and populate it with the set of palette_colors """ diff --git a/src/lib/adafruit_imageload/pnm/pgm/binary.py b/src/lib/adafruit_imageload/pnm/pgm/binary.py index 7e8c56b..700b563 100644 --- a/src/lib/adafruit_imageload/pnm/pgm/binary.py +++ b/src/lib/adafruit_imageload/pnm/pgm/binary.py @@ -14,11 +14,14 @@ * Author(s): Matt Land, Brooke Storm, Sam McGahan """ + try: - from typing import Tuple, Optional, Set from io import BufferedReader - from displayio import Palette, Bitmap - from ...displayio_types import PaletteConstructor, BitmapConstructor + from typing import Optional, Set, Tuple + + from displayio import Bitmap, Palette + + from ...displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass @@ -54,9 +57,7 @@ def load( return bitmap_obj, palette_obj -def build_palette( - palette_class: PaletteConstructor, palette_colors: Set[int] -) -> Palette: +def build_palette(palette_class: PaletteConstructor, palette_colors: Set[int]) -> Palette: """ construct the Palette, and populate it with the set of palette_colors """ diff --git a/src/lib/adafruit_imageload/pnm/ppm_ascii.py b/src/lib/adafruit_imageload/pnm/ppm_ascii.py index 2ba7e9f..ac8ea8a 100644 --- a/src/lib/adafruit_imageload/pnm/ppm_ascii.py +++ b/src/lib/adafruit_imageload/pnm/ppm_ascii.py @@ -16,20 +16,22 @@ """ -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" try: + from io import BufferedReader from typing import ( - Tuple, Iterator, - Optional, List, + Optional, Set, + Tuple, ) - from io import BufferedReader - from displayio import Palette, Bitmap - from ..displayio_types import PaletteConstructor, BitmapConstructor + + from displayio import Bitmap, Palette + + from ..displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass diff --git a/src/lib/adafruit_imageload/pnm/ppm_binary.py b/src/lib/adafruit_imageload/pnm/ppm_binary.py index 44af03b..cada568 100644 --- a/src/lib/adafruit_imageload/pnm/ppm_binary.py +++ b/src/lib/adafruit_imageload/pnm/ppm_binary.py @@ -15,15 +15,18 @@ * Author(s): Matt Land, Brooke Storm, Sam McGahan """ + try: - from typing import Tuple, Optional, Set from io import BufferedReader - from displayio import Palette, Bitmap - from ..displayio_types import PaletteConstructor, BitmapConstructor + from typing import Optional, Set, Tuple + + from displayio import Bitmap, Palette + + from ..displayio_types import BitmapConstructor, PaletteConstructor except ImportError: pass -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" @@ -38,7 +41,6 @@ def load( Load pixel values (indices or colors) into a bitmap and for a binary ppm, return None for pallet. """ - # pylint: disable=too-many-locals data_start = file.tell() palette_colors = set() # type: Set[Tuple[int, int, int]] diff --git a/src/lib/adafruit_imageload/tilegrid_inflator.py b/src/lib/adafruit_imageload/tilegrid_inflator.py index ee6ce21..8df1a22 100644 --- a/src/lib/adafruit_imageload/tilegrid_inflator.py +++ b/src/lib/adafruit_imageload/tilegrid_inflator.py @@ -13,20 +13,23 @@ * Author(s): Tim Cocks, Matt Land """ + import displayio + import adafruit_imageload try: - from typing import Tuple, Optional, List, Union - from displayio import Palette, Bitmap, OnDiskBitmap, TileGrid + from typing import List, Optional, Tuple, Union + + from displayio import Bitmap, OnDiskBitmap, Palette, TileGrid except ImportError: pass -__version__ = "1.20.1" +__version__ = "1.23.5" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" -def inflate_tilegrid( +def inflate_tilegrid( # noqa: PLR0913, PLR0912, Too many arguments in function definition, Too many branches bmp_path: Optional[str] = None, target_size: Tuple[int, int] = (3, 3), tile_size: Optional[List[int]] = None, @@ -48,8 +51,6 @@ def inflate_tilegrid( :param Optional[Palette] bmp_palette: Already loaded spritesheet Palette """ - # pylint: disable=too-many-arguments, too-many-locals, too-many-branches - if bmp_path is None and (bmp_obj is None and bmp_palette is None): raise AttributeError("Must pass either bmp_path or bmp_obj and bmp_palette") diff --git a/src/lib/adafruit_irremote.mpy b/src/lib/adafruit_irremote.mpy index 8bfcc8f22b3e2a8c1d6f7aba7b4ae6aa4d1784b9..4f1634a9635f3dc09084a3a11bdfc4c3184ee1ab 100644 GIT binary patch literal 2977 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 literal 3069 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 DXF$XM diff --git a/src/lib/adafruit_ntp.mpy b/src/lib/adafruit_ntp.mpy index d7a91766ec6b8005bc9bfd5acd0868bb383d6827..95130dc1f9f0aca3e0dc77ef5820dbd4088df172 100644 GIT binary patch literal 1245 zcmaJ<O;FoL6kf^3CdM(cqzE-Q#MlM`7+J9$)iCW0#D>(#@Z(^T(rIV0Wf|OJ$s?^Z zp<HB#&d^@lYi2srOOJw(^#73lH*L@Dq0?JWy+MYV-nue&NH5h$``$i%?|tukyJ;7= zc*QwTC>6?jy@H^MYC>%b^m+}X*JT8{QKhPYhQG1yNeBtyGH@;Amw?w$^gD_Ux@($_ z0FB;;TDfc}2m}mGeoH~n&eG}#oR<soh5`*m*3^;#!X8-Dv`yf{kyZhFk1Gtoc3z=W z(iOwNfLg&W1Xy@l{28iKJplh(ei&9YRYRIuk)eSKI+kMqT2<~MXl$u62*G--R6t6r zy^|2Pt{|JVqLwu*tJOX5&CJ2<!fYO}%Zuq7FmvtZ%sgPRz78>e%7Yp3G}IE(0Ie(X z9avGZ%hgp|04(cT6*vd40&jajuEA^;P<9io!P1+WT-a>6-a3-)emMy7XpM@dLI@}b zb)}|ZFNEg~^NVn0A^R$vU0O`P0=T7_^o`j(T+Y5W3t|&jsG6?T6di4WCc~acX-&I9 zG+uU93wJ@+)CNK|V=5L~ub_>3QINH2taJ3Sna&+ZS9BTQg{3XDft$d*0)_*(Cmt75 zlc`in6ubIFp_3=r9D;psG<_YTlJUvpr1WBZQrhuSJh2uu{ljyckxZmy=K4vF#H)jI zn3Qvj=<f<RIp-?n;x2^&HyS3mv5?4(=i`8KCrQqolZl-YA8_x6*QVv*ws~P^V%O)7 zaubxB6PBYOOj6y&khx8rDVmh0_#V}Rt+$u}+}Sw6@%~txOcLA>whnAZa<cQCOHX#q z-RbCA@pAVWPmkA(n>`Wyj0%xbFtcazzI}`DePHoa&f@)aJR~Lwi>K+tLFlEY__cS; zLyKo0S^PQE;yL{F<>dGI`_vRKn)7QTC^$S6OOB32E7xz1&nJxW`SI#>@J);H=l;y( zEyl;bU@^TGLrJ8$va^C&KC&3vyw$jR{q|!MyL-19f87p=zoo@h8+{%xOuxMZB=VZ@ z^*(#SVpxe-r5)^m1ism4FXALzULsfb*&z0x{rfie`WrOK4pJc;rNT|Ai7CIMlg)?! zSj@R3`TfD8(7iwY{s25Z#41|INDKKPMvCMQKRy@wxE1>8$tU#KQ9J3=whcRu4}bpb zH2(Q>@n61paP;ND(P8uW*RL#wIi=%r^1aj`JtUgj)6sHJKT%^beZObsES8r*Tc5>n ehbLLbk1=L=Pa@=I%1@1m=DTab=-mJ1$^QbB3W2-; literal 855 zcmY+B-%ry}6vuBn6=Vx^ZBr^6Ft&g{hFck<4A2A^6BZ*d83;zbY^8$+*4wmqMAXDG zU%>e2f8ak*e*FQW{tfcrt4}_d05S2+TLv0$?!(FVe9yg~b58m)-5%P+Oc2zy6_yGm zv!Y?BV<Tp4EQW0Vjft*|3hZ3KXJNCVV1XiWJ=V&qKrz1Fm=x>j5d;X=RnyXt4q*fc z41}g?AQDqTcrrf?^HXqkGCL15(^Kh*e1c}K5H(2)R8FBOYj6c)!y1gomo>anDaI63 zj$e?(M=p@knyC=9=?%O>z9IE7V%HiH2`M#@N~I*J8We+6)4TS?VI}m+7J(l$3xvfZ zfR>qV5CM$OQcZ$c4BIc6dIOobXfrH+0a2-Bskr!-30g>5RWWqCLls=?r3B#jGlq!_ z)x;YKI!Ou4QUR;3A*WEZ)hxv>NMi;<YcY3l$Xu>Y9NPBQa2WWT?A!L$&d$!Lq=qtJ z#}ON#Yut6jMp)z7t7#@?!EjhgQf|g5xF9TewjaK8O0KK&@Gt9uBeuc+VQohY!7|bj zM!Kdz3l~gGG*(xiV`y#YN=^X)Z1c4$7onY;?Rr&iZM8Ft()D=HP_%EgyI;E57YTJ_ z%Uytt^5VZ2bxQ^g#~qCw*&iG(V9&8&)#0clwK?jwAAPh*yfe4?eg5&+^v~A|3l7)8 z`)Z##oQG>1xd*e8nY<hGGgImNaBTeH$OD-km%-sK&yxk5Pu<}nGPSTvidB6HBZq5p zxG1@|XqhH*i>WH>B@>mQrn}iXVrBz;Kn9<3PoA<vyin2I=|R`ST<REgI4|R?t+*;z zX?ynbUUmO>_|3N;@4@M@BSu&+?<K~pYxJHq<w;UoCuiO-2M*VN%-%iOs}=k@al`?( anP=CKQdo0|Sr30r2IpCVb1YM5gZ=|@7!jcW diff --git a/src/lib/adafruit_register/i2c_bcd_alarm.py b/src/lib/adafruit_register/i2c_bcd_alarm.py index 292aa23..178d8e1 100644 --- a/src/lib/adafruit_register/i2c_bcd_alarm.py +++ b/src/lib/adafruit_register/i2c_bcd_alarm.py @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: MIT # pylint: disable=too-few-public-methods +# pylint: disable=too-many-branches """ `adafruit_register.i2c_bcd_alarm` @@ -12,7 +13,7 @@ * Author(s): Scott Shawcroft """ -__version__ = "1.9.17" +__version__ = "1.10.1" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" import time @@ -23,7 +24,7 @@ from circuitpython_typing.device_drivers import I2CDeviceDriver FREQUENCY_T = Literal[ - "monthly", "weekly", "daily", "hourly", "secondly", "minutely" + "monthly", "weekly", "daily", "hourly", "minutely", "secondly" ] except ImportError: pass @@ -115,6 +116,9 @@ def __get__( frequency = "minutely" seconds = _bcd2bin(self.buffer[1] & 0x7F) i = 2 + else: + frequency = "minutely" + seconds = _bcd2bin(self.buffer[i] & 0x7F) minute = 0 if (self.buffer[i] & 0x80) == 0: frequency = "hourly" @@ -169,7 +173,7 @@ def __set__( raise ValueError(error_message) frequency = FREQUENCY.index(frequency_name) - if frequency <= 1 and not self.has_seconds: + if frequency < 1 and not self.has_seconds: raise ValueError(error_message) # i is the index of the minute byte diff --git a/src/lib/adafruit_register/i2c_bcd_datetime.py b/src/lib/adafruit_register/i2c_bcd_datetime.py index d9ab4cf..0a23ffe 100644 --- a/src/lib/adafruit_register/i2c_bcd_datetime.py +++ b/src/lib/adafruit_register/i2c_bcd_datetime.py @@ -12,7 +12,7 @@ * Author(s): Scott Shawcroft """ -__version__ = "1.9.17" +__version__ = "1.10.1" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" import time diff --git a/src/lib/adafruit_register/i2c_bit.py b/src/lib/adafruit_register/i2c_bit.py index b9c926d..e518957 100644 --- a/src/lib/adafruit_register/i2c_bit.py +++ b/src/lib/adafruit_register/i2c_bit.py @@ -12,7 +12,7 @@ * Author(s): Scott Shawcroft """ -__version__ = "1.9.17" +__version__ = "1.10.1" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" try: diff --git a/src/lib/adafruit_register/i2c_bits.py b/src/lib/adafruit_register/i2c_bits.py index 7ba9eae..08bf5be 100644 --- a/src/lib/adafruit_register/i2c_bits.py +++ b/src/lib/adafruit_register/i2c_bits.py @@ -12,7 +12,7 @@ * Author(s): Scott Shawcroft """ -__version__ = "1.9.17" +__version__ = "1.10.1" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" try: diff --git a/src/lib/adafruit_register/i2c_struct.py b/src/lib/adafruit_register/i2c_struct.py index ea4e42c..a097e3c 100644 --- a/src/lib/adafruit_register/i2c_struct.py +++ b/src/lib/adafruit_register/i2c_struct.py @@ -12,7 +12,7 @@ * Author(s): Scott Shawcroft """ -__version__ = "1.9.17" +__version__ = "1.10.1" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" import struct diff --git a/src/lib/adafruit_register/i2c_struct_array.py b/src/lib/adafruit_register/i2c_struct_array.py index 8822159..65470c6 100644 --- a/src/lib/adafruit_register/i2c_struct_array.py +++ b/src/lib/adafruit_register/i2c_struct_array.py @@ -12,7 +12,7 @@ * Author(s): Scott Shawcroft """ -__version__ = "1.9.17" +__version__ = "1.10.1" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" import struct diff --git a/src/lib/adafruit_requests.mpy b/src/lib/adafruit_requests.mpy index 0af3a76356f94e76d99aefed3387c698e25afa92..c2a1cc28e66ec0892ff2b4d91388b3decc411988 100644 GIT binary patch literal 6944 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 S6>fh{Sf>d8pbB?Xh5rw4Y>r9* literal 8578 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 diff --git a/src/lib/adafruit_ticks.mpy b/src/lib/adafruit_ticks.mpy new file mode 100644 index 0000000000000000000000000000000000000000..6167b2f161ca616c28220d7ab71cab204e04c254 GIT binary patch literal 694 zcmYLEQE$>v7`-j)C<WPV$1XTXB;6hi7@9RrjEfp%NS294Vhq;BR94Dp1WIU`AwGDE z#3l33z}|h?FYrko_Y+JuV|>F)J23Yq_nhy1=iKkxTLpJgv{<Xx8oj>hXpX6Wuyfr3 zSaW&znA^#b1E5#c+BS&U{jSkFF>R{{SjTJ|AknrumSc5HUF+CDSTZ2^rdquYVm_>! zjm84E4BG}s(@u<@ZCV{o15nd?M%N<f`JpQb{v`81H??Kx{0lAip9A+1=Vb$~ZnT^l z&?6q*0sbok=3&!uy7sOl9h*+Gf0Wa$wzSw*da_u1&+O@B{g(r$Nrv$<a>M|bxQEkb z$02LiT4{?6+-O-J!ME)n^e**2jbr8QQBst$r59fXvHbLuzgIpJM!^w_A)TR;ffS8s z6|SILTL4A(qZl%zx|(7TqaGYp`86J9=*!|ytl~;Ch=M%N2O(2Y0#zgwOEN%AVXz;^ zkR`5Qibd-xzpemPrVw+G_UwEt6SyqCQZWp9Jt4HA$~2LwcjU?e#K|itEHfxl(O2CB z%Q5&djtYVTM0Ylueg37p`FZg*DUxXM`zZfssl0(iF^PhN4WgYke=F2N{Bl=>Ts(n4 zr5|L)8O9h)s)y53NOb3TS}43#i_gZBD{(mIe|6#Z7Nt<euq(pwW)ctc+56+k^-bEv dxo^9=;Xb>*IM-cPj6_KPSzZW_Ckl<H`aeUl*}wn* literal 0 HcmV?d00001 diff --git a/src/network.py b/src/network.py index 1fbfbc8..01c92fe 100644 --- a/src/network.py +++ b/src/network.py @@ -1,11 +1,11 @@ ## Class for handling networking. import os import gc -import ssl +import time import wifi -import socketpool import adafruit_ntp import adafruit_requests +import adafruit_connection_manager class WifiNetwork: def __init__(self) -> None: @@ -28,6 +28,10 @@ def __init__(self) -> None: self._last_ntp_sync = None self.connect() + self._pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio) + self._requests = adafruit_requests.Session(self._pool, adafruit_connection_manager.get_radio_socketpool(wifi.radio)) + self._connection_manager = adafruit_connection_manager.get_connection_manager(self._pool) + def connect(self) -> bool: """ If not connected connect to the network.""" @@ -41,18 +45,18 @@ def connect(self) -> bool: return True except Exception as e: print(e) - attempt += 1 + attempt += 1 + time.sleep(4) raise Exception('Unable to connect') def get_time(self): - pool = socketpool.SocketPool(wifi.radio) ntp_try = 0 while ntp_try < len(self.NTP_HOST): try: - ntp = adafruit_ntp.NTP(pool, tz_offset=self.TZ, server=self.NTP_HOST[ntp_try]) + ntp = adafruit_ntp.NTP(self._pool, tz_offset=self.TZ, server=self.NTP_HOST[ntp_try]) self._last_ntp_sync = ntp.datetime return ntp.datetime except Exception as ex: @@ -63,20 +67,15 @@ def get_time(self): def getJson(self, url): try: - pool = socketpool.SocketPool(wifi.radio) - context = ssl.create_default_context() - #requests = adafruit_requests.Session(pool, context) - requests = adafruit_requests.Session(pool, ssl.create_default_context()) print(f'getting url: {url}') gc.collect() print('free memory', gc.mem_free()) - - #response = requests.get(url, stream=True) - response = requests.get(url) - print('free memory after', gc.mem_free()) - return response.json() + with self._requests.get(url) as response: + print(f'free memory after: {gc.mem_free()} socket count: {self._connection_manager.managed_socket_count}: available: {self._connection_manager.available_socket_count}') + return response.json() except Exception as e: print('response.json Exception:', e) + print(f'free memory: {gc.mem_free()} socket count: {self._connection_manager.managed_socket_count}: available: {self._connection_manager.available_socket_count}') gc.collect() return {} From 8734f5dd368a3862819d6a37dddd97ece2493094 Mon Sep 17 00:00:00 2001 From: Jason Jackson <jake1164@hotmail.com> Date: Sat, 30 Nov 2024 09:39:53 -0500 Subject: [PATCH 2/2] Updated to .NET 9.2 release --- .github/workflows/release.yml | 8 +- README.md | 2 +- src/lib/adafruit_bitmap_font/bdf.mpy | Bin 0 -> 2315 bytes src/lib/adafruit_bitmap_font/bdf.py | 4 + src/lib/adafruit_bitmap_font/bitmap_font.mpy | Bin 0 -> 586 bytes src/lib/adafruit_bitmap_font/bitmap_font.py | 4 + src/lib/adafruit_bitmap_font/glyph_cache.mpy | Bin 0 -> 491 bytes src/lib/adafruit_bitmap_font/glyph_cache.py | 4 + src/lib/adafruit_bitmap_font/pcf.mpy | Bin 0 -> 3874 bytes src/lib/adafruit_bitmap_font/pcf.py | 412 ------------------ src/lib/adafruit_bitmap_font/ttf.mpy | Bin 0 -> 822 bytes src/lib/adafruit_bitmap_font/ttf.py | 65 --- src/lib/adafruit_bus_device/i2c_device.mpy | Bin 0 -> 1172 bytes src/lib/adafruit_bus_device/i2c_device.py | 4 + src/lib/adafruit_bus_device/spi_device.mpy | Bin 0 -> 845 bytes src/lib/adafruit_bus_device/spi_device.py | 4 + src/lib/adafruit_display_text/__init__.mpy | Bin 0 -> 4258 bytes src/lib/adafruit_display_text/__init__.py | 4 + .../adafruit_display_text/bitmap_label.mpy | Bin 0 -> 3923 bytes src/lib/adafruit_display_text/bitmap_label.py | 4 + src/lib/adafruit_display_text/label.mpy | Bin 0 -> 3597 bytes src/lib/adafruit_display_text/label.py | 4 + .../adafruit_display_text/outlined_label.py | 4 + .../adafruit_display_text/scrolling_label.mpy | Bin 0 -> 1126 bytes .../adafruit_display_text/scrolling_label.py | 4 + src/lib/adafruit_imageload/__init__.mpy | Bin 0 -> 921 bytes src/lib/adafruit_imageload/__init__.py | 4 + src/lib/adafruit_imageload/bmp/__init__.mpy | Bin 0 -> 1034 bytes src/lib/adafruit_imageload/bmp/__init__.py | 4 + src/lib/adafruit_imageload/bmp/indexed.mpy | Bin 0 -> 1666 bytes src/lib/adafruit_imageload/bmp/indexed.py | 4 + .../bmp/negative_height_check.mpy | Bin 0 -> 150 bytes .../bmp/negative_height_check.py | 19 - src/lib/adafruit_imageload/bmp/truecolor.mpy | Bin 0 -> 1353 bytes src/lib/adafruit_imageload/bmp/truecolor.py | 4 + .../adafruit_imageload/displayio_types.mpy | Bin 0 -> 331 bytes src/lib/adafruit_imageload/displayio_types.py | 4 + src/lib/adafruit_imageload/gif.mpy | Bin 0 -> 1712 bytes src/lib/adafruit_imageload/gif.py | 4 + src/lib/adafruit_imageload/png.mpy | Bin 0 -> 1063 bytes src/lib/adafruit_imageload/png.py | 4 + src/lib/adafruit_imageload/pnm/__init__.mpy | Bin 0 -> 1211 bytes src/lib/adafruit_imageload/pnm/__init__.py | 4 + src/lib/adafruit_imageload/pnm/pbm_ascii.mpy | Bin 0 -> 465 bytes src/lib/adafruit_imageload/pnm/pbm_ascii.py | 4 + src/lib/adafruit_imageload/pnm/pbm_binary.mpy | Bin 0 -> 615 bytes src/lib/adafruit_imageload/pnm/pbm_binary.py | 4 + .../adafruit_imageload/pnm/pgm/__init__.mpy | Bin 0 -> 577 bytes src/lib/adafruit_imageload/pnm/pgm/ascii.mpy | Bin 0 -> 807 bytes src/lib/adafruit_imageload/pnm/pgm/binary.mpy | Bin 0 -> 669 bytes src/lib/adafruit_imageload/pnm/ppm_ascii.mpy | Bin 0 -> 909 bytes src/lib/adafruit_imageload/pnm/ppm_ascii.py | 4 + src/lib/adafruit_imageload/pnm/ppm_binary.mpy | Bin 0 -> 736 bytes src/lib/adafruit_imageload/pnm/ppm_binary.py | 4 + .../adafruit_imageload/tilegrid_inflator.mpy | Bin 0 -> 1019 bytes .../adafruit_imageload/tilegrid_inflator.py | 4 + src/lib/adafruit_register/i2c_bcd_alarm.mpy | Bin 0 -> 1740 bytes src/lib/adafruit_register/i2c_bcd_alarm.py | 4 + .../adafruit_register/i2c_bcd_datetime.mpy | Bin 0 -> 1141 bytes src/lib/adafruit_register/i2c_bcd_datetime.py | 4 + src/lib/adafruit_register/i2c_bit.mpy | Bin 0 -> 801 bytes src/lib/adafruit_register/i2c_bit.py | 4 + src/lib/adafruit_register/i2c_bits.mpy | Bin 0 -> 1053 bytes src/lib/adafruit_register/i2c_bits.py | 4 + src/lib/adafruit_register/i2c_struct.mpy | Bin 0 -> 1040 bytes src/lib/adafruit_register/i2c_struct.py | 4 + .../adafruit_register/i2c_struct_array.mpy | Bin 0 -> 1008 bytes src/lib/adafruit_register/i2c_struct_array.py | 4 + 68 files changed, 121 insertions(+), 501 deletions(-) create mode 100644 src/lib/adafruit_bitmap_font/bdf.mpy create mode 100644 src/lib/adafruit_bitmap_font/bitmap_font.mpy create mode 100644 src/lib/adafruit_bitmap_font/glyph_cache.mpy create mode 100644 src/lib/adafruit_bitmap_font/pcf.mpy delete mode 100644 src/lib/adafruit_bitmap_font/pcf.py create mode 100644 src/lib/adafruit_bitmap_font/ttf.mpy delete mode 100644 src/lib/adafruit_bitmap_font/ttf.py create mode 100644 src/lib/adafruit_bus_device/i2c_device.mpy create mode 100644 src/lib/adafruit_bus_device/spi_device.mpy create mode 100644 src/lib/adafruit_display_text/__init__.mpy create mode 100644 src/lib/adafruit_display_text/bitmap_label.mpy create mode 100644 src/lib/adafruit_display_text/label.mpy create mode 100644 src/lib/adafruit_display_text/scrolling_label.mpy create mode 100644 src/lib/adafruit_imageload/__init__.mpy create mode 100644 src/lib/adafruit_imageload/bmp/__init__.mpy create mode 100644 src/lib/adafruit_imageload/bmp/indexed.mpy create mode 100644 src/lib/adafruit_imageload/bmp/negative_height_check.mpy delete mode 100644 src/lib/adafruit_imageload/bmp/negative_height_check.py create mode 100644 src/lib/adafruit_imageload/bmp/truecolor.mpy create mode 100644 src/lib/adafruit_imageload/displayio_types.mpy create mode 100644 src/lib/adafruit_imageload/gif.mpy create mode 100644 src/lib/adafruit_imageload/png.mpy create mode 100644 src/lib/adafruit_imageload/pnm/__init__.mpy create mode 100644 src/lib/adafruit_imageload/pnm/pbm_ascii.mpy create mode 100644 src/lib/adafruit_imageload/pnm/pbm_binary.mpy create mode 100644 src/lib/adafruit_imageload/pnm/pgm/__init__.mpy create mode 100644 src/lib/adafruit_imageload/pnm/pgm/ascii.mpy create mode 100644 src/lib/adafruit_imageload/pnm/pgm/binary.mpy create mode 100644 src/lib/adafruit_imageload/pnm/ppm_ascii.mpy create mode 100644 src/lib/adafruit_imageload/pnm/ppm_binary.mpy create mode 100644 src/lib/adafruit_imageload/tilegrid_inflator.mpy create mode 100644 src/lib/adafruit_register/i2c_bcd_alarm.mpy create mode 100644 src/lib/adafruit_register/i2c_bcd_datetime.mpy create mode 100644 src/lib/adafruit_register/i2c_bit.mpy create mode 100644 src/lib/adafruit_register/i2c_bits.mpy create mode 100644 src/lib/adafruit_register/i2c_struct.mpy create mode 100644 src/lib/adafruit_register/i2c_struct_array.mpy diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cb602b8..9214264 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,12 +18,12 @@ jobs: echo '{ "version":"${{ github.event.release.tag_name }}" }' > src/.version - name: Run MPY Action - uses: jake1164/build-mpy@fetch-submodules-fix + uses: adafruit/build-mpy@v1 with: github-token: ${{ secrets.GITHUB_TOKEN }} - circuitpy-tag: "8.2.0" + circuitpy-tag: "8.0.0" mpy-directory: "src" mpy-manifest-file: "mpy-manifest.txt" mpy-manifest-type: "exclude" - zip-directory: "." - zip-filename: "weather-matrix-${{ github.event.release.tag_name }}.zip" \ No newline at end of file + zip-directory: "src" + zip-filename: "weather-matrix-${{ github.event.release.tag_name }}.zip" diff --git a/README.md b/README.md index 2f6ea4c..1ae706a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Pico-RGB-Matrix-Clock LED Matrix Clock with Open Weather Map enabled weather running on a Raspberry Pico W and a WaveShare [Pico-RGB-Matrix-P3-64x32](https://www.waveshare.com/wiki/Pico-RGB-Matrix-P3-64x32) -## NOTE: THIS PROJECT HAS BEEN UPDATED AND REQUIRES CircuitPython 9.0.0 +## NOTE: THIS PROJECT HAS BEEN UPDATED AND REQUIRES CircuitPython 9.0.0 or later This project requires that you use [circuitpython 9.x.x](https://circuitpython.org/board/raspberry_pi_pico_w/). If you still wish to use 8.x you will need to use an older [release](https://github.com/jake1164/Pico-RGB-Matrix-Weather-Clock/releases/tag/v0.54.0) diff --git a/src/lib/adafruit_bitmap_font/bdf.mpy b/src/lib/adafruit_bitmap_font/bdf.mpy new file mode 100644 index 0000000000000000000000000000000000000000..36a7f568c1f35e42e8ed774020f958806554fe56 GIT binary patch literal 2315 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 literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_bitmap_font/bdf.py b/src/lib/adafruit_bitmap_font/bdf.py index 4ff14f0..96830f6 100644 --- a/src/lib/adafruit_bitmap_font/bdf.py +++ b/src/lib/adafruit_bitmap_font/bdf.py @@ -33,7 +33,11 @@ from fontio import Glyph from .glyph_cache import GlyphCache +<<<<<<< HEAD __version__ = "2.1.3" +======= +__version__ = "2.1.1" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git" diff --git a/src/lib/adafruit_bitmap_font/bitmap_font.mpy b/src/lib/adafruit_bitmap_font/bitmap_font.mpy new file mode 100644 index 0000000000000000000000000000000000000000..fe657297b1276b08c31bdc1e3edbf79967ea6baa GIT binary patch literal 586 zcmYk1U2D@&7{{NJHt8Cp%d&W;wy<J1R!T|O9KG<$HL=WzxY`!Ug~TLH+F<iSda4v} zQV;|`&E}?F`~Dg9#;@U}XX!SC!+Cxezvtoq*Em?e#kQ@1<t0;}n6^&>D>l6-B<g>x z#4}hHAIHRxLTe0sKcoNxnZ<rM1fi8}fi&<Z@z|RA5pedvgB%w-9&m(s!0#yA$~H*j z$QoqVA)nYVe?4F4T6!C}LydmDUK<`^(|qYB6MEk?K{U<8jiWR2{IMHafeXSS7tDi* zZH)+tCwEnK=#$aZR-7nMFS@9E7o{{macH^285z;5i?C*!R#fO3aQSX;?+G2qb7DFG z0RX$!4_}1QtFRJSL*J={)4+C<%4Py@<whAjucY$rokpY4*ER<GdMYwvuFjP5Wd<|l z9L^c3$ktJbE3=q2=3;^JQn`Q&l#3Y`agj2gF^_rUfPcEO`bXD{1N2P1g5@gU>zz94 z-T^Fh9Q1DKH>wGEEv?<F-ruNgsSj(}+dtMGq@5D?<^3xAS-No~UfpHBp2*kUG|{&s zd08wpk#3w;(J#Gwnc}<gK^9Mrn~Za26c+}Q8Ryx47$4=8OM_n+xy(3E{L}a(OPL|v LtmaSu?jrXeAhMkr literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_bitmap_font/bitmap_font.py b/src/lib/adafruit_bitmap_font/bitmap_font.py index 640b041..741f8da 100644 --- a/src/lib/adafruit_bitmap_font/bitmap_font.py +++ b/src/lib/adafruit_bitmap_font/bitmap_font.py @@ -31,7 +31,11 @@ except ImportError: pass +<<<<<<< HEAD __version__ = "2.1.3" +======= +__version__ = "2.1.1" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git" diff --git a/src/lib/adafruit_bitmap_font/glyph_cache.mpy b/src/lib/adafruit_bitmap_font/glyph_cache.mpy new file mode 100644 index 0000000000000000000000000000000000000000..1a401cf3bbcc2f10e6fec02235e1b2098472ddb7 GIT binary patch literal 491 zcmYL^QA^uk6oyYy+u9iG*EBn;wy-j%9i2-sI4^d!8Oc--7Fd;BjL-B-Oad_p>F1z# znQXA1)A|$kKgRybQcKy*;k@U(=RG`T4PNXBmg~8<`F+IcIO2D1MsL%E>p?utLdskg z`dT)HEoqcQX#(V&`?))geUSMyi;@7OPYWl=i>oMwwSa+SXouP%s81Vn5dphR`jj{U zj8oTJ2_^9PvWJ@MdC+8O9Q%yJB~tp$&nM+iN`X+C`&n9c`rCI8ZDgtE(=3e=J^}T= zfQRksNyvFNd9Uk1#KZfs#?m`|1*m^qk(yD?O5)E`9+nSImfTiJpp|Fvvv<%DZu*7# z(ioZ6EAOmd5Rp`dVt1`4qS&io#VJU2D0FMRDps8f>AFS!o|?{u@U^hJb*z(hZ0!On zUko6PBM}=m6TWkh8^88GcwVcGDrw*|15h#qlnoI#ZB_|e>k<~P4`9~Wu-Ta+$@si@ zW3wM*xU-3!LhBE#y}|xqFrT$I{+wE6osXEZeFVQB)#m(IaO}nCYNpDMrBLeX)-gCs F*FW;bhtB{2 literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_bitmap_font/glyph_cache.py b/src/lib/adafruit_bitmap_font/glyph_cache.py index 2933f89..a8da27c 100644 --- a/src/lib/adafruit_bitmap_font/glyph_cache.py +++ b/src/lib/adafruit_bitmap_font/glyph_cache.py @@ -30,7 +30,11 @@ import gc +<<<<<<< HEAD __version__ = "2.1.3" +======= +__version__ = "2.1.1" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git" diff --git a/src/lib/adafruit_bitmap_font/pcf.mpy b/src/lib/adafruit_bitmap_font/pcf.mpy new file mode 100644 index 0000000000000000000000000000000000000000..fea304911abdd63c08d2a1c07a0f2ea732b96d46 GIT binary patch literal 3874 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 literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_bitmap_font/pcf.py b/src/lib/adafruit_bitmap_font/pcf.py deleted file mode 100644 index 860ca09..0000000 --- a/src/lib/adafruit_bitmap_font/pcf.py +++ /dev/null @@ -1,412 +0,0 @@ -# SPDX-FileCopyrightText: 2020 Jeff Epler for Adafruit Industries -# -# SPDX-License-Identifier: MIT - -""" -`adafruit_bitmap_font.pcf` -==================================================== - -Loads PCF format fonts. - -* Author(s): Jeff Epler - -Implementation Notes --------------------- - -**Hardware:** - -**Software and Dependencies:** - -* Adafruit CircuitPython firmware for the supported boards: - https://github.com/adafruit/circuitpython/releases - -""" - -try: - from typing import Union, Tuple, Iterator, Iterable - from io import FileIO - from displayio import Bitmap as displayioBitmap -except ImportError: - pass - -from collections import namedtuple -import gc -import struct -from micropython import const -from fontio import Glyph -from .glyph_cache import GlyphCache - -try: - from bitmaptools import readinto as _bitmap_readinto -except ImportError: - _bitmap_readinto = None # pylint: disable=invalid-name - -_PCF_PROPERTIES = const(1 << 0) -_PCF_ACCELERATORS = const(1 << 1) -_PCF_METRICS = const(1 << 2) -_PCF_BITMAPS = const(1 << 3) -_PCF_INK_METRICS = const(1 << 4) -_PCF_BDF_ENCODINGS = const(1 << 5) -_PCF_SWIDTHS = const(1 << 6) -_PCF_GLYPH_NAMES = const(1 << 7) -_PCF_BDF_ACCELERATORS = const(1 << 8) - -_PCF_DEFAULT_FORMAT = const(0x00000000) -_PCF_ACCEL_W_INKBOUNDS = const(0x00000100) -_PCF_COMPRESSED_METRICS = const(0x00000100) - -_PCF_GLYPH_PAD_MASK = const(3 << 0) # See the bitmap table for explanation */ -_PCF_BYTE_MASK = const(1 << 2) # If set then Most Sig Byte First */ -_PCF_BIT_MASK = const(1 << 3) # If set then Most Sig Bit First */ -_PCF_SCAN_UNIT_MASK = const(3 << 4) - -# https://fontforge.org/docs/techref/pcf-format.html - -Table = namedtuple("Table", ("format", "size", "offset")) -Metrics = namedtuple( - "Metrics", - ( - "left_side_bearing", - "right_side_bearing", - "character_width", - "character_ascent", - "character_descent", - "character_attributes", - ), -) -Accelerators = namedtuple( - "Accelerators", - ( - "no_overlap", - "constant_metrics", - "terminal_font", - "constant_width", - "ink_inside", - "ink_metrics", - "draw_direction", - "font_ascent", - "font_descent", - "max_overlap", - "minbounds", - "maxbounds", - "ink_minbounds", - "ink_maxbounds", - ), -) -Encoding = namedtuple( - "Encoding", ("min_byte2", "max_byte2", "min_byte1", "max_byte1", "default_char") -) -Bitmap = namedtuple("Bitmap", ("glyph_count", "bitmap_sizes")) - - -class PCF(GlyphCache): - """Loads glyphs from a PCF file in the given bitmap_class.""" - - def __init__(self, f: FileIO, bitmap_class: displayioBitmap) -> None: - super().__init__() - self.file = f - self.name = f - f.seek(0) - self.buffer = bytearray(1) - self.bitmap_class = bitmap_class - _, table_count = self._read("<4sI") - self.tables = {} - for _ in range(table_count): - type_, format_, size, offset = self._read("<IIII") - self.tables[type_] = Table(format_, size, offset) - - bitmap_format = self.tables[_PCF_BITMAPS].format - if bitmap_format != 0xE: - raise NotImplementedError("Unsupported format %s" % bitmap_format) - - self._accel = self._read_accelerator_tables() - self._encoding = self._read_encoding_table() - self._bitmaps = self._read_bitmap_table() - - self._ascent = self._accel.font_ascent - self._descent = self._accel.font_descent - - minbounds = self._accel.ink_minbounds - maxbounds = self._accel.ink_maxbounds - width = maxbounds.right_side_bearing - minbounds.left_side_bearing - height = maxbounds.character_ascent + maxbounds.character_descent - - self._bounding_box = ( - width, - height, - minbounds.left_side_bearing, - -maxbounds.character_descent, - ) - - @property - def ascent(self) -> int: - """The number of pixels above the baseline of a typical ascender""" - return self._ascent - - @property - def descent(self) -> int: - """The number of pixels below the baseline of a typical descender""" - return self._descent - - def get_bounding_box(self) -> Tuple[int, int, int, int]: - """Return the maximum glyph size as a 4-tuple of: width, height, x_offset, y_offset""" - return self._bounding_box - - def _read(self, format_: str) -> Tuple: - size = struct.calcsize(format_) - if size != len(self.buffer): - self.buffer = bytearray(size) - self.file.readinto(self.buffer) - return struct.unpack_from(format_, self.buffer) - - def _seek_table(self, table: Table) -> int: - self.file.seek(table.offset) - (format_,) = self._read("<I") - - if format_ & _PCF_BYTE_MASK == 0: - raise RuntimeError("Only big endian supported") - - return format_ - - def _read_encoding_table(self) -> Encoding: - encoding = self.tables[_PCF_BDF_ENCODINGS] - self._seek_table(encoding) - - return Encoding(*self._read(">hhhhh")) - - def _read_bitmap_table(self) -> Bitmap: - bitmaps = self.tables[_PCF_BITMAPS] - format_ = self._seek_table(bitmaps) - - (glyph_count,) = self._read(">I") - self.file.seek(bitmaps.offset + 8 + 4 * glyph_count) - bitmap_sizes = self._read(">4I") - return Bitmap(glyph_count, bitmap_sizes[format_ & 3]) - - def _read_metrics(self, compressed_metrics: bool) -> Metrics: - if compressed_metrics: - ( - left_side_bearing, - right_side_bearing, - character_width, - character_ascent, - character_descent, - ) = self._read("5B") - left_side_bearing -= 0x80 - right_side_bearing -= 0x80 - character_width -= 0x80 - character_ascent -= 0x80 - character_descent -= 0x80 - attributes = 0 - else: - ( - left_side_bearing, - right_side_bearing, - character_width, - character_ascent, - character_descent, - attributes, - ) = self._read(">5hH") - return Metrics( - left_side_bearing, - right_side_bearing, - character_width, - character_ascent, - character_descent, - attributes, - ) - - def _read_accelerator_tables(self) -> Accelerators: - # pylint: disable=too-many-locals - accelerators = self.tables.get(_PCF_BDF_ACCELERATORS) - if not accelerators: - accelerators = self.tables.get(_PCF_ACCELERATORS) - if not accelerators: - raise RuntimeError("Accelerator table missing") - - format_ = self._seek_table(accelerators) - has_inkbounds = format_ & _PCF_ACCEL_W_INKBOUNDS - - ( - no_overlap, - constant_metrics, - terminal_font, - constant_width, - ink_inside, - ink_metrics, - draw_direction, - _, - font_ascent, - font_descent, - max_overlap, - ) = self._read(">BBBBBBBBIII") - minbounds = self._read_metrics(False) - maxbounds = self._read_metrics(False) - if has_inkbounds: - ink_minbounds = self._read_metrics(False) - ink_maxbounds = self._read_metrics(False) - else: - ink_minbounds = minbounds - ink_maxbounds = maxbounds - - return Accelerators( - no_overlap, - constant_metrics, - terminal_font, - constant_width, - ink_inside, - ink_metrics, - draw_direction, - font_ascent, - font_descent, - max_overlap, - minbounds, - maxbounds, - ink_minbounds, - ink_maxbounds, - ) - - def _read_properties(self) -> Iterator[Tuple[bytes, Union[bytes, int]]]: - property_table_offset = self.tables[_PCF_PROPERTIES]["offset"] - self.file.seek(property_table_offset) - (format_,) = self._read("<I") - - if format_ & _PCF_BYTE_MASK == 0: - raise RuntimeError("Only big endian supported") - (nprops,) = self._read(">I") - self.file.seek(property_table_offset + 8 + 9 * nprops) - - pos = self.file.tell() - if pos % 4 > 0: - self.file.read(4 - pos % 4) - (string_size,) = self._read(">I") - - strings = self.file.read(string_size) - string_map = {} - i = 0 - for value in strings.split(b"\x00"): - string_map[i] = value - i += len(value) + 1 - - self.file.seek(property_table_offset + 8) - for _ in range(nprops): - name_offset, is_string_prop, value = self._read(">IBI") - - if is_string_prop: - yield (string_map[name_offset], string_map[value]) - else: - yield (string_map[name_offset], value) - - def load_glyphs(self, code_points: Union[int, str, Iterable[int]]) -> None: - # pylint: disable=too-many-statements,too-many-branches,too-many-nested-blocks,too-many-locals - if isinstance(code_points, int): - code_points = (code_points,) - elif isinstance(code_points, str): - code_points = [ord(c) for c in code_points] - - code_points = sorted( - c for c in code_points if self._glyphs.get(c, None) is None - ) - if not code_points: - return - - indices_offset = self.tables[_PCF_BDF_ENCODINGS].offset + 14 - bitmap_offset_offsets = self.tables[_PCF_BITMAPS].offset + 8 - first_bitmap_offset = self.tables[_PCF_BITMAPS].offset + 4 * ( - 6 + self._bitmaps.glyph_count - ) - metrics_compressed = self.tables[_PCF_METRICS].format & _PCF_COMPRESSED_METRICS - first_metric_offset = self.tables[_PCF_METRICS].offset + ( - 6 if metrics_compressed else 8 - ) - metrics_size = 5 if metrics_compressed else 12 - - # These will each _tend to be_ forward reads in the file, at least - # sometimes we'll benefit from oofatfs's 512 byte cache and avoid - # excess reads - indices = [None] * len(code_points) - for i, code_point in enumerate(code_points): - enc1 = (code_point >> 8) & 0xFF - enc2 = code_point & 0xFF - - if enc1 < self._encoding.min_byte1 or enc1 > self._encoding.max_byte1: - continue - if enc2 < self._encoding.min_byte2 or enc2 > self._encoding.max_byte2: - continue - - encoding_idx = ( - (enc1 - self._encoding.min_byte1) - * (self._encoding.max_byte2 - self._encoding.min_byte2 + 1) - + enc2 - - self._encoding.min_byte2 - ) - self.file.seek(indices_offset + 2 * encoding_idx) - (glyph_idx,) = self._read(">H") - if glyph_idx != 65535: - indices[i] = glyph_idx - - all_metrics = [None] * len(code_points) - for i, code_point in enumerate(code_points): - index = indices[i] - if index is None: - continue - self.file.seek(first_metric_offset + metrics_size * index) - all_metrics[i] = self._read_metrics(metrics_compressed) - bitmap_offsets = [None] * len(code_points) - for i, code_point in enumerate(code_points): - index = indices[i] - if index is None: - continue - self.file.seek(bitmap_offset_offsets + 4 * index) - (bitmap_offset,) = self._read(">I") - bitmap_offsets[i] = bitmap_offset - - # Batch creation of glyphs and bitmaps so that we need only gc.collect - # once - gc.collect() - bitmaps = [None] * len(code_points) - for i in range(len(all_metrics)): # pylint: disable=consider-using-enumerate - metrics = all_metrics[i] - if metrics is not None: - width = metrics.right_side_bearing - metrics.left_side_bearing - height = metrics.character_ascent + metrics.character_descent - bitmap = bitmaps[i] = self.bitmap_class(width, height, 2) - self._glyphs[code_points[i]] = Glyph( - bitmap, - 0, - width, - height, - metrics.left_side_bearing, - -metrics.character_descent, - metrics.character_width, - 0, - ) - - for i, code_point in enumerate(code_points): - metrics = all_metrics[i] - if metrics is None: - continue - self.file.seek(first_bitmap_offset + bitmap_offsets[i]) - width = metrics.right_side_bearing - metrics.left_side_bearing - height = metrics.character_ascent + metrics.character_descent - - bitmap = bitmaps[i] - - if _bitmap_readinto: - _bitmap_readinto( - bitmap, - self.file, - bits_per_pixel=1, - element_size=4, - reverse_pixels_in_element=True, - ) - else: - words_per_row = (width + 31) // 32 - buf = bytearray(4 * words_per_row) - start = 0 - for _ in range(height): - self.file.readinto(buf) - for k in range(width): - if buf[k // 8] & (128 >> (k % 8)): - bitmap[start + k] = 1 - start += width diff --git a/src/lib/adafruit_bitmap_font/ttf.mpy b/src/lib/adafruit_bitmap_font/ttf.mpy new file mode 100644 index 0000000000000000000000000000000000000000..a70cfea9b5e6a1192879b17e16857ac5997976e2 GIT binary patch literal 822 zcmXX@T~8B16uq-7ODR=`Wm!I2q;$7a3aur$^szB55DGEUq=0K;$hzIqhSE0eHd4{J zB|aE`fj<M>@IVku{6zeE#5bRe@A?OvE#8;8=iYnHnLCr>U@Y1Z*K%6E)+m}A_lxGX zR^7-~%4W<o^Vh3Q=yhis)sg`ovso>cH^H+|EE(zBz!oduNw(*K&lT&{lGb!eb+gvc zP2jTG1&~~I!`K2>o>D;23tCOnO`}!^HjxH*Vvz=T5=uRtPJ<_B=#`uSdntE<;>&&} zL&pj<z(uDEz)?UMPNe`%HnB*RoZjx^I<&$r(<qgowTpGFq}PiN4G<gUs-|yk<ZG2} zxD|`e?)5Wy@LaA5tp{Ae*a4%5V+)3s1CHG+HS^GkSIhNAwOXl}M$YfN1w4He5s=jt zh(uOX`J0Qx!ptP{cK8^PQ7z2Uywk^uEX_HZclkJxQ<vQ9eSx2IDRl|mvoc<n=*rFj z?p7GFJENnP54i4ULZ2kcxLXX)fas>x7s6kE#!W&K*1*L4yx}LyL?Tl+R>BjpSS%V{ zo(xNwP)H8VhGU^53L>G$iX%0M_J=$X*dMxb;0N^9##a^e&c?k8nr7dB_;|*L4;7?F z;M1X%EUus17(1QMU%r0h!^c7&=HrN;e5Ih1Q-xJePA8e8<F(eWJ9jTqys92ausY3r zC)ja&P2FtV@6bsf;YmLcY%H|l01?R`8M5&}8xE5Z;w3&lEDy^gvRC#|X&Z~Q*Fi?f zH8N)7K?)e+C*wyFq821TB*#MzP?O|u%f>@=pp(etzm_apKjzLXDk;--rho)#CAqSG zE(e8S8;>Z65-;yPrBXAmf~-|SZ0r+8WfDhi7^3tLr6<?;DTz^#K`pPvK@P~$pNrJ< iC(hUGBt2u1QOi5Qy9ED19KE6E_(2eav6pcaXY_w{8_Ev= literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_bitmap_font/ttf.py b/src/lib/adafruit_bitmap_font/ttf.py deleted file mode 100644 index 807ac79..0000000 --- a/src/lib/adafruit_bitmap_font/ttf.py +++ /dev/null @@ -1,65 +0,0 @@ -# SPDX-FileCopyrightText: 2019 Scott Shawcroft for Adafruit Industries -# -# SPDX-License-Identifier: MIT - -# pylint: skip-file -# Remove the above when TTF is actually supported. - -try: - from typing import Tuple - from io import FileIO - from displayio import Bitmap -except ImportError: - pass - -import struct - -# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html - - -class TTF: - def __init__(self, f: FileIO, bitmap: Bitmap) -> None: - f.seek(0) - self.file = f - - self.characters = {} - - def read(format: str) -> Tuple: - s = struct.calcsize(format) - return struct.unpack_from(format, f.read(s)) - - scalar_type = read(">I") - numTables, searchRange, entrySelector, rangeShift = read(">HHHH") - - print(numTables) - table_info = {} - for _ in range(numTables): - tag, checkSum, offset, length = read(">4sIII") - print(tag.decode("utf-8"), hex(checkSum), offset, length) - table_info[tag] = (offset, length) - - head_offset, head_length = table_info[b"head"] - f.seek(head_offset) - version, fontRevision, checkSumAdjustment, magicNumber = read(">IIII") - flags, unitsPerEm, created, modified = read(">HHQQ") - xMin, yMin, xMax, yMax = read(">hhhh") - print(xMin, yMin, xMax, yMax) - macStyle, lowestRecPPEM, fontDirectionHint = read(">HHh") - indexToLocFormat, glyphDataFormat = read(">hh") - - glyf_offset, glyf_length = table_info[b"glyf"] - f.seek(glyf_offset) - while f.tell() < glyf_offset + glyf_length: - numberOfContours, xMin, yMin, xMax, yMax = read(">hhhhh") - - if numberOfContours > 0: # Simple - print(numberOfContours) - ends = [] - for _ in range(numberOfContours): - ends.append(read(">H")) - instructionLength = read(">h")[0] - instructions = read(">{}s".format(instructionLength))[0] - print(instructions) - break - else: - raise RuntimeError("Unsupported font") diff --git a/src/lib/adafruit_bus_device/i2c_device.mpy b/src/lib/adafruit_bus_device/i2c_device.mpy new file mode 100644 index 0000000000000000000000000000000000000000..fa5174c8b4ae35c3bdbf56342284c386bf3cf7c7 GIT binary patch literal 1172 zcmZuuO>Y`k6n!(m7-I^LVe*X4*rt5dojMQ$Mrl-46jKXZ{RoL8i-k32hDR6$GoxX~ zF^ftM*J{|M%SzpKQDuqkB>SpW{y{cfG=HPZz8P?9RawoMbKkl5o^!W3uvYd|TkTfI zv^7gs?19|ICz^`$T0xz`oG}Dpzoi{x0KYXXP4BmQz`s8<FbG;hL+d{V%ll?a#Y#(k z;?e<1;{gyKVA@&f;i}!~U=yq!n3{!e5bLUDs&uX~w7Pm<o;Blk3)>(-SJ8A3*vb`h zcL7hSn!6V`%Zyfd-L~X`)iNy*av<)v0o3|4DoByTq&VsUh*LjutKBy7U;xsxY?!)& z<&JL741&>j%O+j5W9rAU*0*$Uwi|lt>`GzQ1+vw}ec5^B)}>kXKibiPrNE$vu>qiE z4&|P%J^}Hd-FLy)NS05qNj>#t89<r#GIWaax3|us0e2(7DRu{p4g|*%g-&EV^)iDH zpQ=to7=#>jLXQx1DFw7fjP9#+Ez20(%jX|!R@YW?s(zfmK5YJr>kDsB6Td%AylM}o zvF4}<Z~*vLztIyk?8G#+M9WIdg1eWvbDB8?&%_OpIZ7N=c9Mk+^O2fvlSZ6HZ2fZr zJ<uz$ai8cx9?^@uO#(TIiO-1~;wbjRd0GvKe&iSD(L7}qXf-G<poQjM;2@HISKDsx zF^BL2lt}@U-7f$bDzPZkP?;Y-i={*3I9VCbJ&!&Yo|0U<ay}pV2(7~q`uKswJS+lq z>){3<Fsw8nREi8*y7|kZxceKSRbC-5O22|q^q`f37p)b1C|Tf8tf9`GffqjEmV_2R zA)lsesf$SrT~1<)SGApq5G#XbL;c?WCmE9pT9P)xkW@)9lf7#ERomfjUzC{NCs8CU zPoj$#FnkH&Rr#E~A&I+^NAHn{|CgNCfBun-E6EipmyhsKffxj3vYDOC%YSG6@p=j` zOUxT*?5fk_5=O2d{}M)DLE&|I?4i>~-KF4~M1D$cR_i<~BuJTQI`2O$gIa!~j@Dmz zVN$xYSs=fxJA8`TystjH`<7jeN#xg~N^&!Ol1OH4<30M_FY94P<QPaXWwyCjJm8D( pYQ1J%;7g+t^P5w36LE@BxA;|)-%7Dm@pp;AhxF!+>$!&w^&b^%Q7Zrd literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_bus_device/i2c_device.py b/src/lib/adafruit_bus_device/i2c_device.py index c605290..7e65076 100644 --- a/src/lib/adafruit_bus_device/i2c_device.py +++ b/src/lib/adafruit_bus_device/i2c_device.py @@ -20,7 +20,11 @@ pass +<<<<<<< HEAD __version__ = "5.2.10" +======= +__version__ = "5.2.8" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git" diff --git a/src/lib/adafruit_bus_device/spi_device.mpy b/src/lib/adafruit_bus_device/spi_device.mpy new file mode 100644 index 0000000000000000000000000000000000000000..7d696ae94b3eb78c5e0909713f7ab42244aa9860 GIT binary patch literal 845 zcmXw#-%b-j6vodMsC5N8-ED`}R>9JiKVloJG{mb4s{x{c3JNvRWjh_{hNZjNoke=( z774)%-(^+M7f@fo3r#ff%2zO6IxR5COn!6boB6&ub72^s6lV3hzUg=d(`ufp)#<K5 zXu-9OGtAp9h(?&PLjf(>%&?le36a&7O`)H)Y@@jaS5_UJ(3(!RyJeA=sSDwi<pmJ= zn}!97YHS%yHy4^q9s{X<y5k4pbiSCM0f}qXt}|RCuBH=a>{4x4H$CoJ)4jT*GfuW; z>W;x$AlePxrJ&F~=I9zREwb&xXqcx4Od5u*xzwbD!HE0PV5FfjOS3#?bMO88mqpj4 z)CR<yme#om60w?_#+K($NbWE6d(Ce35!SR_>hSnYO#`H94z(>#g`3m+GNOA#>--Z2 zJH(Shf45YFw$N8@FlM`V3kCk^hF8lIYo~DD<-)!5cF!3O;cZ`Tu?Dx8_1x1A<oP8y zG^bL+#>PhZLAq#8Jt3L8UrB~=Xnw{=J*amwl<Z6O;GR@3?ydSLJSikEq{2ANIl}p3 zDuN@NMb4K}A{MKQ;#zF@w>no{6rQ7gJTeOS`f3r-z?~2ts1V^bQ{n?hSN$8q?Zkl? zOXE>AfHRdzVG5SfU@d+4b_7LhK0<uP_>^k50n0@JE5#5_RY=c4`R5z|sGO6t@x)*h z#Uy_vb2_r`0wsPNDAAKZK_3Gp_9;-L_koi55GaFzoKPR~C63Y1<I+A<E99VjFRo<$ z7wKDLmF)QJycCLG_De!FkmK<yB~S|;NTO&UM-d8SgkpglD;)wCB-Hsp?!2iCaS=IO z|IwRCWpiWW{!VscESJkoWOBvvj&6bLzMTmr|A+cgnrPn<KBwESj{T>BEFJy*(pmrc mzf|?4{pZVxKl^CyYsdNOG0)Qev;OS+T)x^3b*%)|W%3`i)b%0& literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_bus_device/spi_device.py b/src/lib/adafruit_bus_device/spi_device.py index 60954e0..522ed24 100644 --- a/src/lib/adafruit_bus_device/spi_device.py +++ b/src/lib/adafruit_bus_device/spi_device.py @@ -22,7 +22,11 @@ pass +<<<<<<< HEAD __version__ = "5.2.10" +======= +__version__ = "5.2.8" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git" diff --git a/src/lib/adafruit_display_text/__init__.mpy b/src/lib/adafruit_display_text/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..254b3b6dfebb1301a25dddc8a1e0ccb016ee49d0 GIT binary patch literal 4258 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 literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_display_text/__init__.py b/src/lib/adafruit_display_text/__init__.py index 7a46cba..4c54e1e 100644 --- a/src/lib/adafruit_display_text/__init__.py +++ b/src/lib/adafruit_display_text/__init__.py @@ -7,7 +7,11 @@ ======================= """ +<<<<<<< HEAD __version__ = "3.2.0" +======= +__version__ = "3.1.0" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" from displayio import Group, Palette diff --git a/src/lib/adafruit_display_text/bitmap_label.mpy b/src/lib/adafruit_display_text/bitmap_label.mpy new file mode 100644 index 0000000000000000000000000000000000000000..ef1ce62f0be706c2aa14606f9fc1816ff1c5ea49 GIT binary patch literal 3923 zcma)8Yj6|S6~21f2tii6Vo_|zS)|q4mccecD2<z>X1#u!hy1{iNwU^sZ3)(r(8I_{ zAS;JVQj*TlX{R&&RXWq@ul`uc?+5lw8eYagnf^$a5c-S1os7)%ch9bji$iBxkM7-b z&pG#;bH8)$xo$P0*K^uE-GOjmG?|H}`EWFq5CfBZTF9mwgVFSOAi;})pddCRCebUV zBMnUrUW9LHMdJwXRfKFHB_P*-HG;^Jm2^BVrVw^Ak&eb=0TG!7G6_*Y=JaGD8XH5l z_INCPDj845LvazAM_~olO{#Td96Z&BjNA}RgQqxT>>U8AZ=e@B_VOj`2<OvLQ5Z`` z!^p)alEOqOYB*0)2q`X+l}`mG1odF3f=>!?%n&RC!4xu;xFm2>Lb|jlS3*GL3J%C7 zMq>h>N(4ems1^K<r70B(z(GvBx<OaL2jiJo7!-lXA{#HpLC%jQ<Cz4?ou^gnJ9X@Q zFc3PYXvD&BjIl@>d?W&4)rcsJrcu@QGO3Df+v{{ZfvUGx!FW0yA4jGO(QrC~%n?D= zHnVCT5e9mqkWLGzd^9SGh~&30P|irb1X#{j4S}TuJ|ITNV&ek9v6l~|LJENm0NNc2 z+O|YAD~Nn55(o=PWL2`jm)w&oy%mEkEQ|&+B7h4DNSj64Ni>P^Tvs1|{MadEOD6-d zR3Z-EvXhX0F`D4BTi;1U^MP0>5>E<Y9#o=gI_)pBTssoOLt#N=DMXDyPIn{)<HJJf z9A&s791|xK5tOUbhqGvJDiR${gL8d&a_czJSXjscdJ{r22oXZ6gJLv|%v+^r%<_kk zaZ;JGyj!8%$eKC_Cn#+!SGD!o!$>~~BkP8*8`)KjR6LV}Dl945d8PVx6c?_t)XFN6 zYCXDC?h8c&cP5@hJL;&!BF6*g1U{Y!oX-e|QWqtp14$)~wIz?r6@KBSczFes2}pbR zr$v#1qET>2!Hwd1z(l!7aiESj9y&Tzhb5Bngpf>6qTN#j{-66cbu>4G!KH+aLKx-V z&c$;VrVPgMXbc(016hP;xATfmZj%*T=xpJfJ3_^T3p?=<FomV!qf#n7xWX%)pHX-G z<a|?&hSo?rok%q|HjYKpkxZ~56d!MV-o6@-J#U7s(PRjk;;G4W1dhvXwZ;LsE)B2` znRGgx7ACFE1Vfp$T9dv^)3p6FX$?B1cNug_^D+<}N}*A)c$ykjE_*Ze(M4o9IuuC8 zpkFjoC2<IfKOuw<QbIN)2;mfUOs!SwIkwG|{iBO^Wbpp4eOpET(#FFtmKYUHQPJ`7 z3^YPfpe{s&7`2@@Mb;h=q2vv93daARuE}7~DIMCNQ(CkF0H@B+VfcLDpj|UUN&9Gy z>9xmO?e4)4g=xu<1Ce3LSE(a)5~g=)Dh*Y7Qt$692cD5McAJJQ!aulHf4AoSPD;Yc zuyU8Sa#vLuSyoj}mir~l1bcQ@nMjlWMcn~6!ps)EM@O1{A<Y$iZL9f<2C2#Jguk&X z_?Lf-j9fnPMewWs@W|z|@a0{X%frYrN{(S>GIG%1&|rIl4lTAf=+I%W1RZ(|QzlE0 ze5=o;>6Z^64T<~U&!z7_q9I?kMBQ4ChGgA3l9oW>h@NbeBt>rMKVl${yN%?qyNo>J zE+^k}?;_uKo5+BBHyN~?b(>+|2|2Xqv(6tsYoYLSV#T;LM$_C$`dp{e>C4*)7*-hj z@R$?j_u+;98R?BFjek0CBlFh%dBWz^<ZZUR^;N8*fK|d8tI89vVbyt}+WQ6a`$B&% zU;LA#S<=2LR#aA1OH&NZgk7AoC(N|92qQJ;=+AdaW!$*a9<~SVuCsQkrmm~0J?e0H z9nOfeZLFSlrblXHR875el&W(&k}b8hPAB}R+Vd?`U803*4^w&HlfQFZUbekHty0sn z?X`mM3D+ePB*)2w?Q4bTk*)g+UX5(Cv78U)0!BS*ZBz7u4ufnvAQN`J$9w}mR)^%( z_*pk-5iqRmFF%#7bU`Lw_iCGrH*ej(vwl}5oLu|-#^ODeTiRH@H+O$dCYYj3)D&;7 z$V4qrb;S+e1DPOvPg?unL%8N1w?ae&QNQw-JB{nC2j^DsxJ(@KXuP@yYv7Aj#MTDI zxom9&S|*w>%VVy!!1iF2^)Q|&fUXAO0ACB6;O2VKYw*j2n`@I8jO~z#BUArkFqyD| zQ*Mp>n*?q=U<f-3elS-KtIuKHIqZ!U>}L}8CRlm6P{f*P?7CuX(|Z-rvA&Fh0?E(8 zs1g^^Boq4{bHlJ?EHd#HFb11+w8i!|jCWxC0yqxi58Op1_&txfZoq`W!91fLXRpd( z6i%JOu@Z061fXRlnrXZ^zv|LMDp>FXf)b)2Q2<??S4A^whG%43wM?|gwqw3fuElL; zE2^$mHQ?v-vbEKVa)Zx2ny(9?-`0LfeL#zq6<6slHbU9$T)Vxkre^FoGvKfv=%wLC za;`%iT~4>p$+kJ$dzlag5XuBM{MT=CH>9DPL$`)*-|?-_-(4KqxTm6fUxJ*z#$b8A z=Pw$@LR+x5M_k8R?&$;e_ql?#9Z%90B}oiU<4{@yc*;>`?ZDF|t_RAhD6MgW^EVe{ zD_fv3uXgR()7!IaPj5&M=H?%9{Y$Wmlh)a8JhMdOM5jl)J_lb{QCSojLRoY@y@^jO z&(VZOcXwg&5!Z)jR)Agq5T@?U)uKncflpjt*k0XZA6`=IveNqU(k5fQzOu>eTY0!z zWXRdv=JP<FP0tjI%>HS{MqBB9OEgLEr)@4{=y&f<J0}{&6O|Pgvi(;t*;%_C8YyER zZ|QON1B6|z&R%Cj4;7`(Q4YrGaN5td98@N*cf9s26`i>?d)s$setlu+?gn6YufX^G zN_&4*0q*4dH?!b=`np$Jyum)pO)CJdD)>EEgLwO&qo=YI@E+!70HnS}6{I_C7oJ&M zQ!u)NPb|%>5nV-?Tt#3NJ-YSTg-6^8JhQw8$gBY{9_?LxVr8~OZmbbKp!<x$fKk7x zFd2&kX|qV*a(>$KkijLT!h5-1h@#xuvFg=81hfUTi+Q5{J7^+X!d=gWvh{c#pMVfL zi;_pHsGh)1(inD%#xWm_DWPF~upjH6^Ip;W)quZYf4sQ3ytKHvvb^cihknyk{Pktc z@Nx0Po6VCaPx<=#uRiJeSSoW}lFUxp8HP7RsOze$qq)Q94;&LmT=wo7{KGsp;L&pL z<*fsS=^1Qr7CSwM4b5ZkE@1tO-YYsk`$G=@5I3q?AK*soKz^n$y+h9rdU`)Qo10gl zogrMe7D`0@?b-S7xVHJ(;TyN+7Jyoq8@_oP&&-34M|%s;EX)w~9_{UgxlM`vr!=%a zKMTb7($L+)a&cpNsdz6>xK@VFeAlj*zGvBCKbHaYuD{3#&&(}>wP(fI;&O5DJ|wrb zZFTW6*S(s*4x68?6i>5VKmq0~+nIa%?(ny*fB3}jFHv6s<qJ)<H18c2Kf2~{LRv`3 z4ZKNJc?`Nlwf8devmN-y4wFYCfM%o_J0o7aR!74V2XDr<dc{xFcdP2TM63Bd@ly4* zCdFhWJR*6oX4|eW^l6LT`o8$dwIejc^e|xX1NAuq)5Ia^G)z`reN9eE+l&!~0fA)Q zctFgdYwy%BG<3`SW9|%mWZOQlQu2o9pxfKvK1?Z(Y3DBZ&;A<cFo#BVnNNt<I!9Wd Hw}<`>&PXK{ literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_display_text/bitmap_label.py b/src/lib/adafruit_display_text/bitmap_label.py index 514ae69..2263ae3 100644 --- a/src/lib/adafruit_display_text/bitmap_label.py +++ b/src/lib/adafruit_display_text/bitmap_label.py @@ -23,7 +23,11 @@ """ +<<<<<<< HEAD __version__ = "3.2.0" +======= +__version__ = "3.1.0" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" import displayio diff --git a/src/lib/adafruit_display_text/label.mpy b/src/lib/adafruit_display_text/label.mpy new file mode 100644 index 0000000000000000000000000000000000000000..2f829b645e9ae9e7699631342d42ff85d16d817e GIT binary patch literal 3597 zcmZ`)TTmO<89tH_7e&R(uDn(;byVFfgt=Ij<;2D@S=K^eY%T^PoVd$MS|l|B$<pGW zx0T{?^Uw$K+V{RRFDotrOyZf^go}+c!{njybdt`r<7qqTLq}xt)QA4(NMK;v0iE-o z%m4k~`ET1@jo$vXzEg~dlj)hbEJWg&R6@)OvNS8VC&ZAHXiH_$3B!f9jy4}Ma&dV| zOriQgF(Jvags72tLh4D!BZ#hO#*>Kd$9kNYk&yd;0wZc5CC8J~VgeaPW>N_W8Rcv$ zJ{?77e{xzLOef`JIGI4kNmv1(fdC?#QwWLSkD}@1%ydLZRVa7`F%pp?hmT|+6~&|) zg|r0E2}^=3hBC-No`sCU$MJ|9gC)jCmZ&5PA&dzOK$u1KLQINBV=|%+tXQVRj{qet zPG?eLS^_l|urr{EJ%!E*;j|>m(qR@DsqrYV_3*h&Ow<cvCXDeYAtIF}i$EL?u}Di{ z>?hO&JR*c%nkY3MtP|3t3|12HX-NQPVdBJtQ#qMJXAV}Oq%0?=Q1!?NhpPFpVK@pw zkOVOik4{fv4%MTB!^oV9&q@g)6B8p+8fj;dHjCT>e(E9bLwJ&DWEK+1u$T~VNKz<w zpCw*Oro{U*5<2qO^8I{6P3~mw3N2)X<m4nk0>Vrxf*nWPSUo(_kE;7eh7pZ}5=~@N zF;o@FB4Z^W^_f_FQWj>Bp&Y`h$Sg93%1LRCNR#4B0wMz8M<zT9@#%;(Tan8eEZMKX znacr9f)i%J$Ydg(0_^gfMOmvj9gZc_kX)%`CQc$j6GxD|(OHRn#Pzl08Rbhvbd~Sm zf;bdUpManD0307V9_tJwmheDIXCUr^09k=kI0@3t_STDU<(XPyJAW}ZmTxy;+ZjY1 zcr$mkdP<x{^tAM`Q1&>5MZzSPte%QbqYT+8Cq6zqLf?>qXiCUQ4vulwcgJKomATyB z9*xVfnNV9eIn};j-tF)2H<0dlIt-0uFe}I40eq#Mj6jjJfgUnw^*Wq-dL2$RgSJM~ z0snXxM_sSO31HA4UX^d|YvJ7ejs0AsX2PPF?2&i+t)9^^rDca~h#gia9aTl?-MZ7& zO*&TBRK->`=~?}_Le;o6r)!&P*qZTxMWN~_gIjz0t)@D*uF1d};M@r3KWj3w#_>MG zSi|kV@ZIBmntLN2MAbLccy(<3P+0RYQQKPoX|v*f#5}zF@ZE=>N4g%?MJ$ns1vQMY zqf|Y6N3|dgd%~k(PkXd%t4GIP@>H>n9zEOVsb>2<HS8@<Ej!?;V+Yl+;Zf`xrR&Uz zvEaBe;^GH-T?uEeldj5nH3c&@STHxxcO9s3^2Ge@1?5s+GhQ&!1%~ly*69xx@f}lv zIcZ{jC^uR#pHd2pS-As)>F0`1Grl<V{WtuLf~k@I5bnapQ22L&1?p4n>EOLzDbWdw z)8TYl<Gn7+Er-R{VGryJ(aMJ8a=PqRo_F;0ob7R0&$_I3mzB43uIp1>D$}HlK2w=r z@M9q6N7rHeWb`X#1LoZ5CimBz%A8S|x9@IktBl2_`HoMM8!Ge5lFC?1U%{}uv9emC zg+gvmWlTS+jO|CS1`h4;bClM(e<+|yIbZSjE1Knl<C>@5XqKVZxg;p$N3j`f4yYY5 zbx7d=(L$Yl#rwhTbM8*XY9BCpt~^z?I37zX<KlZ(b|3F;axl%8K%gg-MXz=prX{Zy zXj!P{SA6gCi>2M--VPVS8yI!@MRA84si69cFP3*W|3a|@Gp$=(%6WA!Y5kX!TV*J! zWsN%bh4+!>>nGvQYKQ%;K~eeRM3<x4(d=(_@*aN==eOLrf8W^`wcy#FXf6zW&));p za>!MtfxoFTZKigd0E4Qzfg8Yw9e7y)3DQF~pH~^i<e@J3G$t<|bET&cto%<9&L)84 zhQff;y{^z7z(ub{`Idih#G$Yu9SI3+!28-v7ZufXdVayD^=Ze4vGM1JFw(~{#N!x) zSX*U$J}rPLcetZ384ACs&0FTGE(Jr%f2>vq4?lmv<+Qt;ypwY}+pN}B8|QCscX)2O zybcH79I%b!ska%Ajy|t#)Hwk1b%(p%>va!-=x{sS9o`mae}@$oj;St}-R`pUErDhp za{p|=1*6mD?`gHdA7{NCYjd@_THx;{?}F3-hc)ngZk^+l^+iYk7w=b8vyTf9cY=h2 z{?04DPZ`@7+uR!3=I-L1cgfB+-r3*+%Gl=E_J*=m5N>={{roX?;T1o;Knp5!s$3DT zpD9l{y9#xFnGQe3h5TZzo8xGkwnMw~67X!g@A%Ji^u)@-8gm6o$yf4fw-ywDp(D#{ zOy};K?M=ASxwpT@%9u=so>-k<W3HB9c(1g^Tq}8X+w&Np2<gBp8(c3PDZ;*2y8&0O zm3Fu+JyE2kd9MbmRfK)j4WhbARJTEOVwI?FV|1vCKj*PoDC@r~|HlUA-bc7!+4X9n z%<#)POJo4<z;3I|xNH${ukN#kJ6B3Cv8DV^#1%W-573E7W&WGk>stY0*MZS4@e$Zr z0UfZj1#bk!&WZ;&fB>Mqw+C1EK)AZ+)d3aks7~yt&JuPbIO^aMHv7i8J6wtMFX#aO zRLF~#_YH57w_U?;!yW(%;9N`rY!>GMg+vjsH_A^hKNE9!^Yl&#GB$mUy!Hw-Iv@D9 z3kX9o{-6L8nE$5G`ZcBt_ZBnt{u;wk-Ee{8;go9mf;#u5_qUp_E8YnVKQUj2A2dPI zw)WROOSlcRc{P9H15ZF$y2JJ2S`R#dma>$4P5K_>xF2|5-GfF#Vmk&V@}NOTKjZM+ zS<025U`QzZcz=(qaEC14!e@|;1gP|MG530%`&YKI*@H8Y!(SItP(3)iI0b)Na3=L& z*K*1xE<EUcJ~Uq8y!35%YenT&ad)}6y0@~t=dM!CO%=_X#pTuFkxgjfH(>MdJ)n4e z3wRz?g|^D5%z6CD?Nv=+^gQ|C=FMDvV=y%LdwYk<^gdNhm*@{w_=fv5<cmD7ntO-B zp9C+neZk4OKiKUK`?(fqy5Pp%XVeYA1l*Ij_Q^M1HJ>5~P<Md7K$LTqMq__4I=5hl zt2WS8%{Pa_x!M-vtzalNx2&2P!5Vz~b3wOpAQ+!}j4xWsOmKTAhk?4<!Qk8zTUGeK Dq{|9| literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_display_text/label.py b/src/lib/adafruit_display_text/label.py index 7dd64a2..c00b503 100644 --- a/src/lib/adafruit_display_text/label.py +++ b/src/lib/adafruit_display_text/label.py @@ -22,7 +22,11 @@ """ +<<<<<<< HEAD __version__ = "3.2.0" +======= +__version__ = "3.1.0" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" diff --git a/src/lib/adafruit_display_text/outlined_label.py b/src/lib/adafruit_display_text/outlined_label.py index 050ceb9..80e7689 100644 --- a/src/lib/adafruit_display_text/outlined_label.py +++ b/src/lib/adafruit_display_text/outlined_label.py @@ -22,7 +22,11 @@ https://circuitpython.org/downloads """ +<<<<<<< HEAD __version__ = "3.2.0" +======= +__version__ = "3.1.0" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" import bitmaptools diff --git a/src/lib/adafruit_display_text/scrolling_label.mpy b/src/lib/adafruit_display_text/scrolling_label.mpy new file mode 100644 index 0000000000000000000000000000000000000000..6a62a3c8949058cd016fc34528ad2c542a3ab455 GIT binary patch literal 1126 zcmZuu-%s0C6uwSEaNI0h+lg_4x1_`kCP2bcnn`=u7_m^*F^z~)nn{x}7t>fuY|puD zWC+!XRt-gcnzX0=6LCws*G;4S7bc-fecDss`qanW{6HI0U+($NcYb{5oLdQlbTP20 z@9PKdp^3G9v*k4OwuX%(Tx=oNZZu5mf!5IXj7Gs}gDK`_VYyHSG&Y+C5cf>n)SXcn z<lox`z^@%_+Lqn`QQUS&Hz2Ot7T$DiY$Kbn2gEaNAZ=aBZ4A@^Gcv(w%fQ%hK~~f) zv#Dc48){1$I&@vb!kTIA8%IDUQ?#&lHK(Z`X{fHdIwBofAQC=4$$-v$Tst^yG=@up z?&n<7w#Y1&i2(N>&uK(=l)|)--Y`Jws$l5&1klGPgLiN(AZXh6M1-uWX#i@PYdAJR zUlo^bLC3Wn!^LfIt;^GceL?pYb6~s30G%DqGJY5@0S9o{ZK6`g*lB%QEIu%C{cx{< z>}K)uz{M{v|EprUi2U1T8`p`hI{v-8WS#=419Wh?aPtvfOi{ZTFCnYBjoHO*1Oq}Q z3xw-lbtWhTJs8SUGZRus2-R+<JQyb4q!bpyH4oARM<iOHYj>C(cJ{SesokNzy;}m1 zVMF}2m7u^>5%qI4v%s9rc`>y581{0fbZ_!B(xXo!fXxarWP}?%7|l{%KD5=p4k#hE znWqS%C}En-l>#f2Ah8nvK`A&yxl)MOB%376#1Q35VPey4nlO_C)JOCq_~xfSC^<H# z%ya1}$@{D*%d)B{Dwn?j{6y@@*6-dYU8?rX7pI>4B7EqJ>{DOl&K_<<{*`(g#^Z^z zGIf6Di-I4YE`wSXJ-+{jDo@WT3*MI=Jy%>>me)ScIty}Eu`*_1Ugd&uu?+rtQrYl% z*5{|*KD|(X?Qn}epIo7Qp1V-*jnq?w@%fo@phhIwD)M=Wgx`)cFVwAJoNz<B5ZFFn z`))*4iSq(}7*7zldbR8w36-gr@S}L*+4FMXd@OY~67qL=sq@b_qBK&hqTNVTQapDz z)8`@TuFl3JWy$+-Vcq8z`-6G^R@eQ$2-h|)iFd>smL(Ohv%A{o1=PJi%O#b9*HaW( o_WyS|zfAo}ss*nvO8xQmh+tarei>9IQ9Z?^N#SoKDOpAT0uymZ2><{9 literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_display_text/scrolling_label.py b/src/lib/adafruit_display_text/scrolling_label.py index b4e4e0a..6b2de71 100644 --- a/src/lib/adafruit_display_text/scrolling_label.py +++ b/src/lib/adafruit_display_text/scrolling_label.py @@ -23,7 +23,11 @@ """ +<<<<<<< HEAD __version__ = "3.2.0" +======= +__version__ = "3.1.0" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" import adafruit_ticks diff --git a/src/lib/adafruit_imageload/__init__.mpy b/src/lib/adafruit_imageload/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..d2e160a105b884f4f9f11bd8779bec0b4fff8c53 GIT binary patch literal 921 zcmZXRTTdE66vt;5SWyth6}MVerGgTSfz}!xnm$+-Me$PTCC#>)?ZOVYDSPQK+l2H5 zY#(a+()2s@U9{TETU&em68$P25Sw0}&dE8yIsbG1BXM9d-gi~i)CzWVqUeTNMKw#+ zQi`IRw4fyI1_%z^a_kxcaFrme5(@)(-6pzasx{zU*XyL$DN$zNwn-bnPa3vvR)Lst zDiws0b_1yz!oaOtAW%?ih!6z)8J!ra4R}qj+cmX8d$C?mvdlWcPPrpCb&CC2n)v-f zp+cw*{FjpR7nAeAUpgHbuzMQb&NaY|OQ7}GTSw>t*o|`~!v-$SHVwd4^$MU_6>JEK z@(AHN-Cj`uR1}PCi)N9EUPFq7l}<EO1A&<hOLJ;y(;~~3V`@tn(<NKdZmMM<&*Bat zcKu2!Rn^IkQ%aUCBXwqP>e`vll8(#N??Qv@P`TBP>+5vSBz*)pHnRaZrT{osZgm-W zMo&+QsJQAF$RrVr9y&U;lmdH&O$yvL>yB+(m>@0E{lQ4Z!iGw~UT9&0xxd)-O-(-c z&duMGV%o}96SB|+-OvL$*f-0Cy&@~HqDydzZow^j1dqrGoY*Jy$xYZl%Y+BSexaY{ zKIori!-Jwv@QHrGFSlR-25AL~0U;m;g`k`txHB~IGb_n?W*ZI(lTjc<Zq9)s<V!_3 zT)GT|P_fLs9DViTS#xncbb%jkCYs)v%u+NKHKas7GaZj7){=>}R3e(AF&bY>wzJZK zq^^uKi{ZgfZ7F*=?Ei4k3BHe1j-Tqu@zH%gw!mid{PaE?Szu2xnf;U3xkKjjQAl`_ zX1*MS&Nb7Fd>k5$GHE7Dw;!XoofpTx%5OrUBgnVm@Im@1Q|=HfCGNIhxJ!h;$!{rf ye1@=H#6^*ETgve>QTGCaT2So5;&=Jof8#v=vg2KL{D=JhFP6^Y=&Y^nV)+-JBLV>c literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/__init__.py b/src/lib/adafruit_imageload/__init__.py index 1abb630..b51c552 100644 --- a/src/lib/adafruit_imageload/__init__.py +++ b/src/lib/adafruit_imageload/__init__.py @@ -30,7 +30,11 @@ except ImportError: pass +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/bmp/__init__.mpy b/src/lib/adafruit_imageload/bmp/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..c44a6e7eb9f9d92ade6b70681251665f83a555a4 GIT binary patch literal 1034 zcmZWm%Wl&^6dmW?kd{dZ<`I_~H&syy2^16|Bv46=fYL%!P$5*vb>c}f!m%xT3`A_4 zzyh&Ah$TXN0xIv6*M>)-1=bW66`#S5NmD2&n$6WY=iYPfovaV^4Y);FkxQnHiG-_i z8L7IgqzY9dB}rJLpp-OfV14k6ZKw#qQwG7hCab`A8W9i}!xjM{QZukt23*E2m5_;) zNhB-C1Rkt|o(Wk+gdh;gU{aM05K*vYsB(>R@l`IXYZfu>BGFACv}ON7+x~V))CgH1 zv?n>dJ2?zOh4#oEW7Q+j$_@e+LKi`OXZ>n@+E>73;G>a1uxuivfj~jE5r|MbRMb^! z=<dOqg04`-I4en)kZIBVBnd!CGLfOvDp107^ZLP}<Q=IHVps=KsWK)NyO1pE)zqKs zr4Ii&V-}l5dd`U&snAi!TSpzE!IHEIc#oV!Wtrehh_4`At`I&mKEbyfEM7Jdujz!h zY{Sq^f)rlY_=1g9#o{khL)|94s%vGe(K&r9%Uc(Dn!zxU)r!sA+TUJqBc9mG%#1ke zghPqp>1<p%HsL@QbVCpH4tZie&c(VoH|yp+tcUZm-n;|-Lrg5d`B^`$yI^q06<f!3 zv0Yq{4dxp#1iLBH!-d!o*Ufh4M}ud>+m^*_ew4WY*Ry^7faOmoKn}t}4u%VR0UOB` znY;Ybog2=`xyW`Hb_6Flm>N7am=ewlCuv2Wu&Y0@V-J0~fulnwjG38%_=(x*hMQ?7 z9}%L_+33dWX$G=s*ISC->OkL7^iBu*{#f|`<`1J=&PMu|#mV{Ofk?cc*~dID<>q(z zFVO6C!o9T#jkeoIir())KT-6-8oHWnA-6bpZAtv;JQ4Q)5WhPKu-Lr4B#MyDWZ<UH zv`0w)*YqmwdI>jAwTJ_q#FiD}P$#i<YVO)M@hHvj+Q*<5&XPFOy!}I*uEQApIF5^b w$-j<9W}iNL+<Xb)!*s(}Y>C81^VdQh_O57pzvkbxH7}ZTR0PA1(%1dP-{CGUi2wiq literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/bmp/__init__.py b/src/lib/adafruit_imageload/bmp/__init__.py index 00487b2..0c87d4c 100644 --- a/src/lib/adafruit_imageload/bmp/__init__.py +++ b/src/lib/adafruit_imageload/bmp/__init__.py @@ -23,7 +23,11 @@ except ImportError: pass +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/bmp/indexed.mpy b/src/lib/adafruit_imageload/bmp/indexed.mpy new file mode 100644 index 0000000000000000000000000000000000000000..68afcda470eeab0995f41e798dc913907c8877ca GIT binary patch literal 1666 zcmY*XO-vg{6rQySzmBtBn~f73aO`DGz_AH+Q>iC+z5FF5!K8$2t9E1T!Cql|-Q6X` zts-`fRiR!Y^;W69wNj-X3WT2oOe{s}PZ9{qp-PZiRceKLOk)tDCpwEEN-uBT%=^Cg zz4>NBm7uBJ$V6h15ot_Ncp(*u!=xCA`G->(zmSf>n=t0fWWljYIV*$O_r@|w2=L1p zMG(`GBrqx2jF6542QxM@0wow5fRPxKK!qRzbAKcW6$JtlBPgjz1`shp&LksQRHF`R zAu%m0(pXdxCEzN<UO#Gl#o&<;l!11O9NurHh+<L(rgOfIc3%fDl@EbAb0Ar*-vLz1 z5RL-vQ!Q*xMQ+N%ClIuzVLYM;Hz1#YLOh}H(FBZ+0tad!^BE}d8Q~^O0y|8?6ih4p zKB+^3H=rcLa#7}mG=ESB_QR4Sj?18WL_qeCQ8AT~pe!SgfH})ck#rn_+HoPKB!Ddj zqhbv55(4%)`SRerglrSiiU>%a*QF4X=K;>6LPkWHsXQ%WN0bOJD-lTnrl^<{C0Un4 zD<6Xy)LuIxYnYa`rC>^wvNr@c4k}YZ8XO5G6eT0S?f1t8B{4SaLo@mhpWXk?;roXK zDT@9<e^yDL33~P4@Gf%Fhe)6jfLcQpcCHHR_}uHIvFky#uFKWo?f4+%8XTcwx8rKK z!9W^%SQR(o6|IJbBMu{JbX1TPoQhYrVhvS}O0p8=)p!l6);g-mYDW!O!{zWg+=Nb! zI_k(ehlw<C7ixzru0PlicLDpb$E@OJ#6IRQlWy+9(fvvn7be}Ph~p&X24wRUF9_q7 z;V@1NzX3>V2S%O_M-5-MfB(&t8q6E4r<}B><xHc6P}|j`E~>MQ?sheaF3RP)*f-kT z=Aq9}o*qwgv%Ayn3DMNJTIKP#G<SJC&Z}?HDd)$|@WZ?8ntFFGfIXbH+3w8cx3|t? z+?>itLyx9y_4)JIW1`iK*~sPGq|Y$8tmX8mYI>a1V_U^}EP&lxx~gqnd;eLehU3Dk zi|h|MZH-}9a(}PQ<yQWE9(t27SdY6V_xAQCp0oWLZbuilJM2%m`?CS;!Qu?jhSs@& zaaA7z4KOn`zq7Nh$6fU|mMv<V>&3jD_7w9d+1gy!R{qhpXna<E&i2is%rZd}6SS4- zQ)$b7H=59B>w>z$?x}>E9U|O?Y5c@Ielm|Y4B(D|z?6Yw{!|HXF@VuF;w)vM2+A5T z@)s}B_0u*pWkX{ieVU}|XSV6%Gb%GWMB6DlMefiiC>wQRaB5!P?P{g%t(O%3f<8%| zEKtWOd+ERnoa3132`0ASHvG<hM4ZMg1^m=B-nf7_mDO5}xN|1(IpCOJ;a;mD`c=<{ zEoV4wIn~(YRKHNGV!@H?nd?E?#kfDKW4jaGRCBjG-c64NWA5Ilvt=acx#Ui^^k;+K zD{*J%WR>siwdS+o+1$pDgf|z!ej>c{Y^O^DOvsf30qo~H?Z#goKDzr@U1gr;mglw$ zrM0=j){_~Vc>&#aK^;VP{i-c!`r5m^RMLSD^u4yhhM4biD9dfI*ADOnL@2E;qr;`` z(qraJ9k@Qv_7<P!cAnBW6Dra;h39q=xr@TJO&TYBi^y#Y;!_rt!qN9Zvh(aM!e6`} zFzh=_P(*GQ$@ed!WM?q{a(aa#N>`an<^Am!<$d|L=??RU<jX@efk1<=1H2qpD3(^4 zzf?3UZJlRjG-LiH3b$Xh8PL1?DeJ!S03xGDMcV)4pFsjqgr@6XA^UV>{p%t=Btlt{ R6HD9ombRaTzP%NW{s+RbMsffE literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/bmp/indexed.py b/src/lib/adafruit_imageload/bmp/indexed.py index 044cd51..1455eae 100644 --- a/src/lib/adafruit_imageload/bmp/indexed.py +++ b/src/lib/adafruit_imageload/bmp/indexed.py @@ -31,7 +31,11 @@ _bitmap_readinto = None +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/bmp/negative_height_check.mpy b/src/lib/adafruit_imageload/bmp/negative_height_check.mpy new file mode 100644 index 0000000000000000000000000000000000000000..f04525bdca7f043283ba3ba43cb930a279216c84 GIT binary patch literal 150 zcmZ=}V~}TIic3sMOe-qQEQ!y|O-xVC$xlqtPs%OO&r3~DEXgcOjn7EUOwTBZPtHh9 z&ekiaWZ>7rD#gG9QOLl~Wn^e#Zen3<W@66HWnyG$Vrgb>WNDVez{Qy0(7<WLAjTA! e%-Cok$j8Loz^|aDx<Q%YhKuV4Wya6R8<GJdzbwiC literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/bmp/negative_height_check.py b/src/lib/adafruit_imageload/bmp/negative_height_check.py deleted file mode 100644 index f16b79e..0000000 --- a/src/lib/adafruit_imageload/bmp/negative_height_check.py +++ /dev/null @@ -1,19 +0,0 @@ -# SPDX-FileCopyrightText: 2018 Scott Shawcroft for Adafruit Industries -# SPDX-FileCopyrightText: 2022 Matt Land -# -# SPDX-License-Identifier: MIT - -""" -Check for negative height on the BMP. -Seperated into it's own file to support builds -without longint. - -* Author(s): Tim Cocks, Matt Land -""" - - -def negative_height_check(height: int) -> int: - """Check the height return modified if negative.""" - if height > 0x7FFFFFFF: - return height - 4294967296 - return height diff --git a/src/lib/adafruit_imageload/bmp/truecolor.mpy b/src/lib/adafruit_imageload/bmp/truecolor.mpy new file mode 100644 index 0000000000000000000000000000000000000000..69597cc107754d7ce92eafa0c7991c5967606025 GIT binary patch literal 1353 zcmY*WO>Ej`82*eQ5Fo8F#398?85l!Y%3lZ}>xCMYv}voAW-MjZ<QXtv1+axpHYTkx z=?*#U(EAR%S34wGvbEixR!wTNuI*umwVL*K*fCm`MZ0F7@tSIq?e~2@KhN{N-}7b% zz{!YZmaA~pc1KWHp~=<whR9W-rKS{B+8w?uHpF&B>Vo3~a#se{LQ4=^0DDzZVB{LW z`dUY7@W8HgC81RVB-5!@`8Hp<%ySjK4UB>ae2kzpIVmf)WT;qH#5NeK2(r}Rx`N0; zA}<3ntM!49WxlOIo~vKW5?6-WIv?OiBw&w660t}E*e}m9Q&UrVOzAP5P6K<X-x7?$ zSQYq2g{_M1CZ~V_I2y3l+C1L^mQtg`1B-TD;1ya@M`8Q7)w>>Ra_`8(yF3WD_!_4O z%RF1>g<2hg>U?<#SY)1G0=@T+mGz;)MS^AF^fL5?WdX*rZC(;#7CM^Yxw;Ha9Gx~f z8LCwU=%V#)p`z4*U2g<j6;9z;S>f6WAo^ss!b=c9{*NpJR_-Cat|?Pj6iI$L8m$RR zy;F*m#b)%`YNKbK?Kms6%W&71x=I~RdQRK;1!zG8l7JO8n<nGa$)p*bnMs%plW~(x zn~z=QpjR?5+4M1Vi!^j<GMP@Bjfq%1rNR40Q;BrUY>B6)<M9;CtjWZ5IzAJNrDG-! z^WQ?enyj}aDqguGNg`Z2+>60%NF<?5;sfJE3VAD|T4#Ofi9+@YmGk-nbNy#2^ZuZk z_ZSGn*@TLrm=QCDQO^L05-4dTjHHP$6;;d}Mm!eMOqh$S*dWZU<RCFvoVPAIPX3z9 z7Uz*SRm_Iju_4GkM%oA)X(#OD5HVE5juT!#AYPm>_z}OM<ghz2KU#v7QLh|&Wzs7g zR$-LzB>>@Cm;iaqS(-!$cfM@6ZaIUy{A$D-r9;7WY`CzF5%3);gwbzsAA26VyXiL+ zHlF5Q+4Q4@G84&{KRkQ$V^z&8yQu&j42?V0jB5A!Dgm0NbK`;F_{F6_G&mced^sQO z3!VxEW<$ZCKXlql1?Fh_Twvk!)%?Bu{ZDhhui|zmzO$YG<%e7mcWoz;@9t=M?#>P~ zhll+GNrY!EY~6U8n}a}XhsoeJZ1i?=72LxO&J(`thlhtNPjZ)fm<M|2Aw3U@pKm6S zyZF!s{t`?eU?qv(Uw4t8q>$pq*4jS@-*2i<a`T(LzaOqVT6xUOs}K9gN4>}R#1~0~ z#_&^Le)V+{WzT<$(2jN23ls*akV)f|W8;8!Zm7&hy+ztZxhVXA9`4WnKviji!c}H* zkshH43ZsUpk^RCNHFB``8%^~7xbnu2S*lpvhW2hldv~{?zq_=1%WwWUH%qzK{-WKG z=Khl&Wn}HT3z|eh`}Cm9-Yz`9s#UA|g&TX%kNYV2^E1~NHJU<hQBKOW|GM7pr)$L` SbNkvY%`s@61DX~#l>Y@vYm|Bb literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/bmp/truecolor.py b/src/lib/adafruit_imageload/bmp/truecolor.py index 8f17b79..280f19b 100644 --- a/src/lib/adafruit_imageload/bmp/truecolor.py +++ b/src/lib/adafruit_imageload/bmp/truecolor.py @@ -25,7 +25,11 @@ from displayio import Bitmap, ColorConverter, Colorspace +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" bitfield_colorspaces = ( diff --git a/src/lib/adafruit_imageload/displayio_types.mpy b/src/lib/adafruit_imageload/displayio_types.mpy new file mode 100644 index 0000000000000000000000000000000000000000..24ab0e58d2d3c1d4369cce12635c884e30d1f0c5 GIT binary patch literal 331 zcmYk1!Apcd6vjtaw{5dcJIrN;VB3?sY3(s6s_9TtumwvP#5Aj>1L_Pq2Hxz_zuCXi zNNvQsy!Y{akMD>2;9#WqBqDERO$DYoN#cx=$ct#jGty9oMZ@FD<qg;~5y>*L&SGFl zkroLUElCy&A%!a{a>Bv>Uk(^2?&8>8fRD53uM4rF5@j6<R)Wb-;J<VaF@BHBin0P@ zU}9XxoXJhUNQL0lsplnBr1jbjS?+BrdzYK;h?b#bST-V+4{ke>J4xco5cnL-q4L@q zllkM(Gn(F<x2EbS<DRWTHE2!E)E#x)w>7BQI@AM8wFWcA(j0XKx4Wa8S<jNL6&(7* VCu`^H8U?=cVs1g>5WwAs@EcjsUH<?8 literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/displayio_types.py b/src/lib/adafruit_imageload/displayio_types.py index bed5efe..e809927 100644 --- a/src/lib/adafruit_imageload/displayio_types.py +++ b/src/lib/adafruit_imageload/displayio_types.py @@ -24,5 +24,9 @@ except ImportError: pass +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/gif.mpy b/src/lib/adafruit_imageload/gif.mpy new file mode 100644 index 0000000000000000000000000000000000000000..3b2c1a31afb28eada9a46a913d411f9f386bd8a4 GIT binary patch literal 1712 zcmYjQT~iZh6n-~frXj>-6W0ifESoP9Ac--?k9InAiSngD6i8R6jmu_(sUeBUrWSkQ zZlx7#r_<YB^rH8@NP<#PxhRMT+N)kT)OPH2hHEhXfu1DLaVE1ld(QKo^E~Hyw^xVS zPU-`EoKNHmNhy|`=BLC|hL8KEk_m5i2JJWIrCdRfkYTKlO^FB}ki;A>WpW4~$x6vg znolA9*<@ZqMrkISOiv+-EhG|RPK=)y`M8)vnq&r<M){N|Ng^_`NoktTA|js5XH)zP z)a<*p-b}ha3VJhj*t@C2|DTA#ATf`ON4x>QH-Jpp-QL9MbbKTc<|Q7P&R&d$lfYVE z)q<2SjfHfU7p@}X2mSpl%OWzC19q`Qj-Linkc2d1>dDDeMz{)8M1C4sQa7&0;-Zj= zgY@b%mJ-v*xSO#NwNyTNLqrxKCGxpg9Vw>c^~g|t&jSq}Hl#GpoFikg&&6CG78i>l zJO&f98Hfh-i6m^-I9Xp$MpU#hU-vP6ysAb?PJLz8*E%avZO;`+%H~h`z#-{MVbUvP zrhR+<`99h+vNxF%z|hed=?aV*sM>lKR^f$1NT=%?ICJ7SzZ;z7k=8Vvk!YTVJY6HA zJ+!-3n$JxYrp2^G=frD;B-jdImXFi5EzwmgkoM3(8g5037r=iy4W06ZY&MgV0IWmk zuCdFHUG9+^&M+T#1upg4<9GeD2WJge={s&Y(xM_&{i8Cj#x=MW*LgH8`zST3rZl96 z(vn(AN9s5k*L$#*_b5H7huDBOcvLM$%0L>Z2C{)u@J8GOnf+8F*+`j46E|pxHaTC1 zd$~dE6C5X9Hbiz@=t2>^Y4Ru{Edh+Q22^D8SU`;vP41wYB*p?7+#FPq=75%Li3qyy zvp@bYC-<-xPiK>Cmkq8?mvh8zb9FeJV~nShc01gTfi5TODOwJE6T(*JZJ15ft@`_q za39fSQwK4TP+3U)Ae3*1u#n2HeX{y=ZEb;3(6;<n_*%KQkLb2(0H-Y6-c~9*&&m&i z*!lyRJr~`8L$^ZM;=>7L>*I?rd%YaTvXS)#M$T@}zELXAOZV<8k9L%|LG=rODj`fB z|9$C~&F}zWEj|vaI5xTT^JaK_ueL^biRNMu3u0^R$P)AZW|(CMfu$Cvvr9K0FM3qM zxBd;>YxQ)>BQ)rAxjUSGH^X=xopuLPQ*sEp-Ki^CUI8t@rl+c;kMP-a&}dKDr@MOA zewEpw=xSZcYF&t*<Muc`lh@@9qNT>`K~NPNvOj+m8)|*=xKv)O%s;GnR1=HJ*81YT zSK%}A`a@-FgKcM<Bf_oG#U4wuM^4aS0pr|j_ghJ>s=8E?+2QE&UUrJB&+Uc<9*78E zARRH6ZSs>xaDog(gs(IRH_u5uv-<euTGmVk0*E{e*TW9iqctL^Z=q((;ZU1=-R|sg zI7&rpn^M{-TIr&hRw_kndnYPd8QZ?1)mF6FLx_W>c)Q6Sl5f(Ej(XnQRz*^PG&7Ni zS2Yn4?&7SsHFRA5nszyDE{DtG8}4=l=wp3udkH#&k@ar2eFD6<Z-!43L=cJ9+RN}D z;VpH7m&@#DCE^4$4Pt<){23mGxC(!(yd7U=&lSx!_{oY_HC|bUD109376(M-dNPD@ z@0?dEO3_U1yb6!P-*+#8LexwtTNkZV8Pt`9xsHF?u9l;1@=vsrVVn%jba>!y_%6_6 zgt-KC<dyyjA_&*)N&hK%wQQzjHWqz)|K9u?WqV=gpVfI~Yh`}!Rk&YXsl)2tP#jmb jwB8S4Qyi-wB%%cIIy}VH5FC2~zF+v3iDSFpazywKxhf(a literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/gif.py b/src/lib/adafruit_imageload/gif.py index c3099fe..e35932a 100644 --- a/src/lib/adafruit_imageload/gif.py +++ b/src/lib/adafruit_imageload/gif.py @@ -26,7 +26,11 @@ except ImportError: pass +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/png.mpy b/src/lib/adafruit_imageload/png.mpy new file mode 100644 index 0000000000000000000000000000000000000000..76f0cb74c8120280015804cbe897a0f00f8fc0f7 GIT binary patch literal 1063 zcmYjO+i%-c96ok)@zOMNT-PnD*Lktyq!*Gcgdp)SI>%d=YIMogt+)sUH$H8xCAMWd zgMb9KibQ!p;+el<?83Gdwn<~_1{*x0NN9WFi5FC=NxX5~w7@x%f9HJX`@Y}B<p?;! z#|o;ZF57M0t?Mmy1vX7p%Ui}u&gy`Jtkhm!hBnmBLsf$|2<avu&snZ+8fp{7=G#^i zg1FnUbYlf1s%jIuE&?RoZK)QZG~Kb9Y6ppgy|=PyIIi7pxTXzKJ=*`Fv40hHWC|S+ z@38^#QBz+6@#DF|v0MQpti4P`P%ZF3j<*d<ZCnP#iAvD{<cUf}3Kn>aa3H)4{4}k> zhS{=g=s4hQre41SZ3i_`uLH7Px1nXC6S1rZ-7NKrH+`&5w_wY(J6Cl00SHg8x~}EC zna{82?rM7}hy3#UqsyP%pJ7?I8)%l*j=PHNE5St1q8f8Z1R}&2)w!90*r6B*C+19- zQ#o|!cGE^el{4~r5I$TnTxd7d2GqFS|KV_L!)aTVX}eGZkx=#Q{3#G-_vXpz24|SY ztGc1V5BDXARgq852jSG548lXF^(HcP5Yy%U^IE5;#<2INz5dixq3~{5JS}KvWRJur zu+csiXK=+MLu7aYAC0gfCd7uBFhZgvfsg}il!>wgLnuBOBl{5&XJbr^?PvOx+1Ntz z&<nY&%wq3(wb21)0DTiof;`BK@_=D4Oo19nF1-erWUYaHP5k}Ux;NcS9v&mTw3o<; znN&IzEUqAW#2frfb~2NmO=pC3=5;YAO4-TriScYUGdV6U9=}Rc>m}^Lbsqaoo}rHL zcoBoyK8h=XA8HS4kGw7KvG;@;pa)61M=jyU@E?EL<omj^yNeGY{L2!C@aW?wTaTVT z`}r<%I?9KT(|2CCT&5WK{a%#*@HY8ySHACEt38)zuhPRCehF73^V_u`{ZT%GL>p@_ zf4O$Ah&{aLN#_<s68W!{u$uyT$^ZSG#b3))iXv&7e6%ai-JnO%>juh>DN=QlC%UpE zUD&rp@v~j~yPr@A`js0cOiX@r`;LF>&tjiQ-M+Q+`S$utaga(0R1p*DJD#-VEr>(H zkTAF-GC}aScl>Q}SV#)P{$Cfx5n;sZ%8S7j?ZNFFeo>$W2JPT{NeVhRfI8^adHqvG K5vZFJc;g=nOg=RL literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/png.py b/src/lib/adafruit_imageload/png.py index 55f6226..1505d88 100644 --- a/src/lib/adafruit_imageload/png.py +++ b/src/lib/adafruit_imageload/png.py @@ -28,7 +28,11 @@ import struct import zlib +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/pnm/__init__.mpy b/src/lib/adafruit_imageload/pnm/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..d372fff296efea44f075dc54dc7f130b9791ca8d GIT binary patch literal 1211 zcmZuv&2QUe9Dbb-$4%4rUFv!tbyqKL8k%HDm!&zNfs)v0tSzD$3zM0U>m*KNNMg@+ zkfJfk4j{peJAVMzu1yMTPzh-pAKSQa%3<Qfi32ypt-N+p*250|>8Iy;-rw{4Fo%Q1 z^b{}Eq`KZwOi^h`J91N%YH6+AN{gb>MxdC|x?m=FqoXxt0I!*{E}5zh;M<z1sBNhU zh)u;X$4mujg5@?M0OX`*Q*wZi+0~Tx4xo#jdR^A#+I3l~$vW^UDwy7qnzCskQBg5l zk_N&x#n75k7ja8tj#Jx)sduW5ZDb@n37!A{g@}w~1B5Q6GOMW!2vtTUr?s&M;migI zLzX`TxVF;*-ms>%M9HWs3Lu@dqO>Kw3wp7zR(V07bWGTH>=nDvwM*ocCYrjcwzSuQ zFIoj}QKI;ftQ%-@Q3OyFby-tUM${E&1C7zdHfG<H?bjy#`G#p~#;fV{j$$@Cl@uzJ zK0ZUbaC{F=(W~e#TV1n(%3gD>vxz21p+^AsY-OCV=7h^m$T{JX6SBZxC@`bxnd*z} zF^a+H^6id-Zot%4oiQ5-ahArYbq3ws0b7#ExJ~2UqoX5$1K?jMw~dabsk({Yxj)IV z@XiJOF2FGseL?WW<`o9B0@h??@%Hw1GINVts=ZmUpa*)P5Bebv1CWRZ<|k+m<)OWl zm-bOU+E4juoWkh<6`%=<5G)vsWAl@AkP4za1gGMj`Dr>th3F}2O6b8E2oZ9Mo}p%F zNI_vec=J^B51td&vG-w^T4n(idnXA>aJEu{WaToT=1NuUtK|JJKezH9&%LrTOIjB# zA{Jw#`FMOo+s-d<@N8=w*VxD#i3l5wuDGBZV#~?pNG8UuUA<T8r99<_yCl`iVL}2t z3dghHaX2x^VxJ88zpXxtv7UtIIe*KBr_mH==+i$5-;i^={Q;cagXDhhQ*X7;dWXDd z!?Uj7?9altNHDO<1G{`u<a0&mT+z8-gzsJ=a*caK{vTxQXK}~)FKdsx8cwo-EGF-b zirQK4ucasZ{QAC~#h$Rl1MA&BInVlYn9~LA8qiOL?@t)qhvWmNRU0n2^ujaYhnLX1 z<as-X{dUMs4EarD8YCC{ISe@;vXevpMlnAUuoG+u_4YfrTKwRUWO9HL5BT>6<c07> zc!rE*z(E#so}rbx`z-PYhkrgUetj3+&0Z}KY|8p90d~cWi67z8y?@hWajp6v8m430 literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/pnm/__init__.py b/src/lib/adafruit_imageload/pnm/__init__.py index 971da14..5271bb1 100644 --- a/src/lib/adafruit_imageload/pnm/__init__.py +++ b/src/lib/adafruit_imageload/pnm/__init__.py @@ -33,7 +33,11 @@ except ImportError: pass +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/pnm/pbm_ascii.mpy b/src/lib/adafruit_imageload/pnm/pbm_ascii.mpy new file mode 100644 index 0000000000000000000000000000000000000000..b5aa9727cabfa1721264d0409dce933cd9ae791c GIT binary patch literal 465 zcmXw!&2G~`6h^O|Ix&e!rzMP#Y6&T+D6%TM4N@1Zh#m1$foK8I8dRByJ&8xM<B>A~ zA~yB{o(Cu)Pf+>@s4G@ou;vAr3M$>jCtcm|+~ZZ@CRXp0hz#>769G%fh$b0{96nAR zK1c&H2^q8b43_IJraYm5o^rvmF-gD>GtR~%Fx}~JNOKxJqa>m^EU^rldnBPkP%vC3 zQo><1ViTT_ncNxMc6ZC}f_?#l@<Z8sf`i~K%_p)q2ml2^PI)GiK4g+uf5##bgAr3U ziUk;he~nH4AEDigh2WFBjx%B+o(}9VOPxz4r+4Y*u{@NHdovMB%%cm_$MOMN9zj*v zhL2+NhEmjuM!UQD+FOqvb_=AUilweCnJQMz3a<DC(kx}IYHC=MxrTJPy<*mI&D62( z@751in!oy<zpEUfI$rJoM*EiX{0`v8eyDsxzqQ+qmDOvl>&5z;&aHNPW23z#r=y&F zE!_79KZ;W~{oFFj9pz-+y1E0N>mJQJ%30ql-Cl9L_-?5$7hlRhXMNXwuqe+@=N>B0 P4`2QCD!zaG%~Hd^ANq>o literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/pnm/pbm_ascii.py b/src/lib/adafruit_imageload/pnm/pbm_ascii.py index 72eefd4..59fec9b 100644 --- a/src/lib/adafruit_imageload/pnm/pbm_ascii.py +++ b/src/lib/adafruit_imageload/pnm/pbm_ascii.py @@ -24,7 +24,11 @@ except ImportError: pass +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/pnm/pbm_binary.mpy b/src/lib/adafruit_imageload/pnm/pbm_binary.mpy new file mode 100644 index 0000000000000000000000000000000000000000..40bf2d094bab8fb606ad3a3a2a13666aaded47e7 GIT binary patch literal 615 zcmXw#T~8B16ozNFrL=V|(+Z=|O(aWAbtSu42q7jWuqB4iNd0OWVz%4vww<IOlkHT~ zc(YT9a_3(uAfR_@0{Rd1&MPj>O8f&(RnFCUa&pf5o;Mo;*JWYFvaO2S!PLYJtLoHS zmaUU!Lnoz%S;9@r?P{b8Mxu{9r0xLtfKc3OT6F+dspDF-<pPOz32s(_Y;-CW$93$7 zj%7P82;vrqZCQ1PQU^!|rVWdLgpJ#zZgu%gx}#-gv<wIjGy!`FF~3;Cv<=v8w%r@v zM5g)Naob$aGyybC*C8$5g)5jliN3%#tpTa#;A)Kmi7yWB$H;#{u>{z?p~V`dq<vS{ ztC-e0C9T|Q=ob&`OBbJKv0LT|Y;|dkYpo7)*x;Ttz69O`rzZt(*o!I))7#mUy_?*L ztSop?gaH^-1IZy-M4}u(0Xc|*1rLT)Avr9EP>A<o7*WM!R1TxC96^!7S~MR|{8-Kw z)`Vy961p-4&}dE-9?b$IWdsz<h$x;b2VRHSm?n*(tJlW8siLAxrl*u!=~OzUq*d?4 zJME8NX7j?A<E&x0iP-U+V6NZ%`u^bXNEM$Rva^%JJ@)(i^8F)rcIurR?f-=WFT*g9 zAs)O_#d42)Sd7IcyoI86BN0y|M@RY)&Wm%xC(l^Vf8N_aXMVN7&hoq8vNMHT`PIre sj8Aw=MNOaSD~$L%=l!?-&aa;zIc@m8^S(0c_x_>kGmhR9pAESD2Ys~3C;$Ke literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/pnm/pbm_binary.py b/src/lib/adafruit_imageload/pnm/pbm_binary.py index 1d52a8e..af402ca 100644 --- a/src/lib/adafruit_imageload/pnm/pbm_binary.py +++ b/src/lib/adafruit_imageload/pnm/pbm_binary.py @@ -24,7 +24,11 @@ except ImportError: pass +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/pnm/pgm/__init__.mpy b/src/lib/adafruit_imageload/pnm/pgm/__init__.mpy new file mode 100644 index 0000000000000000000000000000000000000000..d0e9e6b4c7a3860f66fddf122407b49a04b4f15b GIT binary patch literal 577 zcmZ9IU279T6o$`!<ZInDlNiU^EOkjr#Sjcu?WIT)P-?}*Hk755b+S8&1DoAtclIK8 z+bUG>#-C#2=O6InC+L-b#Ys{`gyArp_nqgwXF6H9zNYRGmyDu>ahpxZn0f(m+o3;c zhvP}xwwW&k`&KxGl6H`U9tHF?<Sg)s2ibkfA-~6B4mzKP%pZfXlZ-|*qV6+FTpEGO z0$Ax0k8(~y-(h@0La4Yb4m~mz+Qx;}3H+ExiNk{k>Py?dt@XbzY%z$&pbwX*mGFX{ zpXUaR#13Pi2-zpm6rSWqOhjH4i!sOclgUtI(qAmI*_rj*+ok}Sb5m@Rh?;)D%{U3e zAmY@8tlZn0mwS*|J0$T!B}0#zJTPPGyXNA@;OwA<r8Jjn_4}=@Bj-^sMKV&5iZV^L zmNjH78wyqo6{|)DXRH+Eno=!q<Zw>h3rK6qwM#|;7Yq$+)=Q+LqUfv`I@XOME?T?V zVfo7MZpYe{j`v&8N2OsOq2V3C<-Q}G_1?UFoj%ws<EyJBl-8f$ys^>UeB2Xfb~>n^ z!q4u*%C!dEmFO%Te4U*PzMVIuU)`e<R1q;Q8<p?Y=W6-g$4{vA9-$B0uN3FJAukNo Qg`xVx`tqMa02KlJ1820NdjJ3c literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/pnm/pgm/ascii.mpy b/src/lib/adafruit_imageload/pnm/pgm/ascii.mpy new file mode 100644 index 0000000000000000000000000000000000000000..fc6293c1f509fb78481becabcae47182ff7c12a1 GIT binary patch literal 807 zcmZ9H%}>){9LJxh8>4#>O07k<3UhCjZD9-6MH62_H^G2!6T_@88Kvz;W4AVI7ehSQ z%E5T@;$Puu8xv48##a<H@n$@E;_TI<6$VjH&-eNMUOwMn)&+**aGV$UQmrl<MY+P4 zB}L`Mlvb^zv~nfI>w+wgXbYg%bG5E15^zmR2EZ<9hOAb31^A2wO|F&!#nwwDsV0e6 zBwmziz$vSs=Q6KIh9LnTD;pJF1Gp&bn!+#GwMeIyRjayDs|$u&1EHO^zpcT&iJ}dX zbb$Uz2T(&&6ky%8#vE4O#f!G1OVVv%o$$}qWkoD%9WrrJk#$2*E81z`j0)faT9WM} zJa=T#m<PUjNiNSDz&E#(uV;7c{(uFoQ&z#^{2i+(D7>x%YVWHmYE1{YRIOK}8gCzI zb$ML?JcuOy(Cjwdq2tNX8^XiHxk(d4FbC$0I|5x4LL!udbWl#x$(fid4g=kki*(r< z#oTcu;Gs|wrQD>OTg1GW&vy1vUeZhXNFO)pDfIb&<g(l(yp_+#k?Es=>=}h*e_lWy zoo_yd7kdKKp}`?DI2((e4brg?ou;F)P?!!y5;RRmgESqArH7&oqBjHH<3R>|zz;KE zy+L4B27X)(gYP+(l~;+r49MQZLl{o%9|bE6%s>WyS|*5R8OUu<tgLRWvuJ*!otwb> z+sh2Hk>6a({WO=FEj+x;K*q7zAPzjW+gm34)hv8&n(QmH@Z}%eHil)#x0l5`IJk?$ zBlaGGw2^BsU&N6aYwOzeZ`rkb9JiyM*lO*091##JJ%%0}Hj@d^C{DRwV*|}!DS|yF zbo?{_`-@->?~lgJiP_=gNCOWy?Y!^}PTOyB3Qr?%-{D8v?RLV!z}C_Xn`{Zc0gzAd A82|tP literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/pnm/pgm/binary.mpy b/src/lib/adafruit_imageload/pnm/pgm/binary.mpy new file mode 100644 index 0000000000000000000000000000000000000000..99ffd7cedb4adaa69faf0448236856f37877500e GIT binary patch literal 669 zcmZXO-EY!R7{*TvV|>ZFW33K4n2a%HWGu5Gn%%(?7l_%|%&;2M9q0iX3$1O5A>Op^ z!WeJ;L-^F`yz+aS@zzVP{69R)a4|9G;yv&CJn!@V@*WVI2OCI6HKVOqlF~$VtZGQk z=&fc(uQxLlrG<>nvfcqx{=02m#emt=Ek$b~6?k^A1%g&bS6X$z=i0RzHn6;nk&F%C zRx}XWLMpZ_41zhuY9bv#Suu4Lb%>T2Yk93@T1LBSX$FX&+5R0x&o?A;2%ErriU+(F zR#o6U^&puvCdQ9|b1PhFE2=E%<D+-HHHGl{pD41`0Ko=U>J7qMIYSBkwLP10Hk}El z3~{U7#0Da`ju;-RQdLE!3Hb9?Q#Hc`&lBk|Wl!3^_|5d{gX)XeM!{xi#>Kc(uE+#W zb2RVbT)dlei#Fp)QISdB!+FTx%lJ}s#Ls&<FYn`g;yx2#f@E@m4{!lK$OXlMzdU{E z*Lq$oP!CI`6uol;aG_O-V@p-~<yP+%C4{)kS7yTY+}=VmnOWG5&o9OkON+@&dJRSd z@VU!QWx<!eokQiXkcYEfmg!|FfxK@AQqg}jVyE9`DKRHFzwh1unGcI%>3Fz)8?wWZ zKp&S*2J1iUL9Y*^BeLT<>9X)Ov6H;V|K-8hfj~(`ZiW7S1m}pKy-1=D-@i%GySZy; z`F>G6e3zoD`=A2Zt8sg6?|OQ<3!}YLq7N`es#Jt4^v6$db~qd^xdf^|*v+N;)jzJ- B#`^#O literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/pnm/ppm_ascii.mpy b/src/lib/adafruit_imageload/pnm/ppm_ascii.mpy new file mode 100644 index 0000000000000000000000000000000000000000..fa95ee33ec4224df9461da306d8cd65c1e4daaf0 GIT binary patch literal 909 zcmYjOOK%%h6h7DQ7tUlDZd)=mt(}aq9qeGHR(Q%8TNP;n)D$Hh3K}Nk8+*jqGn%;u zSuB_dLV(!v3-|?ow57Ck(N;hoAjArF#j5{-B{xlqxSRXwob#RYedjb|uviV9)jRs0 zJ2a_g_Vq5YY`s%;2K}nz^flcxOta#QU@r4wrM6nBLF&DsV-essC~<XayTHBUP}3gh z79_Szk3#GMp^%{?#~gG)REB$d#3h|~iQXYDL`)m9=XHxvN+6?{w68nBcTCT*^byM~ z9p#$#z@zTaI2e#SEc<`x<bMo}4I&;S4pc*e63c>^-eJ%q<YNe4&be%`Mtd$HnqgbE z>p}2Yus#Y0ZQ(VG={4-W^9Dqg4ZxcA32{B<Mbm)OG?zFwLvJPaOlCOsso9}D$n=QW z?J<M9huX8wk(vDy!46Lb!~Vfq2n1??g4cuS{;TO|qerRZy;7}qP1+moR@lhulbu)B zpDe#=x&}MK`4R0g1seya*kYzCj07=&uRAL_<j4K=QY*LkWqhS}$@oU%Lil7J@Zy`> zJ{RU9T$GD(@ltdlA%<~SjNphE#ZfVaV`3b~Ri8_i&_YT~;v~aqE>j9EJSC=aTFl^# zy3b{~ITqo>EY6B^cuqZ++L=G~cdMzMLm#%=rO<_!0MFMD#%&|??b^NX(AxazTz+ZU zFZ;=5sko8L7gwa*QlTtK#nm-llHupEz}Mjy9*<?DZKi&`B0T*=9jS`kzI(ZK=`vrq zA|n~y<)3Fi%ddv+-M@bA$8DB>Fl+tcj|Jf>E1ylKhn3+6Q(tj+ew+A;vGe;;*JJnj zBBKk>T(6@WH-9RHwpI3&M)2t3`+qf$tLh<0s_KnvrI7Iz{j(wA)Bfg1jr{VdLSaif zQz(|3QW<XXB^hpyg=0Y--I)o;>(Dwoojtm(^rp>?No#kOM-N*cOoS7BnR`}PsKHc5 zbta!Fe9TlDd|@J^FCMnu=2!R^7?e?0WqltLmA0XL|9RU$!RmTKtoRqpFxEDcx47pf K|5OF#jPWmx=ndik literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/pnm/ppm_ascii.py b/src/lib/adafruit_imageload/pnm/ppm_ascii.py index ac8ea8a..b8785fc 100644 --- a/src/lib/adafruit_imageload/pnm/ppm_ascii.py +++ b/src/lib/adafruit_imageload/pnm/ppm_ascii.py @@ -16,7 +16,11 @@ """ +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" try: diff --git a/src/lib/adafruit_imageload/pnm/ppm_binary.mpy b/src/lib/adafruit_imageload/pnm/ppm_binary.mpy new file mode 100644 index 0000000000000000000000000000000000000000..af2020337b757d40109ff6ed2488ae8049b22178 GIT binary patch literal 736 zcmZXQ&r{Pt6vsDdDW${`VqJws(6$0bra|m5>PgcwgP;QyrA9|XXtwQ+Nt;QxIvt%c z!GlLH{vrGlMHEgdg2K_!izogA{{R;Yj-#_PyKmpV_r9O~rURfm!HnpJUT|udXxP$= z$gJpwY?m$Bwk>T2mvyI}wCkWPbfadQ2=L=J!IiRZg1{sqfFpGqmy1ADYJ~!FkZ~R9 z26BKOS3r0|HxVHSa0(`tZUe!<Rom3-^ewUfmadem#Hr;;#R0KK+25(IKOGtsLRG+> zO%4tu2SIQT69fq|P2fEW=mx!15xNh&3)i5gJwQ&CQfeCDHO)bGg+{>wru?CY*dQgq zl@KnLDE~|YEo|?z&USd?UXzEtoPf$T3pqOdfTuQHDiLB=FUoQelTvLanXg##fpPNX z0|(RC$x|mM>ZC-~uk87Gm4YT|6L^;C?_}I&HxxVHKX@mdFh)jQp5=YKU-CtpL>985 z5Bfwu^s6o(keFz*7=Qs92l*C>jfTV^42mtVMV;kad5&fdiLJ0z<RGVxhH~vkeq_?> zD07z&Ll_6}Xf`Xclji_z%jTKqecxU%O53rH&Zy`nrl)&OWqRb{d$IWGekqnX)7ul1 zhkI{M%tiPi@Lo8c0w3m|{`|P$Dpqbo=n}f;BJHn+m=s-~R<tp=xf~JR2q#uj%<oO| z4Kb?H=k4CQ{WTp{)$G<%Mq3h2F7GvL2{C$VW8nez^B1A}U5Z(KJEaU{w-+<t-NpHZ zMwxGWE^_!K9YZxA=QiA(|5f9gLYz*DME+4;TYoLFQ|sRDjuLGktUXcHwN;7D{{mLb B-<<#e literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/pnm/ppm_binary.py b/src/lib/adafruit_imageload/pnm/ppm_binary.py index cada568..326435e 100644 --- a/src/lib/adafruit_imageload/pnm/ppm_binary.py +++ b/src/lib/adafruit_imageload/pnm/ppm_binary.py @@ -26,7 +26,11 @@ except ImportError: pass +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_imageload/tilegrid_inflator.mpy b/src/lib/adafruit_imageload/tilegrid_inflator.mpy new file mode 100644 index 0000000000000000000000000000000000000000..ccaec3574db759f783f906e4208992488e40888b GIT binary patch literal 1019 zcmZWmTTc{86s~UO0?mj;&ulF&t+dQQ!eC}tB|Ny1z|2HIK^S$wHZg5Mmov4@rPE!w zVD_OKRE*Ci{tYgQm)+TY^L}~o!8c7d**_qO&sNh+Vs<N)$~oWpzH`2+%7#E!Ja7&h z_?opunNBOXNXj*Aq!}%fqD2jzR<D&Yt63>?1ss$OYMW)eLTe!Le-V%_E}3Nl;IzqT zt%}Q_d6L=;NQEj-L4>WCv|0phGq_9`BOsEYtb$F@F<s43dvQO57y0NhJ{m-RP8}ae z9S5rKf#?lWpxN^X)CykYpoOcpi7is)lYXNHD}hLf&|-;!4wEjEvTm2KK`apS<hsv5 zd+|PP3hDZFV%glJt^=s+7BOpHG+!}w6Z3|MVXH`(ZqpkC$a~tou=~5={G|-C4B9+V zZT?q)e6@eoQ8&B#i+d_KQew=sPo~pF%1TS~sfAi4-FV3KXyY5Q)LP)*F|)!-+|q>i zDU<xdDJ}w%7#2?O9UPomvYBdP+g1s0Ml7{qSFQOmccJ2{v5)&kJoy0M>%Sj6B3vDD zq~6or!(HRqgfZ&mJ4Gb&vk5hg4?8dbgD?cc$v|hb5<meZh=NK8g_JM~YYuFI5^RML zUKN!V)S^g8Qd&`~5<wB|j5ODdKIgL98Q}^%fPRbv)RB)1dA^dN3nu_-%P$D`OaI(+ zg{y6ce(F>XA8`^6OpmE*?^JiDx38zaZ=$DnJdsP}mYr}<fB$r{Z`Rw%D;xPwx%>lu zOg`ktnA{Z?2L-~>54kD1DRyvUNEi^GJ<sGGJbU<j+k+Qnbz43<DCTCi^|R88M=|(# zNYFBane$$un-?ZHw(VgfTfFDFooM^o*Oxm{dF|_~%=ng5c)8^kUTr#s*PCwPjV#6@ zJ23hP%74Q4KVa+${Nd@)UE!@$k2lS(*6Y!Bch^aZv$yL`Ju17qJiOzhjg)s<-E}gT z=ia&XzuYe#dEE;db@$&(mp^8YY8oHs6W_1Zoxj~LoOsJ`<tP6o&d<Hy?>#;D?xxrB Pd)_fk^96@At-kOL=K@&C literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_imageload/tilegrid_inflator.py b/src/lib/adafruit_imageload/tilegrid_inflator.py index 8df1a22..3c424b2 100644 --- a/src/lib/adafruit_imageload/tilegrid_inflator.py +++ b/src/lib/adafruit_imageload/tilegrid_inflator.py @@ -25,7 +25,11 @@ except ImportError: pass +<<<<<<< HEAD __version__ = "1.23.5" +======= +__version__ = "1.20.2" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git" diff --git a/src/lib/adafruit_register/i2c_bcd_alarm.mpy b/src/lib/adafruit_register/i2c_bcd_alarm.mpy new file mode 100644 index 0000000000000000000000000000000000000000..882b011cd50c5d123ea1b7232c5f6ab8f898ec49 GIT binary patch literal 1740 zcmZ8fOLNm!6uwGgV^R}tWFri5LC6n`No+7CB<+I4mcyfY*>N1qzzA8siA7_{m1NR% zQ6v){Wz$7xy6!)yNkZDN>yQ9p+eJx-wkx{pFin^a%U)S=X4)Bz?m6H6&bjBD?<DQu zXnz~a7x`(WDr%g9W<*s(N>q#qTtO&u{4B4OBb9lu-+4OHA35Cz9GX~00FG5OQI_~w z;K<Hb5NOX<E3*hVwfTxD&47+!5of`-j0JG$a}7x<j!?moOR*%2Zixb774a5Qz>pv+ z0)D+Rua#tpvmzqJ28Am&I4XcD5@e}3I}c!4l&TuSma`;R6@0cAdC_#|5c(9K9c5Y4 zO4tY`lI)<_Ko*yr*=Y?xv$0q~luS#MV%P&ds>G|D^@IwXh3fP)F3f8tEb{Z5TH+N{ z1c!HhjaM|#!ErN4<2c|pr)AX(f^!OPozqH4!qeo7qNK^7L#}EZl8OL|5~ntTDOFRd zg2pwbi8HB<Oh&&`E1PxTNtQX>DCoea*=EC-!^Jd=vT4*VQ5=T{XpR+E0Xh6&MaC92 zlu4y0Q=`c|mjxrI28RbTBV2N9WPEHiHJatvOA~{M;S>wVT^^{VqCID8F1on@9A7Ld zNL7JB*yX}a+(F?c76t)hO17OZX<9}7C>os+wNkYZ5#(~TxkAyw<}M{IRmUw=o8yn* z7|?FF?P-c+v+u}evsp6Q>^rjB9J`v^9J`|1{5gKMis*7x)#w7ERrFaENdltfX?hk( zGg^t(=44<y8c=Cbr6pOTd0MSjDzc)XB0a5G{CV(|yE{zW7|{3n*&(K{dzg`g1;>IT zP=PH}$Ootsdb+EXYQ5O6!!~Gx_Hb+09&a1f=Cx5aubr~zb?68aU3<L_%7N{6Y=7Ww zr`q$K4j(Z|g)g^Hb)Ni#P3A8X*JFTk#R$sH7=Y@APPh+t!2J-y&XabkCmU;lWW0qU z(?Y8OjyYWsoxVZW@6{Lnezz@{h&!T(8py+c-faoBYmg)##C7jO^1;WQQR);VsneN^ z5pJD01E>S(Ffnn4pbp1cC>m#6aQt+aU=GC2P@Y5j6yx*z{QgkTe|LR}Wgi=Vt}mL$ zoAt%Iha%&T<3!za@KN1$P|q#ZJ)Y&d=TKVs_R9C2xx=xuy?QB_V;CmTlk!CvrpGtR zM1A87GZy!yeQMk{9t;JinFRgF)pg;((<QeT=fNNR(11sb-i4NY`r7sMnz61wtGg%` z;VWYjPvousnoU9HS|Sbit&uJZ)^ER!6VGbv`g80*wrHDd8g^I=j5HX}^%v&7vDIWu z!2LT66Kil@q&LzpO;&A}^<~}VVaJ-7KJZrGWV5hyC(`7d$IovhauEIxtGf<u<7A#> z!HmAMn{i?{+Qb^~Zmgz%|CznGTHC(={$*nPiRleJscmf}*n2OH4YJjJl=+%BR)73q z<;m*p@ZMfxIou+A(>F6f$IeFd?@nBZ#QcHdL!t2W<?v`=G%y|t&|mb1GC}g(Vw|YG zW-pL^zLq$F$aA=uIALt-iIJ(NWH<JfjIEsU=E~Jyl97CV(U@HGwJyJ3UnYBg!$pvN zSZGA{xQ{LO63<qQU)fKvBFP=x6en3r3>r^Y^jGYJ>5h`_MSar6;Pt?w<yMSWO~}`P zmU1h#SM0dO@>>ut0KW_2CR;V9ebu@Q-~n#M2}U3I%dE1tl}lv*b7P`+FnZMt?%ZTE a)@{&AYVrrn{o0qufA?|B?j;&~CHxCXi#~Ax literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_register/i2c_bcd_alarm.py b/src/lib/adafruit_register/i2c_bcd_alarm.py index 178d8e1..a1e9098 100644 --- a/src/lib/adafruit_register/i2c_bcd_alarm.py +++ b/src/lib/adafruit_register/i2c_bcd_alarm.py @@ -13,7 +13,11 @@ * Author(s): Scott Shawcroft """ +<<<<<<< HEAD __version__ = "1.10.1" +======= +__version__ = "1.9.18" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" import time diff --git a/src/lib/adafruit_register/i2c_bcd_datetime.mpy b/src/lib/adafruit_register/i2c_bcd_datetime.mpy new file mode 100644 index 0000000000000000000000000000000000000000..4ca5d752bf25244f7b933f3fd4797de2f412ae50 GIT binary patch literal 1141 zcmYLG+j81g6g|Q>h%pF6R9~p=0H!v@$ic2B?Tgz$-Nw^SgKr&XnmG~D0hAPpkq&Wq zLc)Z&?L&V>Nj@PT(oe|L&h*vY=TPX3Mp|oWU)L_pqBSLOr0Qzj?idu?q+vLe*oslq za81*(u2Mpc7Ads5C>p+B__A>S0SYn&i9fZeVVUZ$D0td!6BMT1wqZ6<<Oc&PfSei$ zn7pLKbRg70tB;DMGI?QWq-+~6h>Z?4!`7g4yGxsviANa)orhqZ$2chauv9L?Ag9pw z_`eB}$mT2743i<lECNI6aII6XL)qj7A<uQSi>-RyArvi-xkFVOXiIgTPj*8Qj2nbv zj1p|^QFD~Nuwf5Oo5TcLRNXMCg(6mmVq)q@G)z3IB|FsaXcTi#pc1r$N@3apr15VH zW{d!DS{<8%3z&?976UA_WsO3*M72@>k&H2z!z_bRB8L8L3($}KZ<XyY`qKLNOjy-* zn>fz@`_&EGp~w?vt=cn~w)PAhC1~cLNom{pN>LgHZFXt}&1xy*qbuKxuU{J7;_>Jf zW2Xy{gJy%bz23pW+}bS~>iLxL^lLYiDIcba`7>=090bLHoJu1(?N(N%<f-rTt~f2u z<N_<R$!U2yIU~<hU2!fatOS#D@*Ln0;5*5X9I77O`8k&Pt6Zuc2~Ubh4i^P^;j|bK z=l25gd_|k`(7kYY!%aS2_lN%A?~gYcQx-Pd3|D^t=i{~3KMls`ukvo}H}PsImX$vf z=jF{~FBdr3MRKH)6HayoSt<tPB`A3Lz#j<9k*(b4F}JjtO&?~;@%+`E;4ens_)^q8 ze_K9u{YCL%*@O2xe=(MZfANa;$L6h&k+!xA?n!n(v%ahBDvFX)-bjh>?!JGQxC_bf zh_WYs;_VLt)ygkV;!}ymco@{zXTB7FefD8bNd5WvnoC0_4VlF0D_;_Cm^7G3myBLc zXrIykgnEp66FPwWYbL!q``}Bln?0e|%Z2s@?ds*h>eANshTGW5=TpZ!`JHTh;jOd` zqqsc?je6&duYdzmw9j#p<4cY|g<{v7^A22F<(yB<`5Na#j@My9XwG&%XVxrK;hne# Ld|zOeRJ4Bq)KgmQ literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_register/i2c_bcd_datetime.py b/src/lib/adafruit_register/i2c_bcd_datetime.py index 0a23ffe..4da6cb3 100644 --- a/src/lib/adafruit_register/i2c_bcd_datetime.py +++ b/src/lib/adafruit_register/i2c_bcd_datetime.py @@ -12,7 +12,11 @@ * Author(s): Scott Shawcroft """ +<<<<<<< HEAD __version__ = "1.10.1" +======= +__version__ = "1.9.18" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" import time diff --git a/src/lib/adafruit_register/i2c_bit.mpy b/src/lib/adafruit_register/i2c_bit.mpy new file mode 100644 index 0000000000000000000000000000000000000000..53762b9ba6e99bd7564a87edd81f375bbdd7644f GIT binary patch literal 801 zcmZvY(M}pc6ozL(5LSc{aEh{3E0#9IvK6VpUbHH-RgzXg)Dml^u)DxmWy$WKA!(Cc zstLXgN^g4IH|Ptr=?mD{r0Hb`s7)`LOmfbgobNy9{7E~Qyu&35a-pQv3B{UHCOTC# zk;EiiBs5xU0FP@fx)_~H0JvVGM6DJMfFswaDFD7uvkI+iRp6qH8mX4S#9AzwQjUnE zq%?A*XyB<tG>Hk<8nmKTalb7p_gb*r>(K$9-B}@&h4pR-K{gj37W6m3RjijvOvO=b zPzAU#E-Msc;O{Qi*8t&TjZg*Cic)3E7i3bUDsZcHij}GiAgN-V7Bt$0^&Z?@Lm0Ew zban~Tf|y}7m1WPxdk>nvscQ#tL6$W|*MXg_1BAcjV<OWE@E+(zTq2rIfyvp`;y#;M z+-K)0;9c{{vh8t&(whEI6w8EG>cyy}9*Wl{i_6z;C;R4X^v%is@jl8JaQb$3oO``w zIA>DRi7n|&gcgKC0Nq#(8_)^|pe<qz+661J3Ik|BupwLCfP)b(=nw|cU_Q<7j0C=< zlKC{Zmx}@Dj9ZX17vms5;*47npOGxhoWtvEjTx>pPs=$nhQ^^21<h>4vN;dXP$t4{ z&U45Uvmk#)vYvpCC*1guaC2gE%9y<y35U|=MeEo1cEIJmWp=LOTsts)-u4X}+aFTt zi`Gx`svU5ztae!XgJl`%ed3aX9$`9UEQS}(eel`nr;dMw5$r*)34P|mi6x(TwdbAb z72R8HpX)NtNvHQ!<QJxI8;`>Cp$)N%F8vR^NNx1NmtFGf?)J+1KmX6)cDFnJQC3;t ix>GWeISY8cwQBIa+j$g>f$phXCFtsn+w_LxK=}<K)a(lY literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_register/i2c_bit.py b/src/lib/adafruit_register/i2c_bit.py index e518957..3d2469a 100644 --- a/src/lib/adafruit_register/i2c_bit.py +++ b/src/lib/adafruit_register/i2c_bit.py @@ -12,7 +12,11 @@ * Author(s): Scott Shawcroft """ +<<<<<<< HEAD __version__ = "1.10.1" +======= +__version__ = "1.9.18" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" try: diff --git a/src/lib/adafruit_register/i2c_bits.mpy b/src/lib/adafruit_register/i2c_bits.mpy new file mode 100644 index 0000000000000000000000000000000000000000..a9846d634f5635478949327a402bf6a65ec0c381 GIT binary patch literal 1053 zcmZvZ-%}G;6vyu-1Weo{H=DSP5-|pnV1%TEtz&(ukSGXM2_g(LI=7qMOLi^nrn@&V z>2${3Oc`STnnePCfJXm-_R)uS+D_j(#^N8)n?-zL=FXgZ@A>iloO4Qp;L3#OmMDuG zMnfgYz%|t**eIw)2~|~M=Ic!mW~cIB=cjH0_^?h?T@yFKxs_%e1NcB+#-w3rfF;ek zs@1^Ay<(}1w^a$34RsqE;I5<^60KZs5=Gb0NmyQXLy+von1Eego26RRK6LFUq|#_h zG`|P2O??NOq|XA_YGY%A*5o$LD%wyDlK^O{HO+N~5UOE<5Qz2BPXs__$507IM8O(u zO_WuQ=pdvw2*R2SpsFF0hz0>P*>saz_jrUTw@KTiwIHHtb)DYs7bd@IMWNQ%a>oLa zr;|dWEF0J~LE`hzjw%xcuzfTv1Knl@_3AS!TYW~`$G~pdYtX=b73yx?nelz25K=d9 z6$&+#D2-}f(zgnyD=EyJ?xu7y$)%G?E`Qoop5_4GcuCYWog@`;8z;AP11IUg%p_4n z?K5f8RDZ-^_os<V%y+jf|5!P7^Re_|5qkLeDBv&7XDsN21JIZA4i6^0yf-nx4<vlN zZ{31JIcE4=Vu&AFUkI#4F8y9EtuHW7SBe1o1rP6EDKan+@e5u)P?0>XCy?{EFIwSW zqU~5@m`^}If7xDM%6T761O9v^$2^*5_(;*i^A*XvJOA4*lR7_gB^kULPFYh6*Rx}} z%$U93vyTsYPMme3tlepU?7b_`aigP*z~BQX9^}UC&VK^q#6vHgXvkVUbmHNo@|?YI zANOWwEGG^t(%$@DBo!G+XRO<q)zp{iOnPD=JH8*~<}SQGh(&20Juqg&3-*nlJ?oVx zPpvMO<;Ll+z}UyubHV$@iH1vexod|4^X3pO2H$qtJ?cJs{BL)5szcG<JJH~WF1^9` z<@rvF+K>NqJJJhf503LA>72Ec$xKu2$@I6`^0i!s(gy!})o0i_i{Wg5`&`!kge7>+ z=J@r`Zs+A6U6&LsM&5Q(_H)V>I$G_t|L)FC9>l(&uNzFi%Zg-AfIy%vTdcdD0Drj% R`paOHVb+EIfx9jM{6D?nP#gdN literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_register/i2c_bits.py b/src/lib/adafruit_register/i2c_bits.py index 08bf5be..871e966 100644 --- a/src/lib/adafruit_register/i2c_bits.py +++ b/src/lib/adafruit_register/i2c_bits.py @@ -12,7 +12,11 @@ * Author(s): Scott Shawcroft """ +<<<<<<< HEAD __version__ = "1.10.1" +======= +__version__ = "1.9.18" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" try: diff --git a/src/lib/adafruit_register/i2c_struct.mpy b/src/lib/adafruit_register/i2c_struct.mpy new file mode 100644 index 0000000000000000000000000000000000000000..21b38000c7d98d73c16da70e03ab7958c0c1f144 GIT binary patch literal 1040 zcmZvZ-A)=o7=~v-5OKlb$0-U`E4o&Tpj%2?o3t9ys)@BIYDhHOWf@?t>~3}k4L#bW zCdIo!=^fbn=p{7iNl!a0k~EFU9L&%Az2En|v+f3y3FfU>63cpBCW4MDvO%z(l6grm zh+daSQfq(_b~*Vvx%>*Sy*mK+G$N~tcn&=IhK7MRU)RntaIYy106(bvnACLzu%w~M zN(D@8^XplBAxk)`%NJM&o06<cw4c@>RaFssvSi7Y2qjx%0QSJ{5740^>W%xu`2OC% z$G9~QCGlJ`<S!Vo#d^6+-Ti`4!9);1xJ%J<1>B`B6D*J_Rw$)dk`<x?zgi~(R!RWM z3dI$50#IGiMCr3o*40|q$*`S*_MKhR-1dv5l8y}nAVHus1`UEXg97!{RJz+uExu@m zrutb5effAVJfW=WHIV>|ajV5MIz#b{27p1hhHI+cxRCKBXl|^z-c<?FjFnWXB9m&p zn3U97s{c``wf>K-_mceBOLG7I|B|!@d?Sfz=F_S<G?U$&o}4|Dt|zajp#wdR12kdg zqE6)8;!QXJUC<2&p=ZGr9f}R0ftU-qVs7M)4WhxA2YCu6^e!;b;g}bB3p?K9z~s;D zdSQn-&GP`VX$NBSJOh1n<ID37=nwePPUO!?&St_BWLr_wTUu=m1*Xsw$f9W;ppo1H zbMTx&A>M(;y1Laja3nr6YjQLEZ94*koE3D21MLvZFu&7GI}*HUhl1u&PWoE?#lTQ} z?x~sLGB=^{`_a2jc$7ZU1(5|GS(z(GA$M|0>m#&2I8PtajFn3|4l@p^sU5?y_}qe- zUgD@?oGR$Mb=!J5Q0Tf1Q@1F+$uM1yoYV#IwN@y=RBPA<@I44%MdE%NU}L5`|4lm* z%Sl&Tf0(d6>+TZA@&7^HwL`IvdDQJ1`0+hF+UYzrf5*x=%|q$Ra~!tk&M$F`+`~@y pJRR#c(}NkJw$V->#YzCLzjb1IZ4AGSL9=J7QPy^@1fQh={tHqnAt(R< literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_register/i2c_struct.py b/src/lib/adafruit_register/i2c_struct.py index a097e3c..a678a1e 100644 --- a/src/lib/adafruit_register/i2c_struct.py +++ b/src/lib/adafruit_register/i2c_struct.py @@ -12,7 +12,11 @@ * Author(s): Scott Shawcroft """ +<<<<<<< HEAD __version__ = "1.10.1" +======= +__version__ = "1.9.18" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" import struct diff --git a/src/lib/adafruit_register/i2c_struct_array.mpy b/src/lib/adafruit_register/i2c_struct_array.mpy new file mode 100644 index 0000000000000000000000000000000000000000..8871367e98a10a4d912ad99c58c24a991646b91a GIT binary patch literal 1008 zcmYk3ZEw?76vwagM4p=5*yb)Yp)E~F(*Vh0veF`?jiwZ+HVs3e%C_p(y>?ndYg_gW zD0`6XP)*&paS}cO-8a~aNxa#2Kzsmh;#T90b*%Hh=YRgc(~g1pW@t-Mm9E{>DYmr( z-JzP@&?SN$YWE1mift?Xy445SbhExzZ?1xL&;iNqo^_-F_@hO2(@>5;e7kRHAWi$0 zZXAHQ$5MMkd#w{~!`5GGHrOP(O_+_<r-!D216f_2O0YWBIA9U4n>|B)HZ{LL@doJ2 zpOUv+?CQ4j|FR%v?!N@yWrPnjiuZfnF7tv!IU<h!s|M!9NtnO|RNmM+)i6EO3>H>V zb%UB9WA-T43>84#V5t?G0@O1sg}lOD+dKwq{Is5G2alICimKY0;{Z5CgLM^T@YEXv zgfUC%FdP^Ih?$3Fvg(J%t#1ax!UbM@F=6(cao4nu6$-pH+2aNeGAs{+qXF;spx`y4 z-yTwGId>b41DziB_UptvZd{zKasT3W?EvnR0PfTCOV-&N5Y3z)bGq<ve}F&BH;dff zcW$D*vAMYVocz^<A+%5e=$b1R!YKTx;=%}w!dNX_xKxawNHL0{#TbfpTo|u$g+wuq z;+?JJPHyqPjdo{?+ufD`OtwNOxh-)p#fp?nLW3hPn>;PJiIen6O5IcUawSxTNpxKT zC@pa)Cxwt8h0zr$f{HSU4!|&i(v|E|6}mUd<?`6i&y4(hX6Wa$@BBQJ$w^#7xyrKJ zTxec@S*^Llou5B!#(V+(yT1NYr~QDhwSdNlMcx-?R=D^4jgj}U#hv*=W;FctaqPYr zleen|6xfJ+OI67ib3-Qcg{&Yx%$<$J%cBuQ9{kE%ISF;-Uv}B3JR3FgR>I`%0_Lw& zmT$W2OZ95-@{ILoS%2(}PVYoI!JNe3@5I7*g`2#W$&*C9SaBb*6^ZwIJd-;8-i7BN zQUM6L#yz{uq4^20svi;4l}Y|xmY-#xVcD-T4zR?DGi+BsKPR&Y|8U}bC40+#Rcn`I hzCQGYxmKvX!#5@spJd;wY%ONminPKV{_8+MJ_8bIDg^)l literal 0 HcmV?d00001 diff --git a/src/lib/adafruit_register/i2c_struct_array.py b/src/lib/adafruit_register/i2c_struct_array.py index 65470c6..f5cbf4d 100644 --- a/src/lib/adafruit_register/i2c_struct_array.py +++ b/src/lib/adafruit_register/i2c_struct_array.py @@ -12,7 +12,11 @@ * Author(s): Scott Shawcroft """ +<<<<<<< HEAD __version__ = "1.10.1" +======= +__version__ = "1.9.18" +>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git" import struct