From: Steele Date: Mon, 5 Aug 2013 18:57:44 +0000 (+0200) Subject: Removing some backup files X-Git-Url: https://nsweb.tn.tudelft.nl/gitweb/?a=commitdiff_plain;h=cd132a5c9f76d0babfb2be431cf9efc20d8355a5;p=spyview.git Removing some backup files --- diff --git a/spyview/.#ImagePrinter.C.1.104 b/spyview/.#ImagePrinter.C.1.104 deleted file mode 100644 index 10b983d..0000000 --- a/spyview/.#ImagePrinter.C.1.104 +++ /dev/null @@ -1,1780 +0,0 @@ -#include -#include "ImagePrinter.H" -#include "ImageWindow.H" -#include "ImageWindow_LineDraw.H" -#include "message.h" -#include "throttle.H" -#include -#include -#include "eng.h" -#include -#include -#include - - -// Violating all rules of abstraction, but I can't figure our any other way to get access to argv[0] -#include "spyview.H" - -static bool Clip(double &x1,double &y1,double &x2,double &y2, double wx1, double wy1, double wx2, double wy2); -static void setColor(FILE *out, Fl_Color_Chooser *c); - -#ifndef WIN32 -#include -using namespace boost; -using namespace serialization; -using namespace std; -#endif - -static const double INCH=72.0; // Inch in points. -using namespace std; -std::string Image_Printer::settingsDir; - -// Implementation of cohen-sutherland algorithm. -static const int NONE=0; -static const int LEFT=1; -static const int RIGHT=2; -static const int TOP=4; -static const int BOTTOM=8; - -int wx1,wy1,wx2,wy2; - -Image_Printer::Image_Printer(ImageWindow *p_iw, Image_Printer_Control *p_ipc) -{ - iw = p_iw; - ipc = p_ipc; - ipc->ip = this; - ipc->face->value("Palatino"); - ipc->fontsize->value("24"); - width=7; - ipc->height->value("7.0"); - xoff=1; - yoff=1; - boxwidth=4; - tickwidth=4; - ticklength=.25; - zero=1e-15; - xspacing=0; - yspacing=0; - ipc->xscale->value("1.0"); - ipc->yscale->value("1.0"); - ipc->zscale->value("1.0"); - - ipc->xticfmt->value("%.2g"); - ipc->yticfmt->value("%.2g"); - ipc->cticfmt->value("%.2g"); - page_width = 11; - page_height = 8.5; - ipc->landscape->value(1); - ipc->colorbar->value(0); - loadPrintSettings(""); // Load the default settings... - previewFileName = tmpnam(NULL); - previewProc = -1; - - // Some default settings for the preview & formats, in case the - // settings file is not found - ipc->png_dpi->value("300"); -#ifdef WIN32 - ipc->gs_cmd->value("\"c:/Program Files/gs/gs8.64/gswin32c.exe\""); - ipc->preview_cmd->value("\"c:/Programs Files/Ghostgum/gsview/gsview32.exe\""); -#else - ipc->gs_cmd->value("gs"); - ipc->preview_cmd->value("gv --watch"); -#endif - loadPreviewSettings(); -} - -Image_Printer::~Image_Printer() -{ - info("Cleaning up\n"); - -#ifndef WIN32 - if(previewProc != -1) // We're about to unlink the preview ps file. Better kill gs first. - kill(previewProc,SIGTERM); -#endif - - unlink(previewFileName.c_str()); -} - -void Image_Printer::do_extra_conversions(string basename) -{ - string command = ""; - if (ipc->extra_pdf->value()) - { - command = ""; - command = ipc->gs_cmd->value(); - if (ipc->cmyk->value()) - command += " -dProcessColorModel=/DeviceCMYK "; - if (ipc->paper_letter->value()) - command += " -sPAPERSIZE=letter "; - else if (ipc->paper_a4->value()) - command += " -sPAPERSIZE=a4 "; - command += " -q -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dEPSCrop "; - command += " -dAutoFilterColorImages=false -dAutoFilterGrayImages=false "; - command += " -dColorImageFilter=/FlateEncode -dGrayImageFilter=/FlateEncode "; - command += " -sOutputFile=\"" + basename + ".pdf\" \""; - command += basename + ".ps\""; - info("pdf command:\n%s\n",command.c_str()); - // Don't you just love win32? This is pretty obvious, right? - // http://jason.diamond.name/weblog/2005/04/14/dont-quote-me-on-this -#ifdef WIN32 - system(("\""+command+"\"").c_str()); -#else - system(command.c_str()); -#endif - } - if (ipc->extra_png->value()) - { - command = ""; - command = ipc->gs_cmd->value(); - if (ipc->paper_letter->value()) - command += " -sPAPERSIZE=letter "; - else if (ipc->paper_a4->value()) - command += " -sPAPERSIZE=a4 "; - command += " -q -sDEVICE=pngalpha -dBATCH -dNOPAUSE -dEPSCrop "; - command += " -r"; - command += ipc->png_dpi->value(); - command += " -sOutputFile=\"" + basename + ".png\" \""; - command += basename + ".ps\""; - info("png command:\n%s\n",command.c_str()); -#ifdef WIN32 - system(("\""+command+"\"").c_str()); -#else - system(command.c_str()); -#endif - } - if(ipc->extra_svs->value()) - { - savesettings(basename + ".svs"); - } - - if(ipc->extra_set->value()) - { - savePrintSettings(basename + ".set"); - } - info("done\n"); -} - -void Image_Printer::startPreview() -{ -#ifndef WIN32 - if(previewProc != -1) - kill(previewProc,SIGTERM); -#endif - updatePreview(true); -#ifndef WIN32 - previewProc = fork(); -#endif - if(previewProc == 0) // We're the baby - execlp("gv","gv",previewFileName.c_str(),"--watch", NULL); -} - -void Image_Printer::updatePreview(bool first) -{ - static Throttle throttle(this,&Image_Printer::updatePreview, 1.0); - if(!throttle.throttle()) - return; - //reset_time(); - //validatePreviewCmd(); - if (previewFileName.size() == 0) return; - if(!first) - { - if(previewProc == -1) - return; - // If the viewer has quit, exit. - int stat; - int ret = 0; -#ifndef WIN32 - ret = waitpid(previewProc,&stat,WNOHANG); -#endif - if(ret != 0) - { - warn("PS viewer has quit...\n"); - previewProc = -1; - unlink(previewFileName.c_str()); - return; - } - } - char *n = tmpnam(NULL); - - FILE *out = fopen(n,"w"); - print(out,true); - fclose(out); - - // printf("Took %g seconds to generate preview\n",current_time()); - // No need to unlink the old file; rename is guaranteed to do that atomically. - // if (unlink(previewFileName.c_str()) != 0) - // info("error deleteing file \"%s\": %s\n", previewFileName.c_str(), strerror(errno)); - if (rename(n,previewFileName.c_str()) != 0) - info("error renaming file \"%s\" to \"%s\": %s\n", n, previewFileName.c_str(), strerror(errno)); -#ifndef WIN32 - if(!first) - kill(previewProc,SIGHUP); -#endif -} - -double Image_Printer::autospace(double min, double max) -{ - double range = fabs(min-max); - if(range*range == 0) - { - return 1; - } - - double digitsRange = floor(log10(range)); - double rangeMult = (double)pow(10.0,digitsRange); - - double collapsedRange = range/rangeMult; - if(collapsedRange < 2.5) - return .25 * rangeMult; - else if(collapsedRange < 5) - return .5 * rangeMult; - else if(collapsedRange <= 10) - return 1.0 * rangeMult; - warn("Tick Pick Problem... min %e max %e\n", min, max); - return 1.0 * rangeMult; -} - -void Image_Printer::pixelToDevice(double &x, double &y) -{ - double xscale = atof(ipc->xscale->value()); - double yscale = atof(ipc->yscale->value()); - - y = iw->id.getY(y)*yscale; // Why the hell is this right? - // Why does spyview have so many coordinate systems, some of which have 0,0 as top-left, some as bottom-left? - x = iw->id.getX(x)*xscale; - unitToDevice(x,y); -} -void Image_Printer::unitToDevice(double &x, double &y) -{ - double height = atof((ipc->height->value())); - double xscale = atof(ipc->xscale->value()); - double yscale = atof(ipc->yscale->value()); - double xmin = iw->id.getX(img_x1)*xscale; - double xmax = iw->id.getX(img_x2)*xscale; - double ymin = iw->id.getY(img_y1)*yscale; - double ymax = iw->id.getY(img_y2)*yscale; - - double xrange, xoffset, yrange, yoffset; - if (ipc->precise_ticks->value()) - { - xrange=width*(img_xsize-1)/(img_xsize); // xmin is actually 1/2 pixel from the left edge, xmax is 1/2 pixel from the right. - xoffset = width*(0.5/(img_xsize)); - yrange = height*(img_ysize-1)/(img_ysize); - yoffset = height*(0.5/(img_ysize)); - } - else - { - yrange = height; - yoffset = 0; - xrange=width; - xoffset=0; - } - y = yoff + yrange*(y-ymax)/(ymin-ymax) + yoffset; - x = xoff + xrange*(x-xmin)/(xmax-xmin) + xoffset; -} -// void Image_Printer::validatePreviewCmd() -// { -// if(strstr(ipc->preview_cmd->value(),".ps")) -// { -// warn("Overriding apparently inappropriate preview command \"%s\" with default of \"%s\"\n", -// ipc->preview_cmd->value(),defaultPreviewCmd); -// ipc->preview_cmd->value(defaultPreviewCmd); -// } -// } - -void Image_Printer::box(FILE *out, double x, double y, double w, double h) -{ - fprintf(out," %g inch %g inch moveto\n",x,y); - fprintf(out," %g inch 0 rlineto\n",w); - fprintf(out," 0 %g inch rlineto\n",h); - fprintf(out," %g inch 0 rlineto closepath\n",-w); -} -void Image_Printer::pushClip(FILE *out, double xoff, double yoff,double width,double height) -{ - fprintf(out," clipsave\n"); - box(out, xoff,yoff,width,height); - fprintf(out," clip\n"); -} - -/* This function is getting *way* too long and messy. Something needs to be done.. */ -void Image_Printer::print(FILE *out_p, bool preview_p) -{ - preview = preview_p; - out = out_p; - - // initialize some variables - computePlotRange(); - max_ytic_width = 0; // for choosing the offset of the y axix label - max_ctic_width = 0; // for choosing the offset of the colorbar axix label - height = atof((ipc->height->value())); - fontsize = atof(ipc->fontsize->value()); - xscale = atof(ipc->xscale->value()); - yscale = atof(ipc->yscale->value()); - zscale = atof(ipc->zscale->value()); - - write_header(); - - if (ipc->landscape->value() && !ipc->paper_eps->value()) - fprintf(out, "%d 0 translate 90 rotate\n", bb_ur_x ); - - if(ipc->watermark->value()) - write_watermark(); - - draw_image(); - draw_lines(); - - if (ipc->colorbar->value()) - draw_colorbar(); - - draw_axis_tics(); - - // Draw the bounding box - if(boxwidth > 0) - { - fprintf(out,"%% Draw our box around the plot\n"); - setColor(out,ipc->border_color); - fprintf(out," %g setlinewidth newpath\n",boxwidth); - box(out,xoff,yoff,width,height); - fprintf(out," stroke\n"); - } - else - fprintf(out,"%% User requested no box\n"); - - draw_axis_labels(); - - // By defering the bounding box, we now have access to max_ytic_width and max_ctic_width - if (ipc->paper_eps->value()) - { - int label_x = static_cast(- (max_ytic_width+2.5)*fontsize/2.0); - int label_c = static_cast((max_ctic_width+2.5)*fontsize/2.0); - // Tricky part: estimate a nice bounding box for an EPS file - bb_ll_x = (int) (xoff*INCH - (ipc->yaxis_label->value() ? 1 : -1) * fontsize + label_x); - // the y axis tickmark labels are much wider than the x axis are tall - bb_ll_y = (int) (yoff*INCH - (ipc->xaxis_label->value() ? 3 : 2) * fontsize); - if(ipc->colorbar->value()) - bb_ur_x = (int) ((cbar_xoff+cbar_width)*INCH + label_c + (ipc->caxis_label->value() ? fontsize : 0)); - else - bb_ur_x = (int) ((xoff+width)*INCH + fontsize); - bb_ur_y = (int) ((yoff+height)*INCH + (ipc->do_title->value() ? 2 : 1) * fontsize); - } - - if (ipc->dir_stamp->value()) - add_dirstamp(); - - if (preview || !ipc->paper_eps->value()) // If we're using eps, spec says no showpage (adobe maybe disagrees) - fprintf(out,"showpage\n"); - fprintf(out,"grestore\n"); - fprintf(out,"%%%%Trailer\n"); - fprintf(out, "%%%%Actual BoundingBox was: %d %d %d %d\n", bb_ll_x, bb_ll_y, bb_ur_x, bb_ur_y); - fprintf(out,"%%%%EOF\n"); - - info("Label width actual values:\n"); - info("ytic %d ctic %d\n", max_ytic_width, max_ctic_width); - info("%%%%BoundingBox: %d %d %d %d\n", bb_ll_x, bb_ll_y, bb_ur_x, bb_ur_y); -} - -void Image_Printer::updatePlotRange(Image_Printer_Control *ipc) -{ - computePlotRange(); - double xscale = atof(ipc->xscale->value()); - double yscale = atof(ipc->yscale->value()); - - char buf[1024]; - double minx, miny, maxx, maxy; - //int img_x1, img_y1, img_x2, img_y2; // overriding class variables!!!? - switch(ipc->plotRange->value()) - { - case PLOT_ZOOM: - iw->zoom_window->getSourceArea(img_x1, img_y1, img_x2, img_y2); - //falling case! - case PLOT_MANUAL: - minx = iw->xunit(img_x1); - maxx = iw->xunit(img_x2); - miny = iw->yunit(img_y1-1); //strange: why did i need to -1? - maxy = iw->yunit(img_y2-1); - break; - case PLOT_ALL: - default: - minx = iw->xunit(0); - maxx = iw->xunit(iw->w-1); - miny = iw->yunit(0); - maxy = iw->yunit(iw->h-1); - break; - } - minx *= xscale; - miny *= yscale; - maxx *= xscale; - maxy *= yscale; - snprintf(buf,sizeof(buf),"%g,%g",minx,maxx); - ipc->xrange->value(buf); - snprintf(buf,sizeof(buf),"%g,%g",maxy,miny); - ipc->yrange->value(buf); -} - -void Image_Printer::computePlotRange() -{ - double xscale = atof(ipc->xscale->value()); - double yscale = atof(ipc->yscale->value()); - - switch(ipc->plotRange->value()) - { - case PLOT_ALL: - default: - img_x1 = 0; - img_y1 = 0; - img_x2 = iw->w-1; - img_y2 = iw->h-1; - break; - case PLOT_ZOOM: - if(iw->zoom_window) - iw->zoom_window->getSourceArea(img_x1, img_y1, img_x2, img_y2); - else - { - ipc->plotRange->value(PLOT_ALL); - computePlotRange(); - return; - } - break; - case PLOT_MANUAL: - { - double xmin,xmax,ymin,ymax; - if(sscanf(ipc->xrange->value(),"%lg,%lg",&xmin,&xmax) == 2) - { - img_x1 = round(iw->id.getX_inv(xmin / xscale)); - img_x2 = round(iw->id.getX_inv(xmax / xscale)); - if(img_x1 > img_x2) - swap(img_x1,img_x2); - } - else - { - warn("Warning: X Range \"%s\" isn't of the form 1.0,2.0\n",ipc->xrange->value()); - img_x1 = 0; - img_x2 = iw->w-1; - } - if(sscanf(ipc->yrange->value(),"%lg,%lg",&ymax,&ymin) == 2) - { - img_y1 = round(iw->id.getY_inv(ymin / yscale)); - img_y2 = round(iw->id.getY_inv(ymax / yscale)); - if(img_y1 > img_y2) - swap(img_y1,img_y2); - } - else - { - warn("Warning: Y Range \"%s\" isn't of the form 1.0,2.0\n",ipc->yrange->value()); - img_y1 = 0; - img_y2 = iw->h-1; - } - } - } - img_xsize = abs(img_x2-img_x1+1); - img_ysize = abs(img_y2-img_y1+1); -} - -void Image_Printer::updateSettings(Image_Printer_Control *ipc) -{ - char buf[64]; - - snprintf(buf,sizeof(buf),"%g",width); - ipc->width->value(buf); - snprintf(buf,sizeof(buf),"%g",xoff); - ipc->xoff->value(buf); - snprintf(buf,sizeof(buf),"%g",yoff); - ipc->yoff->value(buf); - - snprintf(buf,sizeof(buf),"%g",ticklength); - ipc->ticklength->value(buf); - snprintf(buf,sizeof(buf),"%g",xspacing); - ipc->xspacing->value(buf); - snprintf(buf,sizeof(buf),"%g",yspacing); - ipc->yspacing->value(buf); - - snprintf(buf,sizeof(buf),"%g",boxwidth); - ipc->boxwidth->value(buf); - snprintf(buf,sizeof(buf),"%g",tickwidth); - ipc->tickwidth->value(buf); - updatePlotRange(ipc); - update_page_size(); -} - -void Image_Printer::fetchSettings(Image_Printer_Control *ipc) -{ - width=atof(ipc->width->value()); - xoff=atof(ipc->xoff->value()); - yoff=atof(ipc->yoff->value()); - - ticklength=atof(ipc->ticklength->value()); - xspacing=atof(ipc->xspacing->value()); - yspacing=atof(ipc->yspacing->value()); - - boxwidth=atof(ipc->boxwidth->value()); - tickwidth=atof(ipc->tickwidth->value()); - - updatePreview(); -} - -void Image_Printer::update_page_size(int type) -{ - // This is a pain in the ass because in FLTK, the status of the - // other radio buttons is not updated until after the callback is - // executed: during the callback, two radio buttons could both be - // "1" at the same time... - - if (type == -1 && ipc->paper_letter->value()) - type = 1; - else if (type == -1 && ipc->paper_a4->value()) - type = 2; - - if (type == 1) - { - page_width = 8.5; - page_height = 11.0; - } - - else if (type == 2) - { - page_width = 8.27; - page_height = 11.69; - } - - if (ipc->landscape->value()) - { - double tmp = page_width; - page_width = page_height; - page_height = tmp; - } -} - -void Image_Printer::setAspectRatio(int change_axis) -{ - double target_width, target_height; - - double cur_height = atof(ipc->height->value()); - double cur_width = width; - - // define ar as h/w, giving h = ar*w, w = h/ar - double spyview_ar = 1.0* iw->dozoom(iw->h, iw->yzoom) / iw->dozoom(iw->w, iw->xzoom); - - // change axis: - // 1 = change width, keep left edge - // 2 = change width, center - // 3 = change width, keep right edge - // 4 = change height, keep top edge - // 5 = change height, center - // 6 = change height, keep bottom edge - - - if (change_axis < 4) // change width - { - target_width = cur_height / spyview_ar; - target_height = cur_height; - if (change_axis == 2) - xoff += (cur_width - target_width)/2; - else if (change_axis == 3) - xoff += (cur_width - target_width); - } - else - { - target_width = cur_width; - target_height = cur_width * spyview_ar; - if (change_axis == 4) - yoff += (cur_height - target_height); - else if (change_axis == 5) - yoff += (cur_height - target_height)/2; - } - - width = target_width; - - //historically, height is not a local class variable... - char buf[1024]; - snprintf(buf,sizeof(buf),"%g",target_height); - ipc->height->value(buf); - updateSettings(ipc); - //ipc->center_x->do_callback(); - //ipc->center_y->do_callback(); -} - -static void maybe_mkdir(const char *name) -{ -#ifdef WIN32 - if(mkdir(name) == 0) -#else - if(mkdir(name,0777) == 0) -#endif - - switch(errno) - { - case EEXIST: - return; - default: - warn("Unable to create directory \"%s\": %s\n",name,strerror(errno)); - return; - } -} - -void Image_Printer::initSettingsDir() -{ - string buf; -#ifdef WIN32 - if(getenv("SPYVIEW_PREF_DIR") != NULL) - buf = getenv("SPYVIEW_PREF_DIR"); - else - buf = sharedir; -#else - buf = getenv("HOME"); - buf = buf + DIRECTORY_SEPARATOR + ".spyview"; -#endif - maybe_mkdir(buf.c_str()); - buf = buf + DIRECTORY_SEPARATOR + "print_settings"; - settingsDir = buf; - maybe_mkdir(buf.c_str()); -} - -void Image_Printer::savePreviewSettings() -{ - string name; - initSettingsDir(); - if(name.empty()) - name = settingsDir + DIRECTORY_SEPARATOR + "settings.prv"; - - std::ofstream ofs(name.c_str()); - boost::archive::text_oarchive ar(ofs); - - int version; - ar & version; - // All this stuff is in version 1 - ar & flcast(ipc->preview_cmd); - ar & flcast(ipc->gs_cmd); - ar & flcast(ipc->extra_pdf); - ar & flcast(ipc->extra_png); - ar & flcast(ipc->png_dpi); - ar & flcast(ipc->cmyk); -} - -void Image_Printer::loadPreviewSettings() -{ - string name; - initSettingsDir(); - if(name.empty()) - name = settingsDir + DIRECTORY_SEPARATOR + "settings.prv"; - - std::ifstream ifs(name.c_str()); - if (!ifs.good()) - { - info("preview settings file _%s_ not found\n", name.c_str()); - return; - } - boost::archive::text_iarchive ar(ifs); - - int version; - ar & version; - ar & flcast(ipc->preview_cmd); - ar & flcast(ipc->gs_cmd); - ar & flcast(ipc->extra_pdf); - ar & flcast(ipc->extra_png); - ar & flcast(ipc->png_dpi); - ar & flcast(ipc->cmyk); -} - - -void Image_Printer::savePrintSettings(std::string name) -{ - fetchSettings(ipc); // Should be redundant, but paranoia is good. - initSettingsDir(); - if(name.empty()) - { - name = settingsDir + DIRECTORY_SEPARATOR + "default.set"; - } - - const char *fname = name.c_str(); - std::ofstream ofs(fname); - try - { - if(!ofs.good()) - throw(1); - } - catch (...) - { - warn("Unable to create or overwrite settings file \"%s\"\n",fname); - } - - try - { - boost::archive::text_oarchive oa(ofs); - - // For some reason, on WIN32 even have this code compiled into - // the program, even if it is not executed (!?), causes a - // crash. - - // Upon further inspection, this causes a crash on my machine - // at work, but not on my machine at home. Also, curiously, on - // my machine at work, the fltk widgets have now started to be - // displayed at unix "dark grey" instead of the usual windows - // "light biege". At home, where the exact same executable is - // not crashing, the fltk widgets are beige (except for the - // first warning dialog box!!!) - - oa & (*this); - } - catch (boost::archive::archive_exception e) - { - error("ImagePrinter serialization error: %s",e.what()); - } - catch (...) - { - error("Unknown serialization error\n"); - } - -} - -void Image_Printer::loadPrintSettings(std::string name) -{ - initSettingsDir(); - if(name.empty()) - { - name = settingsDir + DIRECTORY_SEPARATOR + "default.set"; - } - - const char *fname = name.c_str(); - try - { - std::ifstream ifs(fname); - if(!ifs.good()) - throw(1); - boost::archive::text_iarchive ia(ifs); - ia & (*this); - updateSettings(ipc); - } - catch (boost::archive::archive_exception e) - { - error("Serialization error: %s",e.what()); - } - catch (...) - { - warn("Unable to load settings file \"%s\": %s\n",fname,strerror(errno)); - } -} - - -static inline int chGetCode(double x, double y, double wx1, double wy1, double wx2, double wy2) -{ - double eps = max(fabs(wx1-wx2),fabs(wy1-wy2))*1e-6; - int code = NONE; - if(xwx2+eps) - code |= RIGHT; - if(ywy2+eps) - code |= BOTTOM; - return code; -} - -static inline bool SubClip(double &x1,double &y1,double &x2,double &y2, double wx1, double wy1, double wx2, double wy2) -{ - if(wy2 < wy1) - swap(wy2,wy1); - if(wx2 < wx1) - swap(wx2,wx1); - if(fabs(x2-x1) < fabs(y2 - y1)) - return SubClip(y1,x1,y2,x2,wy1,wx1,wy2,wx2); - double m, tx, ty; - int code1, code2; - m=(y2-y1)/(float)(x2-x1); - code1=chGetCode(x1,y1,wx1,wy1,wx2,wy2); - code2=chGetCode(x2,y2,wx1,wy1,wx2,wy2); - for(int i = 0; i < 20; i++) - { - if(code1 == NONE) - break; - if(code1 & LEFT) - { - tx=wx1-x1; - ty=y1+(tx*m); - x1=wx1; y1=ty; - code1=chGetCode(x1,y1,wx1,wy1,wx2,wy2); - } - if(code1 & RIGHT) - { - tx=wx2-x1; - ty=y1+(tx*m); - x1=wx2; y1=ty; - code1=chGetCode(x1,y1,wx1,wy1,wx2,wy2); - } - if(code1 & TOP) - { - ty=wy1-y1; - tx=x1+(ty/m); - x1=tx; y1=wy1; - code1=chGetCode(x1,y1,wx1,wy1,wx2,wy2); - } - if(code1 & BOTTOM) - { - ty=wy2-y1; - tx=x1+(ty/m); - x1=tx; y1=wy2; - code1=chGetCode(x1,y1,wx1,wy1,wx2,wy2); - } - if((code2 & code1) != 0) - return false; - } - if(code1 != NONE) - { - fprintf(stderr,"Bad clip: %g,%g %g,%g [%g,%g]-[%g,%g]\n",x1,y1,x2,y2,wx1,wy1,wx2,wy2); - return false; - } - return true; -} - -static bool Clip(double &x1,double &y1,double &x2,double &y2, double wx1, double wy1, double wx2, double wy2) -{ - int code1=chGetCode(x1,y1,wx1,wy1,wx2,wy2); - int code2=chGetCode(x2,y2,wx1,wy1,wx2,wy2); - if((code1 & code2) != 0) - return false; - if((code1 == 0) && (code2 == 0)) - return true; - // printf("Clipping %g,%g - %g,%g to %g,%g - %g,%g\n",x1,y1,x2,y2,wx1,wy1,wx2,wy2); - bool res = SubClip(x1,y1,x2,y2,wx1,wy1,wx2,wy2); - // printf(" Clip %g,%g - %g,%g to %g,%g - %g,%g %s\n",x1,y1,x2,y2,wx1,wy1,wx2,wy2, res ? "true" : "false"); - return res && SubClip(x2,y2,x1,y1,wx1,wy1,wx2,wy2); - - -} - -void setColor(FILE *out, Fl_Color_Chooser *c) -{ - fprintf(out,"%g %g %g setrgbcolor %% Color: %s\n",c->r(),c->g(),c->b(),c->label()); -} - -void Image_Printer::write_watermark() -{ - // The "Watermark" prints a text copy of many of the settings into a small - // Rectangle clipped to the image area. You can use illustrator to delete - // the image and see it if you need to duplicate an image. - static const double ls=5.0/INCH; - fprintf(out,"%% The following puts a watermark with some info on how the file was made below the image\n"); - setColor(out,ipc->text_color); - pushClip(out,xoff,yoff,width,height); - fprintf(out,"/Courier findfont 4 scalefont setfont\n"); - double y = yoff+height-ls; - char buf[4096]; - - snprintf(buf,sizeof(buf),"filename %s colormap %s", - iw->filename.c_str(), iw->colormap_window->label()); - fprintf(out," newpath %g inch %g inch moveto (%s) show\n", - xoff, y, buf); - y -= ls; - - snprintf(buf,sizeof(buf),"hmin %d %e %s hmax %d %e", - iw->hmin, iw->id.quant_to_raw(iw->hmin), iw->id.zname.c_str(), - iw->hmax, iw->id.quant_to_raw(iw->hmax)); - fprintf(out," newpath %g inch %g inch moveto (%s) show\n", - xoff, y, buf); - y -= ls; - - snprintf(buf,sizeof(buf),"plane_a %g plane_b %g gamma %g gammacenter %g", iw->plane_a, iw->plane_b, iw->gam, iw->gcenter); - fprintf(out," newpath %g inch %g inch moveto (%s) show\n", - xoff, y, buf); - y -= ls; - - snprintf(buf,sizeof(buf),"imop \"%s\"", iw->operations_string.c_str()); - fprintf(out," newpath %g inch %g inch moveto (%s) show\n", - xoff, y, buf); - y -= ls; - - snprintf(buf,sizeof(buf),"box_int (%d,%d)-(%d,%d)", img_x1, img_y1, img_x2, img_y2); - fprintf(out," newpath %g inch %g inch moveto (%s) show\n", - xoff, y, buf); - y -= ls; - - snprintf(buf,sizeof(buf),"box (%g,%g)-(%g,%g)", iw->xunit(img_x1)*xscale, iw->yunit(img_y1)*yscale, iw->xunit(img_x2)*xscale, iw->yunit(img_y2)*yscale); - fprintf(out," newpath %g inch %g inch moveto (%s) show\n", - xoff, y, buf); - y -= ls; - - snprintf(buf,sizeof(buf),"xscale %g yscale %g", xscale, yscale); - fprintf(out," newpath %g inch %g inch moveto (%s) show\n", - xoff, y, buf); - y -= ls; - - - fprintf(out," cliprestore\n"); -} - -void Image_Printer::calculateBoundingBox() -{ - // Before, we put the bounding box at the end of the file after we - // calculated all the label widths. - - // However, there is an outstanding ghostscript bug that ignores - // (atend) bounding boxes gv and gsview both have hacked together - // work arounds however, if we use ghostscript to convert to png or - // pdf, the bounding box is completely ignored! - - // So, now, we have to hack it in here. - - // The y values are easy, since the height of the labels is fixed - bb_ur_y = (int) ((yoff+height)*INCH + (ipc->do_title->value() ? 2 : 1) * fontsize); - bb_ll_y = (int) (yoff*INCH - (ipc->xaxis_label->value() ? 3 : 2) * fontsize); - - // The x values are much harder, since we need to estimate the maximum width of - // the y axis labels and the colorbar labels. - // - // Let's try estimating it from the min an max values of the labels - -// double tmp; -// char buf[128]; -// tmp = iw->yunit((img_y2+img_y1)*0.667)*yscale; // a random uneven number? -// max_ytic_width = snprintf(buf,sizeof(buf),ipc->yticfmt->value(),tmp); -// info("%s\n", buf); - -// // Same for the colorbar - -// tmp = iw->getz((iw->hmin+iw->hmax)*0.667)*zscale; -// max_ctic_width = snprintf(buf,sizeof(buf),ipc->yticfmt->value(),tmp); -// info("%s\n", buf); - - // the above doesn't work so well either... - // let's just overestimate the bounding box a bit... - // it would be better to calculate the tics ahead of time... - - max_ytic_width = 10; - max_ctic_width = 10; - - int label_x = static_cast(- (max_ytic_width+2.5)*fontsize/2.0); - bb_ll_x = (int) (xoff*INCH - (ipc->yaxis_label->value() ? 1 : -1) * fontsize + label_x); - - int label_c = static_cast((max_ctic_width+2.5)*fontsize/2.0); - cbar_width = ipc->cbar_width->value(); - cbar_xoff = xoff + width + 0.3; - - if(ipc->colorbar->value()) - bb_ur_x = (int) ((cbar_xoff+cbar_width)*INCH + label_c + (ipc->caxis_label->value() ? fontsize : 0)); - else - bb_ur_x = (int) ((xoff+width)*INCH + fontsize); - - info("Label width estimates:\n"); - info("ytic %d ctic %d\n", max_ytic_width, max_ctic_width); - info("%%%%BoundingBox: %d %d %d %d\n", bb_ll_x, bb_ll_y, bb_ur_x, bb_ur_y); - - max_ytic_width = 0; - max_ctic_width = 0; -} - -void Image_Printer::write_header() -{ - - // First, reset the bouding box - bb_ll_x = bb_ll_y = 0; - - // Now that we to include support for printing the area selected - // using the zoom window (or a manually set area), we will create - // some variables here that store the area of the image - - if (ipc->paper_eps->value() && (!preview)) - fprintf(out,"%%!PS-Adobe-3.0 EPSF-3.0\n"); - else - fprintf(out,"%%!PS-Adobe-3.0\n"); - - // Add a paper description and orientation for nice cooperation with - // gs: however, for some reason, ps2pdf seems to ignore the paper - // settings we put in the postscript file and just uses Letter... - if (ipc->paper_letter->value()) - { - bb_ur_x = 612; - bb_ur_y = 792; - } - else if (ipc->paper_a4->value()) - { - bb_ur_x = 595; - bb_ur_y = 842; - } - - if (ipc->paper_eps->value()) - { - calculateBoundingBox(); - fprintf(out, "%%%%BoundingBox: %d %d %d %d\n", bb_ll_x, bb_ll_y, bb_ur_x, bb_ur_y); - if(preview) - fprintf(out, "%%%%Pages: 1\n"); - else - fprintf(out, "%%%%Pages: 0\n"); - fprintf(out,"%%%%Orientation: Portrait\n"); - } - else - { - // The PNG and PDF files will be displayed with rotated pages if we do this. - //if (ipc->landscape->value()) - //{ - // int tmp = bb_ur_x; - // bb_ur_x = bb_ur_y; - // bb_ur_y = tmp; - //} - // the above doesn't really work... - if (ipc->paper_letter->value()) - fprintf(out, "%%%%DocumentMedia: Letter %d %d 0 () ()\n", bb_ur_x,bb_ur_y); - else if (ipc->paper_a4->value()) - fprintf(out, "%%%%DocumentMedia: A4 %d %d 0 () ()\n",bb_ur_x,bb_ur_y); - - fprintf(out, "%%%%Orientation: %s\n", ipc->landscape->value() ? "Landscape" : "Portrait"); - fprintf(out, "%%%%Pages: 1\n"); - } - - // DSC comments that don't change with ps/eps... - fprintf(out,"%%%%DocumentData: Clean7Bit\n"); - fprintf(out,"%%%%Creator: Spyview PS Output\n"); - fprintf(out, - "%%%% Spyview parameters:\n" - "%%%% colorplotmin = %e ; colorplotmax = %e\n" - "%%%% gamma = %e\n" - "%%%% rawdata_min = %e, rawdata_max = %e\n", - iw->getz(iw->hmin)*zscale, iw->getz(iw->hmax)*zscale, - iw->gam, iw->id.rawmin, iw->id.rawmax); - fprintf(out,"%%%%EndComments\n\n"); - - - // Distiller magic - fprintf(out, - "%%%%BeginSetup\n" - "%% The following makes distiller not jpeg compress the spyview image.\n" - "systemdict /setdistillerparams known {\n" - "<< /AutoFilterColorImages false /ColorImageFilter /FlateEncode >>\n" - "setdistillerparams\n" - "} if\n" - "/inch {72 mul} bind def\n" - "/rightshow %% stk: string; show a string right aligned at the current location\n" - "{ dup stringwidth pop 0 exch sub 0 rmoveto show } def\n" - "/centershow %% stk: string show a string centered horizontally at the current location\n" - "{ dup stringwidth pop 0 exch sub 0.5 mul 0 rmoveto show } def\n" - "%%%%EndSetup\n"); - - if(ipc->paper_eps->value()) - { - // Tricky part: estimate a nice bounding box for an EPS file; the pagesize will crop the output pdf nicely if we get it close. - int label_c = static_cast((6)*fontsize/2.0); - if(ipc->colorbar->value()) - bb_ur_x = (int) ((cbar_xoff+cbar_width)*INCH + label_c + (ipc->caxis_label->value() ? fontsize : 0)); - else - bb_ur_x = (int) ((xoff+width)*INCH + fontsize); - bb_ur_y = (int) ((yoff+height)*INCH + (ipc->do_title->value() ? 2 : 1) * fontsize); - - // This is causing problems with ghostscript 8.54: strictly - // speaking, EPS files should not have a page size. In newer - // versions of ghostscript, if a page size is found, it - // overrides the bounding box for conversion to, for example, - // PDF and PNG files. - //fprintf(out,"<< /PageSize [%d %d] >> setpagedevice\n",bb_ur_x,bb_ur_y); - } - - if (!ipc->paper_eps->value() || preview) - fprintf(out, "%%%%Page: 1 1\n"); - fprintf(out,"gsave\n"); -} - -void Image_Printer::draw_image() -{ - - // Draw the image - fprintf(out,"%% Draw the image\n"); - //fprintf(out,"/imgstr %d string def\n\n", iw->w); - fprintf(out,"/imgstr %d string def\n\n", img_xsize); - fprintf(out,"gsave\n %g inch %g inch translate\n", xoff,yoff); - fprintf(out," %g inch %g inch scale\n",width,height); - //fprintf(out," %d %d %% Columns and Rows\n", iw->w, iw->h); - fprintf(out," %d %d %% Columns and Rows\n", img_xsize, img_ysize); - fprintf(out," 8 %% bits per color channel\n"); - //fprintf(out," [%d 0 0 %d 0 0]\n",iw->w, iw->h); // Map the unit square to our image - fprintf(out," [%d 0 0 %d 0 0]\n",img_xsize, img_ysize); // Map the unit square to our image - fprintf(out," { currentfile imgstr readhexstring pop } false 3 colorimage\n"); - fprintf(out," "); - - // number of columns before a newline in the postscript image - static const int maxcol=72; - - for(int i = img_y2; i >= img_y1; i--) - { - int c = 0; - for(int j = img_x1; j <= img_x2; j++) - { - c += 6; - if(c > maxcol) - { - fprintf(out,"\n "); - c = 6; - } - unsigned char r,g,b; - if(i >= 0 && i < iw->h && j >= 0 && j < iw->w) // This is a horrible hack, but I'm too lazy to work out the right bounds. - iw->getrgb(i,j,r,g,b); - else - { - r = g = b = 255; - } - fprintf(out,"%02x%02x%02x",r,g,b); - - } - fprintf(out,"\n "); - } - fprintf(out," grestore\n\n"); -} - -void Image_Printer::draw_lines() -{ - // We want to draw the linecut before the bounding box and the tic - // marks, so it comes out beneath them. - bool clipped=false; - - if(ipc->plotLineCut->value() && (iw->line_cut_type != NOLINE)) // Plot the line for the linecut. We use the ticmark settings at the moment, which is stupid but easy. - { - pushClip(out,xoff,yoff,width,height); - clipped=true; - fprintf(out,"%% Plot the linecut location\n"); - setColor(out, ipc->linecut_color); - fprintf(out," %g setlinewidth newpath\n",tickwidth); - double x1,y1,x2,y2,t; - switch(iw->line_cut_type) - { - case HORZLINE: - x1 = xoff; x2 = xoff + width; - y1=iw->line_cut_yp; - pixelToDevice(t,y1); - y2=y1; - break; - case VERTLINE: - x1=iw->line_cut_xp; - pixelToDevice(x1,t); - x2=x1; - y1 = yoff; y2 = yoff + height; - break; - case OTHERLINE: - x1=iw->lcx1; - x2=iw->lcx2; - y1=iw->lcy1; - y2=iw->lcy2; - pixelToDevice(x1,y1); - pixelToDevice(x2,y2); - break; - default: - warn("Unknown line cut type!\n"); - exit(1); - } - fprintf(out," %g inch %g inch moveto\n",x1,y1); - fprintf(out," %g inch %g inch lineto\n",x2,y2); - fprintf(out,"stroke\n"); - } - - if(ipc->plotZoomBox->value() && iw->zoom_window && iw->zoom_window->visible()) - { - int x1,y1,x2,y2; - iw->zoom_window->getSourceArea(x1,y1,x2,y2); - double x1d, y1d, x2d, y2d; - x1d = x1; y1d = y1; x2d = x2; y2d = y2; - pixelToDevice(x1d,y1d); - pixelToDevice(x2d,y2d); - setColor(out,ipc->zoombox_color); - fprintf(out," %g setlinewidth newpath\n",tickwidth); - fprintf(out," %g inch %g inch moveto\n",x1d,y1d); - fprintf(out," %g inch %g inch lineto\n",x1d,y2d); - fprintf(out," %g inch %g inch lineto\n",x2d,y2d); - fprintf(out," %g inch %g inch lineto\n",x2d,y1d); - fprintf(out," %g inch %g inch lineto\n",x1d,y1d); - fprintf(out," stroke\n"); - } - if (ipc->plotLines->value() && !LineDrawer->lines.empty()) - { - if(!clipped) - pushClip(out,xoff,yoff,width,height); - clipped=true; - fprintf(out,"%% Plot the lines\n"); - setColor(out,ipc->overlay_color); - fprintf(out,"%g setlinewidth newpath\n",tickwidth); - double lx = NAN; - double ly = NAN; - - for(LineDraw::lines_t::iterator i = LineDrawer->lines.begin(); i != LineDrawer->lines.end(); i++) - { - double x1,y1,x2,y2; - x1=i->x1*xscale; - x2=i->x2*xscale; - y1=i->y1*yscale; - y2=i->y2*yscale; - unitToDevice(x1,y1); - unitToDevice(x2,y2); - if(Clip(x1,y1,x2,y2,xoff,yoff,xoff+width,yoff+height)) - { - if(!(isnan(x1) || isnan(y1) || isnan(x2) || isnan(y2))) - { - if((x1 != lx) || (y1 != ly)) // Skip unnecessary moves. - fprintf(out," %g inch %g inch moveto\n",x1,y1); - fprintf(out," %g inch %g inch lineto\n",x2,y2); - } - lx = x2; - ly = y2; - } - else - { - lx = NAN; - ly = NAN; - } - } - fprintf(out,"stroke\n"); - } - if(clipped) - { - fprintf(out," cliprestore\n"); - clipped=false; - } -} - -void Image_Printer::draw_colorbar() -{ - int cbimgx, cbimgy; - if (ipc->rotate_cbar->value()) - { - cbar_height = ipc->cbar_width->value(); - cbar_width = height*ipc->cbar_height_per->value()/100.0; - cbar_xoff = xoff + (width-cbar_width)/2; - cbar_yoff = yoff + height+0.3; - cbimgx = iw->colormap_length; - cbimgy = 1; - } - else - { - cbar_width = ipc->cbar_width->value(); - cbar_height = height*ipc->cbar_height_per->value()/100.0; - cbar_xoff = xoff + width + 0.3; - cbar_yoff = yoff + (height - cbar_height)/2; - cbimgx = 1; - cbimgy = iw->colormap_length; - } - - - - if (!ipc->linear_cmap->value()) - { - // Draw a colorbar with a non-linear color mapping but a linear tic spacing - - fprintf(out,"%% Draw the colorbar\n"); - fprintf(out,"/imgstr %d string def\n\n", 1); - fprintf(out,"gsave\n %g inch %g inch translate\n", cbar_xoff, cbar_yoff); - fprintf(out," %g inch %g inch scale\n",cbar_width, cbar_height); - fprintf(out," %d %d %% Columns and Rows\n", cbimgx, cbimgy); - fprintf(out," 8 %% bits per color channel\n"); - fprintf(out," [%d 0 0 %d 0 0]\n", cbimgx, cbimgy); // Map the unit square to our image - fprintf(out," { currentfile imgstr readhexstring pop } false 3 colorimage\n"); - - int tmp; - for(int i = 0; i < iw->colormap_length; i++) - { - unsigned char r,g,b; - tmp = iw->gammatable[i]; - r = iw->colormap[3*tmp]; - g = iw->colormap[3*tmp+1]; - b = iw->colormap[3*tmp+2]; - fprintf(out,"%02x%02x%02x",r,g,b); - fprintf(out,"\n "); - } - fprintf(out," grestore\n\n"); - - // Draw the colorbar box - - if (boxwidth > 0) - { - fprintf(out, "%% Draw the box around the colorbar\n"); - setColor(out,ipc->border_color); - fprintf(out," %g setlinewidth newpath\n",boxwidth); - box(out,cbar_xoff,cbar_yoff,cbar_width,cbar_height); - fprintf(out," stroke\n"); - } - - // Draw the tic marks on the colorbox - fprintf(out,"/%s findfont %g scalefont setfont\n",ipc->face->value(),fontsize); - fprintf(out," %g setlinewidth\n", tickwidth); - if(ipc->cticfmt->size() != 0) - { - double cs; - double cmin = iw->getz(iw->hmin)*zscale; - double cmax = iw->getz(iw->hmax)*zscale; - int tic_width; - - if(ipc->cspacing->value() != 0) - cs = fabs(ipc->cspacing->value()); - else - cs=autospace(cmin,cmax); - - if(cmin > cmax) - cs=-cs; - - // Tic marks should be on integers (1.0, 1.5,... not 1.37,1.87,...) and should not be outside the frame - double min = cs*ceil(cmin/cs); - double tic_offset, wrange; - if (ipc->precise_ticks->value()) - { - wrange=cbar_height*(iw->colormap_length-1)/(iw->colormap_length); // cmin is actually 1/2 picel from the left edge, xmax is 1/2 pixel from the right. - tic_offset = cbar_height*(0.5/(iw->colormap_length)); - } - else - { - wrange=cbar_height; - tic_offset=0; - } - // warn("min %g cmin %g cmax %g cs %g zero %g\n",min,cmin,cmax,cs,zero); - for(double c = min; c*cs <= cmax*cs + zero*cs*fabs(cs); c += cs) - { - // warn("%g %g %g %g\n",c,c*cs,cmax*cs,zero*cs*abs(cs)); - //if(x < xmin) - //continue; - char buf[128]; - buf[0] = 0; // a good default - if (ipc->cticfmt->value()[0] == 'e') - { - char *p = ipc->cticfmt->value()+1; - long int dig = strtol(p, (char **)NULL, 10); // strtol returns zero if no digits are found - if (dig == 0) dig = 2; // a reasonable default? - strncpy(buf, eng(c, dig, 1), 128); - } - else if (ipc->cticfmt->value()[0] == 's') - { - char *p = ipc->cticfmt->value()+1; - long int dig = strtol(p, (char **)NULL, 10); // strtol returns zero if no digits are found - if (dig == 0) dig = 2; // a reasonable default? - strncpy(buf, eng(c, dig, 0), 128); - } - else - { - if(fabs(c/cs) < zero) - snprintf(buf,sizeof(buf),ipc->cticfmt->value(),0.0); - else - snprintf(buf,sizeof(buf),ipc->cticfmt->value(),c); - } - info("cvalue %e label '%s'\n", c, buf); - tic_width = strlen(buf); - - if (tic_width > max_ctic_width) max_ctic_width = tic_width; - - double psx = cbar_xoff+cbar_width+0.25*fontsize/INCH; // - double psy = cbar_yoff + wrange * ((c-cmin)/(cmax-cmin)) + tic_offset; - setColor(out,ipc->text_color); - fprintf(out," newpath %g inch %g inch moveto (%s) show\n",psx,psy-0.25*fontsize/INCH,buf); - - if(ipc->fancy_ticks->value()) - { - setColor(out,ipc->large_tick_color); - fprintf(out,"%g setlinewidth newpath\n",tickwidth*2); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff,psy,ticklength+tickwidth/72.0); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff+cbar_width,psy,-ticklength-tickwidth/72.0); - setColor(out,ipc->small_tick_color); - fprintf(out,"%g setlinewidth newpath\n",tickwidth); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff,psy,ticklength); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff+cbar_width,psy,-ticklength); - } - else - { - setColor(out,ipc->small_tick_color); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff,psy,ticklength); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff+cbar_width,psy,-ticklength); - } - } - } - } - else // Draw a colorbar with a linear color scale but with a non-linear tic mark scale - { - - // First draw the image for inside the colorbar - - int length = iw->colormap_length; - int start = ipc->cmin->value()*length; - int end = ipc->cmax->value()*length; - - fprintf(out,"%% Draw the colorbar\n"); - fprintf(out,"/imgstr %d string def\n\n", 1); - fprintf(out,"gsave\n %g inch %g inch translate\n", cbar_xoff, cbar_yoff); - fprintf(out," %g inch %g inch scale\n",cbar_width, cbar_height); - fprintf(out," %d %d %% Columns and Rows\n", 1, end-start); - fprintf(out," 8 %% bits per color channel\n"); - fprintf(out," [%d 0 0 %d 0 0]\n", 1, end-start); // Map the unit square to our image - fprintf(out," { currentfile imgstr readhexstring pop } false 3 colorimage\n"); - - for(int i = start; i < end; i++) - { - unsigned char r,g,b; - r = iw->colormap[3*i]; - g = iw->colormap[3*i+1]; - b = iw->colormap[3*i+2]; - fprintf(out,"%02x%02x%02x",r,g,b); - fprintf(out,"\n "); - } - fprintf(out," grestore\n\n"); - - // Draw the colorbar box - - if (boxwidth > 0) - { - setColor(out,ipc->border_color); - fprintf(out, "%% Draw the box around the colorbar\n"); - fprintf(out," %g setlinewidth newpath\n",boxwidth); - box(out,cbar_xoff,cbar_yoff,cbar_width,cbar_height); - fprintf(out," stroke\n"); - } - - // Now, we want to do something a bit tricky: map the colors on - // the "linear" color scale onto actual data values for tick - // marks. The first thing we need to do is make what I will call - // a "reverse map". Using this table, we can get a datapoint - // value based on it's color value - - // We have to be a bit careful with rounding, particularly for - // small gammas - int l = iw->colormap_length; - int reverse_map[l]; - for (int i=0; ihmin; ihmax; i++) - { - int index = 1.0*iw->imagehist[i]*(l-1)/LMAX; - if (reverse_map[index] == -1) reverse_map[index] = i; - } - reverse_map[0] = iw->hmin; - for (int i=0; icbegin->value(); // will leave this name unchanged to avoid having to rewrite settings code... - double c1=-1; - // Get the quantized value from the raw value - int val_quant = iw->id.raw_to_quant(definitive_label); - // Get the position in the un-gammed colormap (float between 0 and 1) - double cmap_position = iw->imagehist[val_quant]/LMAX; - info("estimated cmap position is %f\n", cmap_position); - if (c1 < ipc->cmin->value()) c1 = ipc->cmin->value(); - - // Draw the tic marks on the colorbox - fprintf(out,"/%s findfont %g scalefont setfont\n",ipc->face->value(),fontsize); - fprintf(out," %g setlinewidth\n", tickwidth); - char buf[256]; - if(ipc->cticfmt->size() != 0) - { - for (double c=c1; c < ipc->cmax->value(); c += ipc->clabelspacing->value()) - { - int i = (int) (c*(l-1)); - double val = iw->id.quant_to_raw(reverse_map[i]); - - buf[0] = 0; // a good default - if (ipc->cticfmt->value()[0] == 'e') - { - char *p = ipc->cticfmt->value()+1; - long int dig = strtol(p, (char **)NULL, 10); // strtol returns zero if no digits are found - if (dig == 0) dig = 2; // a reasonable default? - strncpy(buf, eng(c, dig, 1), 128); - } - else if (ipc->cticfmt->value()[0] == 's') - { - char *p = ipc->cticfmt->value()+1; - long int dig = strtol(p, (char **)NULL, 10); // strtol returns zero if no digits are found - if (dig == 0) dig = 2; // a reasonable default? - strncpy(buf, eng(c, dig, 0), 128); - } - else - snprintf(buf,sizeof(buf),ipc->cticfmt->value(),c); - info("cvalue %e label '%s'\n", c, buf); - int tic_width = strlen(buf); - - if (tic_width > max_ctic_width) max_ctic_width = tic_width; - - double psx = cbar_xoff + cbar_width + 0.25*fontsize/INCH; - double psy = cbar_yoff + cbar_height * ((c-ipc->cmin->value())/(ipc->cmax->value()-ipc->cmin->value())); - - // Draw the label - setColor(out,ipc->text_color); - fprintf(out," newpath %g inch %g inch moveto (%s) show\n",psx,psy-0.25*fontsize/INCH,buf); - - // Draw the tic lines - if(ipc->fancy_ticks->value()) - { - setColor(out,ipc->large_tick_color); - fprintf(out,"%g setlinewidth newpath\n",tickwidth*2); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff,psy,ticklength+tickwidth/72.0); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff+cbar_width,psy,-ticklength-tickwidth/72.0); - setColor(out,ipc->small_tick_color); - fprintf(out,"%g setlinewidth newpath\n",tickwidth); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff,psy,ticklength); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff+cbar_width,psy,-ticklength); - } - else - { - setColor(out,ipc->small_tick_color); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff,psy,ticklength); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",cbar_xoff+cbar_width,psy,-ticklength); - } - } - } - } -} - -void Image_Printer::draw_axis_tics() -{ - - // ***************** - // Draw the xtics - // ***************** - - // Draw the tick marks - fprintf(out,"/%s findfont %g scalefont setfont\n",ipc->face->value(),fontsize); - fprintf(out," %g setlinewidth\n", tickwidth); - if(ipc->xticfmt->value()[0] != '\0') - { - double xs; - double xmin = iw->xunit(img_x1)*xscale; - double xmax = iw->xunit(img_x2)*xscale; - - if(xspacing != 0) - xs = fabs(xspacing); - else - xs=autospace(xmin,xmax); - - if(xmin > xmax) - xs=-xs; - - // Tic marks should be on integers (1.0, 1.5,... not 1.37,1.87,...) and should not be outside the frame - double min = xs*ceil(xmin/xs); - double tic_offset, wrange; - if (ipc->precise_ticks->value()) - { - wrange=width*(img_xsize-1)/(img_xsize); // xmin is actually 1/2 pixel from the left edge, xmax is 1/2 pixel from the right. - tic_offset = width*(0.5/(img_xsize)); - } - else - { - wrange=width; - tic_offset=0; - } - for(double x = min; x*xs <= xmax*xs + zero*xs*fabs(xs); x += xs) - { - //if(x < xmin) - //continue; - char buf[128]; - buf[0] = 0; // a good default - if (ipc->xticfmt->value()[0] == 'e') - { - char *p = ipc->xticfmt->value()+1; - long int dig = strtol(p, (char **)NULL, 10); // strtol returns zero if no digits are found - if (dig == 0) dig = 2; // a reasonable default? - strncpy(buf, eng(x, dig, 1), 128); - } - else if (ipc->xticfmt->value()[0] == 's') - { - char *p = ipc->xticfmt->value()+1; - long int dig = strtol(p, (char **)NULL, 10); // strtol returns zero if no digits are found - if (dig == 0) dig = 2; // a reasonable default? - strncpy(buf, eng(x, dig, 0), 128); - } - else - { - if(fabs(x/xs) < zero) - snprintf(buf,sizeof(buf),ipc->xticfmt->value(),0.0); - else - snprintf(buf,sizeof(buf),ipc->xticfmt->value(),x); - } - //info("xvalue %e label '%s'\n", x, buf); - - double psy = yoff-1.0*fontsize/INCH; // - double psx = xoff + wrange * ((x-xmin)/(xmax-xmin)) + tic_offset; - setColor(out,ipc->text_color); - fprintf(out," newpath %g inch %g inch moveto (%s) centershow\n",psx,psy,buf); - if(ipc->fancy_ticks->value()) - { - setColor(out,ipc->large_tick_color); - fprintf(out,"%g setlinewidth newpath\n",tickwidth*2); - fprintf(out," newpath %g inch %g inch moveto 0 %g inch rlineto stroke\n",psx,yoff,ticklength+tickwidth/72.0); - fprintf(out," newpath %g inch %g inch moveto 0 %g inch rlineto stroke\n",psx,yoff+height,-ticklength-tickwidth/72.0); - setColor(out,ipc->small_tick_color); - fprintf(out,"%g setlinewidth newpath\n",tickwidth); - fprintf(out," newpath %g inch %g inch moveto 0 %g inch rlineto stroke\n",psx,yoff,ticklength); - fprintf(out," newpath %g inch %g inch moveto 0 %g inch rlineto stroke\n",psx,yoff+height,-ticklength); - } - else - { - setColor(out,ipc->small_tick_color); - fprintf(out," newpath %g inch %g inch moveto 0 inch %g inch rlineto stroke\n",psx,yoff,ticklength); - fprintf(out," newpath %g inch %g inch moveto 0 inch %g inch rlineto stroke\n",psx,yoff+height,-ticklength); - } - } - - - } - - // ***************** - // Draw the ytics - // ***************** - - if(ipc->yticfmt->value()[0] != '\0') - { - double ys; - // we have some issues due to the fact that "y=0" for the fltk - // drawing routines is at the top of the screen...we must - // remember that ymax = y1 and ymin = y2... - double ymin = iw->yunit(img_y2)*yscale; - double ymax = iw->yunit(img_y1)*yscale; - - if(yspacing != 0) - ys = fabs(yspacing); - else - ys=autospace(ymin,ymax); - - if(ymin > ymax) - ys=-ys; - - int tic_width; - - // This is horrible; everything changes when ys and ymin change sign. - double min = ys*ceil(ymin/ys); - double hrange, tic_offset; - if (ipc->precise_ticks->value()) - { - hrange = height*(img_ysize-1)/(img_ysize); - tic_offset = height*(0.5/(img_ysize)); - } - else - { - hrange = height; - tic_offset = 0; - } - for(double y = min; y*ys <= ymax*ys + zero*ys*fabs(ys); y += ys) - { - // warn("%g\n",y); - char buf[128]; - buf[0] = 0; // a good default - if (ipc->yticfmt->value()[0] == 'e') - { - char *p = ipc->yticfmt->value()+1; - long int dig = strtol(p, (char **)NULL, 10); // strtol returns zero if no digits are found - if (dig == 0) dig = 2; // a reasonable default? - strncpy(buf, eng(y, dig, 1), 128); - } - else if (ipc->yticfmt->value()[0] == 's') - { - char *p = ipc->yticfmt->value()+1; - long int dig = strtol(p, (char **)NULL, 10); // strtol returns zero if no digits are found - if (dig == 0) dig = 2; // a reasonable default? - strncpy(buf, eng(y, dig, 0), 128); - } - else - { - if(fabs(y/ys) < zero) - snprintf(buf,sizeof(buf),ipc->yticfmt->value(),0.0); - else - snprintf(buf,sizeof(buf),ipc->yticfmt->value(),y); - } - //info("yvalue %e label '%s'\n", y, buf); - tic_width = strlen(buf); - - if (tic_width > max_ytic_width) max_ytic_width = tic_width; - double psx = xoff-0.25*fontsize/INCH; // - double psy = yoff + hrange * ((y-ymin)/(ymax-ymin)) + tic_offset; - setColor(out,ipc->text_color); - fprintf(out," newpath %g inch %g inch moveto (%s) rightshow\n",psx,psy-0.25*fontsize/INCH,buf); - - if(ipc->fancy_ticks->value()) - { - setColor(out,ipc->large_tick_color); - fprintf(out,"%g setlinewidth newpath\n",tickwidth*2); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",xoff,psy,ticklength+tickwidth/72.0); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",xoff+width,psy,-ticklength-tickwidth/72.0); - setColor(out,ipc->small_tick_color); - fprintf(out,"%g setlinewidth newpath\n",tickwidth); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",xoff,psy,ticklength); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",xoff+width,psy,-ticklength); - } - else - { - setColor(out,ipc->small_tick_color); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",xoff,psy,ticklength); - fprintf(out," newpath %g inch %g inch moveto %g inch 0 rlineto stroke\n",xoff+width,psy,-ticklength); - } - } - } -} - -void Image_Printer::draw_axis_labels() -{ - - // Draw the labels - - double label_x, label_y; - - setColor(out,ipc->text_color); - if (ipc->yaxis_label->value()) - { - // Notes: as a nasty hack, assume an average font aspect ration - // of 2:1. Also, offset us by an extra 3.5 font widths (note - // max_ytic_width includes terminating null) - - // Would probably be better to keep a copy of the longest ytic - // string and then have the postscript interpret the - // width for us...but this seems to work reasonably well. - - label_x = xoff - (max_ytic_width+2.5)*fontsize/2.0/INCH; - label_y = yoff + height/2; - fprintf(out, " newpath %g inch %g inch moveto (%s) 90 rotate centershow -90 rotate\n", label_x, label_y, iw->id.yname.c_str()); - } - - if (ipc->caxis_label->value() && ipc->colorbar->value()) - { - label_x = cbar_xoff + cbar_width + (max_ctic_width+3.5)*fontsize/2.0/INCH; - label_y = cbar_yoff + cbar_height/2; - fprintf(out, " newpath %g inch %g inch moveto (%s) 90 rotate centershow -90 rotate\n", label_x, label_y, iw->id.zname.c_str()); - } - - if (ipc->xaxis_label->value()) - { - label_x = xoff + width/2; - label_y = yoff - 2.5*fontsize/INCH; - fprintf(out, " newpath %g inch %g inch moveto (%s) centershow\n", label_x, label_y, iw->id.xname.c_str()); - } - - if (ipc->do_title->value()) - { - label_x = xoff + width/2; - label_y = yoff + height + 1.0*fontsize/INCH; - char buf[1024]; - char bn[1024]; - strncpy(bn, iw->output_basename, sizeof(bn)); - char *p = basename(bn); - info("%s -> %s\n", iw->output_basename, p); - snprintf(buf, 1024, ipc->title->value(), p, iw->id.zname.c_str()); - // Postscript needs to have double \\ to display properly - string name = buf; - string::size_type pos=0; - while ((pos = name.find("\\", pos+2)) != string::npos) - name.replace(pos, 1, "\\\\"); - fprintf(out, " newpath %g inch %g inch moveto (%s) centershow\n", label_x, label_y, name.c_str()); - } -} - -void Image_Printer::add_dirstamp() -{ - double label_x, label_y; - if (ipc->paper_eps->value()) - { - label_x = bb_ur_x/INCH - 0.25; - label_y = bb_ll_y/INCH - 0.25; - bb_ll_y -= 0.25*INCH + 5; - } - else - { - label_x = page_width - 0.25; - label_y = 0.25; - } - char buf[PATH_MAX]; - getcwd(buf, PATH_MAX); - string name = buf; - string::size_type pos=0; - while ((pos = name.find("\\", pos+2)) != string::npos) - name.replace(pos, 1, "\\\\"); - fprintf(out,"/%s findfont %g scalefont setfont\n",ipc->face->value(),10.0); - fprintf(out, " newpath %g inch %g inch moveto (%s) rightshow\n", label_x, label_y, name.c_str()); -} diff --git a/spyview/.#Makefile.am.1.48 b/spyview/.#Makefile.am.1.48 deleted file mode 100644 index 64a233f..0000000 --- a/spyview/.#Makefile.am.1.48 +++ /dev/null @@ -1,93 +0,0 @@ -AM_CPPFLAGS = -DBUILDSTAMP="\"$(shell hostname) $(shell date)\"" - - -bin_PROGRAMS = spyview spybrowse dat2pgm mtxextract stminfo grid_data test_imagedata @WIN32_EXTRA@ gp_to_mat dat2mtx mtxdiff huettel2mtx toeno2mtx -#bin_PROGRAMS += spyview3d -#bin_PROGRAMS = spyview @WIN32_EXTRA@ -#bin_SCRIPTS = splitfield pm3d2dat gp_to_mat.sh spyrot spyrot_comment pnm_comment pnm_comments -EXTRA_PROGRAMS = spyview_console spybrowse_console - -gp_to_mat_SOURCES = gp_to_mat.C - - -spyview_SOURCES = spyview_ui.C spyview.C \ - ImageWindow.C \ - ImageData.C \ - ImageWindow_Module.C \ - Gnuplot_Interface.C \ - message.C \ - ImagePrinter.C ImagePrinter_Control.C ImagePrinter_Control.h \ - ImageWindow_LineDraw.C \ - Fiddle.C \ - PeakFinder.C PeakFinder_Control.C PeakFinder_Control.h\ - ImageWindow_Fitting.C ImageWindow_Fitting_Ui.C \ - ThresholdDisplay.C ThresholdDisplay_Control.C \ - LineDraw_Control.h LineDraw_Control.C \ - misc.C - -imagedata_code = ImageData.H ImageData.C message.C misc.C - -test_imagedata_SOURCES = test_imagedata.C $(imagedata_code) - -spyview_console_SOURCES = $(spyview_SOURCES) -spyview_console_LDFLAGS = -mwindows -mconsole - -spybrowse_console_SOURCES = $(spybrowse_SOURCES) -spybrowse_console_LDFLAGS = -mwindows -mconsole - -spybrowse_SOURCES = spybrowse_ui.fl spybrowse.C spybrowse.h message.C \ - spybrowse_ui.C spybrowse_ui.h Fl_Table.C Fl_Listbox.C -#spyview3d_SOURCES = spyview3d_ui.fl spyview3d.C ImageWindow3d.C ImageWindow3d.H message.C \ -# gl2ps.c gl2ps.h Image2D.C Image2D.H \ -# spyview3d.H spyview3d_ui.C spyview3d_ui.h -#spyrotate_SOURCES = spyrotate_ui.fl spyrotate.C ImageWindow.C ImageWindow.H message.C \ -# Image2D.C Image2D.H ImagePrinter.C\ -# spyrotate.h spyrotate_ui.C spyrotate_ui.h\ -# ImagePrinter_Control.C ImageWindow_LineDraw.C ImageData.H ImageDatea.C \ -# PeakFinder.C PeakFinder_Control.C PeakFinder_Control.h Gnuplot_Interface.C \ -# ImageWindow_Fitting.C ImageWindow_Fitting_Ui.C ImageWindow_Module.C -#spynavigate_SOURCES = spynavigate_ui.fl spynavigate.C ImageWindow.C ImageWindow.H message.C \ -# Image2D.C Image2D.H ImagePrinter.C\ -# spynavigate.h spynavigate_ui.C spynavigate_ui.h\ -# ImagePrinter_Control.C ImageWindow_LineDraw.C ImageData.H ImageData.C \ -# PeakFinder.C PeakFinder_Control.C PeakFinder_Control.h Gnuplot_Interface.C \ -# ImageWindow_Fitting.C ImageWindow_Fitting_Ui.C ImageWindow_Module.C - -dat2mtx_SOURCES = dat2mtx.C $(imagedata_code) -dat2mtx_LDFLAGS = @WIN32_CONSOLE_FLAGS@ -huettel2mtx_SOURCES = huettel2mtx.C $(imagedata_code) -huettel2mtx_LDFLAGS = @WIN32_CONSOLE_FLAGS@ -toeno2mtx_SOURCES = toeno2mtx.C $(imagedata_code) -toeno2mtx_LDFLAGS = @WIN32_CONSOLE_FLAGS@ -mtxdiff_SOURCES = mtxdiff.C $(imagedata_code) -mtxdiff_LDFLAGS = @WIN32_CONSOLE_FLAGS@ -dat2pgm_SOURCES = dat2pgm.C -dat2pgm_LDFLAGS = @WIN32_CONSOLE_FLAGS@ -stminfo_SOURCES = stminfo.C -stminfo_LDFLAGS = @WIN32_CONSOLE_FLAGS@ -mtxextract_SOURCES = mtxextract.C -mtxextract_LDFLAGS = @WIN32_CONSOLE_FLAGS@ -grid_data_SOURCES = grid_data.C - -BUILT_SOURCES = spyview_ui.C spyview_ui.h \ - spybrowse_ui.h spybrowse_ui.C \ - spyview3d_ui.C spyview3d_ui.h \ - spyrotate_ui.C spyrotate_ui.h \ - spynavigate_ui.C spynavigate_ui.h \ - ImagePrinter_Control.C ImagePrinter_Control.h \ - PeakFinder_Control.C PeakFinder_Control.h \ - ImageWindow_Fitting_Ui.C ImageWindow_Fitting_Ui.h \ - ThresholdDisplay_Control.C ThresholdDisplay_Control.h \ - LineDraw_Control.C LineDraw_Control.h - -# Fluid rules -%.C: %.fl - @FLUID@ -c -o $(basename $<).C -h $(basename $<).h $< - -%.h: %.fl - @FLUID@ -c -o $(basename $<).C -h $(basename $<).h $< - -#Manual rules to install colormap files -install-data-local: - $(INSTALL) -d $(DESTDIR)/$(datadir) - $(INSTALL_DATA) help.txt $(DESTDIR)/$(datadir)