void test_plot_wcs1(CuTest* tc) { plot_args_t myargs; plot_args_t* pargs = &myargs; int W, H; plotxy_t* xy; //plotimage_t* img; log_init(LOG_VERB); W = H = 5; plotstuff_init(pargs); plotstuff_set_size(pargs, W, H); pargs->outformat = PLOTSTUFF_FORMAT_PNG; pargs->outfn = "test-out1.png"; plotstuff_set_color(pargs, "black"); plotstuff_run_command(pargs, "fill"); plotstuff_output(pargs); plotstuff_free(pargs); // perfectly centered circle. plotstuff_init(pargs); plotstuff_set_size(pargs, W, H); pargs->outformat = PLOTSTUFF_FORMAT_PNG; pargs->outfn = "test-out2.png"; plotstuff_set_color(pargs, "black"); plotstuff_run_command(pargs, "fill"); xy = plotstuff_get_config(pargs, "xy"); plot_xy_vals(xy, 3, 3); plotstuff_set_color(pargs, "white"); plotstuff_set_marker(pargs, "circle"); plotstuff_set_markersize(pargs, 1); plotstuff_run_command(pargs, "xy"); plotstuff_output(pargs); plotstuff_free(pargs); // perfectly centered circle. plotstuff_init(pargs); plotstuff_set_size(pargs, W, H); pargs->outformat = PLOTSTUFF_FORMAT_PNG; pargs->outfn = "test-out3.png"; plotstuff_set_color(pargs, "black"); plotstuff_run_command(pargs, "fill"); xy = plotstuff_get_config(pargs, "xy"); plot_xy_vals(xy, 2, 2); plot_xy_set_offsets(xy, 0, 0); plotstuff_set_color(pargs, "white"); plotstuff_set_marker(pargs, "circle"); plotstuff_set_markersize(pargs, 1); plotstuff_run_command(pargs, "xy"); plotstuff_output(pargs); plotstuff_free(pargs); { unsigned char* img; int ww, hh; int i; img = cairoutils_read_png("test-out2.png", &ww, &hh); CuAssertPtrNotNull(tc, img); CuAssertIntEquals(tc, W, ww); CuAssertIntEquals(tc, H, hh); printf("image:\n"); for (i=0; i<W*H; i++) { printf("%02x ", (int)img[i*4]); if (i%W == (W-1)) printf("\n"); } printf("\n"); /* 00 00 00 00 00 00 80 e8 80 00 00 f3 44 f3 00 00 7c e8 7c 00 00 00 00 00 00 */ } }
static int plot_builtin_command(const char* cmd, const char* cmdargs, plot_args_t* pargs, void* baton) { if (streq(cmd, "plot_color")) { if (parse_color_rgba(cmdargs, pargs->rgba)) { ERROR("Failed to parse plot_color: \"%s\"", cmdargs); return -1; } } else if (streq(cmd, "plot_bgcolor")) { if (parse_color_rgba(cmdargs, pargs->bg_rgba)) { ERROR("Failed to parse plot_bgcolor: \"%s\"", cmdargs); return -1; } } else if (streq(cmd, "plot_fontsize")) { pargs->fontsize = atof(cmdargs); } else if (streq(cmd, "plot_alpha")) { if (plotstuff_set_alpha(pargs, atof(cmdargs))) { ERROR("Failed to set alpha"); return -1; } } else if (streq(cmd, "plot_op")) { if (streq(cmdargs, "add")) { pargs->op = CAIRO_OPERATOR_ADD; } else if (streq(cmdargs, "reset")) { pargs->op = CAIRO_OPERATOR_OVER; } else { ERROR("Didn't understand op: %s", cmdargs); return -1; } } else if (streq(cmd, "plot_lw")) { pargs->lw = atof(cmdargs); } else if (streq(cmd, "plot_bglw")) { pargs->bg_lw = atof(cmdargs); } else if (streq(cmd, "plot_marker")) { if (plotstuff_set_marker(pargs, cmdargs)) { return -1; } } else if (streq(cmd, "plot_markersize")) { pargs->markersize = atof(cmdargs); } else if (streq(cmd, "plot_size")) { int W, H; if (sscanf(cmdargs, "%i %i", &W, &H) != 2) { ERROR("Failed to parse plot_size args \"%s\"", cmdargs); return -1; } plotstuff_set_size(pargs, W, H); } else if (streq(cmd, "plot_wcs")) { if (plotstuff_set_wcs_file(pargs, cmdargs, 0)) { return -1; } } else if (streq(cmd, "plot_wcs_box")) { float ra, dec, width; if (sscanf(cmdargs, "%f %f %f", &ra, &dec, &width) != 3) { ERROR("Failed to parse plot_wcs_box args \"%s\"", cmdargs); return -1; } if (plotstuff_set_wcs_box(pargs, ra, dec, width)) { return -1; } } else if (streq(cmd, "plot_wcs_setsize")) { assert(pargs->wcs); plotstuff_set_size_wcs(pargs); } else if (streq(cmd, "plot_label_radec")) { assert(pargs->wcs); double ra, dec; int nc; const char* label; if (sscanf(cmdargs, "%lf %lf %n", &ra, &dec, &nc) != 3) { ERROR("Failed to parse plot_label_radec args \"%s\"", cmdargs); return -1; } label = cmdargs + nc; return plotstuff_text_radec(pargs, ra, dec, label); } else { ERROR("Did not understand command: \"%s\"", cmd); return -1; } if (pargs->cairo) plotstuff_builtin_apply(pargs->cairo, pargs); return 0; }
int plotstuff_set_size_wcs(plot_args_t* pargs) { assert(pargs->wcs); return plotstuff_set_size(pargs, (int)ceil(anwcs_imagew(pargs->wcs)), (int)ceil(anwcs_imageh(pargs->wcs))); }
static void makeplot(const char* plotfn, char* bgimgfn, int W, int H, int Nfield, double* fieldpix, double* fieldsigma2s, int Nindex, double* indexpix, int besti, int* theta, double* crpix, int* testperm, double * qc) { int i; plot_args_t pargs; plotimage_t* img; cairo_t* cairo; int ti; logmsg("Creating plot %s\n", plotfn); plotstuff_init(&pargs); pargs.outformat = PLOTSTUFF_FORMAT_PNG; pargs.outfn = plotfn; pargs.fontsize = 12; if (bgimgfn) { img = plotstuff_get_config(&pargs, "image"); img->format = PLOTSTUFF_FORMAT_JPG; plot_image_set_filename(img, bgimgfn); plot_image_setsize(&pargs, img); plotstuff_run_command(&pargs, "image"); } else { float rgba[4] = {0, 0, 0.1, 1.0}; plotstuff_set_size(&pargs, W, H); //plotstuff_init2(&pargs); plotstuff_set_rgba(&pargs, rgba); plotstuff_run_command(&pargs, "fill"); } cairo = pargs.cairo; // red circles around every field star. cairo_set_color(cairo, "gray"); for (i=0; i<Nfield; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); } // green crosshairs at every index star. cairo_set_color(cairo, "green"); for (i=0; i<Nindex; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*i+0], indexpix[2*i+1], 3); cairo_stroke(cairo); } // thick white circles for corresponding field stars. cairo_set_line_width(cairo, 2); for (ti=0; ti<=besti; ti++) { if (testperm) i = testperm[ti]; else i = ti; //printf("field %i -> index %i\n", i, theta[i]); if (theta[i] < 0) continue; cairo_set_color(cairo, "white"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); // thick cyan crosshairs for corresponding index stars. cairo_set_color(cairo, "cyan"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*theta[i]+0], indexpix[2*theta[i]+1], 3); cairo_stroke(cairo); } cairo_set_line_width(cairo, 2); //for (i=0; i<=besti; i++) { for (ti=0; ti<Nfield; ti++) { anbool mark = TRUE; if (testperm) i = testperm[ti]; else i = ti; switch (theta[i]) { case THETA_DISTRACTOR: cairo_set_color(cairo, "red"); break; case THETA_CONFLICT: cairo_set_color(cairo, "yellow"); break; case THETA_FILTERED: cairo_set_color(cairo, "orange"); break; default: if (theta[i] < 0) { cairo_set_color(cairo, "gray"); } else { cairo_set_color(cairo, "white"); } mark = FALSE; } if (mark) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); } if (ti <= MAX(besti, 10)) { char label[32]; sprintf(label, "%i", i); plotstuff_text_xy(&pargs, fieldpix[2*i+0], fieldpix[2*i+1], label); } if (i == besti) { cairo_set_line_width(cairo, 1); } } if (crpix) { cairo_set_color(cairo, "yellow"); cairo_set_line_width(cairo, 4); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CROSSHAIR, crpix[0], crpix[1], 10); cairo_stroke(cairo); } if (qc) { cairo_set_color(cairo, "skyblue"); cairo_set_line_width(cairo, 4); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CROSSHAIR, qc[0], qc[1], 10); cairo_stroke(cairo); } plotstuff_output(&pargs); logmsg("Wrote plot %s\n", plotfn); }