Mercurial > audlegacy
annotate audacious/widgets/svis.c @ 2191:13b7c5f26332 trunk
[svn] - Updated fix for doublesized, shaded analyzer.
| author | nhjm449 |
|---|---|
| date | Fri, 22 Dec 2006 00:32:44 -0800 |
| parents | d618044d35e4 |
| children | 60bd49189fde |
| rev | line source |
|---|---|
| 1653 | 1 /* BMP - Cross-platform multimedia player |
| 2 * Copyright (C) 2003-2004 BMP development team. | |
| 3 * | |
| 4 * Based on XMMS: | |
| 5 * Copyright (C) 1998-2003 XMMS development team. | |
| 6 * | |
| 7 * This program is free software; you can redistribute it and/or modify | |
| 8 * it under the terms of the GNU General Public License as published by | |
| 9 * the Free Software Foundation; either version 2 of the License, or | |
| 10 * (at your option) any later version. | |
| 11 * | |
| 12 * This program is distributed in the hope that it will be useful, | |
| 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 15 * GNU General Public License for more details. | |
| 16 * | |
| 17 * You should have received a copy of the GNU General Public License | |
| 18 * along with this program; if not, write to the Free Software | |
| 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
| 20 */ | |
| 21 | |
| 22 #include "widgetcore.h" | |
| 23 | |
| 24 #include <glib.h> | |
| 25 #include <gdk/gdk.h> | |
| 26 #include <string.h> | |
| 27 | |
| 28 #include "main.h" | |
| 29 #include "mainwin.h" | |
| 30 #include "plugin.h" | |
| 31 #include "widget.h" | |
| 32 #include "vis.h" | |
| 33 | |
| 34 static gint svis_redraw_delays[] = { 1, 2, 4, 8 }; | |
| 35 | |
| 36 /* FIXME: Are the svis_scope_colors correct? */ | |
| 37 static guint8 svis_scope_colors[] = { 20, 19, 18, 19, 20 }; | |
| 38 static guint8 svis_vu_normal_colors[] = { 17, 17, 17, 12, 12, 12, 2, 2 }; | |
| 39 | |
| 40 #define DRAW_DS_PIXEL(ptr,value) \ | |
| 41 *(ptr) = (value); \ | |
| 42 *((ptr) + 1) = (value); \ | |
| 43 *((ptr) + 76) = (value); \ | |
| 44 *((ptr) + 77) = (value); | |
| 45 | |
| 46 #define SVIS_HEIGHT 5 | |
| 47 #define SVIS_WIDTH 38 | |
| 48 | |
| 49 void | |
| 50 svis_timeout_func(SVis * svis, guchar * data) | |
| 51 { | |
| 52 static GTimer *timer = NULL; | |
| 53 gulong micros = 9999999; | |
| 54 gboolean falloff = FALSE; | |
| 55 gint i; | |
| 56 | |
| 57 if (!timer) { | |
| 58 timer = g_timer_new(); | |
| 59 g_timer_start(timer); | |
| 60 } | |
| 61 else { | |
| 62 g_timer_elapsed(timer, µs); | |
| 63 if (micros > 14000) | |
| 64 g_timer_reset(timer); | |
| 65 | |
| 66 } | |
| 67 | |
| 2171 | 68 if (cfg.vis_type == VIS_VOICEPRINT) { |
| 1653 | 69 if (micros > 14000) |
| 70 falloff = TRUE; | |
| 71 | |
| 72 for (i = 0; i < 2; i++) { | |
| 73 if (falloff || data) { | |
| 74 if (data && data[i] > svis->vs_data[i]) | |
| 75 svis->vs_data[i] = data[i]; | |
| 76 else if (falloff) { | |
| 77 if (svis->vs_data[i] >= 2) | |
| 78 svis->vs_data[i] -= 2; | |
| 79 else | |
| 80 svis->vs_data[i] = 0; | |
| 81 } | |
| 82 } | |
| 83 | |
| 84 } | |
| 85 } | |
| 86 else if (data) { | |
| 87 for (i = 0; i < 75; i++) | |
| 88 svis->vs_data[i] = data[i]; | |
| 89 } | |
| 90 | |
| 91 if (micros > 14000) { | |
| 92 if (!svis->vs_refresh_delay) { | |
| 93 svis_draw((Widget *) svis); | |
| 94 svis->vs_refresh_delay = svis_redraw_delays[cfg.vis_refresh]; | |
| 95 | |
| 96 } | |
| 97 svis->vs_refresh_delay--; | |
| 98 } | |
| 99 } | |
| 100 | |
| 101 void | |
| 102 svis_draw(Widget * w) | |
| 103 { | |
| 104 SVis *svis = (SVis *) w; | |
| 105 gint x, y, h; | |
| 106 guchar svis_color[24][3]; | |
| 107 guchar rgb_data[SVIS_WIDTH * 2 * SVIS_HEIGHT * 2], *ptr, c; | |
| 108 guint32 colors[24]; | |
| 109 GdkRgbCmap *cmap; | |
| 110 | |
| 111 GDK_THREADS_ENTER(); | |
| 112 | |
| 113 skin_get_viscolor(bmp_active_skin, svis_color); | |
| 114 for (y = 0; y < 24; y++) { | |
| 115 colors[y] = | |
| 116 svis_color[y][0] << 16 | svis_color[y][1] << 8 | svis_color[y][2]; | |
| 117 } | |
| 118 cmap = gdk_rgb_cmap_new(colors, 24); | |
| 119 | |
| 1938 | 120 if (!cfg.doublesize) { |
|
2172
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
121 memset(rgb_data, 0, SVIS_WIDTH * SVIS_HEIGHT); |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
122 if (cfg.vis_type == VIS_ANALYZER) { |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
123 for(y=0; y < SVIS_HEIGHT; y++){ |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
124 if (cfg.analyzer_type == ANALYZER_BARS){ |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
125 for(x=0;x< SVIS_WIDTH; x++){ |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
126 if(svis->vs_data[x] > y << 1) |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
127 { |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
128 rgb_data[x*3+ (SVIS_HEIGHT - y) * SVIS_WIDTH] = 23; |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
129 rgb_data[x*3+1 + (SVIS_HEIGHT - y) * SVIS_WIDTH] = 23; |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
130 |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
131 } |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
132 } |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
133 } |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
134 else{ |
| 2171 | 135 for(x=0;x< SVIS_WIDTH; x++){ |
| 136 if(svis->vs_data[x] > y << 1) | |
| 137 { | |
| 138 rgb_data[x + (SVIS_HEIGHT - y) * SVIS_WIDTH] = 23; | |
| 139 } | |
| 140 } | |
| 141 } | |
|
2172
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
142 } |
|
9a02f5ea1a9c
[svn] - Added 'bars' mode for analyzer in windowshade mode
marvin
parents:
2171
diff
changeset
|
143 } |
|
2161
c12319817d7e
[svn] - patch to add a scrolling voiceprint to the mini visualizer.
nenolod
parents:
1938
diff
changeset
|
144 else if (cfg.vis_type == VIS_VOICEPRINT){ |
| 2171 | 145 switch (cfg.vu_mode) { |
| 146 case VU_NORMAL: | |
| 147 for (y = 0; y < 2; y++) { | |
| 148 ptr = rgb_data + ((y * 3) * 38); | |
| 149 h = (svis->vs_data[y] * 7) / 37; | |
| 150 for (x = 0; x < h; x++, ptr += 5) { | |
| 151 c = svis_vu_normal_colors[x]; | |
| 152 *(ptr) = c; | |
| 153 *(ptr + 1) = c; | |
| 154 *(ptr + 2) = c; | |
| 155 *(ptr + 38) = c; | |
| 156 *(ptr + 39) = c; | |
| 157 *(ptr + 40) = c; | |
| 158 } | |
| 159 } | |
| 160 break; | |
| 161 case VU_SMOOTH: | |
| 162 for (y = 0; y < 2; y++) { | |
| 163 ptr = rgb_data + ((y * 3) * SVIS_WIDTH); | |
| 164 for (x = 0; x < svis->vs_data[y]; x++, ptr++) { | |
| 165 c = 17 - ((x * 15) / 37); | |
| 166 *(ptr) = c; | |
| 167 *(ptr + 38) = c; | |
| 168 } | |
| 169 } | |
| 170 break; | |
| 171 } | |
|
2161
c12319817d7e
[svn] - patch to add a scrolling voiceprint to the mini visualizer.
nenolod
parents:
1938
diff
changeset
|
172 } |
| 1938 | 173 else if (cfg.vis_type == VIS_SCOPE) { |
| 174 for (x = 0; x < 38; x++) { | |
| 175 h = svis->vs_data[x << 1] / 3; | |
| 176 ptr = rgb_data + ((4 - h) * 38) + x; | |
| 177 *ptr = svis_scope_colors[h]; | |
| 1653 | 178 } |
| 179 } | |
| 1938 | 180 |
| 181 gdk_draw_indexed_image(mainwin->window, mainwin_gc, | |
| 182 svis->vs_widget.x, svis->vs_widget.y, | |
| 183 svis->vs_widget.width, | |
| 184 svis->vs_widget.height, | |
| 185 GDK_RGB_DITHER_NORMAL, (guchar *) rgb_data, | |
| 186 38, cmap); | |
| 1653 | 187 } |
| 1938 | 188 else { /* doublesize */ |
| 1653 | 189 |
| 1938 | 190 memset(rgb_data, 0, SVIS_WIDTH * 2 * SVIS_HEIGHT * 2); |
| 191 if (cfg.vis_type == VIS_ANALYZER) { | |
| 2171 | 192 for(y=0; y < SVIS_HEIGHT; y++){ |
|
2191
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
193 if (cfg.analyzer_type == ANALYZER_BARS){ |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
194 for(x=0;x< SVIS_WIDTH; x++){ |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
195 if(svis->vs_data[x] > y << 1) |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
196 { |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
197 ptr = rgb_data + x * 6 + (SVIS_HEIGHT * 2 - y * 2) * SVIS_WIDTH * 2; |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
198 DRAW_DS_PIXEL(ptr, 23); |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
199 DRAW_DS_PIXEL(ptr + 2, 23); |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
200 } |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
201 } |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
202 } |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
203 else{ |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
204 for(x=0;x< SVIS_WIDTH; x++){ |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
205 if(svis->vs_data[x] > y << 1) |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
206 { |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
207 ptr = rgb_data + x * 2 + (SVIS_HEIGHT * 2 - y * 2) * SVIS_WIDTH * 2; |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
208 DRAW_DS_PIXEL(ptr, 23); |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
209 } |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
210 } |
|
13b7c5f26332
[svn] - Updated fix for doublesized, shaded analyzer.
nhjm449
parents:
2190
diff
changeset
|
211 } |
| 2171 | 212 } |
| 1938 | 213 } |
| 2171 | 214 else if (cfg.vis_type == VIS_VOICEPRINT){ |
| 215 switch (cfg.vu_mode) { | |
| 216 case VU_NORMAL: | |
| 217 for (y = 0; y < 2; y++) { | |
| 218 ptr = rgb_data + ((y * 3) * 152); | |
| 219 h = (svis->vs_data[y] * 8) / 37; | |
| 220 for (x = 0; x < h; x++, ptr += 10) { | |
| 221 c = svis_vu_normal_colors[x]; | |
| 222 DRAW_DS_PIXEL(ptr, c); | |
| 223 DRAW_DS_PIXEL(ptr + 2, c); | |
| 224 DRAW_DS_PIXEL(ptr + 4, c); | |
| 225 DRAW_DS_PIXEL(ptr + 152, c); | |
| 226 DRAW_DS_PIXEL(ptr + 154, c); | |
| 227 DRAW_DS_PIXEL(ptr + 156, c); | |
| 228 } | |
| 229 } | |
| 230 break; | |
| 231 case VU_SMOOTH: | |
| 232 for (y = 0; y < 2; y++) { | |
| 233 ptr = rgb_data + ((y * 3) * 152); | |
| 234 for (x = 0; x < svis->vs_data[y]; x++, ptr += 2) { | |
| 235 c = 17 - ((x * 15) / 37); | |
| 236 DRAW_DS_PIXEL(ptr, c); | |
| 237 DRAW_DS_PIXEL(ptr + 152, c); | |
| 238 } | |
| 239 } | |
| 240 break; | |
| 241 } | |
| 242 } | |
| 1938 | 243 else if (cfg.vis_type == VIS_SCOPE) { |
| 244 for (x = 0; x < 38; x++) { | |
| 245 h = svis->vs_data[x << 1] / 3; | |
| 246 ptr = rgb_data + ((4 - h) * 152) + (x << 1); | |
| 247 *ptr = svis_scope_colors[h]; | |
| 248 *(ptr + 1) = svis_scope_colors[h]; | |
| 249 *(ptr + 76) = svis_scope_colors[h]; | |
| 250 *(ptr + 77) = svis_scope_colors[h]; | |
| 251 } | |
| 252 } | |
| 1653 | 253 |
| 1938 | 254 gdk_draw_indexed_image(mainwin->window, mainwin_gc, |
| 255 svis->vs_widget.x << 1, | |
| 256 svis->vs_widget.y << 1, | |
| 257 svis->vs_widget.width << 1, | |
| 258 svis->vs_widget.height << 1, | |
| 259 GDK_RGB_DITHER_NONE, (guchar *) rgb_data, | |
| 260 76, cmap); | |
| 261 } | |
| 1653 | 262 gdk_rgb_cmap_free(cmap); |
| 263 GDK_THREADS_LEAVE(); | |
| 264 } | |
| 265 | |
| 266 void | |
| 267 svis_clear_data(SVis * svis) | |
| 268 { | |
| 269 gint i; | |
| 270 | |
| 271 if (!svis) | |
| 272 return; | |
| 273 | |
| 274 for (i = 0; i < 75; i++) { | |
| 275 svis->vs_data[i] = (cfg.vis_type == VIS_SCOPE) ? 6 : 0; | |
| 276 } | |
| 277 } | |
| 278 | |
| 279 void | |
| 280 svis_clear(SVis * svis) | |
| 281 { | |
| 1938 | 282 if (!cfg.doublesize) |
| 283 gdk_window_clear_area(mainwin->window, svis->vs_widget.x, | |
| 284 svis->vs_widget.y, svis->vs_widget.width, | |
| 285 svis->vs_widget.height); | |
| 286 else | |
| 287 gdk_window_clear_area(mainwin->window, svis->vs_widget.x << 1, | |
| 288 svis->vs_widget.y << 1, | |
| 289 svis->vs_widget.width << 1, | |
| 290 svis->vs_widget.height << 1); | |
| 1653 | 291 } |
| 292 | |
| 293 SVis * | |
| 294 create_svis(GList ** wlist, | |
| 295 GdkPixmap * parent, | |
| 296 GdkGC * gc, | |
| 297 gint x, gint y) | |
| 298 { | |
| 299 SVis *svis; | |
| 300 | |
| 301 svis = g_new0(SVis, 1); | |
| 302 widget_init(&svis->vs_widget, parent, gc, x, y, SVIS_WIDTH, SVIS_HEIGHT, | |
| 303 1); | |
| 304 | |
| 305 widget_list_add(wlist, WIDGET(svis)); | |
| 306 return svis; | |
| 307 } |
