Cairo support works, both to draw in the window and to write as a png image in a...
[universe.git] / main.cc
diff --git a/main.cc b/main.cc
index 905706d..e135189 100644 (file)
--- a/main.cc
+++ b/main.cc
@@ -25,8 +25,14 @@ using namespace std;
 #ifdef CAIRO_SUPPORT
 #include <cairo.h>
 
 #ifdef CAIRO_SUPPORT
 #include <cairo.h>
 
+static cairo_status_t write_cairo_to_file(void *closure,
+                                          const unsigned char *data,
+                                          unsigned int length) {
+  fwrite(data, 1, length, (FILE *) closure);
+  return CAIRO_STATUS_SUCCESS;
+}
 
 
-void generate_png(int width, int height, Universe *universe, const char *image_name) {
+void generate_png(int width, int height, Universe *universe, FILE *file) {
   const int depth = 4;
   cairo_surface_t *image;
   cairo_t* context_resource;
   const int depth = 4;
   cairo_surface_t *image;
   cairo_t* context_resource;
@@ -47,13 +53,11 @@ void generate_png(int width, int height, Universe *universe, const char *image_n
 
   universe->draw(context_resource);
 
 
   universe->draw(context_resource);
 
-  cairo_surface_write_to_png(image, image_name);
-
-  // fprintf(stdout, "Content-type: image/png\n\n");
-  // cairo_surface_write_to_png_stream(image, write_cairo_to_file, stdout);
+  cairo_surface_write_to_png_stream(image, write_cairo_to_file, file);
 
   cairo_destroy(context_resource);
   cairo_surface_destroy(image);
 
   cairo_destroy(context_resource);
   cairo_surface_destroy(image);
+
   delete[] data;
 }
 #endif
   delete[] data;
 }
 #endif
@@ -205,6 +209,9 @@ int main(int argc, char **argv) {
   retina.set_location(manipulator.hand_x(), manipulator.hand_y());
 
   SimpleWindow *window_main = 0, *window_brain = 0;
   retina.set_location(manipulator.hand_x(), manipulator.hand_y());
 
   SimpleWindow *window_main = 0, *window_brain = 0;
+#ifdef CAIRO_SUPPORT
+  cairo_t *cairo_cr = 0;
+#endif
 
   int window_main_fd = -1;
 
 
   int window_main_fd = -1;
 
@@ -238,6 +245,9 @@ int main(int argc, char **argv) {
     window_main = new SimpleWindow("Universe (main window)", 4, 4, task->width(), task->height());
     window_main_fd = window_main->file_descriptor();
     window_main->map();
     window_main = new SimpleWindow("Universe (main window)", 4, 4, task->width(), task->height());
     window_main_fd = window_main->file_descriptor();
     window_main->map();
+#ifdef CAIRO_SUPPORT
+    cairo_cr = window_main->get_cairo_context_resource();
+#endif
     cout << "When the main window has the focus, press `q' to quit and click and drag to move" << endl
          << "objects." << endl;
     window_brain = new SimpleWindow("Universe (brain)",
     cout << "When the main window has the focus, press `q' to quit and click and drag to move" << endl
          << "objects." << endl;
     window_brain = new SimpleWindow("Universe (brain)",
@@ -325,11 +335,17 @@ int main(int argc, char **argv) {
                               manipulator.hand_y());
 
           if(window_main) {
                               manipulator.hand_y());
 
           if(window_main) {
-            // window_main->color(0.0, 0.0, 0.0);
+            window_main->color(0.0, 0.0, 0.0);
             window_main->color(1.0, 1.0, 1.0);
             window_main->fill();
             task->draw(window_main);
             window_main->color(1.0, 1.0, 1.0);
             window_main->fill();
             task->draw(window_main);
+
+#ifdef CAIRO_SUPPORT
+            universe.draw(cairo_cr);
+#else
             universe.draw(window_main);
             universe.draw(window_main);
+#endif
+
             manipulator.draw_on_universe(window_main);
             retina.draw_on_universe(window_main);
 
             manipulator.draw_on_universe(window_main);
             retina.draw_on_universe(window_main);
 
@@ -434,15 +450,20 @@ int main(int argc, char **argv) {
               else if(strcmp(se.key, "s") == 0) {
 
                 retina.save_as_ppm("/tmp/retina.ppm");
               else if(strcmp(se.key, "s") == 0) {
 
                 retina.save_as_ppm("/tmp/retina.ppm");
-
                 cout << "Retina screen shot saved in /tmp/retina.ppm" << endl;
                 cout << "Retina screen shot saved in /tmp/retina.ppm" << endl;
+
                 {
                   XFigTracer tracer("/tmp/universe.fig");
                   universe.print_xfig(&tracer);
                 }
 
 #ifdef CAIRO_SUPPORT
                 {
                   XFigTracer tracer("/tmp/universe.fig");
                   universe.print_xfig(&tracer);
                 }
 
 #ifdef CAIRO_SUPPORT
-                generate_png(task->width(), task->height(), &universe, "/tmp/universe.png");
+                {
+                  FILE *file = fopen("/tmp/universe.png", "w");
+                  generate_png(task->width(), task->height(), &universe, file);
+                  // generate_png(task->width(), task->height(), &universe, "/tmp/universe.png");
+                  cout << "Universe image saved in /tmp/universe.png" << endl;
+                }
 #endif
 
               }
 #endif
 
               }