X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=main.cc;h=e13518983871b7d877c39698e0f2cb4addc0862f;hb=ea2a7fd04689794d3fb266e2b73bedb10953abb4;hp=905706ddd7fd2f835c9c5e56a8c9b12e7806c90f;hpb=fe0be986e63c5dabed472d68b0aa7c91ca0651db;p=universe.git diff --git a/main.cc b/main.cc index 905706d..e135189 100644 --- a/main.cc +++ b/main.cc @@ -25,8 +25,14 @@ using namespace std; #ifdef CAIRO_SUPPORT #include +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; @@ -47,13 +53,11 @@ void generate_png(int width, int height, Universe *universe, const char *image_n 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 @@ -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; +#ifdef CAIRO_SUPPORT + cairo_t *cairo_cr = 0; +#endif 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(); +#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)", @@ -325,11 +335,17 @@ int main(int argc, char **argv) { 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); @@ -434,15 +450,20 @@ int main(int argc, char **argv) { 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 }