Skip to content

Commit 115716d

Browse files
committed
bugfix of mono bitshifter
1 parent 82509d5 commit 115716d

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

adafruit_imageload/pnm/pbm_binary.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def load(file, width, height, bitmap=None, palette=None):
4444
next_byte = file.read(1)
4545
if not next_byte:
4646
break # out of bits
47-
for bit in iterbits(int.from_bytes(next_byte, "little")):
47+
for bit in iterbits(next_byte):
4848
bitmap[x, y] = bit
4949
x += 1
5050
if x > width - 1:
@@ -59,5 +59,16 @@ def iterbits(b):
5959
"""
6060
generator to iterate over the bits in a byte (character)
6161
"""
62+
in_char = reverse(int.from_bytes(b, "little"))
6263
for i in range(8):
63-
yield (b >> i) & 1
64+
yield (in_char >> i) & 1
65+
66+
67+
def reverse(b):
68+
"""
69+
reverse bit order so the iterbits works
70+
"""
71+
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4
72+
b = (b & 0xCC) >> 2 | (b & 0x33) << 2
73+
b = (b & 0xAA) >> 1 | (b & 0x55) << 1
74+
return b

adafruit_imageload/tests/test_pbm_load.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@
3030
from io import BytesIO
3131
from unittest import TestCase
3232
from .. import pnm
33+
from ..pnm.pbm_binary import iterbits, reverse
3334
from .displayio_shared_bindings import Bitmap_C_Interface, Palette_C_Interface
3435

3536

36-
class TestPnmLoad(TestCase):
37+
class TestPbmLoad(TestCase):
3738
def test_load_fails_with_no_header_data(self):
3839
file = BytesIO(b"some initial binary data: \x00\x01")
3940
try:
@@ -78,7 +79,7 @@ def test_load_works_p4_in_mem(self):
7879
self.assertEqual(4, bitmap.width)
7980
self.assertEqual(2, bitmap.height)
8081
bitmap.validate()
81-
self.assertEqual("\n 1 0 1 0\n 1 0 1 0\n", str(bitmap))
82+
self.assertEqual("\n 0 1 0 1\n 0 1 0 1\n", str(bitmap))
8283
palette.validate()
8384

8485
def test_load_works_p4_binary(self):
@@ -123,3 +124,18 @@ def test_load_works_p4_binary_high_res(self):
123124
bitmap.validate()
124125
self.assertEqual(1, palette.num_colors)
125126
palette.validate()
127+
128+
def test_iterbits(self):
129+
k = b'k'
130+
bits = []
131+
for byte in iterbits(k):
132+
bits.append(byte)
133+
#self.assertEqual([0,1,1,0,1,0,1,1], bits[::-1])
134+
self.assertEqual([0,1,1,0,1,0,1,1], bits)
135+
136+
def test_reverse(self):
137+
# 00110100 to 00101100
138+
self.assertEqual(reverse(0x34), 0x2C)
139+
self.assertEqual(reverse(0xFF), 0xFF)
140+
self.assertEqual(reverse(0x00), 0x00)
141+
self.assertEqual(reverse(0x0E), 0x70)

0 commit comments

Comments
 (0)