/* * Copyright © 2009 CNRS * Copyright © 2009-2017 Inria. All rights reserved. * Copyright © 2009-2010 Université Bordeaux * Copyright © 2011 Cisco Systems, Inc. All rights reserved. * See COPYING in top-level directory. */ #include #include #include #include #include #include #include "lstopo.h" /* .fig back-end. */ #define FIG_FACTOR 20 static int __hwloc_attribute_const lcolor_to_fig(const struct lstopo_color *lcolor) { int r = lcolor->r, g = lcolor->g, b = lcolor->b; if (r == 0xff && g == 0xff && b == 0xff) return 7; if (!r && !g && !b) return 0; return 32 + rgb_to_color(r, g, b); } static void fig_declare_color(struct lstopo_output *loutput, const struct lstopo_color *lcolor) { FILE *file = loutput->file; int r = lcolor->r, g = lcolor->g, b = lcolor->b; int color; if (r == 0xff && g == 0xff && b == 0xff) return; if (!r && !g && !b) return; color = declare_color(r, g, b); fprintf(file, "0 %d #%02x%02x%02x\n", 32 + color, (unsigned) r, (unsigned) g, (unsigned) b); } static void fig_box(struct lstopo_output *loutput, const struct lstopo_color *lcolor, unsigned depth, unsigned x, unsigned width, unsigned y, unsigned height) { FILE *file = loutput->file; if (!width || !height) return; x *= FIG_FACTOR; y *= FIG_FACTOR; width *= FIG_FACTOR; height *= FIG_FACTOR; fprintf(file, "2 2 0 1 0 %d %u -1 20 0.0 0 0 -1 0 0 5\n\t", lcolor_to_fig(lcolor), depth); fprintf(file, " %u %u", x, y); fprintf(file, " %u %u", x + width, y); fprintf(file, " %u %u", x + width, y + height); fprintf(file, " %u %u", x, y + height); fprintf(file, " %u %u", x, y); fprintf(file, "\n"); } static void fig_line(struct lstopo_output *loutput, const struct lstopo_color *lcolor, unsigned depth, unsigned x1, unsigned y1, unsigned x2, unsigned y2) { FILE *file = loutput->file; x1 *= FIG_FACTOR; y1 *= FIG_FACTOR; x2 *= FIG_FACTOR; y2 *= FIG_FACTOR; fprintf(file, "2 1 0 1 0 %d %u -1 -1 0.0 0 0 -1 0 0 2\n\t", lcolor_to_fig(lcolor), depth); fprintf(file, " %u %u", x1, y1); fprintf(file, " %u %u", x2, y2); fprintf(file, "\n"); } static void fig_text(struct lstopo_output *loutput, const struct lstopo_color *lcolor, int size, unsigned depth, unsigned x, unsigned y, const char *text) { FILE *file = loutput->file; int len = (int)strlen(text); int color; color = lcolor_to_fig(lcolor); x *= FIG_FACTOR; y *= FIG_FACTOR; size = (size * 16) / 10; fprintf(file, "4 0 %d %u -1 0 %d 0.0 4 %d %d %u %u %s\\001\n", color, depth, size, size * 10, len * size * 10, x, y + size * 10, text); } static struct draw_methods fig_draw_methods = { fig_declare_color, fig_box, fig_line, fig_text, NULL, /* textsize not supported, fallback to default estimation in get_textsize() */ }; int output_fig (struct lstopo_output *loutput, const char *filename) { FILE *output = open_output(filename, loutput->overwrite); if (!output) { fprintf(stderr, "Failed to open %s for writing (%s)\n", filename, strerror(errno)); return -1; } loutput->file = output; loutput->methods = &fig_draw_methods; /* recurse once for preparing sizes and positions */ loutput->drawing = LSTOPO_DRAWING_PREPARE; output_draw(loutput); loutput->drawing = LSTOPO_DRAWING_DRAW; fprintf(output, "#FIG 3.2 Produced by hwloc's lstopo\n"); fprintf(output, "Landscape\n"); fprintf(output, "Center\n"); fprintf(output, "Inches\n"); fprintf(output, "letter\n"); fprintf(output, "100.00\n"); /* magnification */ fprintf(output, "Single\n"); /* single page */ fprintf(output, "-2\n"); /* no transparent color */ fprintf(output, "1200 2\n"); /* 1200 ppi resolution, upper left origin */ /* ready */ declare_colors(loutput); lstopo_prepare_custom_styles(loutput); output_draw(loutput); if (output != stdout) fclose(output); return 0; }