From 096d7319fb60ded1bed05d8b5ec0364fd99d474c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Kol=C3=A5s?= <pippin@gimp.org> Date: Fri, 8 Sep 2023 02:38:26 +0200 Subject: [PATCH] clouds,mandelbrot: update with modesetting API changes --- python_payload/apps/clouds/__init__.py | 4 ++ python_payload/apps/mandelbrot/1bit.py | 65 ++++++++++++++++++++++ python_payload/apps/mandelbrot/4bit.py | 19 ++++--- python_payload/apps/mandelbrot/__init__.py | 24 ++++---- 4 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 python_payload/apps/mandelbrot/1bit.py diff --git a/python_payload/apps/clouds/__init__.py b/python_payload/apps/clouds/__init__.py index 3adc4e8951..b7d6c0abe0 100644 --- a/python_payload/apps/clouds/__init__.py +++ b/python_payload/apps/clouds/__init__.py @@ -71,6 +71,10 @@ class App(Application): for c in self.clouds: c.draw(ctx) + def on_enter(self, vm): + super().on_enter(vm) + sys_display.set_mode(24 + sys_display.osd) + if __name__ == "__main__": from st3m.run import run_app diff --git a/python_payload/apps/mandelbrot/1bit.py b/python_payload/apps/mandelbrot/1bit.py new file mode 100644 index 0000000000..adbc7bad99 --- /dev/null +++ b/python_payload/apps/mandelbrot/1bit.py @@ -0,0 +1,65 @@ +from st3m.application import Application +import sys_display, math, random + + +class App(Application): + def __init__(self, app_ctx): + super().__init__(app_ctx) + + def on_enter(self, vm): + super().on_enter(vm) + sys_display.set_mode(1) + pal = bytearray(256 * 3) + modr = random.getrandbits(7) + 1 + modg = random.getrandbits(7) + 1 + modb = random.getrandbits(7) + 1 + + pal[0 * 3] = 0 + pal[0 * 3 + 1] = 0 + pal[0 * 3 + 2] = 0 + pal[1 * 3] = 255 + pal[1 * 3 + 1] = 255 + pal[1 * 3 + 2] = 255 + sys_display.set_palette(pal) + self.y = 0 + self.xa = -1.5 + self.xb = 1.5 + self.ya = -2.0 + self.yb = 1.0 + + def draw(self, ctx: Context): + fb_info = sys_display.fb(0) + fb = fb_info[0] + + max_iterations = 30 + + width = fb_info[1] + height = fb_info[2] + stride = fb_info[3] + + for chunk in range(3): # do 3 scanlines at a time + y = self.y + if y < height: + zy = y * (self.yb - self.ya) / (height - 1) + self.ya + inners = 0 + for x in range(width): + zx = x * (self.xb - self.xa) / (width - 1) + self.xa + z = zy + zx * 1j + c = z + reached = 0 + for i in range(max_iterations): + if abs(z) > 2.0: + break + z = z * z + c + reached = i + val = reached * 255 / max_iterations + val = int(math.sqrt(val / 255) * 16) & 1 + fb[int((y * stride * 8 + x) / 8)] |= int(val) << (x & 7) + + self.y += 1 + + +if __name__ == "__main__": + import st3m.run + + st3m.run.run_app(App) diff --git a/python_payload/apps/mandelbrot/4bit.py b/python_payload/apps/mandelbrot/4bit.py index 628e05c53e..7c6a293c05 100644 --- a/python_payload/apps/mandelbrot/4bit.py +++ b/python_payload/apps/mandelbrot/4bit.py @@ -16,20 +16,22 @@ class App(Application): self.yb = 1.0 def draw(self, ctx: Context): - fb = sys_display.fb(4) + fb_info = sys_display.fb(0) + fb = fb_info[0] max_iterations = 30 - imgx = 240 - imgy = 240 + width = fb_info[1] + height = fb_info[2] + stride = fb_info[3] for chunk in range(3): # do 3 scanlines at a time y = self.y - if y < 240: - zy = y * (self.yb - self.ya) / (imgy - 1) + self.ya + if y < height: + zy = y * (self.yb - self.ya) / (height - 1) + self.ya inners = 0 - for x in range(imgx): - zx = x * (self.xb - self.xa) / (imgx - 1) + self.xa + for x in range(width): + zx = x * (self.xb - self.xa) / (width - 1) + self.xa z = zy + zx * 1j c = z reached = 0 @@ -42,8 +44,7 @@ class App(Application): val = math.sqrt(val / 255) * 16 if val > 15: val = 15 - oval = fb[int((y * 240 + x) / 2)] - fb[int((y * 240 + x) / 2)] = oval | (int(val) << ((x & 1) * 4)) + fb[int((y * stride * 2 + x) / 2)] |= int(val) << ((x & 1) * 4) self.y += 1 def think(self, ins, delta_ms): diff --git a/python_payload/apps/mandelbrot/__init__.py b/python_payload/apps/mandelbrot/__init__.py index 38ddd4dba9..317680b1f8 100644 --- a/python_payload/apps/mandelbrot/__init__.py +++ b/python_payload/apps/mandelbrot/__init__.py @@ -8,7 +8,7 @@ class App(Application): def on_enter(self, vm): super().on_enter(vm) - sys_display.set_mode(8) + sys_display.set_mode(sys_display.cool | sys_display.x2) self.y = 0 self.xa = -1.5 self.xb = 1.5 @@ -16,24 +16,26 @@ class App(Application): self.yb = 1.0 def draw(self, ctx: Context): - fb = sys_display.fb(8) + fb_info = sys_display.fb(sys_display.cool) + fb = fb_info[0] max_iterations = 30 - imgx = 240 - imgy = 240 + width = fb_info[1] + height = fb_info[2] + stride = fb_info[3] for chunk in range(3): # do 3 scanlines at a time y = self.y - if y < 240: - zy = y * (self.yb - self.ya) / (imgy - 1) + self.ya + if y < height: + zy = y * (self.yb - self.ya) / (height - 1) + self.ya inners = 0 - for x in range(imgx / 2): - zx = x * (self.xb - self.xa) / (imgx - 1) + self.xa + for x in range(width / 2): + zx = x * (self.xb - self.xa) / (width - 1) + self.xa z = zy + zx * 1j c = z reached = 0 - if inners > 10 and y < 180: + if inners > 10 and y < height * 0.7: reached = max_iterations - 1 else: for i in range(max_iterations): @@ -45,8 +47,8 @@ class App(Application): inners += 1 val = reached * 255 / max_iterations val = math.sqrt(val / 255) * 255 - fb[y * 240 + x] = int(val) - fb[y * 240 + 239 - x] = int(val) + fb[y * stride + x] = int(val) + fb[y * stride + width - 1 - x] = int(val) self.y += 1 def think(self, ins, delta_ms): -- GitLab