#include #include #include "picture.h" #include "studio/geometry.h" #include "studio/pdf.h" #include "unreliableobjects.h" static struct pdf draw(struct pdf pdf, struct picture image, const matrix layout) { const vector origin = transform((vector){0.0, 0.0}, layout); pdf = generate( point(point(pdf, origin), subtract(origin, transform((vector){1.0, 1.0}, layout))), "re 0 j 0 J 0 w S\n" ); image = picture(image); for (size_t number = 0; number < count(image.object); ++number) { const struct object object = image.object[number]; if (object.vectors) { assert(object.vector); const matrix transformation = concatenate(object.transformation, layout); for (size_t number = 1; number < object.vectors; ++number) { pdf = generate(point(pdf, transform(object.vector[number - 1], transformation)), "m\n"); pdf = generate(point(pdf, transform(object.vector[number], transformation)), "l\n"); } } } pdf = generate(pdf, "1 j 1 J %.2f w S\n", image.linewidth mm); image = erase(image); return pdf; } int proof(void * const device, int parameter) { (void)parameter; struct pdf pdf = startpdf((struct pdf){ .write = output, .device = device, .title = "unreliable objects", .author = "David W. Speck"} ); const size_t resources = (pdf = dictionary(pdf, "/ProcSet [/PDF]")).object.number; const double linewidth = 1.5; const vector imagesize = scalar(linewidth * 100.0 mm); const vector pagesize = portrait(a4); const struct pdf stream = (pdf = startpage(pdf, pagesize, resources)); pdf = draw(pdf, (struct picture){.linewidth = linewidth, .chaos = 1}, center(imagesize, pagesize)); pdf = endpage(pdf, stream); for (size_t sides = 1; sides <= 9; ++sides) { const vector pagesize = landscape(a3); const struct pdf stream = (pdf = startpage(pdf, pagesize, resources)); struct picture picture = {.sides = sides, .linewidth = linewidth, .chaos = 0}; vector position = {.x = (pagesize.x - (imagesize.x * 2.0)) / 3.0, .y = (pagesize.y - imagesize.y) / 2.0}; for (size_t image = 1; image <= 2; ++image) { pdf = draw(pdf, picture, scale(imagesize, translate(position, identity()))); position.x = (position.x + pagesize.x) / 2.0; picture.chaos = 1; } pdf = endpage(pdf, stream); } pdf = endpdf(pdf); return 1; }