commit c04c76a0b6eb03389c4a682acf6104c4b012b552
parent c7e088496f3c89f55ea49feea1a3510d3a920a41
Author: Alexander Kojevnikov <alexander@kojevnikov.com>
Date: Mon, 17 May 2010 10:50:07 +1000
Add the frequency ruler
Diffstat:
2 files changed, 32 insertions(+), 11 deletions(-)
diff --git a/src/spek-ruler.vala b/src/spek-ruler.vala
@@ -40,16 +40,16 @@ namespace Spek {
this.format_tick = format_tick;
}
- public void draw (Context cr) {
+ public void draw (Context cr, bool horizontal) {
// Mesure the sample label.
TextExtents ext;
cr.text_extents (sample_label, out ext);
- var label_width = ext.width;
+ var size = horizontal ? ext.width : ext.height;
// Select the factor to use, we want some space between the labels.
int factor = 0;
foreach (var f in factors) {
- if (unit_to_pixel (f) >= 1.5 * label_width) {
+ if (unit_to_pixel (f) >= 1.5 * size) {
factor = f;
break;
}
@@ -59,7 +59,7 @@ namespace Spek {
int[] ticks = { 0, units };
if (factor > 0) {
for (var tick = factor; tick < units; tick += factor) {
- if (unit_to_pixel (units - tick) < label_width) {
+ if (unit_to_pixel (units - tick) < size) {
break;
}
ticks += tick;
@@ -72,13 +72,22 @@ namespace Spek {
double TICK_LEN = 4;
foreach (var tick in ticks) {
var label = format_tick (tick);
- var pos = unit_to_pixel (tick);
+ var pos = unit_to_pixel (horizontal ? tick : units - tick);
cr.text_extents (label, out ext);
// TODO: use font measurements instead ext.height
- cr.move_to (pos - ext.width / 2, GAP + ext.height);
+ if (horizontal) {
+ cr.move_to (pos - ext.width / 2, GAP + ext.height);
+ } else {
+ cr.move_to (-ext.width - GAP, pos + ext.height / 2);
+ }
cr.show_text (label);
- cr.move_to (pos, 0);
- cr.rel_line_to (0, TICK_LEN);
+ if (horizontal) {
+ cr.move_to (pos, 0);
+ cr.rel_line_to (0, TICK_LEN);
+ } else {
+ cr.move_to (0, pos);
+ cr.rel_line_to (-TICK_LEN, 0);
+ }
cr.stroke ();
}
}
diff --git a/src/spek-spectrogram.vala b/src/spek-spectrogram.vala
@@ -30,7 +30,7 @@ namespace Spek {
private ImageSurface image;
private ImageSurface palette;
- private const int PADDING = 40;
+ private const int PADDING = 60;
private const int GAP = 10;
private const int RULER = 10;
@@ -120,7 +120,7 @@ namespace Spek {
cr.paint ();
cr.identity_matrix ();
- // Prepare to draw the time ruler.
+ // Prepare to draw the rulers.
cr.set_source_rgb (1, 1, 1);
cr.set_line_width (1);
cr.set_antialias (Antialias.NONE);
@@ -136,7 +136,19 @@ namespace Spek {
unit => (w - 2 * PADDING) * unit / duration_seconds,
unit => "%d:%02d".printf (unit / 60, unit % 60));
cr.translate (PADDING, h - PADDING);
- time_ruler.draw (cr);
+ time_ruler.draw (cr, true);
+ cr.identity_matrix ();
+
+ // Frequency ruler.
+ var freq = source.rate / 2;
+ var rate_ruler = new Ruler (
+ "00.0 kHz",
+ {1000, 2000, 5000, 10000, 20000},
+ freq,
+ unit => (h - 2 * PADDING) * unit / freq,
+ unit => "%d.%01d kHz".printf (unit / 1000, (unit % 1000) / 100));
+ cr.translate (PADDING, PADDING);
+ rate_ruler.draw (cr, false);
cr.identity_matrix ();
}