libCPT.pl
author Andreas Thurnherr <ant@ldeo.columbia.edu>
Mon, 13 Apr 2020 11:06:22 -0400
changeset 40 c1803ae2540f
parent 36 04e8cb4f8073
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#                    L I B C P T . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Wed Nov 15 12:28:49 2000
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
     4
#                    dlm: Mon May 14 21:29:00 2018
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 2000 A.M. Thurnherr
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
     6
#                    uE-Info: 75 58 NIL 0 0 72 2 2 4 NIL ofnI
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
#	Nov 15, 2000: - created
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#	May 29, 2001: - made bg/fg numeric
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#	May 31, 2001: - removed dummy bg val from all arrays
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	Dec 12, 2001: - clarified format errors
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	Jun 21, 2004: - relaxed cpt file format restrictions
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#			      - made cpt into a hash
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#				  - totally re-written
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	Jun 25, 2004: - return good value if $z equal upper cpt table limit
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#	Jun 28, 2004: - added default color model
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
#	Jun 30, 2004: - renamed from libGMT.pl to libCPT.pl
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#	Dec  1, 2005: - BUG: roundoff error
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#   Jul  1, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#   Jul 24, 2006: - modified to use $PRACTICALLY_ZERONY
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#	Aug 16, 2006: - BUG: last level was returned on value < first level
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#	May  9, 2008: - adapted to GMT 4.3 (see also IMPLEMENTATION NOTES
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#					in [mkCPT])
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    26
#	Mar 26, 2018: - BUG: fg colors could not be set?!?!?!?! (both F and B set bg color)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    27
#				  - implemented color scaling for input files with rgb vals 0-1
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    28
#	May 14, 2016: - added input file check
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
# CPT File Parsing
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
# NB: %CPT structure assumes RGB --- if the color model is really HSV,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#	  field names are wrong.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
# %CPT
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#	levels				number of different color levels
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#	color_model			RGB or HSV
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#	@from_z				from values (z, RGB) for each level
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#	@from_R
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#	@from_G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#	@from_B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#	@to_z				to values (z, RGB) for each level
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
#	@to_R
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#	@to_G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
#	@to_B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
#	bg_R				background vals
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
#	bg_G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
#	bg_B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
#	fg_R				foreground vals
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
#	fg_G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#	fg_B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
#	nan_R				nan vals
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
#	nan_G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
#	nan_B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
sub readCPT($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
	my($f) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
	my($flag,%CPT);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
	for ($CPT{levels}=0; <$f>;) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
		$CPT{color_model} = $' if /^# COLOR_MODEL = /; chomp($CPT{color_model});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
		s/#.*//;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
		next if /^\s*$/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
		my(@f) = split;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
		if ($f[0] eq 'B') {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
			$CPT{bg_R} = $f[1]; $CPT{bg_G} = $f[2]; $CPT{bg_B} = $f[3];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
		} elsif ($f[0] eq 'F') {
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    71
			$CPT{fg_R} = $f[1]; $CPT{fg_G} = $f[2]; $CPT{fg_B} = $f[3];
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
		} elsif ($f[0] eq 'N') {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
			$CPT{nan_R} = $f[1]; $CPT{nan_G} = $f[2]; $CPT{nan_B} = $f[3];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
		} else {
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    75
			croak("$0: format error - 7 fields expected on line: $_") unless ($#f >= 7);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
			$CPT{from_z}[$CPT{levels}] = $f[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
			$CPT{from_R}[$CPT{levels}] = $f[1];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
			$CPT{from_G}[$CPT{levels}] = $f[2];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
			$CPT{from_B}[$CPT{levels}] = $f[3];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
			$CPT{to_z}[$CPT{levels}] = $f[4];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
			$CPT{to_R}[$CPT{levels}] = $f[5];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
			$CPT{to_G}[$CPT{levels}] = $f[6];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
	        $CPT{to_B}[$CPT{levels}] = $f[7];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
			$CPT{levels}++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
    $CPT{color_model} = 'RGB' unless defined($CPT{color_model});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
    croak("$0: color model $CPT{color_model} not implemented\n")
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    89
    	unless ($CPT{color_model} =~ '\+?[Rr][Gg][Bb]' || $CPT{color_model} =~ '\+?[Hh][Ss][Vv]');
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    90
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    91
	if ($CPT{from_R}[0]>=0 && $CPT{from_R}[0]<=1 &&								# colors in 0-1 range
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    92
		$CPT{from_G}[0]>=0 && $CPT{from_G}[0]<=1 &&
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    93
		$CPT{from_B}[0]>=0 && $CPT{from_B}[0]<=1 &&
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    94
    	$CPT{from_R}[$CPT{levels}-1]>=0 && $CPT{from_R}[$CPT{levels}-1]<=1 &&
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    95
		$CPT{from_G}[$CPT{levels}-1]>=0 && $CPT{from_G}[$CPT{levels}-1]<=1 &&
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    96
		$CPT{from_B}[$CPT{levels}-1]>=0 && $CPT{from_B}[$CPT{levels}-1]<=1) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    97
			$CPT{bg_R} = round(255 * $CPT{bg_R}); $CPT{bg_G} = round(255 * $CPT{bg_G}); $CPT{bg_B} = round(255 * $CPT{bg_B});
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    98
			$CPT{fg_R} = round(255 * $CPT{fg_R}); $CPT{fg_G} = round(255 * $CPT{fg_G}); $CPT{fg_B} = round(255 * $CPT{fg_B});
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    99
			$CPT{nan_R} = round(255 * $CPT{nan_R}); $CPT{nan_G} = round(255 * $CPT{nan_G}); $CPT{nan_B} = round(255 * $CPT{nan_B});
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   100
			for (my($i)=0; $i<$CPT{levels}; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   101
				$CPT{from_R}[$i] = round(255 * $CPT{from_R}[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   102
				$CPT{from_G}[$i] = round(255 * $CPT{from_G}[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   103
				$CPT{from_B}[$i] = round(255 * $CPT{from_B}[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   104
				$CPT{to_R}[$i] = round(255 * $CPT{to_R}[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   105
				$CPT{to_G}[$i] = round(255 * $CPT{to_G}[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   106
				$CPT{to_B}[$i] = round(255 * $CPT{to_B}[$i]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   107
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   108
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   109
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
	return %CPT;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
sub CPTlvl($%)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
	my($z,%CPT) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
	my($l);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
	croak("$0: no valid CPT info\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
		unless ($CPT{levels} > 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
	return nan if isnan($z);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
	for ($l=0; $l<$CPT{levels}; $l++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
		return $l if ($CPT{from_z}[$l] <= $z && $z < $CPT{to_z}[$l]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
	return $CPT{levels}-1
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
		if (abs($z-$CPT{to_z}[$CPT{levels}-1]) < $PRACTICALLY_ZERO);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
	return -1 if ($z < $CPT{from_z}[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
	return $CPT{levels};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
1;