summaryrefslogtreecommitdiff
path: root/Dragon/src/PSPCOL.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/PSPCOL.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/PSPCOL.f')
-rw-r--r--Dragon/src/PSPCOL.f156
1 files changed, 156 insertions, 0 deletions
diff --git a/Dragon/src/PSPCOL.f b/Dragon/src/PSPCOL.f
new file mode 100644
index 0000000..60bac8b
--- /dev/null
+++ b/Dragon/src/PSPCOL.f
@@ -0,0 +1,156 @@
+*DECK PSPCOL
+ SUBROUTINE PSPCOL(ITCOL,NCOL,ICOL,RGB)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Pick a color number from a N-color set.
+*
+*Copyright:
+* Copyright (C) 1999 Ecole Polytechnique de Montreal
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation; either
+* version 2.1 of the License, or (at your option) any later version
+*
+*Author(s):
+* G. Marleau
+*
+*Parameters: input
+* ITCOL type of color set:
+* = 1 gray;
+* = 2 rgb;
+* = 3 cmyk;
+* = 4 hsb.
+* NCOL maximum number of color in set.
+* ICOL requested color number.
+*
+*Parameters: input
+* RGB color intensity:
+* for gray use only RGB(1);
+* for rgb use only RGB(1),RGB(2),RGB(3);
+* for cmyk use all;
+* for hsb use only RGB(1),RGB(2),RGB(3).
+*
+*-----------------------------------------------------------------------
+*
+ IMPLICIT NONE
+ INTEGER IOUT
+ CHARACTER NAMSBR*6
+ PARAMETER (IOUT=6,NAMSBR='PSPCOL')
+*----
+* ROUTINE PARAMETERS
+*----
+ INTEGER ITCOL,NCOL,ICOL
+ REAL RGB(4)
+*----
+* LOCAL PARAMETERS
+*----
+ INTEGER IDC,JCOL
+ REAL DELCOL,DELSAT,DELBLK
+*----
+* LOCAL VARIABLES
+*----
+ IF(ITCOL .EQ. 4) THEN
+ RGB(4)=0.0
+ IF(ICOL .LE. 0 ) THEN
+ RGB(1)=0.0
+ RGB(2)=0.0
+ RGB(3)=1.0
+ ELSE
+ DELCOL=0.6667/FLOAT(NCOL-1)
+ DELSAT=0.5/FLOAT(NCOL-1)
+ DELBLK=0.5/FLOAT(NCOL-1)
+ JCOL=ICOL-1
+ RGB(1)=0.6667-DELCOL*FLOAT(JCOL)
+ RGB(2)=0.5+DELSAT*FLOAT(JCOL)
+ RGB(3)=0.5+DELBLK*FLOAT(JCOL)
+ ENDIF
+ ELSE IF(ITCOL .EQ. 3) THEN
+ RGB(4)=0.0
+ IF(ICOL .LE. 0 ) THEN
+ RGB(1)=0.0
+ RGB(2)=0.0
+ RGB(3)=0.0
+ ELSE
+ IF (NCOL .LE. 8) THEN
+ IDC=2
+ ELSE IF(NCOL .LE. 64) THEN
+ IDC=4
+ ELSE IF(NCOL .LE. 512) THEN
+ IDC=8
+ ELSE IF(NCOL .LE. 4096) THEN
+ IDC=16
+ ELSE IF(NCOL .LE. 32768) THEN
+ IDC=32
+ ELSE IF(NCOL .LE. 262144) THEN
+ IDC=64
+ ELSE
+ IDC=128
+ ENDIF
+ JCOL=ICOL-1
+ DELCOL=1.0/FLOAT(IDC)
+ RGB(1)=1.0-DELCOL*FLOAT(MOD(JCOL,IDC))
+ JCOL=JCOL/IDC
+ RGB(2)=1.0-DELCOL*FLOAT(MOD(JCOL,IDC))
+ JCOL=JCOL/IDC
+ RGB(3)=1.0-DELCOL*FLOAT(MOD(JCOL,IDC))
+ ENDIF
+ ELSE IF(ITCOL .EQ. 2) THEN
+ RGB(4)=0.0
+ IF(ICOL .LE. 0 ) THEN
+ RGB(1)=1.0
+ RGB(2)=1.0
+ RGB(3)=1.0
+ ELSE
+ IF (NCOL .LE. 8) THEN
+ IDC=2
+ ELSE IF(NCOL .LE. 64) THEN
+ IDC=4
+ ELSE IF(NCOL .LE. 512) THEN
+ IDC=8
+ ELSE IF(NCOL .LE. 4096) THEN
+ IDC=16
+ ELSE IF(NCOL .LE. 32768) THEN
+ IDC=32
+ ELSE IF(NCOL .LE. 262144) THEN
+ IDC=64
+ ELSE
+ IDC=128
+ ENDIF
+ JCOL=ICOL-1
+ DELCOL=1.0/FLOAT(IDC)
+ RGB(1)=1.0-DELCOL*FLOAT(MOD(JCOL,IDC)+1)
+ JCOL=JCOL/IDC
+ RGB(2)=1.0-DELCOL*FLOAT(MOD(JCOL,IDC)+1)
+ JCOL=JCOL/IDC
+ RGB(3)=1.0-DELCOL*FLOAT(MOD(JCOL,IDC)+1)
+ ENDIF
+ ELSE
+ IF(ICOL .LE. 0 ) THEN
+ RGB(1)=0.0
+ RGB(2)=0.0
+ RGB(3)=0.0
+ ELSE
+ IF (NCOL .LE. 8) THEN
+ IDC=8
+ ELSE IF(NCOL .LE. 64) THEN
+ IDC=64
+ ELSE IF(NCOL .LE. 512) THEN
+ IDC=512
+ ELSE IF(NCOL .LE. 4096) THEN
+ IDC=4096
+ ELSE IF(NCOL .LE. 32768) THEN
+ IDC=32768
+ ELSE
+ IDC=262144
+ ENDIF
+ JCOL=ICOL-1
+ DELCOL=1.0/FLOAT(IDC)
+ RGB(1)=1.0-DELCOL*FLOAT(MOD(JCOL,IDC))
+ RGB(2)=RGB(1)
+ RGB(3)=RGB(1)
+ ENDIF
+ ENDIF
+ RETURN
+ END