#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;
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);
+
delete[] data;
}
#endif
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;
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)",
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);
+
+#ifdef CAIRO_SUPPORT
+ universe.draw(cairo_cr);
+#else
universe.draw(window_main);
+#endif
+
manipulator.draw_on_universe(window_main);
retina.draw_on_universe(window_main);
else if(strcmp(se.key, "s") == 0) {
retina.save_as_ppm("/tmp/retina.ppm");
-
cout << "Retina screen shot saved in /tmp/retina.ppm" << endl;
+
{
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
}