program f90_CALDAT
implicit none
integer::hmax,hmin,smax,smin,vmax,vmin
integer::hh1(1:12),ss1(1:12),vv1(1:12)
integer::hh2(1:12),ss2(1:12),vv2(1:12)
character(len=7)::HEX1(1:12),HEX2(1:12)
real(4)::Te(1:12)=(/3.3,3.6,6.9,12.9,17.7,21.2,24.7,26.1,21.9,16.1,10.5,5.8/)
real::Temax,Temin
integer::i
integer::R,G,B
character(len=3)::dum1,dum2,dum3,dum4,dum5,dum6
Temax=26.1
Temin=3.3
! Input data
call getarg(1,dum1)
call getarg(2,dum2)
call getarg(3,dum3)
call getarg(4,dum4)
call getarg(5,dum5)
call getarg(6,dum6)
read(dum1,*) hmax
read(dum2,*) hmin
read(dum3,*) smax
read(dum4,*) smin
read(dum5,*) vmax
read(dum6,*) vmin
! Define colors (HSV->RGB->Hex)
do i=1,12
hh2(i)=nint(hmax-(hmax-hmin)/(Temax-Temin)*(Te(i)-Temin))
ss2(i)=nint(smin+(smax-smin)/(Temax-Temin)*(Te(i)-Temin))
vv2(i)=nint(vmin+(vmax-vmin)/(Temax-Temin)*(Te(i)-Temin))
call HSVtoRGB(hh2(i),ss2(i),vv2(i),R,G,B)
HEX2(i)='#'//C10to16(R)//C10to16(G)//C10to16(B)
write(6,'(a7,3(i4))') HEX2(i),hh2(i),ss2(i),vv2(i)
end do
do i=1,12
hh1(i)=nint(hmax-(hmax-hmin)/(Temax-Temin)*(Te(i)-Temin))
ss1(i)=255
vv1(i)=255
call HSVtoRGB(hh1(i),ss1(i),vv1(i),R,G,B)
HEX1(i)='#'//C10to16(R)//C10to16(G)//C10to16(B)
write(6,'(a7,3(i4))') HEX1(i),hh1(i),ss1(i),vv1(i)
end do
call HTMLMAIN(hh1,ss1,vv1,HEX1,hh1,ss2,vv2,HEX2)
call CSCALMAIN()
call CSSUBCOL(HEX1,HEX2)
call BATIMK(HEX2)
! Execute a batch file for ImagiMagick
call system("bat_img_cal.bat")
stop
contains
!-------------------------------------------------
subroutine HSVtoRGB(hh,ss,vv,R,G,B)
!-------------------------------------------------
integer,intent(in)::hh,ss,vv
integer,intent(out)::R,G,B
real(4)::ff
integer::ii,pp,qq,tt
ii = mod(real(hh)/60.0,6.0)
ff = real(hh)/60.0-real(int(real(hh)/60.0))
pp = nint(vv*(1.0-(ss/255.0)))
qq = nint(vv*(1.0-(ss/255.0)*ff))
tt = nint(vv*(1.0-(ss/255.0)*(1.0-ff)))
R=0; G=0; B=0
select case (ii)
case(0)
R=vv; G=tt; B=pp
case(1)
R=qq; G=vv; B=pp
case(2)
R=pp; G=vv; B=tt
case(3)
R=pp; G=qq; B=vv
case(4)
R=tt; G=pp; B=vv
case(5)
R=vv; G=pp; B=qq
end select
end subroutine HSVtoRGB
!-------------------------------------------------
character(len=2) function C10to16(num)
!-------------------------------------------------
integer,intent(in)::num
integer,parameter::n=10
integer::r(1:n)
integer::i,m
integer::numd=16
character(len=1)::snum(1:n)
character(len=200)::ans
integer::num0,qq
num0=num
do i=1,n
qq=num0/numd
r(i)=num0-numd*qq
if(qq==0)exit
num0=qq
end do
m=i
do i=m,1,-1
if(r(i)==10)snum(i)='A'
if(r(i)==11)snum(i)='B'
if(r(i)==12)snum(i)='C'
if(r(i)==13)snum(i)='D'
if(r(i)==14)snum(i)='E'
if(r(i)==15)snum(i)='F'
if(r(i)<=9)then
write(snum(i),'(i1.1)') r(i)
end if
end do
ans=''
do i=m,1,-1
ans=trim(adjustl(ans))//snum(i)
end do
if(len_trim(ans)==1)ans='0'//trim(ans)
C10to16=ans
end function C10to16
!-------------------------------------------------
subroutine HTMLMAIN(hh1,ss1,vv1,HEX1,hh2,ss2,vv2,HEX2)
!-------------------------------------------------
! Create html file for top page of calenders named 'cal_main.html'
integer,intent(in)::hh1(1:12),ss1(1:12),vv1(1:12)
integer,intent(in)::hh2(1:12),ss2(1:12),vv2(1:12)
character(len=7),intent(in)::HEX1(1:12),HEX2(1:12)
character(len=2)::dum
character(len=3)::dum1,dum2,dum3,dum4,dum5,dum6
character(len=9)::dum0
character(len=8)::dumw1,dumw2,dumw3
character(len=500)::str
open(12, file='cal_main.html', status='replace')
write(12,'(a)') ''
write(12,'(a)') ''
write(12,'(a)') '
'
write(12,'(a)') ''
write(12,'(a)') ''
write(12,'(a)') ''
write(12,'(a)') ''
write(12,'(a)') ''
write(12,'(a)') 'WANtaroHP (Calender)'
write(12,'(a)') ''
write(12,'(a)') ''
write(12,'(a)') ''
write(12,'(a)') ''
write(12,'()')
write(12,'(a)') ''
write(12,'()')
write(12,'(a)') ''
write(12,'()')
write(12,'(a)') 'Calender (2011-2014)
'
write(12,'(a)') '
'
write(12,'(a)') ''
write(12,'(a)') ''
write(12,'(a)') '2011 | '
write(12,'(a)') '2012 | '
write(12,'(a)') '2013 | '
write(12,'(a)') '2014 | '
write(12,'(a)') '
'
write(12,'(a)') '
'
write(12,'(a)') '
'
write(12,'(a)') 'Calender & Schedule (2013)
'
write(12,'(a)') ''
write(12,'(a)') '
Color image for each month
'
write(12,'(a)') '
'
write(12,'(a)') 'Month | T (°C) | &
& Selected | Reference |
'
write(12,'(a)') 'Color | HSV | Color | HSV |
'
do i=1,12
if(i== 1)str='January | '
if(i== 2)str='
February | '
if(i== 3)str='
March | '
if(i== 4)str='
April | '
if(i== 5)str='
May | '
if(i== 6)str='
June | '
if(i== 7)str='
July | '
if(i== 8)str='
August | '
if(i== 9)str='
September | '
if(i==10)str='
October | '
if(i==11)str='
Nobemver | '
if(i==12)str='
December | '
write (dum,'(i2.2)') i
dum0(1:9)=''
write(dum0,'(f4.1)') Te(i)
if(len_trim(adjustl(dum0))==3)dum0=' '//trim(adjustl(dum0))
str=trim(adjustl(str))//''//trim(adjustl(dum0))//' | &
& '//HEX2(i)//' | '
dumw1(1:8)=''
dumw2(1:8)=''
dumw3(1:8)=''
write(dumw1,'(i3)') hh2(i)
write(dumw2,'(i3)') ss2(i)
write(dumw3,'(i3)') vv2(i)
if(len_trim(adjustl(dumw1))==2)dumw1=' '//adjustl(dumw1)
if(len_trim(adjustl(dumw2))==2)dumw2=' '//adjustl(dumw2)
if(len_trim(adjustl(dumw3))==2)dumw3=' '//adjustl(dumw3)
str=trim(adjustl(str))// &
& ''//trim(adjustl(dumw1))//' '//trim(adjustl(dumw2))//' '//trim(adjustl(dumw3))//' | '
str=trim(adjustl(str))//''//HEX1(i)//' | '
dumw1(1:8)=''
dumw2(1:8)=''
dumw3(1:8)=''
write(dumw1,'(i3)') hh1(i)
write(dumw2,'(i3)') ss1(i)
write(dumw3,'(i3)') vv1(i)
if(len_trim(adjustl(dumw1))==2)dumw1=' '//adjustl(dumw1)
if(len_trim(adjustl(dumw2))==2)dumw2=' '//adjustl(dumw2)
if(len_trim(adjustl(dumw3))==2)dumw3=' '//adjustl(dumw3)
str=trim(adjustl(str))// &
& ''//trim(adjustl(dumw1))//' '//trim(adjustl(dumw2))//' '//trim(adjustl(dumw3))//' |
'
write(12,'(a)') trim(adjustl(str))
end do
write(12,'(a)') 'T (°C) is average temperature of each month in Maebashi, Japan. |
'
write(12,'(a)') '
'
write(12,'(a)') '
'
write(12,'()')
write(12,'(a)') ''
write(12,'(a)') ''
write(12,'(a)') ''
close(12)
end subroutine HTMLMAIN
!-------------------------------------------------
subroutine CSCALMAIN()
!-------------------------------------------------
open(12, file='cscalmain.css', status='replace')
write(12,'(a)') '*{margin:0;padding:0;}'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '/* Format for body */'
write(12,'(a)') '/******************************************/'
write(12,'(a)') 'body{'
write(12,'(a)') 'line-height:150%;'
write(12,'(a)') 'color:#000000;'
write(12,'(a)') 'background-color:#ffffff;'
write(12,'(a)') 'font-size:0.9em;'
write(12,'(a)') 'font-family:arial;'
write(12,'(a)') '}'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '/* header */'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '#top{'
write(12,'(a)') 'padding:20px;'
write(12,'(a)') 'background-color:#000000;'
write(12,'(a)') 'color:#ffffff;'
write(12,'(a)') 'font-weight:bold;'
write(12,'(a)') 'text-align:center;'
write(12,'(a)') '}'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '/* Footer */'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '#bottom{'
write(12,'(a)') 'padding:10px;'
write(12,'(a)') 'background-color:#000000;'
write(12,'(a)') 'color:#ffffff;'
write(12,'(a)') 'text-align:center;'
write(12,'(a)') '}'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '/* Main contents */'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '#main{'
write(12,'(a)') 'margin-top:20px;'
write(12,'(a)') 'margin-left:200px;'
write(12,'(a)') 'padding:10px;'
write(12,'(a)') 'background-color:#ffffff;'
write(12,'(a)') '}'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '/* Format for h1-h5 */'
write(12,'(a)') '/******************************************/'
write(12,'(a)') 'h1{'
write(12,'(a)') 'font-size:2.0em;'
write(12,'(a)') '}'
write(12,'(a)') 'h2{'
write(12,'(a)') 'margin-top:30px;'
write(12,'(a)') 'margin-bottom:10px;'
write(12,'(a)') 'padding-top:10px;'
write(12,'(a)') 'padding-bottom:10px;'
write(12,'(a)') 'padding-left:10px;'
write(12,'(a)') 'background-color:#00ffff;'
write(12,'(a)') 'font-size:1.5em;'
write(12,'(a)') '}'
write(12,'(a)') 'h3{'
write(12,'(a)') 'margin-top:20px;'
write(12,'(a)') 'margin-bottom:10px;'
write(12,'(a)') 'padding-left:10px;'
write(12,'(a)') 'border-left:solid 20px #00008b;'
write(12,'(a)') 'border-bottom:solid 1px #00008b;'
write(12,'(a)') 'font-size:1.25em;'
write(12,'(a)') '}'
write(12,'(a)') 'h4{'
write(12,'(a)') 'margin-top:20px;'
write(12,'(a)') 'margin-bottom:10px;'
write(12,'(a)') 'padding-left:10px;'
write(12,'(a)') 'border-left:solid 10px #00008b;'
write(12,'(a)') 'font-size:1.0em;'
write(12,'(a)') '}'
write(12,'(a)') 'h5{'
write(12,'(a)') 'font-size:1.0em;'
write(12,'(a)') '}'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '/* Left Menu */'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '#navi{'
write(12,'(a)') 'margin-top:20px;'
write(12,'(a)') 'padding:10px;'
write(12,'(a)') 'width:180px;'
write(12,'(a)') 'position:absolute;'
write(12,'(a)') 'left:0;'
write(12,'(a)') 'font-size:0.85em;'
write(12,'(a)') 'line-height:120%;'
write(12,'(a)') 'background-color:#ffffff;'
write(12,'(a)') 'color:#555555;'
write(12,'(a)') '}'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '/* Table */'
write(12,'(a)') '/******************************************/'
write(12,'(a)') 'table{'
write(12,'(a)') 'margin-left:auto;'
write(12,'(a)') 'margin-right:auto;'
write(12,'(a)') 'margin-top:10px;'
write(12,'(a)') 'margin-bottom:10px;'
write(12,'(a)') 'font-size:1.2em;'
write(12,'(a)') 'line-height:110%;'
write(12,'(a)') '}'
write(12,'(a)') 'th{'
write(12,'(a)') 'width:100px;'
write(12,'(a)') 'text-align:center;'
write(12,'(a)') 'vertical-align:middle;'
write(12,'(a)') 'padding-top:3px;'
write(12,'(a)') 'padding-right:10px;'
write(12,'(a)') 'padding-bottom:3px;'
write(12,'(a)') 'padding-left:10px;'
write(12,'(a)') '}'
write(12,'(a)') 'td{'
write(12,'(a)') 'width:100px;'
write(12,'(a)') 'height:30px;'
write(12,'(a)') 'text-align:left;'
write(12,'(a)') 'vertical-align:middle;'
write(12,'(a)') 'padding-top:3px;'
write(12,'(a)') 'padding-right:10px;'
write(12,'(a)') 'padding-bottom:3px;'
write(12,'(a)') 'padding-left:10px;'
write(12,'(a)') '}'
write(12,'(a)') '/******************************************/'
write(12,'(a)') '/* Table title */'
write(12,'(a)') '/******************************************/'
write(12,'(a)') 'p.title{'
write(12,'(a)') 'text-align:center;'
write(12,'(a)') 'margin-top:10px;'
write(12,'(a)') 'margin-bottom:10px;'
write(12,'(a)') 'font-size:2em;'
write(12,'(a)') 'font-weight:bold;'
write(12,'(a)') 'font-style:italic;'
write(12,'(a)') '}'
close(12)
end subroutine CSCALMAIN
!-------------------------------------------------
subroutine CSSUBCOL(HEX1,HEX2)
!-------------------------------------------------
! Create css-file named 'cssubcol.css' for top page of calender
character(len=7),intent(in)::HEX1(1:12),HEX2(1:12)
character(len=2)::dum
character(len=500)::str
open(12, file='cssubcol.css', status='replace')
do i=1,12
write (dum,'(i2.2)') i
str='td.col2'//dum//'{background-color:'//HEX2(i)//';color:#000000;}'
write(12,'(a)') trim(adjustl(str))
end do
write(12,'()')
do i=1,12
write (dum,'(i2.2)') i
str='td.col1'//dum//'{background-color:'//HEX1(i)//';color:#000000;}'
write(12,'(a)') trim(adjustl(str))
end do
close(12)
end subroutine CSSUBCOL
!-------------------------------------------------
subroutine BATIMK(HEX2)
!-------------------------------------------------
! Create batch file for control commands for ImageMagick named 'bat_img_cal.bat'
character(len=7),intent(in)::HEX2(1:12)
character(len=2)::dum
character(len=500)::str
open(12, file='bat_img_cal.bat', status='replace')
do i=1,12
write (dum,'(i2.2)') i
str='set col1='//HEX2(i) ; write(12,'(a)') trim(adjustl(str))
str='set col2=#ffffff' ; write(12,'(a)') trim(adjustl(str))
str='set image=img_cal_'//dum//'.png'; write(12,'(a)') trim(adjustl(str))
str='set csdat=cscal'//dum//'.css' ; write(12,'(a)') trim(adjustl(str))
str='call bat_imk_exe' ; write(12,'(a)') trim(adjustl(str))
write(12,'()')
end do
close(12)
! Create batch file for execution commandsfor ImageMagick named 'bat_imk_exe.bat'
! (included 2 lines for css file for each html file for calender: echo commands are used)
open(12, file='bat_imk_exe.bat', status='replace')
write(12,'(a)') 'convert -size 200x40 gradient:%col1%-%col2% temp1.png'
write(12,'(a)') 'convert -size 200x80 gradient:%col2%-%col2% tempi.png'
write(12,'(a)') 'convert -size 200x40 gradient:%col2%-%col1% temp2.png'
write(12,'(a)') 'convert -append temp1.png tempi.png imgm.png'
write(12,'(a)') 'convert -append imgm.png temp2.png img1.png'
write(12,'(a)') 'convert -size 160x40 gradient:%col1%-%col2% -rotate -90 temp1.png'
write(12,'(a)') 'convert -size 160x120 gradient:%col2%-%col2% -rotate -90 tempi.png'
write(12,'(a)') 'convert -size 160x40 gradient:%col2%-%col1% -rotate -90 temp2.png'
write(12,'(a)') 'convert +append temp1.png tempi.png imgm.png'
write(12,'(a)') 'convert +append imgm.png temp2.png img2.png'
write(12,'(a)') 'composite -gravity center -dissolve 50%x50% img2.png img1.png temp1.png'
write(12,'(a)') 'convert -resize 120x80! -unsharp 2x1.4+0.5+0 -quality 100 temp1.png %image%'
write(12,'(a)') 'echo th.col{background-color:%col1%;color:#000000;} > %csdat%'
write(12,'(a)') 'echo td.col{background-image:url("%image%");} >> %csdat%'
close(12)
end subroutine BATIMK
!-------------------------------------------------
end program f90_CALDAT