13
0

Improve waveview height and scaling.

The top line of the selection rect is arguably 1 px too low, but
waveviews seem centered on the area properly.
This commit is contained in:
nick_m 2015-04-17 05:03:51 +10:00
parent d24195c41e
commit 7f41de7427

View File

@ -367,19 +367,16 @@ WaveView::y_extent (double s, bool /*round_to_lower_edge*/) const
* up a pixel down. and a value of -1.0 (ideally y = _height-1)
* currently is on the bottom separator line :(
* So to make the complete waveform appear centered in
* a region, we translate by +.5 (instead of -.5)
* and waste two pixel of height: -4 (instad of -2)
* a region, we translate by +1.5 (instead of -.5)
* and scale to height - 2.5 (if we scale to height - 2.0
* then the bottom most pixel may bleed into the selection rect
* by 0.5 px)
*
* This needs fixing in canvas/rectangle the intersect
* functions and probably a couple of other places as well...
*/
Coord pos;
if (s < 0) {
pos = ceil ((1.0 - s) * .5 * (_height - 4.0));
} else {
pos = floor ((1.0 - s) * .5 * (_height - 4.0));
}
return min (_height - 4.0, (max (0.0, pos)));
pos = floor ((1.0 - s) * .5 * (_height - 2.5));
return min (_height - 2.5, (max (0.0, pos)));
}
}
@ -568,23 +565,22 @@ WaveView::draw_image (Cairo::RefPtr<Cairo::ImageSurface>& image, PeakData* _peak
/* ensure single-pixel lines */
wave_context->set_line_width (1.0);
wave_context->translate (0.5, +0.5);
wave_context->translate (0.5, +1.5);
outline_context->set_line_width (1.0);
outline_context->translate (0.5, +0.5);
outline_context->translate (0.5, +1.5);
clip_context->set_line_width (1.0);
clip_context->translate (0.5, +0.5);
clip_context->translate (0.5, +1.5);
zero_context->set_line_width (1.0);
zero_context->translate (0.5, +0.5);
zero_context->translate (0.5, +1.5);
/* the height of the clip-indicator should be at most 7 pixels,
* or 5% of the height of the waveview item.
*/
const double clip_height = min (7.0, ceil (_height * 0.05));
bool draw_outline_as_wave = false;
/* There are 3 possible components to draw at each x-axis position: the
waveform "line", the zero line and an outline/clip indicator. We
@ -638,7 +634,7 @@ WaveView::draw_image (Cairo::RefPtr<Cairo::ImageSurface>& image, PeakData* _peak
outline_context->stroke ();
} else {
const double height_2 = (_height - 4.0) * .5;
const double height_2 = (_height - 2.5) * .5;
for (int i = 0; i < n_peaks; ++i) {
@ -671,43 +667,47 @@ WaveView::draw_image (Cairo::RefPtr<Cairo::ImageSurface>& image, PeakData* _peak
}
if (tips[i].spread > 1.0) {
draw_outline_as_wave = false;
/* lower outline/clip indicator */
bool clipped = false;
/* outline/clip indicators */
if (_global_show_waveform_clipping && tips[i].clip_max) {
clip_context->move_to (i, tips[i].top);
/* clip-indicating upper terminal line */
clip_context->rel_line_to (0, min (clip_height, ceil(tips[i].spread + 0.5)));
clipped = true;
}
if (_global_show_waveform_clipping && tips[i].clip_min) {
clip_context->move_to (i, tips[i].bot);
/* clip-indicating lower terminal line */
const double sign = tips[i].bot > height_2 ? -1 : 1;
clip_context->rel_line_to (0, sign * min (clip_height, ceil (tips[i].spread + .5)));
} else {
outline_context->move_to (i, tips[i].bot + 0.5);
/* normal lower terminal dot */
outline_context->rel_line_to (0, -0.5);
clip_context->rel_line_to (0, - min (clip_height, ceil(tips[i].spread + 0.5)));
clipped = true;
}
} else {
draw_outline_as_wave = true;
if (tips[i].clip_min) {
// make sure we draw the clip
tips[i].clip_max = true;
}
}
/* upper outline/clip indicator */
if (_global_show_waveform_clipping && tips[i].clip_max) {
clip_context->move_to (i, tips[i].top);
/* clip-indicating upper terminal line */
const double sign = tips[i].top > height_2 ? -1 : 1;
clip_context->rel_line_to (0, sign * min(clip_height, ceil(tips[i].spread + .5)));
} else {
if (draw_outline_as_wave) {
wave_context->move_to (i, tips[i].top + 0.5);
/* special case where outline only is drawn.
is this correct? too short by 0.5?
*/
wave_context->rel_line_to (0, -0.5);
} else {
outline_context->move_to (i, tips[i].top + 0.5);
if (!clipped) {
outline_context->move_to (i, tips[i].bot + 1.0);
/* normal lower terminal dot */
outline_context->rel_line_to (0, -1.0);
outline_context->move_to (i, tips[i].top - 1.0);
/* normal upper terminal dot */
outline_context->rel_line_to (0, -0.5);
outline_context->rel_line_to (0, 1.0);
}
} else {
bool clipped = false;
/* outline/clip indicator */
if (_global_show_waveform_clipping && (tips[i].clip_max || tips[i].clip_min)) {
clip_context->move_to (i, tips[i].top);
/* clip-indicating upper / lower terminal line */
clip_context->rel_line_to (0, 1.0);
clipped = true;
}
if (!clipped) {
wave_context->move_to (i, tips[i].top);
/* special case where outline only is drawn.
* we draw a 1px "line", pretending that the span is 1.0
*/
wave_context->rel_line_to (0, 1.0);
}
}
}