4 #include "bcresources.h"
8 #include "rotateframe.h"
24 : BC_SubWindow(x, y, -1, -1, -1)
26 this->virtual_r = virtual_r;
27 this->maxvalue = maxvalue;
28 this->total_values = total_values;
29 this->values = new float[total_values];
30 memcpy(this->values, values, sizeof(float) * total_values);
31 this->value_positions = new int[total_values];
32 memcpy(this->value_positions, value_positions, sizeof(int) * total_values);
33 this->value_x = new int[total_values];
34 this->value_y = new int[total_values];
35 this->stick_x = stick_x;
36 this->stick_y = stick_y;
37 get_channel_positions(value_x,
42 if(stick_x < 0 || stick_y < 0)
43 calculate_stick_position(total_values,
53 memset(images, 0, sizeof(BC_Pixmap*) * PAN_IMAGES);
58 //printf("BC_Pan::~BC_Pan 1\n");
60 //printf("BC_Pan::~BC_Pan 1\n");
61 delete [] value_positions;
62 //printf("BC_Pan::~BC_Pan 1\n");
64 //printf("BC_Pan::~BC_Pan 1\n");
66 //printf("BC_Pan::~BC_Pan 1\n");
67 if(popup) delete popup;
68 //printf("BC_Pan::~BC_Pan 1\n");
70 //printf("BC_Pan::~BC_Pan 1\n");
72 for(int i = 0; i < PAN_IMAGES; i++)
73 if(images[i]) delete images[i];
74 //printf("BC_Pan::~BC_Pan 2\n");
77 int BC_Pan::initialize()
79 set_images(get_resources()->pan_data);
81 BC_SubWindow::initialize();
82 temp_channel = new VFrame(0,
83 get_resources()->pan_data[PAN_CHANNEL]->get_w(),
84 get_resources()->pan_data[PAN_CHANNEL]->get_h(),
85 get_resources()->pan_data[PAN_CHANNEL]->get_color_model());
86 rotater = new RotateFrame(1,
87 get_resources()->pan_data[PAN_CHANNEL]->get_w(),
88 get_resources()->pan_data[PAN_CHANNEL]->get_h());
93 void BC_Pan::set_images(VFrame **data)
95 for(int i = 0; i < PAN_IMAGES; i++)
97 if(images[i]) delete images[i];
98 images[i] = new BC_Pixmap(parent_window, data[i], PIXMAP_ALPHA);
100 w = images[PAN_UP]->get_w();
101 h = images[PAN_UP]->get_h();
104 int BC_Pan::button_press_event()
106 // there are two modes of operation...
108 { if (popup->is_event_win() && get_button_down() && get_buttonpress() == 1)
111 x_origin = popup->get_cursor_x();
112 y_origin = popup->get_cursor_y();
113 stick_x_origin = stick_x;
114 stick_y_origin = stick_y;
122 if(is_event_win() && get_button_down() && get_buttonpress() == 1)
127 x_origin = get_cursor_x();
128 y_origin = get_cursor_y();
129 stick_x_origin = stick_x;
130 stick_y_origin = stick_y;
137 int BC_Pan::cursor_motion_event()
139 if(popup && get_button_down() && get_buttonpress() == 1)
141 stick_x = stick_x_origin + get_cursor_x() - x_origin;
142 stick_y = stick_y_origin + get_cursor_y() - y_origin;
143 CLAMP(stick_x, 0, virtual_r * 2);
144 CLAMP(stick_y, 0, virtual_r * 2);
153 int BC_Pan::button_release_event()
165 int BC_Pan::repeat_event(int64_t duration)
167 if(duration == top_level->get_resources()->tooltip_delay &&
168 tooltip_text[0] != 0 &&
180 int BC_Pan::cursor_enter_event()
182 if(is_event_win() && !highlighted)
191 int BC_Pan::cursor_leave_event()
204 int BC_Pan::deactivate()
206 if(popup) delete popup;
212 int BC_Pan::activate(int popup_x, int popup_y)
218 if (popup_x < 0 || popup_y < 0)
220 XTranslateCoordinates(top_level->display,
229 x -= (images[PAN_POPUP]->get_w() - get_w()) / 2;
230 y -= (images[PAN_POPUP]->get_h() - get_h()) / 2;
234 XTranslateCoordinates(top_level->display,
242 x -= images[PAN_POPUP]->get_w() / 2;
243 y -= images[PAN_POPUP]->get_h() / 2;
248 if (popup) delete popup;
249 popup = new BC_Popup(this,
252 images[PAN_POPUP]->get_w(),
253 images[PAN_POPUP]->get_h(),
262 int BC_Pan::update(int x, int y)
275 void BC_Pan::draw_popup()
277 popup->draw_background(0, 0, popup->get_w(), popup->get_h());
281 float scale = (float)(popup->get_w() -
282 get_resources()->pan_data[PAN_CHANNEL]->get_w()) /
284 set_color(get_resources()->pan_text_color);
287 for(int i = 0; i < total_values; i++)
289 x1 = (int)(value_x[i] * scale);
290 y1 = (int)(value_y[i] * scale);
291 rotate_angle = value_positions[i];
292 rotate_angle = -rotate_angle;
293 while(rotate_angle < 0) rotate_angle += 360;
294 rotater->rotate(temp_channel,
295 get_resources()->pan_data[PAN_CHANNEL],
298 BC_Pixmap *temp_pixmap = new BC_Pixmap(popup,
301 popup->draw_pixmap(temp_pixmap, x1, y1);
304 char string[BCTEXTLEN];
305 float value = values[i] + 0.005;
306 sprintf(string, "%.1f", value);
307 popup->draw_text(x1, y1 + get_text_height(SMALLFONT), string);
310 x1 = (int)(stick_x * scale);
311 y1 = (int)(stick_y * scale);
312 popup->draw_pixmap(images[PAN_STICK], x1, y1);
321 draw_top_background(parent_window, 0, 0, w, h);
323 draw_pixmap(images[highlighted ? PAN_HI : PAN_UP]);
324 get_channel_positions(value_x,
331 int x1, y1, x2, y2, w, h, j;
332 float scale = (float)(get_w() - PICON_W) / (virtual_r * 2);
335 for(int i = 0; i < total_values; i++)
337 // printf("BC_Pan::draw 1 %d %d %d %d\n",
339 // value_positions[i],
342 x1 = (int)(value_x[i] * scale);
343 y1 = (int)(value_y[i] * scale);
344 //printf("BC_Pan::draw 2 %d %d\n", x1, y1);
345 CLAMP(x1, 0, get_w() - PICON_W);
346 CLAMP(y1, 0, get_h() - PICON_H);
347 draw_pixmap(images[PAN_CHANNEL_SMALL], x1, y1);
348 // draw_box(x1, y1, PICON_W, PICON_H);
353 x1 = (int)(stick_x * scale);
354 y1 = (int)(stick_y * scale);
356 //printf("BC_Pan::draw 2 %d %d\n", x1, y1);
357 CLAMP(x1, 0, get_w() - PICON_W);
358 CLAMP(y1, 0, get_h() - PICON_H);
360 draw_pixmap(images[PAN_STICK_SMALL], x1, y1);
361 // x2 = x1 + PICON_W;
362 // y2 = y1 + PICON_H;
363 // draw_line(x1, y1, x2, y2);
364 // draw_line(x2, y1, x1, y2);
369 int BC_Pan::stick_to_values()
371 return stick_to_values(values,
380 int BC_Pan::stick_to_values(float *values,
382 int *value_positions,
388 // find shortest distance to a channel
389 float shortest = 2 * virtual_r, test_distance;
391 int *value_x = new int[total_values];
392 int *value_y = new int[total_values];
394 get_channel_positions(value_x, value_y, value_positions, virtual_r, total_values);
395 for(i = 0; i < total_values; i++)
397 if((test_distance = distance(stick_x,
400 value_y[i])) < shortest)
401 shortest = test_distance;
404 // get values for channels
407 for(i = 0; i < total_values; i++)
409 if(distance(stick_x, value_x[i], stick_y, value_y[i]) == shortest)
410 values[i] = maxvalue;
417 for(i = 0; i < total_values; i++)
419 values[i] = shortest;
420 values[i] -= (float)(distance(stick_x,
423 value_y[i]) - shortest);
424 if(values[i] < 0) values[i] = 0;
425 values[i] = values[i] / shortest * maxvalue;
429 for(i = 0; i < total_values; i++)
431 values[i] = Units::quantize10(values[i]);
440 float BC_Pan::distance(int x1, int x2, int y1, int y2)
442 return hypot(x2 - x1, y2 - y1);
445 int BC_Pan::change_channels(int new_channels, int *value_positions)
448 delete this->value_positions;
452 values = new float[new_channels];
453 this->value_positions = new int[new_channels];
454 value_x = new int[new_channels];
455 value_y = new int[new_channels];
456 total_values = new_channels;
457 for(int i = 0; i < new_channels; i++)
459 this->value_positions[i] = value_positions[i];
461 get_channel_positions(value_x,
471 int BC_Pan::get_channel_positions(int *value_x,
473 int *value_positions,
477 for(int i = 0; i < total_values; i++)
479 rdtoxy(value_x[i], value_y[i], value_positions[i], virtual_r);
484 int BC_Pan::get_total_values()
489 float BC_Pan::get_value(int channel)
491 return values[channel];
494 int BC_Pan::get_stick_x()
499 int BC_Pan::get_stick_y()
504 float* BC_Pan::get_values()
509 int BC_Pan::rdtoxy(int &x, int &y, int a, int virtual_r)
511 float radians = (float)a / 360 * 2 * M_PI;
513 y = (int)(sin(radians) * virtual_r);
514 x = (int)(cos(radians) * virtual_r);
520 void BC_Pan::calculate_stick_position(int total_values,
521 int *value_positions,
528 // If 2 channels have positive values, use weighted average
532 for(int i = 0; i < total_values; i++)
534 if(values[i] > 0.001)
536 if(channel1 < 0) channel1 = i;
538 if(channel2 < 0) channel2 = i;
544 if(channel1 >= 0 && channel2 >= 0)
547 rdtoxy(x1, y1, value_positions[channel1], virtual_r);
548 rdtoxy(x2, y2, value_positions[channel2], virtual_r);
549 stick_x = (x1 + x2) / 2;
550 stick_y = (y1 + y2) / 2;
555 // use highest value as location of stick
556 float highest_value = 0;
560 for(i = 0; i < total_values; i++)
562 if(values[i] > highest_value)
564 highest_value = values[i];
565 angle = value_positions[i];
568 rdtoxy(stick_x, stick_y, angle, virtual_r);