ptformat: Update the lib to 9d0b64f (upstream ptformat)
[ardour.git] / libs / surfaces / push2 / canvas.cc
index e178e0d8b554f284a3067655d1d4d4d840a1adc5..6a8d046aa9f3b41b5ef5b2e73679195d32287ab4 100644 (file)
 
 */
 
+#include <vector>
+
 #include <cairomm/region.h>
 #include <cairomm/surface.h>
 #include <cairomm/context.h>
 
+#include "pbd/compose.h"
+#include "pbd/error.h"
+#include "pbd/i18n.h"
+
+#include "ardour/debug.h"
+
 #include "canvas.h"
 #include "layout.h"
 #include "push2.h"
 
+#ifdef __APPLE__
+#define Rect ArdourCanvas::Rect
+#endif
+
 using namespace ArdourCanvas;
 using namespace ArdourSurface;
+using namespace PBD;
 
 const int Push2Canvas::pixels_per_row = 1024;
 
@@ -64,6 +77,15 @@ Push2Canvas::vblank ()
        if (expose ()) {
                /* something rendered, update device_frame_buffer */
                blit_to_device_frame_buffer ();
+
+#undef RENDER_LAYOUTS
+#ifdef RENDER_LAYOUTS
+               if (p2.current_layout()) {
+                       std::string s = p2.current_layout()->name();
+                       s += ".png";
+                       frame_buffer->write_to_png (s);
+               }
+#endif
        }
 
        int transferred = 0;
@@ -94,10 +116,12 @@ Push2Canvas::request_redraw (Rect const & r)
 {
        Cairo::RectangleInt cr;
 
-       cr.x = r.x1;
-       cr.y = r.y1;
+       cr.x = r.x0;
+       cr.y = r.y0;
        cr.width = r.width();
-       cr.width = r.height();
+       cr.height = r.height();
+
+       // DEBUG_TRACE (DEBUG::Push2, string_compose ("invalidate rect %1\n", r));
 
        expose_region->do_union (cr);
 
@@ -115,6 +139,8 @@ Push2Canvas::expose ()
 
        const int nrects = expose_region->get_num_rectangles ();
 
+       //DEBUG_TRACE (DEBUG::Push2, string_compose ("expose with %1 rects\n", nrects));
+
        for (int n = 0; n < nrects; ++n) {
                Cairo::RectangleInt r = expose_region->get_rectangle (n);
                context->rectangle (r.x, r.y, r.width, r.height);
@@ -125,12 +151,22 @@ Push2Canvas::expose ()
        Push2Layout* layout = p2.current_layout();
 
        if (layout) {
+               /* all layouts cover (at least) the full size of the video
+                  display, so we do not need to check if the layout intersects
+                  the bounding box of the full expose region.
+               */
                Cairo::RectangleInt r = expose_region->get_extents();
+               Rect rr (r.x, r.y, r.x + r.width, r.y + r.height);
+               //DEBUG_TRACE (DEBUG::Push2, string_compose ("render layout with %1\n", rr));
                layout->render (Rect (r.x, r.y, r.x + r.width, r.y + r.height), context);
        }
 
        context->reset_clip ();
 
+       /* why is there no "reset()" method for Cairo::Region? */
+
+       expose_region = Cairo::Region::create ();
+
        return true;
 }
 
@@ -188,3 +224,39 @@ Push2Canvas::blit_to_device_frame_buffer ()
 
        return 0;
 }
+
+void
+Push2Canvas::request_size (Duple)
+{
+       /* fixed size canvas */
+}
+
+Rect
+Push2Canvas::visible_area () const
+{
+       /* may need to get more sophisticated once we do scrolling */
+       return Rect (0, 0, 960, 160);
+}
+
+Glib::RefPtr<Pango::Context>
+Push2Canvas::get_pango_context ()
+{
+       if (!pango_context) {
+               PangoFontMap* map = pango_cairo_font_map_get_default ();
+               if (!map) {
+                       error << _("Default Cairo font map is null!") << endmsg;
+                       return Glib::RefPtr<Pango::Context> ();
+               }
+
+               PangoContext* context = pango_font_map_create_context (map);
+
+               if (!context) {
+                       error << _("cannot create new PangoContext from cairo font map") << endmsg;
+                       return Glib::RefPtr<Pango::Context> ();
+               }
+
+               pango_context = Glib::wrap (context);
+       }
+
+       return pango_context;
+}