diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2011-02-08 19:19:55 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2011-02-08 19:19:55 +0000 |
commit | cc074c66fabd3fb28f8387b64f58e6d49206f122 (patch) | |
tree | 94df315220a852aae412ddfcc70a0e4579072994 /libs/gtkmm2ext/pixscroller.cc | |
parent | b12beab67c70045269d6ec5dc735c2f4af67c4f9 (diff) |
cairo-ify expose handlers for PixFader and PixScroller (latter is not used); tweak UI RC file in response; move rgb macros to gtkmm2ext for easier use there as we go cairo over time
git-svn-id: svn://localhost/ardour2/branches/3.0@8775 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/gtkmm2ext/pixscroller.cc')
-rw-r--r-- | libs/gtkmm2ext/pixscroller.cc | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/libs/gtkmm2ext/pixscroller.cc b/libs/gtkmm2ext/pixscroller.cc index f20e11c9ca..22db1892d1 100644 --- a/libs/gtkmm2ext/pixscroller.cc +++ b/libs/gtkmm2ext/pixscroller.cc @@ -37,6 +37,8 @@ PixScroller::PixScroller (Adjustment& a, rail (r), slider (s) { + Cairo::Format format; + dragging = false; add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK); @@ -55,6 +57,26 @@ PixScroller::PixScroller (Adjustment& a, sliderrect.set_y((int) rint ((overall_height - sliderrect.get_height()) * (adj.get_upper() - adj.get_value()))); railrect.set_x((sliderrect.get_width() / 2) - 2); + + if (rail->get_has_alpha()) { + format = Cairo::FORMAT_ARGB32; + } else { + format = Cairo::FORMAT_RGB24; + } + rail_surface = Cairo::ImageSurface::create (format, rail->get_width(), rail->get_height()); + rail_context = Cairo::Context::create (rail_surface); + Gdk::Cairo::set_source_pixbuf (rail_context, rail, 0.0, 0.0); + rail_context->paint(); + + if (slider->get_has_alpha()) { + format = Cairo::FORMAT_ARGB32; + } else { + format = Cairo::FORMAT_RGB24; + } + slider_surface = Cairo::ImageSurface::create (format, slider->get_width(), slider->get_height()); + slider_context = Cairo::Context::create (slider_surface); + Gdk::Cairo::set_source_pixbuf (slider_context, slider, 0.0, 0.0); + slider_context->paint(); } void @@ -69,45 +91,31 @@ PixScroller::on_expose_event (GdkEventExpose* ev) { GdkRectangle intersect; Glib::RefPtr<Gdk::Window> win (get_window()); - - win->draw_rectangle (get_style()->get_bg_gc(get_state()), TRUE, - ev->area.x, - ev->area.y, - ev->area.width, - ev->area.height); - + Cairo::RefPtr<Cairo::Context> context = get_window()->create_cairo_context(); + if (gdk_rectangle_intersect (railrect.gobj(), &ev->area, &intersect)) { - Glib::RefPtr<Gdk::GC> gc(get_style()->get_bg_gc(get_state())); - win->draw_pixbuf (gc, rail, - intersect.x - railrect.get_x(), - intersect.y - railrect.get_y(), - intersect.x, - intersect.y, - intersect.width, - intersect.height, - Gdk::RGB_DITHER_NONE, 0, 0); + + context->save(); + context->rectangle (intersect.x, intersect.y, intersect.width, intersect.height); + context->clip(); + context->set_source (rail_surface, intersect.x - railrect.get_x(), intersect.y - railrect.get_y()); + context->rectangle (intersect.x, intersect.y, intersect.width, intersect.height); + context->clip(); + context->paint(); + context->restore(); } if (gdk_rectangle_intersect (sliderrect.gobj(), &ev->area, &intersect)) { - Glib::RefPtr<Gdk::GC> gc(get_style()->get_fg_gc(get_state())); - // Glib::RefPtr<Gdk::Bitmap> mask (slider_mask); - - GdkGCValues values; - gdk_gc_get_values(gc->gobj(), &values); - gc->set_clip_origin (sliderrect.get_x(), sliderrect.get_y()); - // gc->set_clip_mask (mask); - win->draw_pixbuf (gc, slider, - intersect.x - sliderrect.get_x(), - intersect.y - sliderrect.get_y(), - intersect.x, - intersect.y, - intersect.width, - intersect.height, - Gdk::RGB_DITHER_NONE, 0, 0); - gc->set_clip_origin (values.clip_x_origin, values.clip_y_origin); - // gdk_gc_set_clip_mask (gc->gobj(), values.clip_mask); - } + context->save(); + context->rectangle (intersect.x, intersect.y, intersect.width, intersect.height); + context->clip(); + context->set_source (rail_surface, intersect.x - sliderrect.get_x(), intersect.y - sliderrect.get_y()); + context->rectangle (intersect.x, intersect.y, intersect.width, intersect.height); + context->clip(); + context->paint(); + context->restore(); + } return true; } |