From 61916962320ec0256df997cd126e55f8c83960ea Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Wed, 24 Nov 2021 09:05:11 -0600 Subject: [PATCH 1/4] bitmaptools: Fix the DitgherAlorithm.FloydStenberg value --- shared-bindings/bitmaptools/__init__.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/bitmaptools/__init__.c b/shared-bindings/bitmaptools/__init__.c index 57ac779081..ec26eab98e 100644 --- a/shared-bindings/bitmaptools/__init__.c +++ b/shared-bindings/bitmaptools/__init__.c @@ -664,7 +664,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(bitmaptools_readinto_obj, 0, bitmaptools_readinto); //| """The Floyd-Stenberg dither""" //| MAKE_ENUM_VALUE(bitmaptools_dither_algorithm_type, dither_algorithm, Atkinson, DITHER_ALGORITHM_ATKINSON); -MAKE_ENUM_VALUE(bitmaptools_dither_algorithm_type, dither_algorithm, FloydStenberg, DITHER_ALGORITHM_ATKINSON); +MAKE_ENUM_VALUE(bitmaptools_dither_algorithm_type, dither_algorithm, FloydStenberg, DITHER_ALGORITHM_FLOYD_STENBERG); MAKE_ENUM_MAP(bitmaptools_dither_algorithm) { MAKE_ENUM_MAP_ENTRY(dither_algorithm, Atkinson), From 9af76a2f0388aad732433156bade06b59f558e55 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Wed, 24 Nov 2021 09:15:17 -0600 Subject: [PATCH 2/4] bitmaptools dither: Fix off-by-one error filling row data --- shared-module/bitmaptools/__init__.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared-module/bitmaptools/__init__.c b/shared-module/bitmaptools/__init__.c index 80b4a38964..1ce84a239b 100644 --- a/shared-module/bitmaptools/__init__.c +++ b/shared-module/bitmaptools/__init__.c @@ -761,13 +761,13 @@ void common_hal_bitmaptools_dither(displayio_bitmap_t *dest_bitmap, displayio_bi rows[1] = rows[2]; rows[2] = tmp; - fill_row(source_bitmap, swap, rows[2], y + 2, info->mx); - y++; if (y == height) { break; } + fill_row(source_bitmap, swap, rows[2], y + 2, info->mx); + // Serpentine dither. Going right-to-left... for (int x = width; x--;) { int16_t pixel_in = rows[0][x] + err; @@ -790,7 +790,7 @@ void common_hal_bitmaptools_dither(displayio_bitmap_t *dest_bitmap, displayio_bi rows[1] = rows[2]; rows[2] = tmp; - fill_row(source_bitmap, swap, rows[2], y + 2, info->mx); + fill_row(source_bitmap, swap, rows[2], y + 3, info->mx); } displayio_area_t a = { 0, 0, width, height, NULL }; From 30c07a772ffa348fecfee7cd54c759565981fc32 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Wed, 24 Nov 2021 09:48:32 -0600 Subject: [PATCH 3/4] bitmaptools: dither: get rid of shifts this happens to make the occasional FS dither artifact disappear. I guess `a * b >> 8` and `(a * b) / 256` are not identical. I'm not sure if it was just the parens or not, but write the clearer code and rely on the compiler to substitute an appropriate shift if possible. --- shared-module/bitmaptools/__init__.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shared-module/bitmaptools/__init__.c b/shared-module/bitmaptools/__init__.c index 1ce84a239b..6b5def2904 100644 --- a/shared-module/bitmaptools/__init__.c +++ b/shared-module/bitmaptools/__init__.c @@ -749,9 +749,9 @@ void common_hal_bitmaptools_dither(displayio_bitmap_t *dest_bitmap, displayio_bi int x1 = x + info->terms[i].dx; int dy = info->terms[i].dy; - rows[dy][x1] = ((info->terms[i].dl * err) >> 8) + rows[dy][x1]; + rows[dy][x1] = ((info->terms[i].dl * err) / 256) + rows[dy][x1]; } - err = err * info->dl >> 8; + err = (err * info->dl) / 256; } write_pixels(dest_bitmap, y, out); @@ -779,9 +779,9 @@ void common_hal_bitmaptools_dither(displayio_bitmap_t *dest_bitmap, displayio_bi int x1 = x - info->terms[i].dx; int dy = info->terms[i].dy; - rows[dy][x1] = ((info->terms[i].dl * err) >> 8) + rows[dy][x1]; + rows[dy][x1] = ((info->terms[i].dl * err) / 256) + rows[dy][x1]; } - err = err * info->dl >> 8; + err = (err * info->dl) / 256; } write_pixels(dest_bitmap, y, out); From ddf24772c32774c4f423473671fe0ec2dada1ddd Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Wed, 24 Nov 2021 09:53:19 -0600 Subject: [PATCH 4/4] tests: move bitmaptools files to their own directory --- .../{ => bitmaptools}/_bmp16.py | 0 .../{ => bitmaptools}/blend.py | 0 .../{ => bitmaptools}/blinka16.bmp | Bin .../bitmaptools/dither-atkinson.bmp | Bin 0 -> 153670 bytes .../bitmaptools/dither-floydstenberg.bmp | Bin 0 -> 153670 bytes .../bitmaptools/dither.py | 18 ++++++++++ .../bitmaptools/ellipse.bmp | Bin 0 -> 8330 bytes .../{ => bitmaptools}/minerva16.bmp | Bin tests/circuitpython-manual/dither.py | 31 ------------------ 9 files changed, 18 insertions(+), 31 deletions(-) rename tests/circuitpython-manual/{ => bitmaptools}/_bmp16.py (100%) rename tests/circuitpython-manual/{ => bitmaptools}/blend.py (100%) rename tests/circuitpython-manual/{ => bitmaptools}/blinka16.bmp (100%) create mode 100644 tests/circuitpython-manual/bitmaptools/dither-atkinson.bmp create mode 100644 tests/circuitpython-manual/bitmaptools/dither-floydstenberg.bmp create mode 100644 tests/circuitpython-manual/bitmaptools/dither.py create mode 100644 tests/circuitpython-manual/bitmaptools/ellipse.bmp rename tests/circuitpython-manual/{ => bitmaptools}/minerva16.bmp (100%) delete mode 100644 tests/circuitpython-manual/dither.py diff --git a/tests/circuitpython-manual/_bmp16.py b/tests/circuitpython-manual/bitmaptools/_bmp16.py similarity index 100% rename from tests/circuitpython-manual/_bmp16.py rename to tests/circuitpython-manual/bitmaptools/_bmp16.py diff --git a/tests/circuitpython-manual/blend.py b/tests/circuitpython-manual/bitmaptools/blend.py similarity index 100% rename from tests/circuitpython-manual/blend.py rename to tests/circuitpython-manual/bitmaptools/blend.py diff --git a/tests/circuitpython-manual/blinka16.bmp b/tests/circuitpython-manual/bitmaptools/blinka16.bmp similarity index 100% rename from tests/circuitpython-manual/blinka16.bmp rename to tests/circuitpython-manual/bitmaptools/blinka16.bmp diff --git a/tests/circuitpython-manual/bitmaptools/dither-atkinson.bmp b/tests/circuitpython-manual/bitmaptools/dither-atkinson.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1829b8e7aec2499efa949ec98731702fe2151693 GIT binary patch literal 153670 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 dULWN?yQ95 literal 0 HcmV?d00001 diff --git a/tests/circuitpython-manual/bitmaptools/dither-floydstenberg.bmp b/tests/circuitpython-manual/bitmaptools/dither-floydstenberg.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e7481b040615b0342db477467306153e0a46cc0e GIT binary patch literal 153670 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 i0jZqyKVkGfpG%0f%`dk0{;&KboHnJ literal 0 HcmV?d00001 diff --git a/tests/circuitpython-manual/bitmaptools/dither.py b/tests/circuitpython-manual/bitmaptools/dither.py new file mode 100644 index 0000000000..13d0a5be6d --- /dev/null +++ b/tests/circuitpython-manual/bitmaptools/dither.py @@ -0,0 +1,18 @@ +import bitmaptools +import displayio +import _bmp16 + +if "/" in __file__: + here = __file__.rsplit("/", 1)[0] +else: + here = "." + +c = displayio.Colorspace.BGR565 + +b1 = _bmp16.loadbmp16(here + "/minerva16.bmp") +b3 = displayio.Bitmap(320, 240, 65536) + +bitmaptools.dither(b3, b1, c) +_bmp16.writebmp16(f"dither-atkinson.bmp", b3) +bitmaptools.dither(b3, b1, c, bitmaptools.DitherAlgorithm.FloydStenberg) +_bmp16.writebmp16(f"dither-floydstenberg.bmp", b3) diff --git a/tests/circuitpython-manual/bitmaptools/ellipse.bmp b/tests/circuitpython-manual/bitmaptools/ellipse.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c048cb17c73cdafcd4e35fe230dc834210de2003 GIT binary patch literal 8330 zcmc&(F>3-b6i(ZrYex~GLicXE3B{#Tmx3T&Z*&y5x;Z%ua)@q@9d8ovC%7pna&~ic zDO?93HEQrU?wRBz<(-_#y}b9nqX7``OyE>y!Ap;wFcX0*YD|LpE&!y(N06P z7RzdCiZ1w9Q!V96rosk;E@TQDrE(31`WTB}A8V*ru zC0@ELc_Hcztese2^ai&V`POq^TEa)IfpSO6+m_`HIK{z+_RbbHDc?5Ui`}d}*$4AA zXz%$XwkXZLU~C-mB=OSqxCg#ypdo0ab=W)y4FCopkDSgv(Q~tC5Fc|vRx*pl1~W(x zmOhvPrp_eiLo5y?mk%?60HXf|>A}+dF90f&oEu_sAi3Ny69^!hpLZZ!N$(qZ0C#(j z#5dc6=GJka#Fgc|379&Q+;ZyuL?2p49?(tXCC4txl9xG9fS8nYRR^Fl$*wSydNP3k zBDMXg=O6X@qxL`4{+D|Hq27O~;}7cii#qxJ{B{}`CV+DuKnNl=RfzwT{8dx literal 0 HcmV?d00001 diff --git a/tests/circuitpython-manual/minerva16.bmp b/tests/circuitpython-manual/bitmaptools/minerva16.bmp similarity index 100% rename from tests/circuitpython-manual/minerva16.bmp rename to tests/circuitpython-manual/bitmaptools/minerva16.bmp diff --git a/tests/circuitpython-manual/dither.py b/tests/circuitpython-manual/dither.py deleted file mode 100644 index 49a63c458c..0000000000 --- a/tests/circuitpython-manual/dither.py +++ /dev/null @@ -1,31 +0,0 @@ -import bitmaptools -import displayio -import _bmp16 - -if "/" in __file__: - here = __file__.rsplit("/", 1)[0] -else: - here = "." - -c = displayio.Colorspace.BGR565 - -b1 = _bmp16.loadbmp16(here + "/minerva16.bmp") -b3 = displayio.Bitmap(320, 240, 65536) - -for i in ( - 0, - 1 / 64, - 3 / 64, - 3 / 32, - 3 / 16, - 0.5, - 1 - 3 / 16, - 1 - 3 / 32, - 1 - 3 / 64, - 1 - 1 / 64, - 1, -): - bitmaptools.dither(b3, b1, c) - _bmp16.writebmp16(f"dither-atkinson.bmp", b3) - bitmaptools.dither(b3, b1, c, bitmaptools.DitherAlgorithm.FloydStenberg) - _bmp16.writebmp16(f"dither-floydstenberg.bmp", b3)