From 4ce6ccfe5fdee154abaa19bcdbdc1560b8cf43a0 Mon Sep 17 00:00:00 2001 From: Melissa LeBlanc-Williams Date: Wed, 27 Sep 2023 09:35:33 -0700 Subject: [PATCH] Slight optimization and uses CP font as default --- displayio/_bitmap.py | 17 ++++------------- displayio/_display.py | 13 +++++-------- displayio/_shape.py | 3 +-- displayio/resources/__init__.py | 3 +++ displayio/resources/ter-u12n.pbm | Bin 0 -> 1117 bytes displayio/resources/ter-u12n.pbm.license | 3 +++ displayio/resources/ter-u12n.pil | Bin 0 -> 5143 bytes displayio/resources/ter-u12n.pil.license | 3 +++ fontio.py | 5 ++++- 9 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 displayio/resources/__init__.py create mode 100644 displayio/resources/ter-u12n.pbm create mode 100644 displayio/resources/ter-u12n.pbm.license create mode 100644 displayio/resources/ter-u12n.pil create mode 100644 displayio/resources/ter-u12n.pil.license diff --git a/displayio/_bitmap.py b/displayio/_bitmap.py index 324475f..07eb7af 100644 --- a/displayio/_bitmap.py +++ b/displayio/_bitmap.py @@ -27,13 +27,11 @@ from ._area import Area __version__ = "0.0.0+auto.0" __repo__ = "https://github.com/adafruit/Adafruit_Blinka_displayio.git" -ALIGN_BITS = 8 * struct.calcsize("I") - def stride(width: int, bits_per_pixel: int) -> int: """Return the number of bytes per row of a bitmap with the given width and bits per pixel.""" row_width = width * bits_per_pixel - return (row_width + (ALIGN_BITS - 1)) // ALIGN_BITS + return (row_width + (31)) // 32 class Bitmap: @@ -109,7 +107,7 @@ class Bitmap: self._x_shift = 0 power_of_two = 1 - while power_of_two < ALIGN_BITS // bits_per_value: + while power_of_two < 32 // bits_per_value: self._x_shift += 1 power_of_two = power_of_two << 1 @@ -142,11 +140,7 @@ class Bitmap: if bytes_per_value < 1: word = self._data[row_start + (x >> self._x_shift)] return ( - word - >> ( - struct.calcsize("I") * 8 - - ((x & self._x_mask) + 1) * self._bits_per_value - ) + word >> (32 - ((x & self._x_mask) + 1) * self._bits_per_value) ) & self._bitmask row = memoryview(self._data)[row_start : row_start + self._stride] if bytes_per_value == 1: @@ -190,10 +184,7 @@ class Bitmap: row_start = y * self._stride bytes_per_value = self._bits_per_value // 8 if bytes_per_value < 1: - bit_position = ( - struct.calcsize("I") * 8 - - ((x & self._x_mask) + 1) * self._bits_per_value - ) + bit_position = 32 - ((x & self._x_mask) + 1) * self._bits_per_value index = row_start + (x >> self._x_shift) word = self._data[index] word &= ~(self._bitmask << bit_position) diff --git a/displayio/_display.py b/displayio/_display.py index d06ccbe..d7d04cf 100644 --- a/displayio/_display.py +++ b/displayio/_display.py @@ -18,7 +18,6 @@ displayio for Blinka """ import time -import struct from array import array from typing import Optional import digitalio @@ -338,7 +337,7 @@ class Display: return True rows_per_buffer = clipped.height() - pixels_per_word = (struct.calcsize("I") * 8) // self._core.colorspace.depth + pixels_per_word = 32 // self._core.colorspace.depth pixels_per_buffer = clipped.size() subrectangles = 1 @@ -366,8 +365,6 @@ class Display: buffer_size = pixels_per_buffer // pixels_per_word if pixels_per_buffer % pixels_per_word: buffer_size += 1 - - # TODO: Optimize with memoryview mask_length = (pixels_per_buffer // 8) + 1 # 1 bit per pixel + 1 remaining_rows = clipped.height() @@ -391,8 +388,8 @@ class Display: 8 // self._core.colorspace.depth ) - buffer = bytearray([0] * (buffer_size * struct.calcsize("I"))) - mask = bytearray([0] * mask_length) + buffer = memoryview(bytearray([0] * (buffer_size * 4))) + mask = memoryview(bytearray([0] * mask_length)) self._core.fill_area(subrectangle, mask, buffer) self._core.begin_transaction() self._send_pixels(buffer[:subrectangle_size_bytes]) @@ -405,13 +402,13 @@ class Display: raise ValueError("Display must have a 16 bit colorspace.") area = Area(0, y, self._core.width, y + 1) - pixels_per_word = (struct.calcsize("I") * 8) // self._core.colorspace.depth + pixels_per_word = 32 // self._core.colorspace.depth buffer_size = self._core.width // pixels_per_word pixels_per_buffer = area.size() if pixels_per_buffer % pixels_per_word: buffer_size += 1 - buffer = bytearray([0] * (buffer_size * struct.calcsize("I"))) + buffer = bytearray([0] * (buffer_size * 4)) mask_length = (pixels_per_buffer // 32) + 1 mask = array("L", [0x00000000] * mask_length) self._core.fill_area(area, mask, buffer) diff --git a/displayio/_shape.py b/displayio/_shape.py index 81d15a0..8545cf1 100644 --- a/displayio/_shape.py +++ b/displayio/_shape.py @@ -18,7 +18,6 @@ displayio for Blinka """ -import struct from ._bitmap import Bitmap from ._area import Area from ._helpers import clamp @@ -52,7 +51,7 @@ class Shape(Bitmap): height //= 2 height += self._height % 2 self._half_height = height - self._data = bytearray(height * struct.calcsize("HH")) + self._data = bytearray(height * 4) for i in range(height): self._data[2 * i] = 0 self._data[2 * i + 1] = width diff --git a/displayio/resources/__init__.py b/displayio/resources/__init__.py new file mode 100644 index 0000000..c0b450f --- /dev/null +++ b/displayio/resources/__init__.py @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2023 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT \ No newline at end of file diff --git a/displayio/resources/ter-u12n.pbm b/displayio/resources/ter-u12n.pbm new file mode 100644 index 0000000000000000000000000000000000000000..98052371d5a30315072dbb2b857e6315fc01625c GIT binary patch literal 1117 zcmeAS@N?(olHy`uVBq!ia0y~yV3uQGV31&BU|?W~`5-3Dz`&y7>EaktF=y?R*o^2@ ziR1OppS)hv_H9XuiRR6+FUwxG<~h&No>I7p|7|K)+=`CqV>}wHv%jXTzFi}Id)>1n z*`OP0SFd&PB)%w9O}^3QEB57BoS)3QkkgYK7rxZF>pA<$S0&%wI~D(asQ>z55C8f8 z|G#Z)Hu!1&|0z|$Jp4 zn4$3>!=cst9_;%jUU5WEHLsGT=}Fky+Wl!O!W}Emp0;CnI>Y+HrPtk@Jhl?u<}vnC z5m6UnOpZK?c5j@oCZ4Trr!oEMUY62>aMmF1xn`b;c)X*=9SCgKmFU;?)+idWtW3k_AH!XHcv6t zYl@!iVh&$<)9+hUjTZWSb(wiOjH{0GJZERH=VI{*&7QBV4yd%b2F@~Wm~@R%M5AMB zW(>;(t-^25lyqf_+8H!%iTt|NUuSm1s5VYEpz`*_X|{1KX$$7&F`GP&T5s5u#_)u3 ztHzA`xs6+I8Sn3z8Q(UUXV%sk++~pp2UxPs?Nws9qH#jDdWU6lR(iiE;Zs7(9oxEn+wYb+zC6YM($#Wji;1jQ zS7)RBtXFX#b*Al4bXEI*>DB)mQ|B&~3z+_Sk=5PMl?e@Lc2_fHUme-a_0eXr1FP_s z8rGx*uWNVRbKktkboPwje}AbxI6rL{_wDK1YBOh5?Md9g_d!MFPkn$;|2N&UeCkHk z_Gep!Ugoa+5V0!k`ef(O_Fr9xtFF6AW^MTU;%36}@8)S!BI-YMa0lew*cZL%mBEE8 zk9k-7TgQkm*=3n3e4(oGj9|UVO56D#-6!voocaINgtU%a`I_2yf1{HY3p~xzn8?T^ z7VwI-;Qsy(VSf&V)Eiv03@nN7`pSO)F4GBR>9S9WB~=?(Pdsg$#O5Q`COk8s>7mQA zsL<=XFa8rf@iS`*yG*5nWa%#@zxf}Z-&_z;H(UCK%n~bM(F2MMl>!Z0D%NQ2_dIb< z-#@MW7XQzu9_8PX%FC8WS7wzhvZ(%XW^uLi+jg<19_3{vg=LE@%r{A%k@{@fAG_h} jsh!vUd`!Q)!t|xQXmp)4!+|x)pmM|0)z4*}Q$iB}k~j|h literal 0 HcmV?d00001 diff --git a/displayio/resources/ter-u12n.pbm.license b/displayio/resources/ter-u12n.pbm.license new file mode 100644 index 0000000..9a506cd --- /dev/null +++ b/displayio/resources/ter-u12n.pbm.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2023 Melissa LeBlanc-Williams, written for Adafruit Industries + +SPDX-License-Identifier: MIT diff --git a/displayio/resources/ter-u12n.pil b/displayio/resources/ter-u12n.pil new file mode 100644 index 0000000000000000000000000000000000000000..b13bdb03d95ab36fd8151052e28d4533324bf641 GIT binary patch literal 5143 zcmWIW^hwLlE8(&R14AQgE*HlTM=l071_lO(|KAwc7??mT1~vvBFg;3)h5$W606G1E z*gOn8C}|Ru8imlrgcukYB+$ep7#JAj(8S~z7#LL0#8em<7_`vDv=|r|4A8_37#JAL z(8SCb7#M8O#B3NC7@W|=oER7wJkZ2E7#JA*(8T;07#Kp(#6lPt7^2X`q8Jz$641mF z7#JAR(8SUh7#MQU#BvxI7>dxuiWnFeD$v9#7#JAp(8TH(7#Ld6#99~_7`o8Jx)>N3 zCZLH;U|?XFh9)+Rfq`KTn%Eo$28KmwVv86U7*?Q(tzckaScfLIj)8$;3!2y#1_p** zXkxn<7#I$qi5*~IU^s>*c8r06;S8GC83qQ1OK4)37#J9Cpo!gJU|_h1CU%d3f#C_7 z*b@c@hF54}uNW8@KA?$xU|?YQh9>rnfq~%Mm{t# zJ_ZIx5i~Io1_nkcG%+a#21W%mF$D$&Mm01sH3kMo9W*f=1_nkWG%+Iv21W}sF$)F; zMmsbyI|c?u7c?;!1_nkiG%+s*2F3t1u>b}J#xOLoFa`$37&NgM1_s6?G_fQG2F46D zu?z+V#ym8!JO&2F5;UPFfh5HrCm1$1|}agF&_p7rXV!2AO;4e2sE(>1_q`$G_g1a z2Bs7=u@nXdrYtnEECvRq0yMD#1_q`wG_f)U2BsP`u^I*jrY1D8CI$wk4m7b21_q`+ zG_gJg2Bs-!VpA9xm}a4g&0=6+T7V|DfPsN&8JgHK1_q`zXku#^7??JpiEUzFVA_Eu zwu6CzX&;){J_ZJ+BWPkr7#NsNp^2ShU|_m{CU${=f$18W*fje?lR)g0K^@GyT#6bO^95gXdKd1;z4Ac**KobM?gX+-4K>eT=G%-*=s0&RD z)DN0~CI;#UO+ym{^@HZ1iGlh-i_pYC{h$?SVxWG|Iy5m*KWGb@7^ok#3r!5v4?2J* z2I>bLLlXn_gU+Cdf%-w0(8NIfpc`mnpnlLjG%-*==n0w_s2}tSO$^iz`hX?|>IZ#8 z69e^w{-BBdVc=n8LKOq`gBUr`#5fpu82Qk|_!xK?MbN}V7=<|$UC_i_7