3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
10 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12 * Copyright (c) 2001-2004, The GROMACS development team,
13 * check out http://www.gromacs.org for more information.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
33 * GROningen Mixture of Alchemy and Childrens' Stories
49 #include "gmx_fatal.h"
55 #define round(a) (int)(a+0.5)
57 static const char mapper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+{}|;:',<.>/?";
58 #define NMAP (long int)strlen(mapper)
60 #define MAX_XPM_LINELENGTH 4096
62 real **mk_matrix(int nx, int ny, gmx_bool b1D)
73 for (i = 0; (i < nx); i++)
88 void done_matrix(int nx, real ***m)
92 for (i = 0; (i < nx); i++)
100 void clear_matrix(int nx, int ny, real **m)
104 for (x = 0; x < nx; x++)
106 for (y = 0; y < ny; y++)
113 gmx_bool matelmt_cmp(t_xpmelmt e1, t_xpmelmt e2)
115 return (e1.c1 == e2.c1) && (e1.c2 == e2.c2);
118 t_matelmt searchcmap(int n, t_mapping map[], t_xpmelmt c)
122 for (i = 0; (i < n); i++)
124 if (matelmt_cmp(map[i].code, c))
133 int getcmap(FILE *in, const char *fn, t_mapping **map)
137 char code[STRLEN], desc[STRLEN];
141 if (fgets2(line, STRLEN-1, in) == NULL)
143 gmx_fatal(FARGS, "Not enough lines in colormap file %s"
144 "(just wanted to read number of entries)", fn);
146 sscanf(line, "%d", &n);
148 for (i = 0; (i < n); i++)
150 if (fgets2(line, STRLEN-1, in) == NULL)
152 gmx_fatal(FARGS, "Not enough lines in colormap file %s"
153 "(should be %d, found only %d)", fn, n+1, i);
155 sscanf(line, "%s%s%lf%lf%lf", code, desc, &r, &g, &b);
156 m[i].code.c1 = code[0];
158 m[i].desc = strdup(desc);
168 int readcmap(const char *fn, t_mapping **map)
174 n = getcmap(in, fn, map);
180 void printcmap(FILE *out, int n, t_mapping map[])
184 fprintf(out, "%d\n", n);
185 for (i = 0; (i < n); i++)
187 fprintf(out, "%c%c %20s %10g %10g %10g\n",
188 map[i].code.c1 ? map[i].code.c1 : ' ',
189 map[i].code.c2 ? map[i].code.c2 : ' ',
190 map[i].desc, map[i].rgb.r, map[i].rgb.g, map[i].rgb.b);
194 void writecmap(const char *fn, int n, t_mapping map[])
198 out = gmx_fio_fopen(fn, "w");
199 printcmap(out, n, map);
203 static char *fgetline(char **line, int llmax, int *llalloc, FILE *in)
207 if (llmax > *llalloc)
209 srenew(*line, llmax+1);
212 fg = fgets(*line, llmax, in);
218 void skipstr(char *line)
224 while ((line[c] != ' ') && (line[c] != '\0'))
229 while (line[c] != '\0')
237 char *line2string(char **line)
243 while (((*line)[0] != '\"' ) && ( (*line)[0] != '\0' ))
248 if ((*line)[0] != '\"')
255 while (( (*line)[i] != '\"' ) && ( (*line)[i] != '\0' ))
260 if ((*line)[i] != '\"')
273 void parsestring(char *line, const char *label, char *string)
275 if (strstr(line, label))
277 if (strstr(line, label) < strchr(line, '\"'))
280 strcpy(string, line);
285 void read_xpm_entry(FILE *in, t_matrix *mm)
288 char *line_buf = NULL, *line = NULL, *str, buf[256] = {0};
289 int i, m, col_len, nch = 0, n_axis_x, n_axis_y, llmax;
291 unsigned int r, g, b;
293 gmx_bool bGetOnWithIt, bSetLine;
304 mm->bDiscrete = FALSE;
308 while ((NULL != fgetline(&line_buf, llmax, &llalloc, in)) &&
309 (strncmp(line_buf, "static", 6) != 0))
312 parsestring(line, "title", (mm->title));
313 parsestring(line, "legend", (mm->legend));
314 parsestring(line, "x-label", (mm->label_x));
315 parsestring(line, "y-label", (mm->label_y));
316 parsestring(line, "type", buf);
319 if (!line || strncmp(line, "static", 6) != 0)
321 gmx_input("Invalid XPixMap");
324 if (buf[0] && (gmx_strcasecmp(buf, "Discrete") == 0))
326 mm->bDiscrete = TRUE;
331 fprintf(debug, "%s %s %s %s\n",
332 mm->title, mm->legend, mm->label_x, mm->label_y);
336 bGetOnWithIt = FALSE;
337 while (!bGetOnWithIt && (NULL != fgetline(&line_buf, llmax, &llalloc, in)))
340 while (( line[0] != '\"' ) && ( line[0] != '\0' ))
348 sscanf(line, "%d %d %d %d", &(mm->nx), &(mm->ny), &(mm->nmap), &nch);
351 gmx_fatal(FARGS, "Sorry can only read xpm's with at most 2 caracters per pixel\n");
353 if (mm->nx <= 0 || mm->ny <= 0)
355 gmx_fatal(FARGS, "Dimensions of xpm-file have to be larger than 0\n");
357 llmax = std::max(STRLEN, mm->nx+10);
363 fprintf(debug, "mm->nx %d mm->ny %d mm->nmap %d nch %d\n",
364 mm->nx, mm->ny, mm->nmap, nch);
368 gmx_fatal(FARGS, "Number of characters per pixel not found in xpm\n");
374 while ((m < mm->nmap) && (NULL != fgetline(&line_buf, llmax, &llalloc, in)))
376 line = strchr(line_buf, '\"');
380 /* Read xpm color map entry */
381 map[m].code.c1 = line[0];
388 map[m].code.c2 = line[1];
391 str = strchr(line, '#');
396 while (isxdigit(str[col_len]))
402 sscanf(line, "%*s #%2x%2x%2x", &r, &g, &b);
403 map[m].rgb.r = r/255.0;
404 map[m].rgb.g = g/255.0;
405 map[m].rgb.b = b/255.0;
407 else if (col_len == 12)
409 sscanf(line, "%*s #%4x%4x%4x", &r, &g, &b);
410 map[m].rgb.r = r/65535.0;
411 map[m].rgb.g = g/65535.0;
412 map[m].rgb.b = b/65535.0;
416 gmx_file("Unsupported or invalid colormap in X PixMap");
421 str = strchr(line, 'c');
428 gmx_file("Unsupported or invalid colormap in X PixMap");
430 fprintf(stderr, "Using white for color \"%s", str);
435 line = strchr(line, '\"');
438 map[m].desc = strdup(line);
444 gmx_fatal(FARGS, "Number of read colors map entries (%d) does not match the number in the header (%d)", m, mm->nmap);
448 /* Read axes, if there are any */
459 if (strstr(line, "x-axis"))
461 line = strstr(line, "x-axis");
463 if (mm->axis_x == NULL)
465 snew(mm->axis_x, mm->nx + 1);
467 while (sscanf(line, "%lf", &u) == 1)
469 if (n_axis_x > mm->nx)
471 gmx_fatal(FARGS, "Too many x-axis labels in xpm (max %d)", mm->nx);
473 else if (n_axis_x == mm->nx)
475 mm->flags |= MAT_SPATIAL_X;
477 mm->axis_x[n_axis_x] = u;
482 else if (strstr(line, "y-axis"))
484 line = strstr(line, "y-axis");
486 if (mm->axis_y == NULL)
488 snew(mm->axis_y, mm->ny + 1);
490 while (sscanf(line, "%lf", &u) == 1)
492 if (n_axis_y > mm->ny)
494 gmx_file("Too many y-axis labels in xpm");
496 else if (n_axis_y == mm->ny)
498 mm->flags |= MAT_SPATIAL_Y;
500 mm->axis_y[n_axis_y] = u;
506 while ((line[0] != '\"') && (NULL != fgetline(&line_buf, llmax, &llalloc, in)));
509 snew(mm->matrix, mm->nx);
510 for (i = 0; i < mm->nx; i++)
512 snew(mm->matrix[i], mm->ny);
523 if (m%(1+mm->ny/100) == 0)
525 fprintf(stderr, "%3d%%\b\b\b\b", (100*(mm->ny-m))/mm->ny);
527 while ((line[0] != '\"') && (line[0] != '\0'))
533 gmx_fatal(FARGS, "Not enough caracters in row %d of the matrix\n", m+1);
538 for (i = 0; i < mm->nx; i++)
547 c.c2 = line[nch*i+1];
549 mm->matrix[i][m] = searchcmap(mm->nmap, mm->map, c);
554 while ((m >= 0) && (NULL != fgetline(&line_buf, llmax, &llalloc, in)));
557 gmx_incons("Not enough rows in the matrix");
563 int read_xpm_matrix(const char *fnm, t_matrix **matrix)
570 in = gmx_fio_fopen(fnm, "r");
573 while (NULL != fgetline(&line, STRLEN, &llalloc, in))
575 if (strstr(line, "/* XPM */"))
577 srenew(*matrix, nmat+1);
578 read_xpm_entry(in, &(*matrix)[nmat]);
586 gmx_file("Invalid XPixMap");
594 real **matrix2real(t_matrix *matrix, real **mat)
605 for (i = 0; i < nmap; i++)
607 if ((map[i].desc == NULL) || (sscanf(map[i].desc, "%lf", &tmp) != 1))
609 fprintf(stderr, "Could not convert matrix to reals,\n"
610 "color map entry %d has a non-real description: \"%s\"\n",
620 snew(mat, matrix->nx);
621 for (i = 0; i < matrix->nx; i++)
623 snew(mat[i], matrix->ny);
626 for (i = 0; i < matrix->nx; i++)
628 for (j = 0; j < matrix->ny; j++)
630 mat[i][j] = rmap[matrix->matrix[i][j]];
636 fprintf(stderr, "Converted a %dx%d matrix with %d levels to reals\n",
637 matrix->nx, matrix->ny, nmap);
642 void write_xpm_header(FILE *out,
643 const char *title, const char *legend,
644 const char *label_x, const char *label_y,
647 fprintf(out, "/* XPM */\n");
648 fprintf(out, "/* Generated by %s */\n", Program());
649 fprintf(out, "/* This file can be converted to EPS by the GROMACS program xpm2ps */\n");
650 fprintf(out, "/* title: \"%s\" */\n", title);
651 fprintf(out, "/* legend: \"%s\" */\n", legend);
652 fprintf(out, "/* x-label: \"%s\" */\n", label_x);
653 fprintf(out, "/* y-label: \"%s\" */\n", label_y);
656 fprintf(out, "/* type: \"Discrete\" */\n");
660 fprintf(out, "/* type: \"Continuous\" */\n");
664 static int calc_nmid(int nlevels, real lo, real mid, real hi)
666 /* Take care that we have at least 1 entry in the mid to hi range
668 return std::min(std::max(0, static_cast<int>(((mid-lo)/(hi-lo))*(nlevels-1))),
672 void write_xpm_map3(FILE *out, int n_x, int n_y, int *nlevels,
673 real lo, real mid, real hi,
674 t_rgb rlo, t_rgb rmid, t_rgb rhi)
677 real r, g, b, clev_lo, clev_hi;
679 if (*nlevels > NMAP*NMAP)
681 fprintf(stderr, "Warning, too many levels (%d) in matrix, using %d only\n",
682 *nlevels, (int)(NMAP*NMAP));
683 *nlevels = NMAP*NMAP;
685 else if (*nlevels < 2)
687 fprintf(stderr, "Warning, too few levels (%d) in matrix, using 2 instead\n",
691 if (!((mid >= lo) && (mid < hi)))
693 gmx_fatal(FARGS, "Lo: %f, Mid: %f, Hi: %f\n", lo, mid, hi);
696 fprintf(out, "static char *gromacs_xpm[] = {\n");
697 fprintf(out, "\"%d %d %d %d\",\n",
698 n_x, n_y, *nlevels, (*nlevels <= NMAP) ? 1 : 2);
700 nmid = calc_nmid(*nlevels, lo, mid, hi);
702 clev_hi = (*nlevels - 1 - nmid);
703 for (i = 0; (i < nmid); i++)
705 r = rlo.r+(i*(rmid.r-rlo.r)/clev_lo);
706 g = rlo.g+(i*(rmid.g-rlo.g)/clev_lo);
707 b = rlo.b+(i*(rmid.b-rlo.b)/clev_lo);
708 fprintf(out, "\"%c%c c #%02X%02X%02X \" /* \"%.3g\" */,\n",
710 (*nlevels <= NMAP) ? ' ' : mapper[i/NMAP],
711 (unsigned int)round(255*r),
712 (unsigned int)round(255*g),
713 (unsigned int)round(255*b),
714 ((nmid - i)*lo + i*mid)/clev_lo);
716 for (i = 0; (i < (*nlevels-nmid)); i++)
718 r = rmid.r+(i*(rhi.r-rmid.r)/clev_hi);
719 g = rmid.g+(i*(rhi.g-rmid.g)/clev_hi);
720 b = rmid.b+(i*(rhi.b-rmid.b)/clev_hi);
721 fprintf(out, "\"%c%c c #%02X%02X%02X \" /* \"%.3g\" */,\n",
722 mapper[(i+nmid) % NMAP],
723 (*nlevels <= NMAP) ? ' ' : mapper[(i+nmid)/NMAP],
724 (unsigned int)round(255*r),
725 (unsigned int)round(255*g),
726 (unsigned int)round(255*b),
727 ((*nlevels - 1 - nmid - i)*mid + i*hi)/clev_hi);
731 static void pr_simple_cmap(FILE *out, real lo, real hi, int nlevel, t_rgb rlo,
737 for (i = 0; (i < nlevel); i++)
739 fac = (i+1.0)/(nlevel);
740 r = rlo.r+fac*(rhi.r-rlo.r);
741 g = rlo.g+fac*(rhi.g-rlo.g);
742 b = rlo.b+fac*(rhi.b-rlo.b);
743 fprintf(out, "\"%c%c c #%02X%02X%02X \" /* \"%.3g\" */,\n",
744 mapper[(i+i0) % NMAP],
745 (nlevel <= NMAP) ? ' ' : mapper[(i+i0)/NMAP],
746 (unsigned int)round(255*r),
747 (unsigned int)round(255*g),
748 (unsigned int)round(255*b),
753 static void pr_discrete_cmap(FILE *out, int *nlevel, int i0)
756 { 1.0, 1.0, 1.0 }, /* white */
757 { 1.0, 0.0, 0.0 }, /* red */
758 { 1.0, 1.0, 0.0 }, /* yellow */
759 { 0.0, 0.0, 1.0 }, /* blue */
760 { 0.0, 1.0, 0.0 }, /* green */
761 { 1.0, 0.0, 1.0 }, /* purple */
762 { 1.0, 0.4, 0.0 }, /* orange */
763 { 0.0, 1.0, 1.0 }, /* cyan */
764 { 1.0, 0.4, 0.4 }, /* pink */
765 { 1.0, 1.0, 0.0 }, /* yellow */
766 { 0.4, 0.4, 1.0 }, /* lightblue */
767 { 0.4, 1.0, 0.4 }, /* lightgreen */
768 { 1.0, 0.4, 1.0 }, /* lightpurple */
769 { 1.0, 0.7, 0.4 }, /* lightorange */
770 { 0.4, 1.0, 1.0 }, /* lightcyan */
771 { 0.0, 0.0, 0.0 } /* black */
776 *nlevel = std::min(16, *nlevel);
778 for (i = 0; (i < n); i++)
780 fprintf(out, "\"%c%c c #%02X%02X%02X \" /* \"%3d\" */,\n",
781 mapper[(i+i0) % NMAP],
782 (n <= NMAP) ? ' ' : mapper[(i+i0)/NMAP],
783 (unsigned int)round(255*rgbd[i].r),
784 (unsigned int)round(255*rgbd[i].g),
785 (unsigned int)round(255*rgbd[i].b),
792 void write_xpm_map_split(FILE *out, int n_x, int n_y,
793 int *nlevel_top, real lo_top, real hi_top,
794 t_rgb rlo_top, t_rgb rhi_top,
795 gmx_bool bDiscreteColor,
796 int *nlevel_bot, real lo_bot, real hi_bot,
797 t_rgb rlo_bot, t_rgb rhi_bot)
801 ntot = *nlevel_top + *nlevel_bot;
804 gmx_fatal(FARGS, "Warning, too many levels (%d) in matrix", ntot);
807 fprintf(out, "static char *gromacs_xpm[] = {\n");
808 fprintf(out, "\"%d %d %d %d\",\n", n_x, n_y, ntot, 1);
812 pr_discrete_cmap(out, nlevel_bot, 0);
816 pr_simple_cmap(out, lo_bot, hi_bot, *nlevel_bot, rlo_bot, rhi_bot, 0);
819 pr_simple_cmap(out, lo_top, hi_top, *nlevel_top, rlo_top, rhi_top, *nlevel_bot);
823 void write_xpm_map(FILE *out, int n_x, int n_y, int *nlevels, real lo, real hi,
824 t_rgb rlo, t_rgb rhi)
827 real invlevel, r, g, b;
829 if (*nlevels > NMAP*NMAP)
831 fprintf(stderr, "Warning, too many levels (%d) in matrix, using %d only\n",
832 *nlevels, (int)(NMAP*NMAP));
833 *nlevels = NMAP*NMAP;
835 else if (*nlevels < 2)
837 fprintf(stderr, "Warning, too few levels (%d) in matrix, using 2 instead\n", *nlevels);
841 fprintf(out, "static char *gromacs_xpm[] = {\n");
842 fprintf(out, "\"%d %d %d %d\",\n",
843 n_x, n_y, *nlevels, (*nlevels <= NMAP) ? 1 : 2);
845 invlevel = 1.0/(*nlevels-1);
846 for (i = 0; (i < *nlevels); i++)
849 r = (nlo*rlo.r+i*rhi.r)*invlevel;
850 g = (nlo*rlo.g+i*rhi.g)*invlevel;
851 b = (nlo*rlo.b+i*rhi.b)*invlevel;
852 fprintf(out, "\"%c%c c #%02X%02X%02X \" /* \"%.3g\" */,\n",
853 mapper[i % NMAP], (*nlevels <= NMAP) ? ' ' : mapper[i/NMAP],
854 (unsigned int)round(255*r),
855 (unsigned int)round(255*g),
856 (unsigned int)round(255*b),
857 (nlo*lo+i*hi)*invlevel);
861 void write_xpm_axis(FILE *out, const char *axis, gmx_bool bSpatial, int n,
868 for (i = 0; i < (bSpatial ? n+1 : n); i++)
874 fprintf(out, "*/\n");
876 fprintf(out, "/* %s-axis: ", axis);
878 fprintf(out, "%g ", label[i]);
880 fprintf(out, "*/\n");
884 void write_xpm_data(FILE *out, int n_x, int n_y, real **matrix,
885 real lo, real hi, int nlevels)
890 invlevel = (nlevels-1)/(hi-lo);
891 for (j = n_y-1; (j >= 0); j--)
893 if (j%(1+n_y/100) == 0)
895 fprintf(stderr, "%3d%%\b\b\b\b", (100*(n_y-j))/n_y);
898 for (i = 0; (i < n_x); i++)
900 c = gmx_nint((matrix[i][j]-lo)*invlevel);
911 fprintf(out, "%c", mapper[c]);
915 fprintf(out, "%c%c", mapper[c % NMAP], mapper[c / NMAP]);
920 fprintf(out, "\",\n");
924 fprintf(out, "\"\n");
929 void write_xpm_data3(FILE *out, int n_x, int n_y, real **matrix,
930 real lo, real mid, real hi, int nlevels)
932 int i, j, c = 0, nmid;
933 real invlev_lo, invlev_hi;
935 nmid = calc_nmid(nlevels, lo, mid, hi);
936 invlev_hi = (nlevels-1-nmid)/(hi-mid);
937 invlev_lo = (nmid)/(mid-lo);
939 for (j = n_y-1; (j >= 0); j--)
941 if (j%(1+n_y/100) == 0)
943 fprintf(stderr, "%3d%%\b\b\b\b", (100*(n_y-j))/n_y);
946 for (i = 0; (i < n_x); i++)
948 if (matrix[i][j] >= mid)
950 c = nmid+gmx_nint((matrix[i][j]-mid)*invlev_hi);
952 else if (matrix[i][j] >= lo)
954 c = gmx_nint((matrix[i][j]-lo)*invlev_lo);
971 fprintf(out, "%c", mapper[c]);
975 fprintf(out, "%c%c", mapper[c % NMAP], mapper[c / NMAP]);
980 fprintf(out, "\",\n");
984 fprintf(out, "\"\n");
989 void write_xpm_data_split(FILE *out, int n_x, int n_y, real **matrix,
990 real lo_top, real hi_top, int nlevel_top,
991 real lo_bot, real hi_bot, int nlevel_bot)
994 real invlev_top, invlev_bot;
996 invlev_top = (nlevel_top-1)/(hi_top-lo_top);
997 invlev_bot = (nlevel_bot-1)/(hi_bot-lo_bot);
999 for (j = n_y-1; (j >= 0); j--)
1001 if (j % (1+n_y/100) == 0)
1003 fprintf(stderr, "%3d%%\b\b\b\b", (100*(n_y-j))/n_y);
1006 for (i = 0; (i < n_x); i++)
1010 c = nlevel_bot+round((matrix[i][j]-lo_top)*invlev_top);
1011 if ((c < nlevel_bot) || (c >= nlevel_bot+nlevel_top))
1013 gmx_fatal(FARGS, "Range checking i = %d, j = %d, c = %d, bot = %d, top = %d matrix[i,j] = %f", i, j, c, nlevel_bot, nlevel_top, matrix[i][j]);
1018 c = round((matrix[i][j]-lo_bot)*invlev_bot);
1019 if ((c < 0) || (c >= nlevel_bot+nlevel_bot))
1021 gmx_fatal(FARGS, "Range checking i = %d, j = %d, c = %d, bot = %d, top = %d matrix[i,j] = %f", i, j, c, nlevel_bot, nlevel_top, matrix[i][j]);
1029 fprintf(out, "%c", mapper[c]);
1033 fprintf(out, "\",\n");
1037 fprintf(out, "\"\n");
1042 void write_xpm_m(FILE *out, t_matrix m)
1044 /* Writes a t_matrix struct to .xpm file */
1050 bOneChar = (m.map[0].code.c2 == 0);
1051 write_xpm_header(out, m.title, m.legend, m.label_x, m.label_y,
1053 fprintf(out, "static char *gromacs_xpm[] = {\n");
1054 fprintf(out, "\"%d %d %d %d\",\n", m.nx, m.ny, m.nmap, bOneChar ? 1 : 2);
1055 for (i = 0; (i < m.nmap); i++)
1057 fprintf(out, "\"%c%c c #%02X%02X%02X \" /* \"%s\" */,\n",
1059 bOneChar ? ' ' : m.map[i].code.c2,
1060 (unsigned int)round(m.map[i].rgb.r*255),
1061 (unsigned int)round(m.map[i].rgb.g*255),
1062 (unsigned int)round(m.map[i].rgb.b*255), m.map[i].desc);
1064 write_xpm_axis(out, "x", m.flags & MAT_SPATIAL_X, m.nx, m.axis_x);
1065 write_xpm_axis(out, "y", m.flags & MAT_SPATIAL_Y, m.ny, m.axis_y);
1066 for (j = m.ny-1; (j >= 0); j--)
1068 if (j%(1+m.ny/100) == 0)
1070 fprintf(stderr, "%3d%%\b\b\b\b", (100*(m.ny-j))/m.ny);
1075 for (i = 0; (i < m.nx); i++)
1077 fprintf(out, "%c", m.map[m.matrix[i][j]].code.c1);
1082 for (i = 0; (i < m.nx); i++)
1084 c = m.map[m.matrix[i][j]].code;
1085 fprintf(out, "%c%c", c.c1, c.c2);
1090 fprintf(out, "\",\n");
1094 fprintf(out, "\"\n");
1099 void write_xpm3(FILE *out, unsigned int flags,
1100 const char *title, const char *legend,
1101 const char *label_x, const char *label_y,
1102 int n_x, int n_y, real axis_x[], real axis_y[],
1103 real *matrix[], real lo, real mid, real hi,
1104 t_rgb rlo, t_rgb rmid, t_rgb rhi, int *nlevels)
1107 * Writes a colormap varying as rlo -> rmid -> rhi.
1112 gmx_fatal(FARGS, "hi (%g) <= lo (%g)", hi, lo);
1115 write_xpm_header(out, title, legend, label_x, label_y, FALSE);
1116 write_xpm_map3(out, n_x, n_y, nlevels, lo, mid, hi, rlo, rmid, rhi);
1117 write_xpm_axis(out, "x", flags & MAT_SPATIAL_X, n_x, axis_x);
1118 write_xpm_axis(out, "y", flags & MAT_SPATIAL_Y, n_y, axis_y);
1119 write_xpm_data3(out, n_x, n_y, matrix, lo, mid, hi, *nlevels);
1122 void write_xpm_split(FILE *out, unsigned int flags,
1123 const char *title, const char *legend,
1124 const char *label_x, const char *label_y,
1125 int n_x, int n_y, real axis_x[], real axis_y[],
1127 real lo_top, real hi_top, int *nlevel_top,
1128 t_rgb rlo_top, t_rgb rhi_top,
1129 real lo_bot, real hi_bot, int *nlevel_bot,
1130 gmx_bool bDiscreteColor,
1131 t_rgb rlo_bot, t_rgb rhi_bot)
1134 * Writes a colormap varying as rlo -> rmid -> rhi.
1137 if (hi_top <= lo_top)
1139 gmx_fatal(FARGS, "hi_top (%g) <= lo_top (%g)", hi_top, lo_top);
1141 if (hi_bot <= lo_bot)
1143 gmx_fatal(FARGS, "hi_bot (%g) <= lo_bot (%g)", hi_bot, lo_bot);
1145 if (bDiscreteColor && (*nlevel_bot >= 16))
1147 gmx_impl("Can not plot more than 16 discrete colors");
1150 write_xpm_header(out, title, legend, label_x, label_y, FALSE);
1151 write_xpm_map_split(out, n_x, n_y, nlevel_top, lo_top, hi_top, rlo_top, rhi_top,
1152 bDiscreteColor, nlevel_bot, lo_bot, hi_bot, rlo_bot, rhi_bot);
1153 write_xpm_axis(out, "x", flags & MAT_SPATIAL_X, n_x, axis_x);
1154 write_xpm_axis(out, "y", flags & MAT_SPATIAL_Y, n_y, axis_y);
1155 write_xpm_data_split(out, n_x, n_y, matrix, lo_top, hi_top, *nlevel_top,
1156 lo_bot, hi_bot, *nlevel_bot);
1159 void write_xpm(FILE *out, unsigned int flags,
1160 const char *title, const char *legend,
1161 const char *label_x, const char *label_y,
1162 int n_x, int n_y, real axis_x[], real axis_y[],
1163 real *matrix[], real lo, real hi,
1164 t_rgb rlo, t_rgb rhi, int *nlevels)
1167 * title matrix title
1168 * legend label for the continuous legend
1169 * label_x label for the x-axis
1170 * label_y label for the y-axis
1171 * n_x, n_y size of the matrix
1172 * axis_x[] the x-ticklabels
1173 * axis_y[] the y-ticklables
1174 * *matrix[] element x,y is matrix[x][y]
1175 * lo output lower than lo is set to lo
1176 * hi output higher than hi is set to hi
1177 * rlo rgb value for level lo
1178 * rhi rgb value for level hi
1179 * nlevels number of color levels for the output
1184 gmx_fatal(FARGS, "hi (%f) <= lo (%f)", hi, lo);
1187 write_xpm_header(out, title, legend, label_x, label_y, FALSE);
1188 write_xpm_map(out, n_x, n_y, nlevels, lo, hi, rlo, rhi);
1189 write_xpm_axis(out, "x", flags & MAT_SPATIAL_X, n_x, axis_x);
1190 write_xpm_axis(out, "y", flags & MAT_SPATIAL_Y, n_y, axis_y);
1191 write_xpm_data(out, n_x, n_y, matrix, lo, hi, *nlevels);