libCPT.pl
author A.M. Thurnherr <athurnherr@yahoo.com>
Fri, 12 Jun 2015 15:25:28 +0000
changeset 20 7ea1fd9d64e6
parent 0 a5233793bf69
child 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
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    dlm: Fri May  9 11:40:01 2008
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 2000 A.M. Thurnherr
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    uE-Info: 25 31 NIL 0 0 72 2 2 4 NIL ofnI
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])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
# CPT File Parsing
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
# NB: %CPT structure assumes RGB --- if the color model is really HSV,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#	  field names are wrong.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
# %CPT
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#	levels				number of different color levels
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#	color_model			RGB or HSV
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#	@from_z				from values (z, RGB) for each level
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#	@from_R
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#	@from_G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#	@from_B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#	@to_z				to values (z, RGB) for each level
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#	@to_R
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#	@to_G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#	@to_B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
#	bg_R				background vals
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#	bg_G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
#	bg_B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
#	fg_R				foreground vals
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
#	fg_G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
#	fg_B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
#	nan_R				nan vals
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
#	nan_G
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#	nan_B
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
sub readCPT($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
	my($f) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
	my($flag,%CPT);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
	for ($CPT{levels}=0; <$f>;) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
		$CPT{color_model} = $' if /^# COLOR_MODEL = /; chomp($CPT{color_model});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
		s/#.*//;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
		next if /^\s*$/;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
		my(@f) = split;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
		if ($f[0] eq 'B') {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
			$CPT{bg_R} = $f[1]; $CPT{bg_G} = $f[2]; $CPT{bg_B} = $f[3];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
		} elsif ($f[0] eq 'F') {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
			$CPT{bg_R} = $f[1]; $CPT{bg_G} = $f[2]; $CPT{bg_B} = $f[3];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
		} elsif ($f[0] eq 'N') {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
			$CPT{nan_R} = $f[1]; $CPT{nan_G} = $f[2]; $CPT{nan_B} = $f[3];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
			$CPT{from_z}[$CPT{levels}] = $f[0];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
			$CPT{from_R}[$CPT{levels}] = $f[1];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
			$CPT{from_G}[$CPT{levels}] = $f[2];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
			$CPT{from_B}[$CPT{levels}] = $f[3];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
			$CPT{to_z}[$CPT{levels}] = $f[4];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
			$CPT{to_R}[$CPT{levels}] = $f[5];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
			$CPT{to_G}[$CPT{levels}] = $f[6];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
	        $CPT{to_B}[$CPT{levels}] = $f[7];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
			$CPT{levels}++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
    $CPT{color_model} = 'RGB' unless defined($CPT{color_model});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
    croak("$0: color model $CPT{color_model} not implemented\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
    	unless ($CPT{color_model} =~ '\+?RGB' || $CPT{color_model} =~ '\+?HSV');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
	return %CPT;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
		
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
sub CPTlvl($%)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
	my($z,%CPT) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
	my($l);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
	croak("$0: no valid CPT info\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
		unless ($CPT{levels} > 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
	return nan if isnan($z);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
	for ($l=0; $l<$CPT{levels}; $l++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
		return $l if ($CPT{from_z}[$l] <= $z && $z < $CPT{to_z}[$l]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
	return $CPT{levels}-1
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
		if (abs($z-$CPT{to_z}[$CPT{levels}-1]) < $PRACTICALLY_ZERO);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
	return -1 if ($z < $CPT{from_z}[0]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
	return $CPT{levels};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
1;