44 #ifdef DJGPP // dos386/djgpp 51 #include <sys/types.h> 53 #ifdef PL_HAVE_UNISTD_H 62 #define BUFFER_SIZE 256 69 #define FUZZ_EPSILON 1.e-4 95 value(
double n1,
double n2,
double hue );
102 int *number_colors,
unsigned int **r,
unsigned int **g,
103 unsigned int **b,
double **a );
108 #if defined ( DJGPP ) 110 #define PLLIBDEV "c:/plplot/lib" 113 #elif defined ( MSDOS ) 115 #define PLLIBDEV "c:\\plplot\\lib" 123 #define PLLIBDEV "/usr/local/plplot/lib" 143 if ( plsc->level < 1 )
145 plabort(
"plcol0: Please call plinit first" );
148 if ( icol0 < 0 || icol0 >= plsc->ncol0 )
157 plsc->curcolor.r = plsc->cmap0[icol0].r;
158 plsc->curcolor.g = plsc->cmap0[icol0].g;
159 plsc->curcolor.b = plsc->cmap0[icol0].b;
160 plsc->curcolor.a = plsc->cmap0[icol0].a;
179 if ( plsc->level < 1 )
181 plabort(
"plcol1: Please call plinit first" );
184 if ( col1 < 0 || col1 > 1 ||
isnan( col1 ) )
192 icol1 = (
PLINT) ( col1 * plsc->ncol1 );
193 icol1 =
MIN( icol1, plsc->ncol1 - 1 );
196 plsc->curcolor.r = plsc->cmap1[plsc->icol1].r;
197 plsc->curcolor.g = plsc->cmap1[plsc->icol1].g;
198 plsc->curcolor.b = plsc->cmap1[plsc->icol1].b;
199 plsc->curcolor.a = plsc->cmap1[plsc->icol1].a;
284 if ( plsc->cmap0 == NULL )
286 if ( icol0 < 0 || icol0 >= plsc->ncol0 )
293 if ( ( r < 0 || r > 255 ) || ( g < 0 || g > 255 ) || ( b < 0 || b > 255 ) )
297 (
int) r, (
int) g, (
int) b );
320 if ( plsc->cmap0 == NULL )
322 if ( icol0 < 0 || icol0 >= plsc->ncol0 )
329 if ( ( r < 0 || r > 255 ) || ( g < 0 || g > 255 ) || ( b < 0 || b > 255 ) || ( alpha < 0. || alpha > 1.0 ) )
333 (
int) r, (
int) g, (
int) b, (
double) alpha );
338 plsc->cmap0[icol0].r = (
unsigned char) r;
339 plsc->cmap0[icol0].g = (
unsigned char) g;
340 plsc->cmap0[icol0].b = (
unsigned char) b;
341 plsc->cmap0[icol0].a = alpha;
343 if ( plsc->level > 0 )
361 if ( plsc->cmap0 == NULL )
368 if ( icol0 < 0 || icol0 > plsc->ncol0 )
376 *r = plsc->cmap0[icol0].r;
377 *g = plsc->cmap0[icol0].g;
378 *b = plsc->cmap0[icol0].b;
398 if ( plsc->cmap0 == NULL )
406 if ( icol0 < 0 || icol0 > plsc->ncol0 )
414 *r = plsc->cmap0[icol0].r;
415 *g = plsc->cmap0[icol0].g;
416 *b = plsc->cmap0[icol0].b;
417 *alpha = plsc->cmap0[icol0].a;
440 for ( i = 0; i < plsc->ncol0; i++ )
442 if ( ( r[i] < 0 || r[i] > 255 ) ||
443 ( g[i] < 0 || g[i] > 255 ) ||
444 ( b[i] < 0 || b[i] > 255 ) )
448 (
int) r[i], (
int) g[i], (
int) b[i] );
453 plsc->cmap0[i].r = (
unsigned char) r[i];
454 plsc->cmap0[i].g = (
unsigned char) g[i];
455 plsc->cmap0[i].b = (
unsigned char) b[i];
456 plsc->cmap0[i].a = 1.0;
459 if ( plsc->level > 0 )
482 for ( i = 0; i < plsc->ncol0; i++ )
484 if ( ( r[i] < 0 || r[i] > 255 ) ||
485 ( g[i] < 0 || g[i] > 255 ) ||
486 ( b[i] < 0 || b[i] > 255 ) ||
487 ( alpha[i] < 0.0 || alpha[i] > 1.0 ) )
491 (
int) r[i], (
int) g[i], (
int) b[i], (
double) alpha[i] );
496 plsc->cmap0[i].r = (
unsigned char) r[i];
497 plsc->cmap0[i].g = (
unsigned char) g[i];
498 plsc->cmap0[i].b = (
unsigned char) b[i];
499 plsc->cmap0[i].a = alpha[i];
502 if ( plsc->level > 0 )
524 for ( i = 0; i < plsc->ncol1; i++ )
526 if ( ( r[i] < 0 || r[i] > 255 ) ||
527 ( g[i] < 0 || g[i] > 255 ) ||
528 ( b[i] < 0 || b[i] > 255 ) )
532 (
int) r[i], (
int) g[i], (
int) b[i] );
536 plsc->cmap1[i].r = (
unsigned char) r[i];
537 plsc->cmap1[i].g = (
unsigned char) g[i];
538 plsc->cmap1[i].b = (
unsigned char) b[i];
539 plsc->cmap1[i].a = 1.0;
542 if ( plsc->level > 0 )
565 for ( i = 0; i < plsc->ncol1; i++ )
567 if ( ( r[i] < 0 || r[i] > 255 ) ||
568 ( g[i] < 0 || g[i] > 255 ) ||
569 ( b[i] < 0 || b[i] > 255 ) ||
570 ( alpha[i] < 0.0 || alpha[i] > 1.0 ) )
574 (
int) r[i], (
int) g[i], (
int) b[i], (
double) alpha[i] );
578 plsc->cmap1[i].r = (
unsigned char) r[i];
579 plsc->cmap1[i].g = (
unsigned char) g[i];
580 plsc->cmap1[i].b = (
unsigned char) b[i];
581 plsc->cmap1[i].a = alpha[i];
584 if ( plsc->level > 0 )
648 plabort(
"plscmap1l: Must specify at least two control points" );
652 if ( ( intensity[0] != 0 ) || ( intensity[npts - 1] != 1 ) )
654 plabort(
"plscmap1l: First, last control points must lie on boundary" );
660 plabort(
"plscmap1l: exceeded maximum number of control points" );
666 if ( plsc->cmap1 == NULL )
671 plsc->cmap1cp_is_rgb = itype == 0 ? 0 : 1;
674 for ( n = 0; n < npts; n++ )
676 plsc->cmap1cp[n].c1 = coord1[n];
677 plsc->cmap1cp[n].c2 = coord2[n];
678 plsc->cmap1cp[n].c3 = coord3[n];
679 plsc->cmap1cp[n].p = intensity[n];
680 plsc->cmap1cp[n].a = 1.0;
682 if ( alt_hue_path == NULL )
683 plsc->cmap1cp[n].alt_hue_path = 0;
684 else if ( n != npts - 1 )
685 plsc->cmap1cp[n].alt_hue_path = alt_hue_path[n];
688 plsc->cmap1cp[n].alt_hue_path = 0;
719 plabort(
"plscmap1la: Must specify at least two control points" );
723 if ( ( intensity[0] != 0 ) || ( intensity[npts - 1] != 1 ) )
725 plabort(
"plscmap1la: First, last control points must lie on boundary" );
731 plabort(
"plscmap1la: exceeded maximum number of control points" );
737 if ( plsc->cmap1 == NULL )
742 plsc->cmap1cp_is_rgb = itype == 0 ? 0 : 1;
745 for ( n = 0; n < npts; n++ )
747 plsc->cmap1cp[n].c1 = coord1[n];
748 plsc->cmap1cp[n].c2 = coord2[n];
749 plsc->cmap1cp[n].c3 = coord3[n];
750 plsc->cmap1cp[n].p = intensity[n];
751 plsc->cmap1cp[n].a = alpha[n];
753 if ( alt_hue_path == NULL )
754 plsc->cmap1cp[n].alt_hue_path = 0;
755 else if ( n != npts - 1 )
756 plsc->cmap1cp[n].alt_hue_path = alt_hue_path[n];
759 plsc->cmap1cp[n].alt_hue_path = 0;
776 PLFLT delta, dp, dh, dl, ds, da, dr, dg, db;
777 PLFLT h, l, s, p, r, g, b, a;
780 if ( !plsc->cmap1cp_is_rgb )
782 for ( n = 0; n < plsc->ncp1 - 1; n++ )
784 if ( plsc->cmap1cp[n].p == plsc->cmap1cp[n + 1].p )
789 dp = plsc->cmap1cp[n + 1].p - plsc->cmap1cp[n].p;
790 dh = plsc->cmap1cp[n + 1].c1 - plsc->cmap1cp[n].c1;
791 dl = plsc->cmap1cp[n + 1].c2 - plsc->cmap1cp[n].c2;
792 ds = plsc->cmap1cp[n + 1].c3 - plsc->cmap1cp[n].c3;
793 da = plsc->cmap1cp[n + 1].a - plsc->cmap1cp[n].a;
797 if ( plsc->cmap1cp[n].alt_hue_path )
798 dh = ( dh > 0 ) ? dh - 360 : dh + 360;
803 for ( i = 0; i < plsc->ncol1; i++ )
805 p = (double) i / ( plsc->ncol1 - 1.0 );
806 if ( ( p < plsc->cmap1cp[n].p ) ||
807 ( p > plsc->cmap1cp[n + 1].p ) )
812 delta = ( p - plsc->cmap1cp[n].p ) / dp;
816 h = plsc->cmap1cp[n].c1 + dh * delta;
817 l = plsc->cmap1cp[n].c2 + dl * delta;
818 s = plsc->cmap1cp[n].c3 + ds * delta;
819 a = plsc->cmap1cp[n].a + da * delta;
829 plsc->cmap1[i].r = (
unsigned char)
MAX( 0,
MIN( 255, (
int) ( 256. * r ) ) );
830 plsc->cmap1[i].g = (
unsigned char)
MAX( 0,
MIN( 255, (
int) ( 256. * g ) ) );
831 plsc->cmap1[i].b = (
unsigned char)
MAX( 0,
MIN( 255, (
int) ( 256. * b ) ) );
832 plsc->cmap1[i].a = a;
838 for ( n = 0; n < plsc->ncp1 - 1; n++ )
840 if ( plsc->cmap1cp[n].p == plsc->cmap1cp[n + 1].p )
845 dp = plsc->cmap1cp[n + 1].p - plsc->cmap1cp[n].p;
846 dr = plsc->cmap1cp[n + 1].c1 - plsc->cmap1cp[n].c1;
847 dg = plsc->cmap1cp[n + 1].c2 - plsc->cmap1cp[n].c2;
848 db = plsc->cmap1cp[n + 1].c3 - plsc->cmap1cp[n].c3;
849 da = plsc->cmap1cp[n + 1].a - plsc->cmap1cp[n].a;
854 for ( i = 0; i < plsc->ncol1; i++ )
856 p = (double) i / ( plsc->ncol1 - 1.0 );
857 if ( ( p < plsc->cmap1cp[n].p ) ||
858 ( p > plsc->cmap1cp[n + 1].p ) )
863 delta = ( p - plsc->cmap1cp[n].p ) / dp;
867 r = plsc->cmap1cp[n].c1 + dr * delta;
868 g = plsc->cmap1cp[n].c2 + dg * delta;
869 b = plsc->cmap1cp[n].c3 + db * delta;
870 a = plsc->cmap1cp[n].a + da * delta;
872 plsc->cmap1[i].r = (
unsigned char)
MAX( 0,
MIN( 255, (
int) ( 256. * r ) ) );
873 plsc->cmap1[i].g = (
unsigned char)
MAX( 0,
MIN( 255, (
int) ( 256. * g ) ) );
874 plsc->cmap1[i].b = (
unsigned char)
MAX( 0,
MIN( 255, (
int) ( 256. * b ) ) );
875 plsc->cmap1[i].a = a;
880 if ( plsc->level > 0 )
901 if ( min_color > max_color || max_color < 0.0 || min_color > 1.0 )
903 plwarn(
"plscmap1_range called with invalid color range" );
906 if ( min_color < 0.0 )
908 plwarn(
"plscmap1_range called with a negative minimum color value" );
911 if ( max_color > 1.0 )
913 plwarn(
"plscmap1_range called with an out of range maximum color value" );
916 plsc->cmap1_min = min_color;
917 plsc->cmap1_max = max_color;
930 *min_color = plsc->cmap1_min;
931 *max_color = plsc->cmap1_max;
948 int ncol, size, imin, imax;
952 if ( ncol0 > 0 && plsc->ncol0 == ncol0 )
957 if ( plsc->ncol0 <= 0 && ncol0 <= 0 )
959 else if ( ncol0 <= 0 )
965 size = ncol * (int)
sizeof (
PLColor );
969 if ( plsc->cmap0 == NULL )
971 if ( ( plsc->cmap0 = (
PLColor *) calloc( 1, (
size_t) size ) ) == NULL )
973 plexit(
"c_plscmap0n: Insufficient memory" );
979 if ( ( plsc->cmap0 = (
PLColor *) realloc( plsc->cmap0, (
size_t) size ) ) == NULL )
981 plexit(
"c_plscmap0n: Insufficient memory" );
991 if ( plsc->level > 0 )
1010 plsc->cmap0[i].r = r;
1011 plsc->cmap0[i].g = g;
1012 plsc->cmap0[i].b = b;
1013 plsc->cmap0[i].a = a;
1014 plsc->cmap0[i].name =
name;
1017 #define color_def( i, r, g, b, a, n ) \ 1018 if ( i >= imin && i <= imax ) color_set( i, r, g, b, a, n ); 1033 unsigned int *r, *g, *b;
1039 for ( i = imin; i <=
MIN( ( number_colors - 1 ), imax ); i++ )
1041 "colors defined by default cmap0 palette file" );
1054 for ( i =
MAX( number_colors, imin ); i <= imax; i++ )
1056 "opaque red colour to mark not defined by palette file" );
1078 if ( ncol1 > 0 && plsc->ncol1 == ncol1 )
1083 if ( plsc->ncol1 <= 0 && ncol1 <= 0 )
1085 else if ( ncol1 <= 0 )
1090 size = (size_t) ncol *
sizeof (
PLColor );
1094 if ( plsc->ncol1 > 0 )
1096 if ( ( plsc->cmap1 = (
PLColor *) realloc( plsc->cmap1, size ) ) == NULL )
1098 plexit(
"c_plscmap1n: Insufficient memory" );
1103 if ( ( plsc->cmap1 = (
PLColor *) calloc( (
size_t) ncol,
sizeof (
PLColor ) ) ) == NULL )
1105 plexit(
"c_plscmap1n: Insufficient memory" );
1112 if ( plsc->ncp1 == 0 )
1134 PLFLT i[6], h[6], l[6], s[6], midpt = 0., vertex = 0.;
1148 if ( plsc->cmap0 != NULL )
1149 vertex = ( (
PLFLT) plsc->cmap0[0].r +
1150 (
PLFLT) plsc->cmap0[0].g +
1151 (
PLFLT) plsc->cmap0[0].b ) / 3. / 255.;
1193 if ( plsc->level > 0 )
1209 plsc->color =
color;
1223 value(
double n1,
double n2,
double hue )
1227 while ( hue >= 360. )
1233 val = n1 + ( n2 - n1 ) * hue / 60.;
1234 else if ( hue < 180. )
1236 else if ( hue < 240. )
1237 val = n1 + ( n2 - n1 ) * ( 240. - hue ) / 60.;
1270 m2 = l * ( s + 1. );
1276 *p_r =
value( m1, m2, h + 120. );
1277 *p_g =
value( m1, m2, h );
1278 *p_b =
value( m1, m2, h - 120. );
1300 PLFLT h, l, s, d, rc, gc, bc, rgb_min, rgb_max;
1302 rgb_min =
MIN( r,
MIN( g, b ) );
1303 rgb_max =
MAX( r,
MAX( g, b ) );
1305 l = ( rgb_min + rgb_max ) / 2.0;
1307 if ( rgb_min == rgb_max )
1314 d = rgb_max - rgb_min;
1318 s = 0.5 * d / ( 1. - l );
1320 rc = ( rgb_max - r ) / d;
1321 gc = ( rgb_max - g ) / d;
1322 bc = ( rgb_max - b ) / d;
1326 else if ( g == rgb_max )
1334 else if ( h >= 360 )
1361 if ( fgets(
buffer, length, fp ) == NULL )
1368 pchr = strchr(
buffer,
'\n' );
1375 if ( fscanf( fp,
"%*[^\n]\n" ) == EOF && ferror( fp ) )
1382 pchr = strchr(
buffer,
'\r' );
1390 while ( pchr !=
buffer && *pchr ==
' ' )
1414 int *number_colors,
unsigned int **r,
unsigned int **g,
unsigned int **b,
double **a )
1422 if ( strlen( filename ) == 0 )
1437 snprintf( msgbuf,
MSGLEN,
"Unable to open cmap0 file %s\n", filename );
1442 if ( !err && ( fscanf( fp,
"%d\n", number_colors ) != 1 || *number_colors < 1 ) )
1454 if ( ( ( *r = (
unsigned int *) malloc( (
size_t) ( *number_colors ) *
sizeof (
unsigned int ) ) ) == NULL ) ||
1455 ( ( *g = (
unsigned int *) malloc( (
size_t) ( *number_colors ) *
sizeof (
unsigned int ) ) ) == NULL ) ||
1456 ( ( *b = (
unsigned int *) malloc( (
size_t) ( *number_colors ) *
sizeof (
unsigned int ) ) ) == NULL ) ||
1457 ( ( *a = (
double *) malloc( (
size_t) ( *number_colors ) *
sizeof (
double ) ) ) == NULL ) )
1460 plexit(
"cmap0_palette_read: insufficient memory" );
1463 for ( i = 0; i < *number_colors; i++ )
1472 if ( strlen( color_info ) == 7 )
1474 if ( sscanf( color_info,
"#%2x%2x%2x",
1475 (
unsigned int *) ( *r + i ), (
unsigned int *) ( *g + i ),
1476 (
unsigned int *) ( *b + i ) ) != 3 )
1483 else if ( strlen( color_info ) > 9 )
1485 if ( sscanf( color_info,
"#%2x%2x%2x %lf",
1486 (
unsigned int *) ( *r + i ), (
unsigned int *) ( *g + i ),
1487 (
unsigned int *) ( *b + i ), (
double *) ( *a + i ) ) != 4 )
1498 else if ( *( *a + i ) < 0. )
1502 else if ( *( *a + i ) > 1. )
1516 snprintf( msgbuf,
MSGLEN,
"Unrecognized cmap0 format data line. Line is %s\n",
1529 *number_colors = 16;
1530 if ( ( ( *r = (
unsigned int *) malloc( (
size_t) ( *number_colors ) *
sizeof (
int ) ) ) == NULL ) ||
1531 ( ( *g = (
unsigned int *) malloc( (
size_t) ( *number_colors ) *
sizeof (
unsigned int ) ) ) == NULL ) ||
1532 ( ( *b = (
unsigned int *) malloc( (
size_t) ( *number_colors ) *
sizeof (
unsigned int ) ) ) == NULL ) ||
1533 ( ( *a = (
double *) malloc( (
size_t) ( *number_colors ) *
sizeof (
double ) ) ) == NULL ) )
1535 plexit(
"cmap0_palette_read: insufficient memory" );
1541 for ( i = 1; i < *number_colors; i++ )
1565 unsigned int *r, *g, *b;
1573 if ( number_colors > plsc->ncol0 )
1577 for ( i = 0; i < number_colors; i++ )
1596 #define fuzzy_range_check( value, min, max, fuzz, err_number ) \ 1597 if ( value < ( min - fuzz ) || value > ( max + fuzz ) ) { \ 1598 snprintf( msgbuf, MSGLEN, "Unrecognized cmap1 format data line. Error number is %d. Line is %s\n", err_number, color_info ); \ 1602 } else if ( value < min ) { \ 1604 } else if ( value > max ) { \ 1622 int format_version, err;
1625 unsigned int r_i, g_i, b_i;
1626 int pos_i, alt_hue_path_i;
1627 double r_d, g_d, b_d, a_d, pos_d;
1628 PLFLT *r, *g, *b, *a, *pos;
1629 PLINT *ri, *gi, *bi;
1638 if ( strlen( filename ) == 0 )
1653 snprintf( msgbuf,
MSGLEN,
"Unable to open cmap1 .pal file %s\n", filename );
1661 snprintf( msgbuf,
MSGLEN,
"Error reading cmap1 .pal file %s\n", filename );
1666 if ( strncmp( color_info,
"v2 ", 2 ) == 0 )
1669 if ( strncmp( &color_info[3],
"hls", 3 ) == 0 )
1671 else if ( strncmp( &color_info[3],
"rgb", 3 ) == 0 )
1675 snprintf( msgbuf,
MSGLEN,
"Invalid color space %s - assuming RGB\n", &color_info[3] );
1681 snprintf( msgbuf,
MSGLEN,
"Error reading cmap1 .pal file %s\n", filename );
1688 if ( sscanf( color_info,
"%d\n", &number_colors ) != 1 || number_colors < 2 )
1690 snprintf( msgbuf,
MSGLEN,
"Unrecognized cmap1 format (wrong number of colors) %s\n", color_info );
1696 r = (
PLFLT *) malloc( (
size_t) number_colors *
sizeof (
PLFLT ) );
1697 g = (
PLFLT *) malloc( (
size_t) number_colors *
sizeof (
PLFLT ) );
1698 b = (
PLFLT *) malloc( (
size_t) number_colors *
sizeof (
PLFLT ) );
1699 ri = (
PLINT *) malloc( (
size_t) number_colors *
sizeof (
PLINT ) );
1700 gi = (
PLINT *) malloc( (
size_t) number_colors *
sizeof (
PLINT ) );
1701 bi = (
PLINT *) malloc( (
size_t) number_colors *
sizeof (
PLINT ) );
1702 a = (
PLFLT *) malloc( (
size_t) number_colors *
sizeof (
PLFLT ) );
1703 pos = (
PLFLT *) malloc( (
size_t) number_colors *
sizeof (
PLFLT ) );
1704 alt_hue_path = (
PLBOOL *) malloc( (
size_t) ( number_colors - 1 ) *
sizeof (
PLBOOL ) );
1706 if ( format_version == 0 )
1708 int return_sscanf = -1, return_sscanf_old = 0;
1710 for ( i = 0; i < number_colors; i++ )
1714 snprintf( msgbuf,
MSGLEN,
"Error reading cmap1 .pal file %s\n", filename );
1720 color_info[
PALLEN - 1] =
'\0';
1721 return_sscanf = sscanf( color_info,
"#%2x%2x%2x %d %d", &r_i, &g_i, &b_i, &pos_i, &alt_hue_path_i );
1722 if ( return_sscanf < 4 || ( return_sscanf_old != 0 && return_sscanf != return_sscanf_old ) )
1724 snprintf( msgbuf,
MSGLEN,
"Unrecognized cmap1 format (wrong number of items for version 1 of format) %s\n", color_info );
1729 return_sscanf_old = return_sscanf;
1732 r[i] = (
PLFLT) r_i / 255.;
1733 g[i] = (
PLFLT) g_i / 255.;
1734 b[i] = (
PLFLT) b_i / 255.;
1736 pos[i] = 0.01 * (
PLFLT) pos_i;
1741 if ( ( return_sscanf == 5 ) && ( i != number_colors - 1 ) )
1744 alt_hue_path[i] = (
PLBOOL) alt_hue_path_i;
1747 if ( return_sscanf == 4 )
1750 free( alt_hue_path );
1751 alt_hue_path = NULL;
1757 for ( i = 0; i < number_colors; i++ )
1761 snprintf( msgbuf,
MSGLEN,
"Error reading cmap1 .pal file %s\n", filename );
1766 if ( sscanf( color_info,
"%lf %lf %lf %lf %lf %d", &pos_d, &r_d, &g_d, &b_d, &a_d, &alt_hue_path_i ) != 6 )
1768 snprintf( msgbuf,
MSGLEN,
"Unrecognized cmap1 format (wrong number of items for version 2 of format) %s\n", color_info );
1778 pos[i] = (
PLFLT) pos_d;
1795 if ( i != number_colors - 1 )
1796 alt_hue_path[i] = (
PLBOOL) alt_hue_path_i;
1805 c_plscmap1la( rgb, number_colors, pos, r, g, b, a, alt_hue_path );
1809 for ( i = 0; i < number_colors; i++ )
1811 ri[i] = (
PLINT) ( r[i] * 255.0 );
1812 gi[i] = (
PLINT) ( g[i] * 255.0 );
1813 bi[i] = (
PLINT) ( b[i] * 255.0 );
1827 r = (
PLFLT *) malloc( (
size_t) number_colors *
sizeof (
PLFLT ) );
1828 g = (
PLFLT *) malloc( (
size_t) number_colors *
sizeof (
PLFLT ) );
1829 b = (
PLFLT *) malloc( (
size_t) number_colors *
sizeof (
PLFLT ) );
1830 pos = (
PLFLT *) malloc( (
size_t) number_colors *
sizeof (
PLFLT ) );
1850 free( alt_hue_path );
1871 if ( plsc->graphx == 1 )
1877 fprintf( stderr,
"\n*** PLPLOT WARNING ***\n" );
1878 if ( *errormsg !=
'\0' )
1879 fprintf( stderr,
"%s\n", errormsg );
1901 ( *abort_handler )( errormsg );
1903 if ( plsc->errcode != NULL )
1904 *( plsc->errcode ) = 1;
1906 if ( plsc->errmsg != NULL )
1908 sprintf( plsc->errmsg,
"\n*** PLPLOT ERROR, ABORTING OPERATION ***\n" );
1909 if ( *errormsg !=
'\0' )
1910 sprintf( plsc->errmsg,
"%s, aborting operation\n", errormsg );
1916 if ( plsc->graphx == 1 )
1922 fprintf( stderr,
"\n*** PLPLOT ERROR, ABORTING OPERATION ***\n" );
1923 if ( *errormsg !=
'\0' )
1924 fprintf( stderr,
"%s, aborting operation\n", errormsg );
1967 status = ( *exit_handler )( errormsg );
1970 if ( *errormsg !=
'\0' )
1972 fprintf( stderr,
"\n*** PLPLOT ERROR, IMMEDIATE EXIT ***\n" );
1973 fprintf( stderr,
"%s\n", errormsg );
1977 fprintf( stderr,
"Program aborted\n" );
2009 if ( plsc->level > 0 )
2024 static int ostate = 0;
2026 if ( !plsc->dev_xor )
2032 if ( plsc->level > 0 )
2037 ostate = plsc->plbuf_write;
2038 plsc->plbuf_write = 0;
2041 plsc->plbuf_write = ostate;
2054 if ( !plsc->dev_modeset )
2056 plwarn(
"plsdrawmode: Mode setting is not supported by this device" );
2058 else if ( plsc->level > 0 )
2064 plwarn(
"plsdrawmode: Initialize PLplot first" );
2079 if ( !plsc->dev_modeset )
2081 plwarn(
"plgdrawmode: Mode getting is not supported by this device" );
2084 else if ( plsc->level > 0 )
2090 plwarn(
"plsdrawmode: Initialize PLplot first" );
2106 if ( plsc->level > 0 )
2124 if ( plsc->level > 0 )
2152 char *fs = NULL, *dn;
2170 #if defined ( PLPLOT_BIN_ENV ) 2178 #endif // PLPLOT_BIN_ENV 2188 #if defined ( PLPLOT_HOME_ENV ) 2196 #endif // PLPLOT_HOME_ENV 2200 #if defined ( BIN_DIR ) 2209 fprintf( stderr,
"plFindCommand: cannot locate command: %s\n", fn );
2210 #if defined ( BIN_DIR ) 2211 fprintf( stderr,
"bin dir=\"" BIN_DIR "\"\n" );
2242 if ( pdfs->
file != NULL )
2270 char *fs = NULL, *dn = NULL;
2278 if ( ( file =
pdf_fopen( fs,
"rb" ) ) != NULL )
2284 #if defined ( PLPLOT_LIB_ENV ) 2289 if ( ( file =
pdf_fopen( fs,
"rb" ) ) != NULL )
2293 #endif // PLPLOT_LIB_ENV 2297 if ( ( file =
pdf_fopen( fn,
"rb" ) ) != NULL )
2299 pldebug(
"plLibOpenPdfstr",
"Found file %s in current directory.\n", fn );
2306 #if defined ( PLPLOT_HOME_ENV ) 2311 if ( ( file =
pdf_fopen( fs,
"rb" ) ) != NULL )
2315 #endif // PLPLOT_HOME_ENV/lib 2319 #if defined ( DATA_DIR ) 2322 if ( ( file =
pdf_fopen( fs,
"rb" ) ) != NULL )
2331 if ( ( file =
pdf_fopen( fs,
"rb" ) ) != NULL )
2336 file = plMacLibOpen( fn );
2344 if ( ( file =
pdf_fopen( fs,
"rb" ) ) != NULL )
2349 pldebug(
"plLibOpenPdfstr",
"File %s not found.\n", fn );
2354 pldebug(
"plLibOpenPdfstr",
"Found file %s\n", fs );
2389 pldebug(
"plFindName",
"Trying to find %s\n", p );
2392 pldebug(
"plFindName",
"Readlink read %d chars at: %s\n", n, p );
2393 if (
buf[0] ==
'/' )
2397 strncpy( p,
buf, (
size_t) n );
2399 pldebug(
"plFindName",
"Link is absolute: %s\n", p );
2405 cp = 1 + strrchr( p,
'/' );
2406 strncpy( cp,
buf, (
size_t) n );
2408 pldebug(
"plFindName",
2409 "Link is relative: %s\n\tTotal path:%s\n", cp, p );
2416 #define S_ISREG( mode ) ( mode & S_IFREG ) 2421 if ( errno == EINVAL || errno == ENXIO )
2423 pldebug(
"plFindName",
"%s may be the one...\n", p );
2424 if ( ( stat( p, &sbuf ) == 0 ) && S_ISREG( sbuf.st_mode ) )
2426 pldebug(
"plFindName",
"%s is a regular file\n", p );
2427 return (
access( p, X_OK ) );
2430 pldebug(
"plFindName",
"%s found but is not executable\n", p );
2431 return ( errno ? errno : -1 );
2466 lfilespec = strlen( dir ) + strlen( subdir ) + strlen( filename ) + 10;
2467 if ( ( *filespec = (
char *) malloc( lfilespec ) ) == NULL )
2469 plexit(
"plGetName: Insufficient memory" );
2472 strcpy( *filespec, dir );
2474 if ( *subdir !=
'\0' )
2477 strcat( *filespec, subdir );
2479 if ( *filename !=
'\0' )
2482 strcat( *filespec, filename );
2488 pldebug(
"plGetName",
"Maximum length of full pathname of file to be found is %lu\n", lfilespec - 1 );
2490 pldebug(
"plGetName",
"Maximum length of full pathname of file to be found is %zu\n", lfilespec - 1 );
2492 pldebug(
"plGetName",
"Full pathname of file to be found is %s\n", *filespec );
2507 size_t ldirspec = strlen( dirspec );
2508 #if defined ( MSDOS ) || defined ( _WIN32 ) 2509 if ( dirspec[ldirspec - 1] !=
'\\' )
2510 strcat( dirspec,
"\\" );
2511 #elif defined ( macintosh ) 2512 if ( dirspec[ldirspec - 1] !=
':' )
2513 strcat( dirspec,
":" );
2514 #else // unix is the default 2515 if ( dirspec[ldirspec - 1] !=
'/' )
2516 strcat( dirspec,
"/" );
2539 x = (double) ( i * (
pls->
ncol1 - 1 ) ) / (
double) ( ncol - 1 );
2545 fprintf( stderr,
"Invalid color\n" );
2547 else if ( ir ==
pls->
ncol1 || ( delta == 0. ) )
2556 newcolor->
r = (
unsigned char) ( ( 1. - delta ) *
pls->
cmap1[il].
r + delta *
pls->
cmap1[ir].
r );
2557 newcolor->
g = (
unsigned char) ( ( 1. - delta ) *
pls->
cmap1[il].
g + delta *
pls->
cmap1[ir].
g );
2558 newcolor->
b = (
unsigned char) ( ( 1. - delta ) *
pls->
cmap1[il].
b + delta *
pls->
cmap1[ir].
b );
2573 #define MAX_NUM_TRIES 10 2577 int i = 0, count = 0;
2595 fprintf( stdout,
"Enter graphics output file name: " );
2597 len = strlen(
line );
2621 plexit(
"Too many tries." );
2624 fprintf( stderr,
"Can't open %s.\n",
pls->
FileName );
2626 pldebug(
"plOpenFile",
"Opened %s\n",
pls->
FileName );
2674 plexit(
"plP_getmember: Insufficient memory" );
2683 if ( suffix == NULL )
2714 maxlen = 10 + strlen( fnam );
2717 plexit(
"plP_sfnam: Insufficient memory" );
2720 suffix = strstr( fnam,
"%n" );
2722 if ( suffix == NULL )
2739 plexit(
"plP_sfnam: Insufficient memory" );
2786 PLFLT xpmm_loc, ypmm_loc;
2804 plP_setpxl( xpmm_loc * plsc->caspfactor, ypmm_loc / plsc->caspfactor );
2836 switch ( orient % 4 )
2839 *px = xmin + ( y - ymin );
2840 *py = ymin + ( xmax - x );
2844 *px = xmin + ( xmax - x );
2845 *py = ymin + ( ymax - y );
2849 *px = xmin + ( ymax - y );
2850 *py = ymin + ( x - xmin );
2873 free( (
void *)
pls->
dev );
2875 pls->
dev = calloc( 1, (
size_t)
sizeof (
PLDev ) );
2877 plexit(
"plAllocDev: cannot allocate memory\n" );
2898 gin->
pX = gin->
pY = -1;
2899 gin->
dX = gin->
dY = 0.;
2900 gin->
wX = gin->
wY = 0.;
2929 if ( sscanf(
line,
"%d", &m ) == 1 )
2931 fprintf( stdout,
"No value or value out of range; please try again\n" );
2934 plexit(
"Too many tries." );
2965 if ( sscanf(
line,
"%lf", &m1 ) == 1 )
2970 fprintf( stdout,
"No value or value out of range; please try again\n" );
2973 plexit(
"Too many tries." );
2991 char *dest = (
char *) malloc( ( strlen( src ) + 1 ) *
sizeof ( char ) );
2993 strcpy( dest, src );
3000 #ifndef PL_HAVE_SNPRINTF 3022 va_start( args, format );
3023 ret = vsprintf(
buffer, format, args );
3028 plabort(
"plsnprintf: buffer overrun" );
3054 va_start( args, format );
3055 ret = vsscanf(
buffer, format, args );
3061 #endif // PL_HAVE_SNPRINTF 3107 char * setlocale_ptr;
3108 char * saved_lc_numeric_locale;
3110 if ( !( saved_lc_numeric_locale = (
char *) malloc( 100 *
sizeof (
char ) ) ) )
3112 plexit(
"plsave_set_locale: out of memory" );
3116 if ( !( setlocale_ptr = setlocale( LC_NUMERIC, NULL ) ) )
3118 plexit(
"plsave_set_locale: LC_NUMERIC locale could not be determined for NULL locale.\n" );
3120 strncpy( saved_lc_numeric_locale, setlocale_ptr, 100 );
3121 saved_lc_numeric_locale[99] =
'\0';
3131 if ( !( setlocale( LC_NUMERIC,
"C" ) ) )
3133 plexit(
"plsave_set_locale: LC_NUMERIC locale could not be set to \"C\"" );
3135 return saved_lc_numeric_locale;
3159 if ( !( setlocale( LC_NUMERIC, saved_lc_numeric_locale ) ) )
3162 snprintf( msgbuf, 1024,
"plrestore_locale: LC_NUMERIC could not be restored to the default \"%s\" locale.\n", saved_lc_numeric_locale );
3165 free( saved_lc_numeric_locale );
static void color_set(PLINT i, U_CHAR r, U_CHAR g, U_CHAR b, PLFLT a, PLCHAR_VECTOR name)
integer(kind=private_plint), parameter, private maxlen
void c_plscolbga(PLINT r, PLINT g, PLINT b, PLFLT alpha)
static int(* exit_handler)(PLCHAR_VECTOR errormsg)
PLINT plGetInt(PLCHAR_VECTOR s)
void plexit(PLCHAR_VECTOR errormsg)
void plGetName(PLCHAR_VECTOR dir, PLCHAR_VECTOR subdir, PLCHAR_VECTOR filename, char **filespec)
void plP_esc(PLINT op, void *ptr)
#define PL_DEFAULT_CMAP1_FILE
void init_genrand(unsigned long s)
PLINT plFindName(char *p)
void c_plscmap1_range(PLFLT min_color, PLFLT max_color)
void plOpenFile(PLStream *pls)
void plCloseFile(PLStream *pls)
void plGetFam(PLStream *pls)
void c_plscmap1l(PLINT itype, PLINT npts, PLFLT_VECTOR intensity, PLFLT_VECTOR coord1, PLFLT_VECTOR coord2, PLFLT_VECTOR coord3, PLINT_VECTOR alt_hue_path)
void plP_getmember(PLStream *pls)
void plGinInit(PLGraphicsIn *gin)
PDFstrm * pdf_fopen(PLCHAR_VECTOR filename, PLCHAR_VECTOR mode)
const char * PLCHAR_VECTOR
void c_plcol0(PLINT icol0)
void plcol_interp(PLStream *pls, PLColor *newcolor, int i, int ncol)
static char * read_line(char *buffer, int length, FILE *fp)
void plcmap1_calc(void)
Bin up cmap 1 space and assign colors to make inverse mapping easy.
void c_plscmap1n(PLINT ncol1)
void c_plgcolbg(PLINT *r, PLINT *g, PLINT *b)
char * plsave_set_locale(void)
void plabort(PLCHAR_VECTOR errormsg)
void plP_gpixmm(PLFLT *p_x, PLFLT *p_y)
#define color_def(i, r, g, b, a, n)
void c_plscmap1a(PLINT_VECTOR r, PLINT_VECTOR g, PLINT_VECTOR b, PLFLT_VECTOR alpha, PLINT ncol1)
void c_plspal0(PLCHAR_VECTOR filename)
void plsabort(void(*handler)(PLCHAR_VECTOR))
void c_plxormod(PLINT mode, PLINT *status)
void c_plseed(unsigned int seed)
void c_plgcol0a(PLINT icol0, PLINT *r, PLINT *g, PLINT *b, PLFLT *alpha)
void plFamInit(PLStream *pls)
PLDev * plAllocDev(PLStream *pls)
void c_plscmap0n(PLINT ncol0)
void plrestore_locale(char *saved_lc_numeric_locale)
void c_plspal1(PLCHAR_VECTOR filename, PLBOOL interpolate)
#define PL_DEFAULT_CMAP0_FILE
void plP_sfnam(PLStream *pls, PLCHAR_VECTOR fnam)
void plio_fgets(char *buf, int size, FILE *stream)
void c_plhlsrgb(PLFLT h, PLFLT l, PLFLT s, PLFLT *p_r, PLFLT *p_g, PLFLT *p_b)
void c_plscmap1(PLINT_VECTOR r, PLINT_VECTOR g, PLINT_VECTOR b, PLINT ncol1)
static void cmap0_palette_read(PLCHAR_VECTOR filename, int *number_colors, unsigned int **r, unsigned int **g, unsigned int **b, double **a)
void c_plcol1(PLFLT col1)
static void strcat_delim(char *dirspec)
int plsnprintf(char *buffer, int n, PLCHAR_VECTOR format,...)
char * plFindCommand(PLCHAR_VECTOR fn)
void c_plrgbhls(PLFLT r, PLFLT g, PLFLT b, PLFLT *p_h, PLFLT *p_l, PLFLT *p_s)
void c_plscolbg(PLINT r, PLINT g, PLINT b)
void plP_setpxl(PLFLT xpmm, PLFLT ypmm)
void pl_cmd(PLINT op, void *ptr)
const PLINT * PLINT_VECTOR
void plsexit(int(*handler)(PLCHAR_VECTOR))
void c_plscmap0a(PLINT_VECTOR r, PLINT_VECTOR g, PLINT_VECTOR b, PLFLT_VECTOR alpha, PLINT ncol0)
static PLStream * pls[PL_NSTREAMS]
void c_plscol0a(PLINT icol0, PLINT r, PLINT g, PLINT b, PLFLT alpha)
void c_plgcolbga(PLINT *r, PLINT *g, PLINT *b, PLFLT *alpha)
int plsnscanf(PLCHAR_VECTOR buffer, int n, PLCHAR_VECTOR format,...)
void c_plscolor(PLINT color)
static PLFLT value(double n1, double n2, double hue)
char PLDLLIMPEXP * plstrdup(PLCHAR_VECTOR src)
PLINT c_plgdrawmode(void)
#define fuzzy_range_check(value, min, max, fuzz, err_number)
int pdf_close(PDFstrm *pdfs)
void c_plgcmap1_range(PLFLT *min_color, PLFLT *max_color)
FILE * plLibOpen(PLCHAR_VECTOR fn)
void plRotPhy(PLINT orient, PLINT xmin, PLINT ymin, PLINT xmax, PLINT ymax, PLINT *px, PLINT *py)
void c_pltext(void)
Switches to text screen.
static void plcmap0_def(int imin, int imax)
void c_plscmap0(PLINT_VECTOR r, PLINT_VECTOR g, PLINT_VECTOR b, PLINT ncol0)
void plwarn(PLCHAR_VECTOR errormsg)
int access(char *filename, int flag)
PLFLT plGetFlt(PLCHAR_VECTOR s)
void c_plscol0(PLINT icol0, PLINT r, PLINT g, PLINT b)
void c_plsdrawmode(PLINT mode)
static void(* abort_handler)(PLCHAR_VECTOR errormsg)
void c_plgcol0(PLINT icol0, PLINT *r, PLINT *g, PLINT *b)
const PLFLT * PLFLT_VECTOR
static void plcmap1_def(void)
char PLDLLIMPEXP * plplotLibDir
PDFstrm * plLibOpenPdfstrm(PLCHAR_VECTOR fn)
void c_plscmap1la(PLINT itype, PLINT npts, PLFLT_VECTOR intensity, PLFLT_VECTOR coord1, PLFLT_VECTOR coord2, PLFLT_VECTOR coord3, PLFLT_VECTOR alpha, PLINT_VECTOR alt_hue_path)
double genrand_real1(void)