subroutine hue(modei,clr1i,clr2i,clr3i,modeo,clr1o,clr2o,clr3o,status) character(len=*),intent(in) :: modei ! color model of input values character(len=*),intent(in) :: modeo ! color model of output values real,intent(in) :: clr1i,clr2i,clr3i real,intent(out) :: clr1o,clr2o,clr3o integer,intent(out) :: status
Valid values for modei and modeo as well as the corresponding meanings for clr1*, clr2*, and clr3* are:
model | clr1 | clr2 | clr3 |
---|---|---|---|
hls | hue | lightness | saturation |
hsl | hue | saturation | lightness |
hvs | hue | value | saturation |
hsv | hue | saturation | value |
rgb | red | green | blue |
cmy | cyan | magenta | yellow |
yiq | luma grayscale | orange-bluechrominance | purple-greenchrominance |
The STATUS variable can signal the following conditions:
-1 modei = modeo, so no substantial conversion was done, 1 one of the input color values was outside the allowable range, 2 modei was invalid 3 modeo was invalid
Sample program program demo_hue use M_color, only : hue implicit none ! NAME RGB(0-255) HLS(0-100) call chk('hls','red', [100, 0, 0 ], [0, 50, 100]) call chk('hls','orange', [100, 65, 0 ], [39, 50, 100]) call chk('hls','yellow', [100, 100, 0 ], [60, 50, 100]) call chk('hls','green', [0, 100, 0 ], [120, 50, 100]) call chk('hls','cyan', [0, 100, 100], [180, 50, 100]) call chk('hls','blue', [0, 0, 100], [240, 50, 100]) call chk('hls','magenta', [100, 0, 100], [300, 50, 100]) call chk('hls','black', [0, 0, 0 ], [0, 0, 0 ]) call chk('hls','white', [100, 100, 100], [0, 100, 0 ]) ! NAME RGB(0-255) HSV(0-100) call chk('hsv','red', [100, 0, 0 ], [0, 100, 100]) call chk('hsv','yellow', [100, 100, 0 ], [60, 100, 100]) call chk('hsv','green', [0, 100, 0 ], [120, 100, 100]) call chk('hsv','cyan', [0, 100, 100], [180, 100, 100]) call chk('hsv','blue', [0, 0, 100], [240, 100, 100]) call chk('hsv','magenta', [100, 0, 100], [300, 100, 100]) call chk('hsv','black', [0, 0, 0 ], [0, 0, 0 ]) call chk('hsv','white', [100, 100, 100], [0, 0, 100]) call chk('hsv','gray50', [50, 50, 50 ], [0, 0, 50 ]) call chk('hsv','silver', [75, 75, 75 ], [0, 0, 75 ]) call chk('hsv','red4', [55, 0, 0 ], [0, 100, 55 ]) call chk('hsv','olive', [50, 50, 0 ], [60, 100, 50 ]) call chk('hsv','lime', [0, 100, 0 ], [120, 100, 100]) call chk('hsv','teal', [0, 50, 50 ], [180, 100, 50 ]) call chk('hsv','navy', [0, 0, 50 ], [240, 100, 50 ]) call chk('hsv','purple', [63, 13, 94 ], [277, 87, 94 ]) call chk('hsv','magenta4',[55, 0, 55 ], [300, 100, 55 ]) call chk('hsv','maroon', [69, 19, 38 ], [338, 73, 69 ]) contains subroutine chk(modelout,name,rgb,other) ! given a color convert to MODELOUT and compare to expected values character(len=*),intent(in) :: name integer,intent(in) :: rgb(3), other(3) character(len=*),intent(in) :: modelout real :: val1,val2,val3 integer :: status ! convert RGB values to MODELOUT values call hue('rgb',REAL(rgb(1)),REAL(rgb(2)),REAL(rgb(3)),& & modelout,val1,val2,val3,status) ! left-justify name to 10 characters or more write(*,'(a,1x)',advance='no') & & [ character(len=max(10,len_trim(name))) ::' '//trim(name)] write(*,'(a,1x,3(i3,1x))',advance='no') & & modelout//' EXPECTED',other write(*,'(a,1x,3(i3,1x))',advance='no') & & 'GOT',int([val1+0.5,val2+0.5,val3+0.5]) write(*,'(a,i0)')'STATUS ',status end subroutine chk end program demo_hue Results: red hls EXPECTED 0 50 100 GOT 0 50 100 STATUS 0 orange hls EXPECTED 39 50 100 GOT 39 50 100 STATUS 0 yellow hls EXPECTED 60 50 100 GOT 60 50 100 STATUS 0 green hls EXPECTED 120 50 100 GOT 120 50 100 STATUS 0 cyan hls EXPECTED 180 50 100 GOT 180 50 100 STATUS 0 blue hls EXPECTED 240 50 100 GOT 240 50 100 STATUS 0 magenta hls EXPECTED 300 50 100 GOT 300 50 100 STATUS 0 black hls EXPECTED 0 0 0 GOT 0 0 0 STATUS 0 white hls EXPECTED 0 100 0 GOT 0 100 0 STATUS 0 black hsv EXPECTED 0 0 0 GOT 0 0 0 STATUS 0 gray50 hsv EXPECTED 0 0 50 GOT 0 0 50 STATUS 0 silver hsv EXPECTED 0 0 75 GOT 0 0 75 STATUS 0 white hsv EXPECTED 0 0 100 GOT 0 0 100 STATUS 0 red4 hsv EXPECTED 0 100 55 GOT 0 100 55 STATUS 0 red hsv EXPECTED 0 100 100 GOT 0 100 100 STATUS 0 olive hsv EXPECTED 60 100 50 GOT 60 100 50 STATUS 0 yellow hsv EXPECTED 60 100 100 GOT 60 100 100 STATUS 0 green hsv EXPECTED 120 100 100 GOT 120 100 100 STATUS 0 lime hsv EXPECTED 120 100 100 GOT 120 100 100 STATUS 0 teal hsv EXPECTED 180 100 50 GOT 180 100 50 STATUS 0 cyan hsv EXPECTED 180 100 100 GOT 180 100 100 STATUS 0 navy hsv EXPECTED 240 100 50 GOT 240 100 50 STATUS 0 blue hsv EXPECTED 240 100 100 GOT 240 100 100 STATUS 0 purple hsv EXPECTED 277 87 94 GOT 277 86 94 STATUS 0 magenta4 hsv EXPECTED 300 100 55 GOT 300 100 55 STATUS 0 magenta hsv EXPECTED 300 100 100 GOT 300 100 100 STATUS 0 maroon hsv EXPECTED 338 73 69 GOT 337 72 69 STATUS 0