2 Copyright (C) 2008 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 #include "midi_scroomer.h"
21 #include <cairomm/context.h>
25 using namespace Gtkmm2ext
;
29 //std::map<int, Glib::RefPtr<Gdk::Pixmap> > MidiScroomer::piano_pixmaps;
31 MidiScroomer::MidiScroomer(Adjustment
& adj
)
32 : Gtkmm2ext::Scroomer(adj
)
38 /* set minimum view range to one octave */
39 set_min_page_size(12);
42 MidiScroomer::~MidiScroomer()
47 MidiScroomer::on_expose_event(GdkEventExpose
* ev
)
49 Cairo::RefPtr
<Cairo::Context
> cc
= get_window()->create_cairo_context();
50 GdkRectangle comp_rect
, clip_rect
;
51 Component first_comp
= point_in(ev
->area
.y
);
52 Component last_comp
= point_in(ev
->area
.y
+ ev
->area
.height
);
53 int height
= get_height();
55 double y2note
= (double) 127 / height
;
56 double note2y
= (double) height
/ 127;
57 double note_width
= 0.8 * get_width();
58 double note_height
= 1.4 * note2y
;
59 double black_shift
= 0.1 * note2y
;
60 double colors
[6] = {0.0f
, 0.0f
, 0.0f
, 0.0f
, 0.0f
, 0.0f
};
62 //cerr << ev->area.y << " " << ev->area.height << endl;
65 comp_rect
.width
= get_width();
67 for (int i
= first_comp
; i
<= last_comp
; ++i
) {
68 Component comp
= (Component
) i
;
69 set_comp_rect(comp_rect
, comp
);
71 if (gdk_rectangle_intersect(&comp_rect
, &ev
->area
, &clip_rect
)) {
72 get_colors(colors
, comp
);
74 cc
->rectangle(clip_rect
.x
, clip_rect
.y
, clip_rect
.width
, clip_rect
.height
);
75 cc
->set_source_rgb (colors
[3], colors
[4], colors
[5]);
79 cc
->set_source_rgb(colors
[0], colors
[1], colors
[2]);
80 cc
->set_line_width(note_height
);
82 lnote
= 127 - (int) floor((double) (clip_rect
.y
+ clip_rect
.height
) * y2note
) - 1;
83 hnote
= 127 - (int) floor((double) clip_rect
.y
* y2note
) + 1;
85 for (int note
= lnote
; note
< hnote
+ 1; ++note
) {
86 double y
= height
- note
* note2y
;
108 cc
->set_line_width(1.4 * note2y
);
110 cc
->line_to(note_width
, y
);
115 if (i
== Handle1
|| i
== Handle2
) {
116 cc
->rectangle(comp_rect
.x
+ 0.5f
, comp_rect
.y
+ 0.5f
, comp_rect
.width
- 1.0f
, comp_rect
.height
- 1.0f
);
117 cc
->set_line_width(1.0f
);
118 cc
->set_source_rgb (1.0f
, 1.0f
, 1.0f
);
130 MidiScroomer::get_colors(double color
[], Component comp
)
165 MidiScroomer::on_size_request(Gtk::Requisition
* r
)
172 MidiScroomer::on_size_allocate(Gtk::Allocation
& a
)
174 Scroomer::on_size_allocate(a
);