2b211e25eb6dbe0a55690c87d2bccf83a34f1e1f
braney
Thu Jul 1 15:18:45 2010 -0700
fix phyloGif to write out PNG, and make sure no one can write out GIF if USE_PNG is set
diff --git src/hg/phyloGif/phyloGif.c src/hg/phyloGif/phyloGif.c
index 5fe2637..9577dbe 100644
--- src/hg/phyloGif/phyloGif.c
+++ src/hg/phyloGif/phyloGif.c
@@ -1,742 +1,749 @@
/* phyloGif.c for parsing phylo tree and outputting a gif.
*
* Author: Galt Barber 2006
*
* Designed to be run either as a cgi or as a command-line utility.
* The input file spec matches the .nh tree format e.g. (cat:0.5,dog:0.6):1.2;
* The output gif layout was originally designed to ignore branch lengths.
* However, options have now been added to allow it to use branchlengths,
* and to label the length of the branches.
* Any _suffix is stripped from labels both because pyloTree.c
* can't tolerate underscores and because we don't want suffixes anyway.
* A semi-colon is automatically appended to the input if left off.
* Because phyloTree.c does errAbort on bad input, this causes cgi err 500
* if the input data has incorrect syntax. See the apache error_log.
* Added another option to place form output in a static html page
* so that we can prevent IE6 save-as bug, and FF auto-shrunk output.
* Added an option to display a length-scale legend or ruler at the bottom.
* Added an option to preserve underscores in input as spaces in output.
*
*
* One may use as a cgi in html GET:
*
*
* Or as cgi in html POST:
\n" "((A:0.1,B:0.1):0.2,C:0.15);\n" " | \n"
" |
\n" "((A:0.1,B:0.1)D:0.2,C:0.15)E;\n" " | \n"
" (internal or ancestral node labels)\n" " |
\n" " ((((\n" " (\n" " ((mouse,rat),human),\n" " (dog,cow)\n" " ),\n" " opossum),\n" " chicken),\n" " xenopus),\n" " (tetraodon,zebrafish));\n" " | \n"
" |
"); /* we dont think the specific error message coming back are correct or useful * so supply a generic err msg */ printf("Original input tree:\n[%s]\n\n",cgiString("phyloGif_tree")); printf("Input tree as passed to parser:\n[%s]\n\n",phyloData); printf("Parser syntax error:\n%s",errMsg); puts(""); } else { warn("%s", errMsg); } freez(&errMsg); freez(&phyloData); return 0; } } if (phyloTree) { mg = mgNew(width,height); mgClearPixels(mg); lengthLegend = lengthLegend && branchLengths; /* moot without lengths */ if (lengthLegend) { int fHeight = mgFontPixelHeight(font); height -= (MARGIN+2*fHeight); } phyloTreeLayoutBL(phyloTree, &maxDepth, &numLeafs, 0, font, &maxLabelWidth, width, &minMaxFactor, 0.0); if (layoutErrMsg[0] != 0) { if (onWeb) { printf("Content-type: text/html\r\n"); printf("\r\n"); puts("
"); printf("input tree: [%s]\n\n%s",cgiString("phyloGif_tree"),layoutErrMsg); puts(""); } else { warn("%s", layoutErrMsg); } freez(&phyloData); mgFree(&mg); return 0; } if (branchLengths) phyloTreeGifBL(phyloTree, maxDepth, numLeafs, maxLabelWidth, width, height, mg, font, minMaxFactor, FALSE); else phyloTreeGif(phyloTree, maxDepth, numLeafs, maxLabelWidth, width, height, mg, font); if (lengthLegend) { int i = 0; char out[256]; double scaleEnd = (width - 2*MARGIN); int fHeight = mgFontPixelHeight(font); int x=0; int dh=0; mgDrawLine(mg, MARGIN, height+fHeight/2, width-MARGIN, height+fHeight/2, MG_BLACK); while(TRUE) { x=((minMaxFactor*i)/10); if (x >= scaleEnd) break; if ((i % 5) == 0) { int y = mgFontCharWidth(font,'0'); y += 0.5*mgFontCharWidth(font,'.'); safef(out,sizeof(out),"%3.2f",branchMultiplier*i/10.0); if (branchMultiplier > 10) safef(out,sizeof(out),"%3.0f",branchMultiplier*i/10.0); mgText(mg, MARGIN+x-y, height+fHeight, MG_BLACK, font, out); dh=fHeight/2; } else { dh = fHeight / 4; } mgDrawLine(mg, MARGIN+x, height+fHeight/2-dh, MARGIN+x, height+fHeight/2+dh, MG_BLACK); ++i; } } } if (onWeb) { printf("Content-type: image/gif\r\n"); printf("\r\n"); } +#ifdef USE_PNG +if (!mgSaveToPng(stdout, mg, FALSE)) + { + errAbort("Couldn't save png to stdout"); + } +#else if (!mgSaveToGif(stdout, mg, FALSE)) { errAbort("Couldn't save gif to stdout"); } +#endif if (cgiOptionalString("phyloGif_submit")) cartCheckout(&cart); /* there's no code for freeing the phyloTree yet in phyloTree.c */ mgFree(&mg); freez(&phyloData); return 0; }