Fractals: fix weird keymap for SAMSUNG_YH_PAD. adjust spaces.
[kugel-rb.git] / apps / plugins / fractals / fractal.c
blob5023b2c4508f91fbda03e07d2562a12158b3f7a5
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2004 Matthias Wientapper
11 * Heavily extended 2005 Jens Arnold
12 * Extended 2009 Tomer Shalev
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21 * KIND, either express or implied.
23 ****************************************************************************/
24 #include "plugin.h"
26 #ifdef HAVE_LCD_BITMAP
28 #include "fractal.h"
29 #include "fractal_rect.h"
30 #include "fractal_sets.h"
31 #include "mandelbrot_set.h"
33 #ifdef USEGSLIB
34 #define MYLCD(fn) grey_ub_ ## fn
35 #define MYLCD_UPDATE()
36 #define MYXLCD(fn) grey_ub_ ## fn
37 #else
38 #define MYLCD(fn) rb->lcd_ ## fn
39 #define MYLCD_UPDATE() rb->lcd_update();
40 #define MYXLCD(fn) xlcd_ ## fn
41 #endif
43 #ifdef USEGSLIB
44 GREY_INFO_STRUCT
45 static unsigned char *gbuf;
46 static size_t gbuf_size = 0;
47 #endif
49 #define REDRAW_NONE 0
50 #define REDRAW_PARTIAL 1
51 #define REDRAW_FULL 2
53 PLUGIN_HEADER
55 /* returns 1 if a button has been pressed, 0 otherwise */
56 static int button_yield(void *ctx)
58 long *button = (long *)ctx;
60 *button = rb->button_get(false);
61 switch (*button)
63 case FRACTAL_QUIT:
64 case FRACTAL_UP:
65 case FRACTAL_DOWN:
66 case FRACTAL_LEFT:
67 case FRACTAL_RIGHT:
68 case FRACTAL_ZOOM_IN:
69 case FRACTAL_ZOOM_OUT:
70 case FRACTAL_PRECISION_INC:
71 case FRACTAL_PRECISION_DEC:
72 case FRACTAL_RESET:
73 #ifdef FRACTAL_ZOOM_IN2
74 case FRACTAL_ZOOM_IN2:
75 #endif
76 #ifdef FRACTAL_ZOOM_IN_PRE
77 case FRACTAL_ZOOM_IN_PRE:
78 #endif
79 #if defined(FRACTAL_ZOOM_OUT_PRE) && \
80 (FRACTAL_ZOOM_OUT_PRE != FRACTAL_ZOOM_IN_PRE)
81 case FRACTAL_ZOOM_OUT_PRE:
82 #endif
83 #ifdef FRACTAL_PRECISION_INC_PRE
84 case FRACTAL_PRECISION_INC_PRE:
85 #endif
86 #if defined(FRACTAL_PRECISION_DEC_PRE) && \
87 (FRACTAL_PRECISION_DEC_PRE != FRACTAL_PRECISION_INC_PRE)
88 case FRACTAL_PRECISION_DEC_PRE:
89 #endif
90 return 1;
91 default:
92 *button = BUTTON_NONE;
93 return 0;
97 static void cleanup(void *parameter)
99 (void)parameter;
100 #ifdef USEGSLIB
101 grey_release();
102 #endif
105 enum plugin_status plugin_start(const void* parameter)
107 long lastbutton = BUTTON_NONE;
108 int redraw = REDRAW_FULL;
109 struct fractal_ops *ops = &mandelbrot_ops;
111 (void)parameter;
113 #ifdef USEGSLIB
114 /* get the remainder of the plugin buffer */
115 gbuf = (unsigned char *)rb->plugin_get_buffer(&gbuf_size);
117 /* initialize the greyscale buffer.*/
118 if (!grey_init(gbuf, gbuf_size, GREY_ON_COP, LCD_WIDTH, LCD_HEIGHT, NULL))
120 rb->splash(HZ, "Couldn't init greyscale display");
121 return 0;
123 grey_show(true); /* switch on greyscale overlay */
124 #endif
126 #if LCD_DEPTH > 1
127 rb->lcd_set_backdrop(NULL);
128 #endif
130 ops->init();
132 /* main loop */
133 while (true)
135 long button = BUTTON_NONE;
137 if (redraw != REDRAW_NONE)
139 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
140 rb->cpu_boost(true);
141 #endif
142 if (redraw == REDRAW_FULL)
144 MYLCD(clear_display)();
145 MYLCD_UPDATE();
146 rects_queue_init();
149 /* paint all rects */
150 rects_calc_all(ops->calc, button_yield, (void *)&button);
151 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
152 rb->cpu_boost(false);
153 #endif
154 /* not interrupted by button press - screen is fully drawn */
155 redraw = (button == BUTTON_NONE) ? REDRAW_NONE : REDRAW_PARTIAL;
158 if (button == BUTTON_NONE)
159 button = rb->button_get(true);
161 switch (button)
163 #ifdef FRACTAL_RC_QUIT
164 case FRACTAL_RC_QUIT:
165 #endif
166 case FRACTAL_QUIT:
167 #ifdef USEGSLIB
168 grey_release();
169 #endif
170 return PLUGIN_OK;
172 case FRACTAL_ZOOM_OUT:
173 #ifdef FRACTAL_ZOOM_OUT_PRE
174 if (lastbutton != FRACTAL_ZOOM_OUT_PRE)
175 break;
176 #endif
177 if (!ops->zoom(-1))
178 redraw = REDRAW_FULL;
179 break;
182 case FRACTAL_ZOOM_IN:
183 #ifdef FRACTAL_ZOOM_IN_PRE
184 if (lastbutton != FRACTAL_ZOOM_IN_PRE)
185 break;
186 #endif
187 #ifdef FRACTAL_ZOOM_IN2
188 case FRACTAL_ZOOM_IN2:
189 #endif
190 if (!ops->zoom(1))
191 redraw = REDRAW_FULL;
192 break;
194 case FRACTAL_UP:
195 ops->move(0, +1);
196 MYXLCD(scroll_down)(LCD_SHIFT_Y);
197 MYLCD_UPDATE();
198 if (redraw != REDRAW_FULL)
199 redraw = rects_move_down() ? REDRAW_FULL : REDRAW_PARTIAL;
200 break;
202 case FRACTAL_DOWN:
203 ops->move(0, -1);
204 MYXLCD(scroll_up)(LCD_SHIFT_Y);
205 MYLCD_UPDATE();
206 if (redraw != REDRAW_FULL)
207 redraw = rects_move_up() ? REDRAW_FULL : REDRAW_PARTIAL;
208 break;
210 case FRACTAL_LEFT:
211 ops->move(-1, 0);
212 MYXLCD(scroll_right)(LCD_SHIFT_X);
213 MYLCD_UPDATE();
214 if (redraw != REDRAW_FULL)
215 redraw = rects_move_right() ? REDRAW_FULL : REDRAW_PARTIAL;
216 break;
218 case FRACTAL_RIGHT:
219 ops->move(+1, 0);
220 MYXLCD(scroll_left)(LCD_SHIFT_X);
221 MYLCD_UPDATE();
222 if (redraw != REDRAW_FULL)
223 redraw = rects_move_left() ? REDRAW_FULL : REDRAW_PARTIAL;
224 break;
226 case FRACTAL_PRECISION_DEC:
227 #ifdef FRACTAL_PRECISION_DEC_PRE
228 if (lastbutton != FRACTAL_PRECISION_DEC_PRE)
229 break;
230 #endif
231 if (ops->precision(-1))
232 redraw = REDRAW_FULL;
234 break;
236 case FRACTAL_PRECISION_INC:
237 #ifdef FRACTAL_PRECISION_INC_PRE
238 if (lastbutton != FRACTAL_PRECISION_INC_PRE)
239 break;
240 #endif
241 if (ops->precision(+1))
242 redraw = REDRAW_FULL;
244 break;
246 case FRACTAL_RESET:
247 ops->init();
248 redraw = REDRAW_FULL;
249 break;
251 default:
252 if (rb->default_event_handler_ex(button, cleanup, NULL)
253 == SYS_USB_CONNECTED)
254 return PLUGIN_USB_CONNECTED;
255 break;
258 if (button != BUTTON_NONE)
259 lastbutton = button;
261 #ifdef USEGSLIB
262 grey_release();
263 #endif
264 return PLUGIN_OK;
267 #endif