Colour targets: Revert an optimisation from almost 18 months ago that actually turned...
[Rockbox.git] / apps / plugins / logo.c
blobdd03dd800cdd1f092a943ee16a4534e2c56e9ca4
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2005 Jonas H�gqvist
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 **************************************************************************/
21 #include "plugin.h"
22 #include "playergfx.h"
24 PLUGIN_HEADER
26 #ifdef HAVE_LCD_BITMAP
27 #define DISPLAY_WIDTH LCD_WIDTH
28 #define DISPLAY_HEIGHT LCD_HEIGHT
29 #define RAND_SCALE 5
31 #ifdef HAVE_REMOTE_LCD
32 #define REMOTE_WIDTH LCD_REMOTE_WIDTH
33 #define REMOTE_HEIGHT LCD_REMOTE_HEIGHT
34 #include "remote_rockboxlogo.h"
35 #define REMOTE_LOGO_WIDTH BMPWIDTH_remote_rockboxlogo
36 #define REMOTE_LOGO_HEIGHT BMPHEIGHT_remote_rockboxlogo
37 #define REMOTE_LOGO remote_rockboxlogo
38 extern const fb_remote_data remote_rockboxlogo[];
39 #endif /* HAVE_REMOTE_LCD */
41 #define LOGO rockboxlogo
42 #include "rockboxlogo.h"
43 #define LOGO_WIDTH BMPWIDTH_rockboxlogo
44 #define LOGO_HEIGHT BMPHEIGHT_rockboxlogo
45 extern const fb_data rockboxlogo[];
47 #else /* !LCD_BITMAP */
48 #define DISPLAY_WIDTH 55
49 #define DISPLAY_HEIGHT 14
50 #define RAND_SCALE 2
51 #define LOGO_WIDTH 16
52 #define LOGO_HEIGHT 7
53 #define LOGO rockbox16x7
54 const unsigned char rockbox16x7[] = {
55 0x47, 0x18, 0xa6, 0xd8, 0x66, 0xde, 0xb7, 0x9b,
56 0x76, 0xdb, 0x26, 0xdb, 0x66, 0xde,
58 #endif /* !LCD_BITMAP */
60 /* variable button definitions */
61 #if CONFIG_KEYPAD == PLAYER_PAD
62 #define LP_QUIT BUTTON_STOP
63 #define LP_DEC_X BUTTON_LEFT
64 #define LP_INC_X BUTTON_RIGHT
65 #define LP_DEC_Y (BUTTON_ON | BUTTON_LEFT)
66 #define LP_INC_Y (BUTTON_ON | BUTTON_RIGHT)
68 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
69 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
70 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
71 #define LP_QUIT BUTTON_MENU
72 #define LP_DEC_X BUTTON_LEFT
73 #define LP_INC_X BUTTON_RIGHT
74 #define LP_DEC_Y BUTTON_SCROLL_BACK
75 #define LP_INC_Y BUTTON_SCROLL_FWD
77 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
78 #define LP_QUIT BUTTON_PLAY
79 #define LP_DEC_X BUTTON_LEFT
80 #define LP_INC_X BUTTON_RIGHT
81 #define LP_DEC_Y BUTTON_DOWN
82 #define LP_INC_Y BUTTON_UP
84 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
85 #define LP_QUIT BUTTON_POWER
86 #define LP_DEC_X BUTTON_LEFT
87 #define LP_INC_X BUTTON_RIGHT
88 #define LP_DEC_Y BUTTON_DOWN
89 #define LP_INC_Y BUTTON_UP
91 #elif CONFIG_KEYPAD == GIGABEAT_PAD
92 #define LP_QUIT BUTTON_POWER
93 #define LP_DEC_X BUTTON_LEFT
94 #define LP_INC_X BUTTON_RIGHT
95 #define LP_DEC_Y BUTTON_DOWN
96 #define LP_INC_Y BUTTON_UP
98 #elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
99 (CONFIG_KEYPAD == SANSA_C200_PAD)
100 #define LP_QUIT BUTTON_POWER
101 #define LP_DEC_X BUTTON_LEFT
102 #define LP_INC_X BUTTON_RIGHT
103 #define LP_DEC_Y BUTTON_DOWN
104 #define LP_INC_Y BUTTON_UP
106 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
107 #define LP_QUIT BUTTON_POWER
108 #define LP_DEC_X BUTTON_LEFT
109 #define LP_INC_X BUTTON_RIGHT
110 #define LP_DEC_Y BUTTON_SCROLL_DOWN
111 #define LP_INC_Y BUTTON_SCROLL_UP
113 #elif CONFIG_KEYPAD == MROBE500_PAD
114 #define LP_QUIT BUTTON_POWER
115 #define LP_DEC_X BUTTON_LEFT
116 #define LP_INC_X BUTTON_RIGHT
117 #define LP_DEC_Y BUTTON_RC_DOWN
118 #define LP_INC_Y BUTTON_RC_PLAY
120 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
121 #define LP_QUIT BUTTON_BACK
122 #define LP_DEC_X BUTTON_LEFT
123 #define LP_INC_X BUTTON_RIGHT
124 #define LP_DEC_Y BUTTON_DOWN
125 #define LP_INC_Y BUTTON_UP
127 #elif CONFIG_KEYPAD == MROBE100_PAD
128 #define LP_QUIT BUTTON_POWER
129 #define LP_DEC_X BUTTON_LEFT
130 #define LP_INC_X BUTTON_RIGHT
131 #define LP_DEC_Y BUTTON_DOWN
132 #define LP_INC_Y BUTTON_UP
134 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
135 #define LP_QUIT BUTTON_RC_REC
136 #define LP_DEC_X BUTTON_RC_REW
137 #define LP_INC_X BUTTON_RC_FF
138 #define LP_DEC_Y BUTTON_RC_VOL_DOWN
139 #define LP_INC_Y BUTTON_RC_VOL_UP
141 #elif CONFIG_KEYPAD == COWOND2_PAD
142 #define LP_QUIT BUTTON_POWER
144 #else
145 #define LP_QUIT BUTTON_OFF
146 #define LP_DEC_X BUTTON_LEFT
147 #define LP_INC_X BUTTON_RIGHT
148 #define LP_DEC_Y BUTTON_DOWN
149 #define LP_INC_Y BUTTON_UP
150 #endif
152 #ifdef CONFIG_REMOTE_KEYPAD
153 #if (CONFIG_REMOTE_KEYPAD == H100_REMOTE) || \
154 (CONFIG_REMOTE_KEYPAD == H300_REMOTE)
155 #define LP_R_QUIT BUTTON_RC_STOP
156 #define LP_R_DEC_X BUTTON_RC_REW
157 #define LP_R_INC_X BUTTON_RC_FF
158 #define LP_R_DEC_Y BUTTON_RC_SOURCE
159 #define LP_R_INC_Y BUTTON_RC_BITRATE
160 #endif
161 #endif /* CONFIG_REMOTE_KEYPAD */
163 #ifdef HAVE_TOUCHPAD
164 #ifndef LP_QUIT
165 #define LP_QUIT BUTTON_TOPLEFT
166 #endif
167 #ifndef LP_DEC_X
168 #define LP_DEC_X BUTTON_MIDLEFT
169 #endif
170 #ifndef LP_INC_X
171 #define LP_INC_X BUTTON_MIDRIGHT
172 #endif
173 #ifndef LP_DEC_Y
174 #define LP_DEC_Y BUTTON_TOPMIDDLE
175 #endif
176 #ifndef LP_INC_Y
177 #define LP_INC_Y BUTTON_BOTTOMMIDDLE
178 #endif
179 #endif
181 enum plugin_status plugin_start(const struct plugin_api* api, const void* parameter) {
182 int button;
183 int timer = 10;
184 int x = (DISPLAY_WIDTH / 2) - (LOGO_WIDTH / 2);
185 int y = (DISPLAY_HEIGHT / 2) - (LOGO_HEIGHT / 2);
186 const struct plugin_api* rb = api;
187 int dx;
188 int dy;
189 #ifdef HAVE_LCD_CHARCELLS
190 int cpos = -1;
191 int old_cpos = -1;
192 #endif
194 (void)parameter;
196 #ifdef HAVE_LCD_CHARCELLS
197 if (!pgfx_init(rb, 4, 2)) {
198 rb->splash(HZ*2, "Old LCD :(");
199 return PLUGIN_OK;
201 #endif
202 rb->srand(*rb->current_tick);
203 dx = rb->rand()%(2*RAND_SCALE+1) - RAND_SCALE;
204 dy = rb->rand()%(2*RAND_SCALE+1) - RAND_SCALE;
206 while (1) {
207 #ifdef HAVE_LCD_BITMAP
208 rb->lcd_clear_display();
209 rb->lcd_bitmap(LOGO, x, y, LOGO_WIDTH, LOGO_HEIGHT);
210 #ifdef REMOTE_LOGO
211 rb->lcd_remote_clear_display();
212 rb->lcd_remote_bitmap(REMOTE_LOGO,
213 (x * (REMOTE_WIDTH - REMOTE_LOGO_WIDTH)) / (DISPLAY_WIDTH - LOGO_WIDTH),
214 (y * (REMOTE_HEIGHT - REMOTE_LOGO_HEIGHT)) / (DISPLAY_HEIGHT - LOGO_HEIGHT),
215 REMOTE_LOGO_WIDTH, REMOTE_LOGO_HEIGHT);
216 #endif
217 #else
218 pgfx_clear_display();
219 pgfx_mono_bitmap(LOGO, x % 5, y, LOGO_WIDTH, LOGO_HEIGHT);
220 cpos = x / 5;
221 #endif
223 x += dx;
224 if (x < 0) {
225 dx = -dx;
226 x = 0;
228 if (x > DISPLAY_WIDTH - LOGO_WIDTH) {
229 dx = -dx;
230 x = DISPLAY_WIDTH - LOGO_WIDTH;
233 y += dy;
234 if (y < 0) {
235 dy = -dy;
236 y = 0;
238 if (y > DISPLAY_HEIGHT - LOGO_HEIGHT) {
239 dy = -dy;
240 y = DISPLAY_HEIGHT - LOGO_HEIGHT;
243 #ifdef HAVE_LCD_BITMAP
244 rb->lcd_update();
245 #ifdef REMOTE_LOGO
246 rb->lcd_remote_update();
247 #endif
248 #else
249 if (cpos != old_cpos) {
250 rb->lcd_clear_display();
251 pgfx_display(cpos, 0);
252 old_cpos = cpos;
254 pgfx_update();
255 #endif
256 rb->sleep(HZ/timer);
258 button = rb->button_get(false);
259 switch (button) {
260 case LP_QUIT:
261 #ifdef CONFIG_REMOTE_KEYPAD
262 case LP_R_QUIT:
263 #endif
264 #ifdef HAVE_LCD_CHARCELLS
265 pgfx_release();
266 #endif
267 return PLUGIN_OK;
268 case LP_DEC_X:
269 #ifdef CONFIG_REMOTE_KEYPAD
270 case LP_R_DEC_X:
271 #endif
272 if (dx)
273 dx += (dx < 0) ? 1 : -1;
274 break;
275 case LP_INC_X:
276 #ifdef CONFIG_REMOTE_KEYPAD
277 case LP_R_INC_X:
278 #endif
279 dx += (dx < 0) ? -1 : 1;
280 break;
281 case LP_DEC_Y:
282 #ifdef CONFIG_REMOTE_KEYPAD
283 case LP_R_DEC_Y:
284 #endif
285 if (dy)
286 dy += (dy < 0) ? 1 : -1;
287 break;
288 case LP_INC_Y:
289 #ifdef CONFIG_REMOTE_KEYPAD
290 case LP_R_INC_Y:
291 #endif
292 dy += (dy < 0) ? -1 : 1;
293 break;
295 default:
296 if (rb->default_event_handler(button) == SYS_USB_CONNECTED) {
297 #ifdef HAVE_LCD_CHARCELLS
298 pgfx_release();
299 #endif
300 return PLUGIN_USB_CONNECTED;
302 break;