summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomer Shalev <shalev.tomer@gmail.com>2010-01-15 06:17:56 +0000
committerTomer Shalev <shalev.tomer@gmail.com>2010-01-15 06:17:56 +0000
commit4794891c971dd546e279ac928a1fcba837df7a09 (patch)
tree88c5cd0a6377757b1040f16f11bf3bc0513ffd2c
parent7719d297f2a1da0e45fd39cad21e99e23fd695c8 (diff)
downloadrockbox-4794891c971dd546e279ac928a1fcba837df7a09.tar.gz
rockbox-4794891c971dd546e279ac928a1fcba837df7a09.zip
Fractals: Fix red
- Define painting buffer inside fractal set implementation - Add missing USEGLIB define - Removed mandelbrot.c that was forgotten in last commit git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24231 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/fractals/fractal.c3
-rw-r--r--apps/plugins/fractals/fractal_sets.h6
-rw-r--r--apps/plugins/fractals/mandelbrot_set.c7
-rw-r--r--apps/plugins/mandelbrot.c925
4 files changed, 7 insertions, 934 deletions
diff --git a/apps/plugins/fractals/fractal.c b/apps/plugins/fractals/fractal.c
index 3a0c785bdd..a086652647 100644
--- a/apps/plugins/fractals/fractal.c
+++ b/apps/plugins/fractals/fractal.c
@@ -45,9 +45,6 @@
45GREY_INFO_STRUCT 45GREY_INFO_STRUCT
46static unsigned char *gbuf; 46static unsigned char *gbuf;
47static size_t gbuf_size = 0; 47static size_t gbuf_size = 0;
48unsigned char imgbuffer[LCD_HEIGHT];
49#else
50fb_data imgbuffer[LCD_HEIGHT];
51#endif 48#endif
52 49
53#define REDRAW_NONE 0 50#define REDRAW_NONE 0
diff --git a/apps/plugins/fractals/fractal_sets.h b/apps/plugins/fractals/fractal_sets.h
index c5339d63d7..2d0ff7d930 100644
--- a/apps/plugins/fractals/fractal_sets.h
+++ b/apps/plugins/fractals/fractal_sets.h
@@ -24,12 +24,6 @@
24#include "lib/grey.h" 24#include "lib/grey.h"
25#include "lib/xlcd.h" 25#include "lib/xlcd.h"
26 26
27#ifdef USEGSLIB
28extern unsigned char imgbuffer[LCD_HEIGHT];
29#else
30extern fb_data imgbuffer[LCD_HEIGHT];
31#endif
32
33struct fractal_rect 27struct fractal_rect
34{ 28{
35 int px_min; 29 int px_min;
diff --git a/apps/plugins/fractals/mandelbrot_set.c b/apps/plugins/fractals/mandelbrot_set.c
index ccc65b8e91..22f81ea4bb 100644
--- a/apps/plugins/fractals/mandelbrot_set.c
+++ b/apps/plugins/fractals/mandelbrot_set.c
@@ -24,6 +24,12 @@
24 24
25#define BUTTON_YIELD_TIMEOUT (HZ / 4) 25#define BUTTON_YIELD_TIMEOUT (HZ / 4)
26 26
27#ifdef USEGSLIB
28unsigned char imgbuffer[LCD_HEIGHT];
29#else
30fb_data imgbuffer[LCD_HEIGHT];
31#endif
32
27/* 8 entries cyclical, last entry is black (convergence) */ 33/* 8 entries cyclical, last entry is black (convergence) */
28#ifdef HAVE_LCD_COLOR 34#ifdef HAVE_LCD_COLOR
29static const fb_data color[9] = { 35static const fb_data color[9] = {
@@ -55,6 +61,7 @@ static const unsigned char color[9] = {
55#endif 61#endif
56 62
57#if (LCD_DEPTH < 8) 63#if (LCD_DEPTH < 8)
64#define USEGLIB
58#else 65#else
59#define UPDATE_FREQ (HZ/50) 66#define UPDATE_FREQ (HZ/50)
60#endif 67#endif
diff --git a/apps/plugins/mandelbrot.c b/apps/plugins/mandelbrot.c
deleted file mode 100644
index 091de31afc..0000000000
--- a/apps/plugins/mandelbrot.c
+++ /dev/null
@@ -1,925 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2004 Matthias Wientapper
11 * Heavily extended 2005 Jens Arnold
12 *
13 *
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
18 *
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
21 *
22 ****************************************************************************/
23#include "plugin.h"
24
25#ifdef HAVE_LCD_BITMAP
26#include "lib/grey.h"
27#include "lib/xlcd.h"
28
29PLUGIN_HEADER
30
31/* variable button definitions */
32#if CONFIG_KEYPAD == RECORDER_PAD
33#define MANDELBROT_QUIT BUTTON_OFF
34#define MANDELBROT_UP BUTTON_UP
35#define MANDELBROT_DOWN BUTTON_DOWN
36#define MANDELBROT_LEFT BUTTON_LEFT
37#define MANDELBROT_RIGHT BUTTON_RIGHT
38#define MANDELBROT_ZOOM_IN BUTTON_PLAY
39#define MANDELBROT_ZOOM_OUT BUTTON_ON
40#define MANDELBROT_MAXITER_INC BUTTON_F2
41#define MANDELBROT_MAXITER_DEC BUTTON_F1
42#define MANDELBROT_RESET BUTTON_F3
43
44#elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
45#define MANDELBROT_QUIT BUTTON_OFF
46#define MANDELBROT_UP BUTTON_UP
47#define MANDELBROT_DOWN BUTTON_DOWN
48#define MANDELBROT_LEFT BUTTON_LEFT
49#define MANDELBROT_RIGHT BUTTON_RIGHT
50#define MANDELBROT_ZOOM_IN BUTTON_SELECT
51#define MANDELBROT_ZOOM_OUT BUTTON_ON
52#define MANDELBROT_MAXITER_INC BUTTON_F2
53#define MANDELBROT_MAXITER_DEC BUTTON_F1
54#define MANDELBROT_RESET BUTTON_F3
55
56#elif CONFIG_KEYPAD == ONDIO_PAD
57#define MANDELBROT_QUIT BUTTON_OFF
58#define MANDELBROT_UP BUTTON_UP
59#define MANDELBROT_DOWN BUTTON_DOWN
60#define MANDELBROT_LEFT BUTTON_LEFT
61#define MANDELBROT_RIGHT BUTTON_RIGHT
62#define MANDELBROT_ZOOM_IN_PRE BUTTON_MENU
63#define MANDELBROT_ZOOM_IN (BUTTON_MENU | BUTTON_REL)
64#define MANDELBROT_ZOOM_IN2 (BUTTON_MENU | BUTTON_UP)
65#define MANDELBROT_ZOOM_OUT (BUTTON_MENU | BUTTON_DOWN)
66#define MANDELBROT_MAXITER_INC (BUTTON_MENU | BUTTON_RIGHT)
67#define MANDELBROT_MAXITER_DEC (BUTTON_MENU | BUTTON_LEFT)
68#define MANDELBROT_RESET (BUTTON_MENU | BUTTON_OFF)
69
70#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
71 (CONFIG_KEYPAD == IRIVER_H300_PAD)
72#define MANDELBROT_QUIT BUTTON_OFF
73#define MANDELBROT_UP BUTTON_UP
74#define MANDELBROT_DOWN BUTTON_DOWN
75#define MANDELBROT_LEFT BUTTON_LEFT
76#define MANDELBROT_RIGHT BUTTON_RIGHT
77#define MANDELBROT_ZOOM_IN BUTTON_SELECT
78#define MANDELBROT_ZOOM_OUT BUTTON_MODE
79#define MANDELBROT_MAXITER_INC (BUTTON_ON | BUTTON_RIGHT)
80#define MANDELBROT_MAXITER_DEC (BUTTON_ON | BUTTON_LEFT)
81#define MANDELBROT_RESET BUTTON_REC
82
83#define MANDELBROT_RC_QUIT BUTTON_RC_STOP
84
85#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
86 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
87 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
88#define MANDELBROT_QUIT (BUTTON_SELECT | BUTTON_MENU)
89#define MANDELBROT_UP BUTTON_MENU
90#define MANDELBROT_DOWN BUTTON_PLAY
91#define MANDELBROT_LEFT BUTTON_LEFT
92#define MANDELBROT_RIGHT BUTTON_RIGHT
93#define MANDELBROT_ZOOM_IN BUTTON_SCROLL_FWD
94#define MANDELBROT_ZOOM_OUT BUTTON_SCROLL_BACK
95#define MANDELBROT_MAXITER_INC (BUTTON_SELECT | BUTTON_RIGHT)
96#define MANDELBROT_MAXITER_DEC (BUTTON_SELECT | BUTTON_LEFT)
97#define MANDELBROT_RESET (BUTTON_SELECT | BUTTON_PLAY)
98
99#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
100#define MANDELBROT_QUIT BUTTON_POWER
101#define MANDELBROT_UP BUTTON_UP
102#define MANDELBROT_DOWN BUTTON_DOWN
103#define MANDELBROT_LEFT BUTTON_LEFT
104#define MANDELBROT_RIGHT BUTTON_RIGHT
105#define MANDELBROT_ZOOM_IN_PRE BUTTON_SELECT
106#define MANDELBROT_ZOOM_IN (BUTTON_SELECT | BUTTON_REL)
107#define MANDELBROT_ZOOM_OUT_PRE BUTTON_SELECT
108#define MANDELBROT_ZOOM_OUT (BUTTON_SELECT | BUTTON_REPEAT)
109#define MANDELBROT_MAXITER_INC_PRE BUTTON_PLAY
110#define MANDELBROT_MAXITER_INC (BUTTON_PLAY | BUTTON_REL)
111#define MANDELBROT_MAXITER_DEC_PRE BUTTON_PLAY
112#define MANDELBROT_MAXITER_DEC (BUTTON_PLAY | BUTTON_REPEAT)
113#define MANDELBROT_RESET BUTTON_REC
114
115#elif CONFIG_KEYPAD == GIGABEAT_PAD
116#define MANDELBROT_QUIT BUTTON_POWER
117#define MANDELBROT_UP BUTTON_UP
118#define MANDELBROT_DOWN BUTTON_DOWN
119#define MANDELBROT_LEFT BUTTON_LEFT
120#define MANDELBROT_RIGHT BUTTON_RIGHT
121#define MANDELBROT_ZOOM_IN_PRE BUTTON_SELECT
122#define MANDELBROT_ZOOM_IN (BUTTON_SELECT | BUTTON_REL)
123#define MANDELBROT_ZOOM_OUT_PRE BUTTON_SELECT
124#define MANDELBROT_ZOOM_OUT (BUTTON_SELECT | BUTTON_REPEAT)
125#define MANDELBROT_MAXITER_INC BUTTON_VOL_UP
126#define MANDELBROT_MAXITER_DEC BUTTON_VOL_DOWN
127#define MANDELBROT_RESET BUTTON_A
128
129#elif CONFIG_KEYPAD == SANSA_E200_PAD
130#define MANDELBROT_QUIT BUTTON_POWER
131#define MANDELBROT_UP BUTTON_UP
132#define MANDELBROT_DOWN BUTTON_DOWN
133#define MANDELBROT_LEFT BUTTON_LEFT
134#define MANDELBROT_RIGHT BUTTON_RIGHT
135#define MANDELBROT_ZOOM_IN BUTTON_SCROLL_FWD
136#define MANDELBROT_ZOOM_OUT BUTTON_SCROLL_BACK
137#define MANDELBROT_MAXITER_INC (BUTTON_SELECT | BUTTON_RIGHT)
138#define MANDELBROT_MAXITER_DEC (BUTTON_SELECT | BUTTON_LEFT)
139#define MANDELBROT_RESET BUTTON_REC
140
141#elif CONFIG_KEYPAD == SANSA_FUZE_PAD
142#define MANDELBROT_QUIT (BUTTON_HOME|BUTTON_REPEAT)
143#define MANDELBROT_UP BUTTON_UP
144#define MANDELBROT_DOWN BUTTON_DOWN
145#define MANDELBROT_LEFT BUTTON_LEFT
146#define MANDELBROT_RIGHT BUTTON_RIGHT
147#define MANDELBROT_ZOOM_IN BUTTON_SCROLL_FWD
148#define MANDELBROT_ZOOM_OUT BUTTON_SCROLL_BACK
149#define MANDELBROT_MAXITER_INC (BUTTON_SELECT | BUTTON_RIGHT)
150#define MANDELBROT_MAXITER_DEC (BUTTON_SELECT | BUTTON_LEFT)
151#define MANDELBROT_RESET (BUTTON_SELECT | BUTTON_REPEAT)
152
153#elif CONFIG_KEYPAD == SANSA_C200_PAD
154#define MANDELBROT_QUIT BUTTON_POWER
155#define MANDELBROT_UP BUTTON_UP
156#define MANDELBROT_DOWN BUTTON_DOWN
157#define MANDELBROT_LEFT BUTTON_LEFT
158#define MANDELBROT_RIGHT BUTTON_RIGHT
159#define MANDELBROT_ZOOM_IN BUTTON_VOL_UP
160#define MANDELBROT_ZOOM_OUT BUTTON_VOL_DOWN
161#define MANDELBROT_MAXITER_INC (BUTTON_SELECT | BUTTON_RIGHT)
162#define MANDELBROT_MAXITER_DEC (BUTTON_SELECT | BUTTON_LEFT)
163#define MANDELBROT_RESET BUTTON_REC
164
165#elif CONFIG_KEYPAD == SANSA_CLIP_PAD
166#define MANDELBROT_QUIT BUTTON_POWER
167#define MANDELBROT_UP BUTTON_UP
168#define MANDELBROT_DOWN BUTTON_DOWN
169#define MANDELBROT_LEFT BUTTON_LEFT
170#define MANDELBROT_RIGHT BUTTON_RIGHT
171#define MANDELBROT_ZOOM_IN BUTTON_VOL_UP
172#define MANDELBROT_ZOOM_OUT BUTTON_VOL_DOWN
173#define MANDELBROT_MAXITER_INC (BUTTON_SELECT | BUTTON_RIGHT)
174#define MANDELBROT_MAXITER_DEC (BUTTON_SELECT | BUTTON_LEFT)
175#define MANDELBROT_RESET BUTTON_HOME
176
177#elif CONFIG_KEYPAD == SANSA_M200_PAD
178#define MANDELBROT_QUIT BUTTON_POWER
179#define MANDELBROT_UP BUTTON_UP
180#define MANDELBROT_DOWN BUTTON_DOWN
181#define MANDELBROT_LEFT BUTTON_LEFT
182#define MANDELBROT_RIGHT BUTTON_RIGHT
183#define MANDELBROT_ZOOM_IN BUTTON_VOL_UP
184#define MANDELBROT_ZOOM_OUT BUTTON_VOL_DOWN
185#define MANDELBROT_MAXITER_INC (BUTTON_SELECT | BUTTON_RIGHT)
186#define MANDELBROT_MAXITER_DEC (BUTTON_SELECT | BUTTON_LEFT)
187#define MANDELBROT_RESET (BUTTON_SELECT | BUTTON_UP)
188
189#elif CONFIG_KEYPAD == IRIVER_H10_PAD
190#define MANDELBROT_QUIT BUTTON_POWER
191#define MANDELBROT_UP BUTTON_SCROLL_UP
192#define MANDELBROT_DOWN BUTTON_SCROLL_DOWN
193#define MANDELBROT_LEFT BUTTON_LEFT
194#define MANDELBROT_RIGHT BUTTON_RIGHT
195#define MANDELBROT_ZOOM_IN_PRE BUTTON_PLAY
196#define MANDELBROT_ZOOM_IN (BUTTON_PLAY | BUTTON_REL)
197#define MANDELBROT_ZOOM_OUT_PRE BUTTON_PLAY
198#define MANDELBROT_ZOOM_OUT (BUTTON_PLAY | BUTTON_REPEAT)
199#define MANDELBROT_MAXITER_INC BUTTON_FF
200#define MANDELBROT_MAXITER_DEC BUTTON_REW
201#define MANDELBROT_RESET (BUTTON_PLAY | BUTTON_REW)
202
203#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
204#define MANDELBROT_QUIT BUTTON_EQ
205#define MANDELBROT_UP BUTTON_UP
206#define MANDELBROT_DOWN BUTTON_DOWN
207#define MANDELBROT_LEFT BUTTON_LEFT
208#define MANDELBROT_RIGHT BUTTON_RIGHT
209#define MANDELBROT_ZOOM_IN_PRE BUTTON_SELECT
210#define MANDELBROT_ZOOM_IN (BUTTON_SELECT | BUTTON_REL)
211#define MANDELBROT_ZOOM_OUT_PRE BUTTON_SELECT
212#define MANDELBROT_ZOOM_OUT (BUTTON_SELECT | BUTTON_REPEAT)
213#define MANDELBROT_MAXITER_INC (BUTTON_PLAY | BUTTON_RIGHT)
214#define MANDELBROT_MAXITER_DEC (BUTTON_PLAY | BUTTON_LEFT)
215#define MANDELBROT_RESET BUTTON_MODE
216
217#elif CONFIG_KEYPAD == GIGABEAT_S_PAD
218#define MANDELBROT_QUIT BUTTON_BACK
219#define MANDELBROT_UP BUTTON_UP
220#define MANDELBROT_DOWN BUTTON_DOWN
221#define MANDELBROT_LEFT BUTTON_LEFT
222#define MANDELBROT_RIGHT BUTTON_RIGHT
223#define MANDELBROT_ZOOM_IN BUTTON_VOL_UP
224#define MANDELBROT_ZOOM_OUT BUTTON_VOL_DOWN
225#define MANDELBROT_MAXITER_INC BUTTON_PREV
226#define MANDELBROT_MAXITER_DEC BUTTON_NEXT
227#define MANDELBROT_RESET BUTTON_MENU
228
229#elif CONFIG_KEYPAD == MROBE100_PAD
230#define MANDELBROT_QUIT BUTTON_POWER
231#define MANDELBROT_UP BUTTON_UP
232#define MANDELBROT_DOWN BUTTON_DOWN
233#define MANDELBROT_LEFT BUTTON_LEFT
234#define MANDELBROT_RIGHT BUTTON_RIGHT
235#define MANDELBROT_ZOOM_IN_PRE BUTTON_SELECT
236#define MANDELBROT_ZOOM_IN (BUTTON_SELECT | BUTTON_REL)
237#define MANDELBROT_ZOOM_OUT_PRE BUTTON_SELECT
238#define MANDELBROT_ZOOM_OUT (BUTTON_SELECT | BUTTON_REPEAT)
239#define MANDELBROT_MAXITER_INC BUTTON_MENU
240#define MANDELBROT_MAXITER_DEC BUTTON_PLAY
241#define MANDELBROT_RESET BUTTON_DISPLAY
242
243#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
244#define MANDELBROT_QUIT BUTTON_RC_REC
245#define MANDELBROT_UP BUTTON_RC_VOL_UP
246#define MANDELBROT_DOWN BUTTON_RC_VOL_DOWN
247#define MANDELBROT_LEFT BUTTON_RC_REW
248#define MANDELBROT_RIGHT BUTTON_RC_FF
249#define MANDELBROT_ZOOM_IN_PRE BUTTON_RC_PLAY
250#define MANDELBROT_ZOOM_IN (BUTTON_RC_PLAY | BUTTON_REL)
251#define MANDELBROT_ZOOM_OUT_PRE BUTTON_RC_PLAY
252#define MANDELBROT_ZOOM_OUT (BUTTON_RC_PLAY | BUTTON_REPEAT)
253#define MANDELBROT_MAXITER_INC_PRE BUTTON_RC_MODE
254#define MANDELBROT_MAXITER_INC (BUTTON_RC_MODE|BUTTON_REL)
255#define MANDELBROT_MAXITER_DEC_PRE BUTTON_RC_MODE
256#define MANDELBROT_MAXITER_DEC (BUTTON_RC_MODE|BUTTON_REPEAT)
257#define MANDELBROT_RESET BUTTON_RC_MENU
258
259#elif CONFIG_KEYPAD == COWON_D2_PAD
260#define MANDELBROT_QUIT BUTTON_POWER
261
262#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
263#define MANDELBROT_QUIT BUTTON_BACK
264#define MANDELBROT_UP BUTTON_UP
265#define MANDELBROT_DOWN BUTTON_DOWN
266#define MANDELBROT_LEFT BUTTON_LEFT
267#define MANDELBROT_RIGHT BUTTON_RIGHT
268#define MANDELBROT_ZOOM_IN BUTTON_PLAY
269#define MANDELBROT_ZOOM_OUT BUTTON_MENU
270#define MANDELBROT_MAXITER_INC (BUTTON_UP | BUTTON_CUSTOM)
271#define MANDELBROT_MAXITER_DEC (BUTTON_DOWN | BUTTON_CUSTOM)
272#define MANDELBROT_RESET BUTTON_SELECT
273
274#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
275#define MANDELBROT_QUIT BUTTON_POWER
276#define MANDELBROT_UP BUTTON_UP
277#define MANDELBROT_DOWN BUTTON_DOWN
278#define MANDELBROT_LEFT BUTTON_LEFT
279#define MANDELBROT_RIGHT BUTTON_RIGHT
280#define MANDELBROT_ZOOM_IN BUTTON_VIEW
281#define MANDELBROT_ZOOM_OUT BUTTON_PLAYLIST
282#define MANDELBROT_MAXITER_INC BUTTON_VOL_UP
283#define MANDELBROT_MAXITER_DEC BUTTON_VOL_DOWN
284#define MANDELBROT_RESET BUTTON_MENU
285
286#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
287#define MANDELBROT_QUIT BUTTON_POWER
288#define MANDELBROT_UP BUTTON_UP
289#define MANDELBROT_DOWN BUTTON_DOWN
290#define MANDELBROT_LEFT BUTTON_PREV
291#define MANDELBROT_RIGHT BUTTON_NEXT
292#define MANDELBROT_ZOOM_IN BUTTON_RIGHT
293#define MANDELBROT_ZOOM_OUT BUTTON_LEFT
294#define MANDELBROT_MAXITER_INC BUTTON_VOL_UP
295#define MANDELBROT_MAXITER_DEV BUTTON_VOL_DOWN
296#define MANDELBROT_RESET BUTTON_MENU
297
298#elif CONFIG_KEYPAD == ONDAVX747_PAD || CONFIG_KEYPAD == MROBE500_PAD
299#define MANDELBROT_QUIT BUTTON_POWER
300
301#elif CONFIG_KEYPAD == ONDAVX777_PAD
302#define MANDELBROT_QUIT BUTTON_POWER
303
304#elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
305#define MANDELBROT_QUIT BUTTON_REC
306#define MANDELBROT_UP BUTTON_UP
307#define MANDELBROT_DOWN BUTTON_DOWN
308#define MANDELBROT_LEFT BUTTON_LEFT
309#define MANDELBROT_RIGHT BUTTON_RIGHT
310#define MANDELBROT_ZOOM_IN_PRE (BUTTON_FFWD | BUTTON_UP)
311#define MANDELBROT_ZOOM_IN (BUTTON_REW | BUTTON_UP)
312#define MANDELBROT_ZOOM_OUT_PRE (BUTTON_FFWD | BUTTON_DOWN)
313#define MANDELBROT_ZOOM_OUT (BUTTON_REW | BUTTON_DOWN)
314#define MANDELBROT_MAXITER_INC (BUTTON_PLAY | BUTTON_UP)
315#define MANDELBROT_MAXITER_DEC (BUTTON_FFWD | BUTTON_DOWN)
316#define MANDELBROT_RESET (BUTTON_PLAY | BUTTON_RIGHT)
317
318#else
319#error No keymap defined!
320#endif
321
322#ifdef HAVE_TOUCHSCREEN
323#ifndef MANDELBROT_UP
324#define MANDELBROT_UP BUTTON_TOPMIDDLE
325#endif
326#ifndef MANDELBROT_DOWN
327#define MANDELBROT_DOWN BUTTON_BOTTOMMIDDLE
328#endif
329#ifndef MANDELBROT_LEFT
330#define MANDELBROT_LEFT BUTTON_MIDLEFT
331#endif
332#ifndef MANDELBROT_RIGHT
333#define MANDELBROT_RIGHT BUTTON_MIDRIGHT
334#endif
335#ifndef MANDELBROT_ZOOM_IN_PRE
336#define MANDELBROT_ZOOM_IN_PRE BUTTON_TOPRIGHT
337#endif
338#ifndef MANDELBROT_ZOOM_IN
339#define MANDELBROT_ZOOM_IN (BUTTON_TOPRIGHT | BUTTON_REL)
340#endif
341#ifndef MANDELBROT_ZOOM_OUT_PRE
342#define MANDELBROT_ZOOM_OUT_PRE BUTTON_TOPLEFT
343#endif
344#ifndef MANDELBROT_ZOOM_OUT
345#define MANDELBROT_ZOOM_OUT (BUTTON_TOPLEFT | BUTTON_REL)
346#endif
347#ifndef MANDELBROT_MAXITER_INC
348#define MANDELBROT_MAXITER_INC BUTTON_BOTTOMRIGHT
349#endif
350#ifndef MANDELBROT_MAXITER_DEC
351#define MANDELBROT_MAXITER_DEC BUTTON_BOTTOMLEFT
352#endif
353#ifndef MANDELBROT_RESET
354#define MANDELBROT_RESET BUTTON_CENTER
355#endif
356#endif
357
358#if LCD_DEPTH < 8
359#define USEGSLIB
360#define MYLCD(fn) grey_ub_ ## fn
361#define MYLCD_UPDATE()
362#define MYXLCD(fn) grey_ub_ ## fn
363#else
364#define UPDATE_FREQ (HZ/50)
365#define MYLCD(fn) rb->lcd_ ## fn
366#define MYLCD_UPDATE() rb->lcd_update();
367#define MYXLCD(fn) xlcd_ ## fn
368#endif
369
370/* Fixed point format s5.26: sign, 5 bits integer part, 26 bits fractional part */
371static long x_min;
372static long x_max;
373static long x_step;
374static long x_delta;
375static long y_min;
376static long y_max;
377static long y_step;
378static long y_delta;
379
380static int px_min = 0;
381static int px_max = LCD_WIDTH;
382static int py_min = 0;
383static int py_max = LCD_HEIGHT;
384
385static int step_log2;
386static unsigned max_iter;
387
388#ifdef USEGSLIB
389GREY_INFO_STRUCT
390static unsigned char *gbuf;
391static size_t gbuf_size = 0;
392static unsigned char imgbuffer[LCD_HEIGHT];
393#else
394static fb_data imgbuffer[LCD_HEIGHT];
395#endif
396
397/* 8 entries cyclical, last entry is black (convergence) */
398#ifdef HAVE_LCD_COLOR
399static const fb_data color[9] = {
400 LCD_RGBPACK(255, 0, 159), LCD_RGBPACK(159, 0, 255), LCD_RGBPACK(0, 0, 255),
401 LCD_RGBPACK(0, 159, 255), LCD_RGBPACK(0, 255, 128), LCD_RGBPACK(128, 255, 0),
402 LCD_RGBPACK(255, 191, 0), LCD_RGBPACK(255, 0, 0), LCD_RGBPACK(0, 0, 0)
403};
404#else /* greyscale */
405static const unsigned char color[9] = {
406 255, 223, 191, 159, 128, 96, 64, 32, 0
407};
408#endif
409
410#if CONFIG_CPU == SH7034
411
412#define MULS16_ASR10(a, b) muls16_asr10(a, b)
413static inline short muls16_asr10(short a, short b)
414{
415 short r;
416 asm (
417 "muls %[a],%[b] \n"
418 "sts macl,%[r] \n"
419 "shlr8 %[r] \n"
420 "shlr2 %[r] \n"
421 : /* outputs */
422 [r]"=r"(r)
423 : /* inputs */
424 [a]"r"(a),
425 [b]"r"(b)
426 );
427 return r;
428}
429
430#define MULS32_ASR26(a, b) muls32_asr26(a, b)
431static inline long muls32_asr26(long a, long b)
432{
433 long r, t1, t2, t3;
434 asm (
435 /* Signed 32bit * 32bit -> 64bit multiplication.
436 Notation: xxab * xxcd, where each letter represents 16 bits.
437 xx is the 64 bit sign extension. */
438 "swap.w %[a],%[t1] \n" /* t1 = ba */
439 "mulu %[t1],%[b] \n" /* a * d */
440 "swap.w %[b],%[t3] \n" /* t3 = dc */
441 "sts macl,%[t2] \n" /* t2 = a * d */
442 "mulu %[t1],%[t3] \n" /* a * c */
443 "sts macl,%[r] \n" /* hi = a * c */
444 "mulu %[a],%[t3] \n" /* b * c */
445 "clrt \n"
446 "sts macl,%[t3] \n" /* t3 = b * c */
447 "addc %[t2],%[t3] \n" /* t3 += t2, carry -> t2 */
448 "movt %[t2] \n"
449 "mulu %[a],%[b] \n" /* b * d */
450 "mov %[t3],%[t1] \n" /* t1t3 = t2t3 << 16 */
451 "xtrct %[t2],%[t1] \n"
452 "shll16 %[t3] \n"
453 "sts macl,%[t2] \n" /* lo = b * d */
454 "clrt \n" /* hi.lo += t1t3 */
455 "addc %[t3],%[t2] \n"
456 "addc %[t1],%[r] \n"
457 "cmp/pz %[a] \n" /* ab >= 0 ? */
458 "bt 1f \n"
459 "sub %[b],%[r] \n" /* no: hi -= cd (sign extension of ab is -1) */
460 "1: \n"
461 "cmp/pz %[b] \n" /* cd >= 0 ? */
462 "bt 2f \n"
463 "sub %[a],%[r] \n" /* no: hi -= ab (sign extension of cd is -1) */
464 "2: \n"
465 /* Shift right by 26 and return low 32 bits */
466 "shll2 %[r] \n" /* hi <<= 6 */
467 "shll2 %[r] \n"
468 "shll2 %[r] \n"
469 "shlr16 %[t2] \n" /* (unsigned)lo >>= 26 */
470 "shlr8 %[t2] \n"
471 "shlr2 %[t2] \n"
472 "or %[t2],%[r] \n" /* combine result */
473 : /* outputs */
474 [r] "=&r"(r),
475 [t1]"=&r"(t1),
476 [t2]"=&r"(t2),
477 [t3]"=&r"(t3)
478 : /* inputs */
479 [a] "r" (a),
480 [b] "r" (b)
481 );
482 return r;
483}
484
485#elif defined CPU_COLDFIRE
486
487#define MULS16_ASR10(a, b) muls16_asr10(a, b)
488static inline short muls16_asr10(short a, short b)
489{
490 asm (
491 "muls.w %[a],%[b] \n"
492 "asr.l #8,%[b] \n"
493 "asr.l #2,%[b] \n"
494 : /* outputs */
495 [b]"+d"(b)
496 : /* inputs */
497 [a]"d" (a)
498 );
499 return b;
500}
501
502/* Needs the EMAC initialised to fractional mode w/o rounding and saturation */
503#define MULS32_INIT() coldfire_set_macsr(EMAC_FRACTIONAL)
504#define MULS32_ASR26(a, b) muls32_asr26(a, b)
505static inline long muls32_asr26(long a, long b)
506{
507 long r, t1;
508 asm (
509 "mac.l %[a], %[b], %%acc0 \n" /* multiply */
510 "move.l %%accext01, %[t1] \n" /* get low part */
511 "movclr.l %%acc0, %[r] \n" /* get high part */
512 "asl.l #5, %[r] \n" /* hi <<= 5, plus one free */
513 "lsr.l #3, %[t1] \n" /* lo >>= 3 */
514 "and.l #0x1f, %[t1] \n" /* mask out unrelated bits */
515 "or.l %[t1], %[r] \n" /* combine result */
516 : /* outputs */
517 [r] "=d"(r),
518 [t1]"=d"(t1)
519 : /* inputs */
520 [a] "d" (a),
521 [b] "d" (b)
522 );
523 return r;
524}
525
526#elif defined CPU_ARM
527
528#define MULS32_ASR26(a, b) muls32_asr26(a, b)
529static inline long muls32_asr26(long a, long b)
530{
531 long r, t1;
532 asm (
533 "smull %[r], %[t1], %[a], %[b] \n"
534 "mov %[r], %[r], lsr #26 \n"
535 "orr %[r], %[r], %[t1], lsl #6 \n"
536 : /* outputs */
537 [r] "=&r,&r,&r"(r),
538 [t1]"=&r,&r,&r"(t1)
539 : /* inputs */
540 [a] "%r,%r,%r" (a),
541 [b] "r,0,1" (b)
542 );
543 return r;
544}
545
546#endif /* CPU */
547
548/* default macros */
549#ifndef MULS16_ASR10
550#define MULS16_ASR10(a, b) ((short)(((long)(a) * (long)(b)) >> 10))
551#endif
552#ifndef MULS32_ASR26
553#define MULS32_ASR26(a, b) ((long)(((long long)(a) * (long long)(b)) >> 26))
554#endif
555#ifndef MULS32_INIT
556#define MULS32_INIT()
557#endif
558
559int ilog2_fp(long value) /* calculate integer log2(value_fp_6.26) */
560{
561 int i = 0;
562
563 if (value <= 0) {
564 return -32767;
565 } else if (value > (1L<<26)) {
566 while (value >= (2L<<26)) {
567 value >>= 1;
568 i++;
569 }
570 } else {
571 while (value < (1L<<26)) {
572 value <<= 1;
573 i--;
574 }
575 }
576 return i;
577}
578
579void recalc_parameters(void)
580{
581 x_step = (x_max - x_min) / LCD_WIDTH;
582 x_delta = (x_step * LCD_WIDTH) / 8;
583 y_step = (y_max - y_min) / LCD_HEIGHT;
584 y_delta = (y_step * LCD_HEIGHT) / 8;
585 step_log2 = ilog2_fp(MIN(x_step, y_step));
586 max_iter = MAX(15, -15 * step_log2 - 45);
587}
588
589#if CONFIG_LCD == LCD_SSD1815
590/* Recorder, Ondio: pixel_height == 1.25 * pixel_width */
591#define MB_HEIGHT (LCD_HEIGHT*5/4)
592#else
593/* square pixels */
594#define MB_HEIGHT LCD_HEIGHT
595#endif
596
597#define MB_XOFS (-0x03000000L) /* -0.75 (s5.26) */
598#if 3000*MB_HEIGHT/LCD_WIDTH >= 2400 /* width is limiting factor */
599#define MB_XFAC (0x06000000LL) /* 1.5 (s5.26) */
600#define MB_YFAC (MB_XFAC*MB_HEIGHT/LCD_WIDTH)
601#else /* height is limiting factor */
602#define MB_YFAC (0x04cccccdLL) /* 1.2 (s5.26) */
603#define MB_XFAC (MB_YFAC*LCD_WIDTH/MB_HEIGHT)
604#endif
605
606void init_mandelbrot_set(void)
607{
608 x_min = MB_XOFS-MB_XFAC;
609 x_max = MB_XOFS+MB_XFAC;
610 y_min = -MB_YFAC;
611 y_max = MB_YFAC;
612 recalc_parameters();
613}
614
615void calc_mandelbrot_low_prec(void)
616{
617 long start_tick, last_yield;
618#ifndef USEGSLIB
619 long next_update = *rb->current_tick;
620 int last_px = px_min;
621#endif
622 unsigned n_iter;
623 long a32, b32;
624 short x, x2, y, y2, a, b;
625 int p_x, p_y;
626
627 start_tick = last_yield = *rb->current_tick;
628
629 for (p_x = 0, a32 = x_min; p_x < px_max; p_x++, a32 += x_step) {
630 if (p_x < px_min)
631 continue;
632 a = a32 >> 16;
633 for (p_y = LCD_HEIGHT-1, b32 = y_min; p_y >= py_min; p_y--, b32 += y_step) {
634 if (p_y >= py_max)
635 continue;
636 b = b32 >> 16;
637 x = a;
638 y = b;
639 n_iter = 0;
640
641 while (++n_iter <= max_iter) {
642 x2 = MULS16_ASR10(x, x);
643 y2 = MULS16_ASR10(y, y);
644
645 if (x2 + y2 > (4<<10)) break;
646
647 y = 2 * MULS16_ASR10(x, y) + b;
648 x = x2 - y2 + a;
649 }
650
651 if (n_iter > max_iter)
652 imgbuffer[p_y] = color[8];
653 else
654 imgbuffer[p_y] = color[n_iter & 7];
655
656 /* be nice to other threads:
657 * if at least one tick has passed, yield */
658 if (TIME_AFTER(*rb->current_tick, last_yield)) {
659 rb->yield();
660 last_yield = *rb->current_tick;
661 }
662 }
663#ifdef USEGSLIB
664 grey_ub_gray_bitmap_part(imgbuffer, 0, py_min, 1,
665 p_x, py_min, 1, py_max - py_min);
666#else
667 rb->lcd_bitmap_part(imgbuffer, 0, py_min, 1,
668 p_x, py_min, 1, py_max - py_min);
669 if ((p_x == px_max - 1) || TIME_AFTER(*rb->current_tick, next_update))
670 {
671 next_update = *rb->current_tick + UPDATE_FREQ;
672 rb->lcd_update_rect(last_px, py_min, p_x - last_px + 1,
673 py_max - py_min);
674 last_px = p_x;
675 }
676#endif
677 }
678}
679
680void calc_mandelbrot_high_prec(void)
681{
682 long start_tick, last_yield;
683#ifndef USEGSLIB
684 long next_update = *rb->current_tick;
685 int last_px = px_min;
686#endif
687 unsigned n_iter;
688 long x, x2, y, y2, a, b;
689 int p_x, p_y;
690
691 MULS32_INIT();
692 start_tick = last_yield = *rb->current_tick;
693
694 for (p_x = 0, a = x_min; p_x < px_max; p_x++, a += x_step) {
695 if (p_x < px_min)
696 continue;
697 for (p_y = LCD_HEIGHT-1, b = y_min; p_y >= py_min; p_y--, b += y_step) {
698 if (p_y >= py_max)
699 continue;
700 x = a;
701 y = b;
702 n_iter = 0;
703
704 while (++n_iter <= max_iter) {
705 x2 = MULS32_ASR26(x, x);
706 y2 = MULS32_ASR26(y, y);
707
708 if (x2 + y2 > (4L<<26)) break;
709
710 y = 2 * MULS32_ASR26(x, y) + b;
711 x = x2 - y2 + a;
712 }
713
714 if (n_iter > max_iter)
715 imgbuffer[p_y] = color[8];
716 else
717 imgbuffer[p_y] = color[n_iter & 7];
718
719 /* be nice to other threads:
720 * if at least one tick has passed, yield */
721 if (TIME_AFTER(*rb->current_tick, last_yield)) {
722 rb->yield();
723 last_yield = *rb->current_tick;
724 }
725 }
726#ifdef USEGSLIB
727 grey_ub_gray_bitmap_part(imgbuffer, 0, py_min, 1,
728 p_x, py_min, 1, py_max - py_min);
729#else
730 rb->lcd_bitmap_part(imgbuffer, 0, py_min, 1,
731 p_x, py_min, 1, py_max-py_min);
732 if ((p_x == px_max - 1) || TIME_AFTER(*rb->current_tick, next_update))
733 {
734 next_update = *rb->current_tick + UPDATE_FREQ;
735 rb->lcd_update_rect(last_px, py_min, p_x - last_px + 1,
736 py_max - py_min);
737 last_px = p_x;
738 }
739#endif
740 }
741}
742
743void cleanup(void *parameter)
744{
745 (void)parameter;
746#ifdef USEGSLIB
747 grey_release();
748#endif
749}
750
751#define REDRAW_NONE 0
752#define REDRAW_PARTIAL 1
753#define REDRAW_FULL 2
754
755enum plugin_status plugin_start(const void* parameter)
756{
757 int button;
758 int lastbutton = BUTTON_NONE;
759 int redraw = REDRAW_FULL;
760
761 (void)parameter;
762
763#ifdef USEGSLIB
764 /* get the remainder of the plugin buffer */
765 gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size);
766
767 /* initialize the greyscale buffer.*/
768 if (!grey_init(gbuf, gbuf_size, GREY_ON_COP,
769 LCD_WIDTH, LCD_HEIGHT, NULL))
770 {
771 rb->splash(HZ, "Couldn't init greyscale display");
772 return 0;
773 }
774 grey_show(true); /* switch on greyscale overlay */
775#endif
776
777#if LCD_DEPTH > 1
778 rb->lcd_set_backdrop(NULL);
779#endif
780
781 init_mandelbrot_set();
782
783 /* main loop */
784 while (true) {
785 if (redraw > REDRAW_NONE) {
786#ifdef HAVE_ADJUSTABLE_CPU_FREQ
787 rb->cpu_boost(true);
788#endif
789 if (redraw == REDRAW_FULL) {
790 MYLCD(clear_display)();
791 MYLCD_UPDATE();
792 }
793
794 if (step_log2 <= -10) /* select precision */
795 calc_mandelbrot_high_prec();
796 else
797 calc_mandelbrot_low_prec();
798
799#ifdef HAVE_ADJUSTABLE_CPU_FREQ
800 rb->cpu_boost(false);
801#endif
802 px_min = 0;
803 px_max = LCD_WIDTH;
804 py_min = 0;
805 py_max = LCD_HEIGHT;
806 redraw = REDRAW_NONE;
807 }
808
809 button = rb->button_get(true);
810 switch (button) {
811#ifdef MANDELBROT_RC_QUIT
812 case MANDELBROT_RC_QUIT:
813#endif
814 case MANDELBROT_QUIT:
815#ifdef USEGSLIB
816 grey_release();
817#endif
818 return PLUGIN_OK;
819
820 case MANDELBROT_ZOOM_OUT:
821#ifdef MANDELBROT_ZOOM_OUT_PRE
822 if (lastbutton != MANDELBROT_ZOOM_OUT_PRE)
823 break;
824#endif
825 x_min -= x_delta;
826 x_max += x_delta;
827 y_min -= y_delta;
828 y_max += y_delta;
829 recalc_parameters();
830 redraw = REDRAW_FULL;
831 break;
832
833
834 case MANDELBROT_ZOOM_IN:
835#ifdef MANDELBROT_ZOOM_IN_PRE
836 if (lastbutton != MANDELBROT_ZOOM_IN_PRE)
837 break;
838#endif
839#ifdef MANDELBROT_ZOOM_IN2
840 case MANDELBROT_ZOOM_IN2:
841#endif
842 x_min += x_delta;
843 x_max -= x_delta;
844 y_min += y_delta;
845 y_max -= y_delta;
846 recalc_parameters();
847 redraw = REDRAW_FULL;
848 break;
849
850 case MANDELBROT_UP:
851 y_min += y_delta;
852 y_max += y_delta;
853 MYXLCD(scroll_down)(LCD_HEIGHT/8);
854 MYLCD_UPDATE();
855 py_max = (LCD_HEIGHT/8);
856 redraw = REDRAW_PARTIAL;
857 break;
858
859 case MANDELBROT_DOWN:
860 y_min -= y_delta;
861 y_max -= y_delta;
862 MYXLCD(scroll_up)(LCD_HEIGHT/8);
863 MYLCD_UPDATE();
864 py_min = (LCD_HEIGHT-LCD_HEIGHT/8);
865 redraw = REDRAW_PARTIAL;
866 break;
867
868 case MANDELBROT_LEFT:
869 x_min -= x_delta;
870 x_max -= x_delta;
871 MYXLCD(scroll_right)(LCD_WIDTH/8);
872 MYLCD_UPDATE();
873 px_max = (LCD_WIDTH/8);
874 redraw = REDRAW_PARTIAL;
875 break;
876
877 case MANDELBROT_RIGHT:
878 x_min += x_delta;
879 x_max += x_delta;
880 MYXLCD(scroll_left)(LCD_WIDTH/8);
881 MYLCD_UPDATE();
882 px_min = (LCD_WIDTH-LCD_WIDTH/8);
883 redraw = REDRAW_PARTIAL;
884 break;
885
886 case MANDELBROT_MAXITER_DEC:
887#ifdef MANDELBROT_MAXITER_DEC_PRE
888 if (lastbutton != MANDELBROT_MAXITER_DEC_PRE)
889 break;
890#endif
891 if (max_iter >= 15) {
892 max_iter -= max_iter / 3;
893 redraw = REDRAW_FULL;
894 }
895 break;
896
897 case MANDELBROT_MAXITER_INC:
898#ifdef MANDELBROT_MAXITER_INC_PRE
899 if (lastbutton != MANDELBROT_MAXITER_INC_PRE)
900 break;
901#endif
902 max_iter += max_iter / 2;
903 redraw = REDRAW_FULL;
904 break;
905
906 case MANDELBROT_RESET:
907 init_mandelbrot_set();
908 redraw = REDRAW_FULL;
909 break;
910
911 default:
912 if (rb->default_event_handler_ex(button, cleanup, NULL)
913 == SYS_USB_CONNECTED)
914 return PLUGIN_USB_CONNECTED;
915 break;
916 }
917 if (button != BUTTON_NONE)
918 lastbutton = button;
919 }
920#ifdef USEGSLIB
921 grey_release();
922#endif
923 return PLUGIN_OK;
924}
925#endif