#include #include #include // Build with: // gcc -g `pkg-config --cflags --libs cairo` copy.c int main(int argc, char *argv[]) { // Make a PDF surface const char fileName[] = "unused.pdf"; const double pntWidth = 1000; const double pntHeight = 1000; cairo_surface_t *pdfSurface = cairo_pdf_surface_create( fileName, pntWidth, pntHeight); cairo_t *pdfContext = cairo_create(pdfSurface); const double xMinUser = 0.0; const double yMinUser = 0.0; const double xMaxUser = 10000.0; const double yMaxUser = 10000.0; // Set up the transform (rotation, etc) { const double userWidth = xMaxUser - xMinUser; const double userHeight = yMaxUser - yMinUser; const double scaleX = pntWidth / userWidth; const double scaleY = pntHeight / userHeight; // Rotate about the centre of the VP const int vpCenX = pntWidth / 2; const int vpCenY = pntHeight / 2; const double txRotRad = 0 * M_PI / 180.0; cairo_translate(pdfContext, vpCenX, vpCenY); cairo_rotate(pdfContext, txRotRad); cairo_translate(pdfContext, -vpCenX, -vpCenY); cairo_translate(pdfContext, 0, pntHeight); cairo_scale(pdfContext, scaleX, -scaleY); cairo_translate(pdfContext, -xMinUser, -yMinUser); } // Draw a bunch of stuff { // Line cairo_move_to(pdfContext, xMaxUser-100, yMaxUser-100); cairo_line_to(pdfContext, xMinUser+100, yMinUser+100); cairo_set_source_rgba(pdfContext, 1.0, 0.0, 0.0, 1); cairo_stroke(pdfContext); // Polygon cairo_move_to(pdfContext, (xMinUser + xMaxUser)/2.0, (yMinUser + yMaxUser)/2.0); cairo_rel_line_to(pdfContext, 0, 250); cairo_rel_line_to(pdfContext, -250, -250); cairo_close_path(pdfContext); cairo_set_source_rgba(pdfContext, 0.0, 0.0, 1.0, 1); cairo_fill(pdfContext); } // Make the image surface const int pixWidth = 1000; const int pixHeight = 1000; cairo_surface_t *imgSurface = cairo_image_surface_create( CAIRO_FORMAT_RGB24, pixWidth, pixHeight); cairo_t *imgContext = cairo_create(imgSurface); cairo_set_antialias(imgContext, CAIRO_ANTIALIAS_NONE); // Copy the PDF to the image { cairo_translate(imgContext, -11200, -11200); cairo_scale(imgContext, 24, 24); cairo_set_source_surface(imgContext, pdfSurface, 0, 0); cairo_paint(imgContext); /* // The whole surface */ /* cairo_set_source_surface(imgContext, pdfSurface, 0, 0); */ /* cairo_paint(imgContext); */ } cairo_surface_write_to_png(imgSurface, "output.png"); cairo_destroy(imgContext); cairo_destroy(pdfContext); cairo_surface_destroy(imgSurface); cairo_surface_destroy(pdfSurface); cairo_debug_reset_static_data(); // Valgrind return 0; }