00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <muse.h>
00023 #include <cairo.h>
00024 #include <cairo-pdf.h>
00025 #include <string.h>
00026
00027
00057
00058
00061 #define PRINT_USAGE(rc) \
00062 fprintf(stderr, "Usage: %s [ -f format ] [ -s xscale yscale ] " \
00063 "GEOMETRY_TABLE OUTPUT_PLOT\n", argv[0]); \
00064 cpl_end(); return (rc);
00065
00066 int main(int argc, char **argv)
00067 {
00068 cpl_init(CPL_INIT_DEFAULT);
00069 muse_processing_recipeinfo(NULL);
00070
00071 if (argc <= 2) {
00072
00073 PRINT_USAGE(1);
00074 }
00075
00076
00077 char *tiname = NULL,
00078 *oname = NULL;
00079 enum eformats {
00080 PLOT_FORMAT_PDF = 0,
00081 PLOT_FORMAT_PNG
00082 };
00083 unsigned char oformat = PLOT_FORMAT_PDF;
00084 double xscale = 4.,
00085 yscale = 4.;
00086 int i;
00087 for (i = 1; i < argc; i++) {
00088 if (strncmp(argv[i], "-f", 3) == 0) {
00089
00090 i++;
00091 if (i < argc) {
00092 if (!strncmp(argv[i], "pdf", 4)) {
00093 oformat = PLOT_FORMAT_PDF;
00094 } else if (!strncmp(argv[i], "png", 4)) {
00095 oformat = PLOT_FORMAT_PNG;
00096 } else {
00097 PRINT_USAGE(3);
00098 }
00099 } else {
00100 PRINT_USAGE(2);
00101 }
00102 } else if (strncmp(argv[i], "-s", 3) == 0) {
00103 if (++i + 1 < argc) {
00104 xscale = atof(argv[i++]);
00105 yscale = atof(argv[i]);
00106 if (xscale <= 0 || yscale <= 0) {
00107 PRINT_USAGE(5);
00108 }
00109 } else {
00110 PRINT_USAGE(4);
00111 }
00112 } else if (strncmp(argv[i], "-", 1) == 0) {
00113 PRINT_USAGE(9);
00114 } else {
00115 if (tiname && oname) {
00116 break;
00117 }
00118 if (!tiname) {
00119 tiname = argv[i];
00120 } else {
00121 oname = argv[i];
00122 }
00123 }
00124 }
00125 if (!tiname) {
00126 PRINT_USAGE(1);
00127 }
00128
00129 cpl_table *table = cpl_table_load(tiname, 1, 1);
00130 if (!table) {
00131 PRINT_USAGE(10);
00132 }
00133
00134 if (!cpl_table_has_column(table, MUSE_GEOTABLE_X) ||
00135 !cpl_table_has_column(table, MUSE_GEOTABLE_Y) ||
00136 !cpl_table_has_column(table, MUSE_GEOTABLE_WIDTH) ||
00137 !cpl_table_has_column(table, MUSE_GEOTABLE_ANGLE)) {
00138 cpl_table_delete(table);
00139 PRINT_USAGE(11);
00140 }
00141
00142
00143 double wmax = cpl_table_get_column_max(table, MUSE_GEOTABLE_WIDTH),
00144 xmin = cpl_table_get_column_min(table, MUSE_GEOTABLE_X) - wmax / 2.,
00145 ymin = cpl_table_get_column_min(table, MUSE_GEOTABLE_Y) - 2,
00146 xmax = cpl_table_get_column_max(table, MUSE_GEOTABLE_X) + wmax / 2.,
00147 ymax = cpl_table_get_column_max(table, MUSE_GEOTABLE_Y) + 2,
00148 sx = xmax - xmin + 1,
00149 sy = ymax - ymin + 1;
00150 printf("Using scaling of %.3f in x- and %.3f in y-direction\n", xscale, yscale);
00151 double xt = -xmin,
00152 yt = -ymax;
00153 printf("Translating coordinates by %.3f in x- and %.3f in y-direction\n "
00154 "(extrema: %f / %f ... %f / %f)\n", xt, yt, xmin, ymin, xmax, ymax);
00155
00156
00157 cairo_status_t rc = CAIRO_STATUS_SUCCESS;
00158 cairo_surface_t *cs;
00159 if (oformat == PLOT_FORMAT_PDF) {
00160 cs = cairo_pdf_surface_create(oname, xscale * sx, yscale * sy);
00161 rc = cairo_surface_status(cs);
00162 if (rc != CAIRO_STATUS_SUCCESS) {
00163 fprintf(stderr, "opening PDF (\"%s\") returned %d!\n", oname, rc);
00164 rc = 50;
00165 } else {
00166 fprintf(stdout, "writing PDF to \"%s\"\n", oname);
00167 }
00168 } else {
00169 cs = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
00170 xscale * sx, yscale * sy);
00171 }
00172 cairo_t *cr = cairo_create(cs);
00173
00174 cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
00175 cairo_paint(cr);
00176
00177 cairo_scale(cr, xscale, -yscale);
00178 cairo_translate(cr, xt, yt);
00179 #if 0
00180 cairo_matrix_t *cm = cpl_calloc(1, sizeof(cairo_matrix_t));
00181 cairo_get_matrix(cr, cm);
00182 cairo_status_t cstat = cairo_status(cr);
00183 fprintf(stderr, "cm = %p, cstat = %d/%s, size is %f,%f\n",
00184 cm, cstat, cairo_status_to_string(cstat), xscale * sx, yscale * sy);
00185 double xtt = xmin, ytt = ymin + 2;
00186 cairo_matrix_transform_point(cm, &xtt, &ytt);
00187 fprintf(stderr, "%f,%f is transformed to %f,%f\n", xmin, ymin + 2, xtt, ytt);
00188 xtt = xmin, ytt = ymax - 2;
00189 cairo_matrix_transform_point(cm, &xtt, &ytt);
00190 fprintf(stderr, "%f,%f is transformed to %f,%f\n", xmin, ymax - 2, xtt, ytt);
00191 xtt = xmax, ytt = ymin + 2;
00192 cairo_matrix_transform_point(cm, &xtt, &ytt);
00193 fprintf(stderr, "%f,%f is transformed to %f,%f\n", xmax, ymin + 2, xtt, ytt);
00194 xtt = xmax, ytt = ymax - 2;
00195 cairo_matrix_transform_point(cm, &xtt, &ytt);
00196 fprintf(stderr, "%f,%f is transformed to %f,%f\n", xmax, ymax - 2, xtt, ytt);
00197 cpl_free(cm);
00198 #endif
00199
00200
00201 cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
00202 cairo_save(cr);
00203 cairo_move_to(cr, -1000., 0.);
00204 cairo_rel_line_to(cr, +5000, 0.);
00205 cairo_scale(cr, 1., 1. / yscale);
00206 cairo_stroke(cr);
00207 cairo_restore(cr);
00208 cairo_save(cr);
00209 cairo_move_to(cr, 0., -1000);
00210 cairo_rel_line_to(cr, 0., +5000);
00211 cairo_scale(cr, 1. / xscale, 1.);
00212 cairo_stroke(cr);
00213 cairo_restore(cr);
00214 #if 0
00215 cairo_save(cr);
00216 cairo_scale(cr, 1. / xscale, 1. / yscale);
00217 cairo_set_source_rgb(cr, 0.0, 0.0, 0.9);
00218 cairo_arc(cr, 0, 0, 5., 0, CPL_MATH_2PI);
00219 cairo_fill(cr);
00220 cairo_restore(cr);
00221 #endif
00222
00223
00224 int n = cpl_table_get_nrow(table);
00225 for (i = 0; i < n; i++) {
00226 double x = cpl_table_get(table, MUSE_GEOTABLE_X, i, NULL),
00227 y = cpl_table_get(table, MUSE_GEOTABLE_Y, i, NULL),
00228 width = cpl_table_get(table, MUSE_GEOTABLE_WIDTH, i, NULL),
00229 angrad = cpl_table_get(table, MUSE_GEOTABLE_ANGLE, i, NULL)
00230 * CPL_MATH_RAD_DEG;
00231 unsigned short ifu = cpl_table_get_int(table, MUSE_GEOTABLE_FIELD, i, NULL);
00232 if ((ifu - 0) % 3 == 0) {
00233 cairo_set_source_rgba(cr, 0.2, 0.2, 0.4, 0.5);
00234 } else if ((ifu - 1) % 3 == 0) {
00235 cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.5);
00236 } else if ((ifu - 2) % 3 == 0) {
00237 cairo_set_source_rgba(cr, 1.0, 0.843, 0.0, 0.5);
00238 } else {
00239 cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.5);
00240 }
00241 #if 0
00242 printf("ifu %hu slicesky %hu angle %f\n",
00243 ifu, cpl_table_get_int(table, MUSE_GEOTABLE_SKY, i, NULL),
00244 angrad * CPL_MATH_DEG_RAD);
00245 #endif
00246
00247 cairo_save(cr);
00248 cairo_translate(cr, x, y);
00249 cairo_rotate(cr, angrad);
00250 cairo_rectangle(cr, -width / 2., -0.5, width, 1.);
00251 cairo_fill(cr);
00252
00253
00254
00255 if (y == 0.0) {
00256 cairo_set_source_rgba(cr, 0.0, 0.0, 0.9, 0.8);
00257 cairo_move_to(cr, - width / 2., - 0.5);
00258 cairo_set_line_width(cr, 1. / yscale);
00259 cairo_rel_line_to(cr, width, 0.);
00260 cairo_set_line_width(cr, 1. / xscale);
00261 cairo_rel_line_to(cr, 0., 1.);
00262 cairo_set_line_width(cr, 1. / yscale);
00263 cairo_rel_line_to(cr, -width, 0.);
00264 cairo_close_path(cr);
00265 cairo_stroke(cr);
00266 }
00267 cairo_restore(cr);
00268 }
00269
00270 if (oformat == PLOT_FORMAT_PNG) {
00271 cairo_surface_write_to_png(cs, oname);
00272 if (rc != CAIRO_STATUS_SUCCESS) {
00273 fprintf(stderr, "writing PNG (\"%s\") returned %d!\n", oname, rc);
00274 rc = 50;
00275 } else {
00276 fprintf(stdout, "written PNG to \"%s\"\n", oname);
00277 }
00278 }
00279 cairo_destroy(cr);
00280 cairo_surface_destroy(cs);
00281 cairo_debug_reset_static_data();
00282 cpl_table_delete(table);
00283 cpl_errorstate_dump(0,0,0);
00284 cpl_memory_dump();
00285 cpl_end();
00286 return rc;
00287 }
00288