1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
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 ****************************************************************************/
26 #ifdef HAVE_LCD_BITMAP
29 #include "fractal_rect.h"
30 #include "fractal_sets.h"
31 #include "mandelbrot_set.h"
34 #define MYLCD(fn) grey_ub_ ## fn
35 #define MYLCD_UPDATE()
36 #define MYXLCD(fn) grey_ub_ ## fn
38 #define MYLCD(fn) rb->lcd_ ## fn
39 #define MYLCD_UPDATE() rb->lcd_update();
40 #define MYXLCD(fn) xlcd_ ## fn
45 static unsigned char *gbuf
;
46 static size_t gbuf_size
= 0;
50 #define REDRAW_PARTIAL 1
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);
69 case FRACTAL_ZOOM_OUT
:
70 case FRACTAL_PRECISION_INC
:
71 case FRACTAL_PRECISION_DEC
:
73 #ifdef FRACTAL_ZOOM_IN2
74 case FRACTAL_ZOOM_IN2
:
76 #ifdef FRACTAL_ZOOM_IN_PRE
77 case FRACTAL_ZOOM_IN_PRE
:
79 #if defined(FRACTAL_ZOOM_OUT_PRE) && \
80 (FRACTAL_ZOOM_OUT_PRE != FRACTAL_ZOOM_IN_PRE)
81 case FRACTAL_ZOOM_OUT_PRE
:
83 #ifdef FRACTAL_PRECISION_INC_PRE
84 case FRACTAL_PRECISION_INC_PRE
:
86 #if defined(FRACTAL_PRECISION_DEC_PRE) && \
87 (FRACTAL_PRECISION_DEC_PRE != FRACTAL_PRECISION_INC_PRE)
88 case FRACTAL_PRECISION_DEC_PRE
:
92 *button
= BUTTON_NONE
;
97 static void cleanup(void *parameter
)
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
;
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");
123 grey_show(true); /* switch on greyscale overlay */
127 rb
->lcd_set_backdrop(NULL
);
135 long button
= BUTTON_NONE
;
137 if (redraw
!= REDRAW_NONE
)
139 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
142 if (redraw
== REDRAW_FULL
)
144 MYLCD(clear_display
)();
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);
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);
163 #ifdef FRACTAL_RC_QUIT
164 case FRACTAL_RC_QUIT
:
172 case FRACTAL_ZOOM_OUT
:
173 #ifdef FRACTAL_ZOOM_OUT_PRE
174 if (lastbutton
!= FRACTAL_ZOOM_OUT_PRE
)
178 redraw
= REDRAW_FULL
;
182 case FRACTAL_ZOOM_IN
:
183 #ifdef FRACTAL_ZOOM_IN_PRE
184 if (lastbutton
!= FRACTAL_ZOOM_IN_PRE
)
187 #ifdef FRACTAL_ZOOM_IN2
188 case FRACTAL_ZOOM_IN2
:
191 redraw
= REDRAW_FULL
;
196 MYXLCD(scroll_down
)(LCD_SHIFT_Y
);
198 if (redraw
!= REDRAW_FULL
)
199 redraw
= rects_move_down() ? REDRAW_FULL
: REDRAW_PARTIAL
;
204 MYXLCD(scroll_up
)(LCD_SHIFT_Y
);
206 if (redraw
!= REDRAW_FULL
)
207 redraw
= rects_move_up() ? REDRAW_FULL
: REDRAW_PARTIAL
;
212 MYXLCD(scroll_right
)(LCD_SHIFT_X
);
214 if (redraw
!= REDRAW_FULL
)
215 redraw
= rects_move_right() ? REDRAW_FULL
: REDRAW_PARTIAL
;
220 MYXLCD(scroll_left
)(LCD_SHIFT_X
);
222 if (redraw
!= REDRAW_FULL
)
223 redraw
= rects_move_left() ? REDRAW_FULL
: REDRAW_PARTIAL
;
226 case FRACTAL_PRECISION_DEC
:
227 #ifdef FRACTAL_PRECISION_DEC_PRE
228 if (lastbutton
!= FRACTAL_PRECISION_DEC_PRE
)
231 if (ops
->precision(-1))
232 redraw
= REDRAW_FULL
;
236 case FRACTAL_PRECISION_INC
:
237 #ifdef FRACTAL_PRECISION_INC_PRE
238 if (lastbutton
!= FRACTAL_PRECISION_INC_PRE
)
241 if (ops
->precision(+1))
242 redraw
= REDRAW_FULL
;
248 redraw
= REDRAW_FULL
;
252 if (rb
->default_event_handler_ex(button
, cleanup
, NULL
)
253 == SYS_USB_CONNECTED
)
254 return PLUGIN_USB_CONNECTED
;
258 if (button
!= BUTTON_NONE
)