Hi Paul,
I hacked this from somewhere I cannot remember so not sure it work but
you can try, sorry for no indentation:
FUNCTION RGB2HSV(nR, nG, nB) AS ARRAY
LOCAL nDelta, nMin, nV, nS, nH AS REAL8
LOCAL aHSV AS ARRAY
nMin := Min(nR, Min(nG, nB))
nV := Max(nR, Max(nG, nB))
nDelta := nV - nMin
BEGIN SEQUENCE
IF nV = 0.0
nS := 0.0
ELSE
nS := nDelta / nV
ENDIF
IF nS = 0.0
aHSV := {NIL, nS, nV}
BREAK // nH undefined
ELSEIF nR = nV
nH := 60.0 * (nG - nB) / nDelta
ELSEIF nG = nV
nH := 120.0 + 60.0 * (nB - nR) / nDelta
ELSEIF nB = nV
nH := 240.0 + 60.0 * (nR - nG) / nDelta
ENDIF
IF nH < 0.0
nH := nH + 360.0
ENDIF
aHSV := {nH, nS, nV}
END SEQUENCE
RETURN aHSV
FUNCTION HSV2RGB(nH, nS, nV) AS ARRAY
LOCAL nF, nHTemp, nP, nQ, nT, nR, nG, nB AS REAL8
LOCAL aRGB AS ARRAY
LOCAL nI AS INT
BEGIN SEQUENCE
IF nS = 0.0
IF nH = NIL
nR := nV
nG := nV
nB := nV
ELSE
aRGB := {NIL, NIL, NIL}
BREAK
ENDIF
ELSE
IF nH = 360.0
nHTemp := 0.0
ELSE
nHTemp := nH
ENDIF
nHTemp := nHTemp / 60
nI := Floor(nHTemp)
nF := nHTemp - nI
nP := nV * (1.0 - nS)
nQ := nV * (1.0 - (nS * nF))
nT := nV * (1.0 - (nS * (1.0 - nF)))
DO CASE
CASE nI = 0
nR := nV; nG := nT; nB := nP
CASE nI = 1
nR := nQ; nG := nV; nB := nP
CASE nI = 2
nR := nP; nG := nV; nB := nT
CASE nI = 3
nR := nP; nG := nQ; nB := nV
CASE nI = 4
nR := nT; nG := nP; nB := nV
CASE nI = 5
nR := nV; nG := nP; nB := nQ
ENDCASE
ENDIF
aRGB := {nR, nG, nB}
END SEQUENCE
RETURN aRGB
HTH,
Johan Nel
Pretoria, South Africa.


|