rgb <- function(r, g, b, names=NULL)
.Internal(rgb(r, g, b, names))

hsv <- function(h=1,s=1,v=1,gamma=1)
.Internal(hsv(h,s,v,gamma))

#nice to the English
colours <- colors

palette <- function(value)
{
	if(missing(value)) .Internal(palette(character()))
	else invisible(.Internal(palette(value)))
}

## This is a quick little ``rainbow'' function -- improved by MM

rainbow <- function (n, s = 1, v = 1, start = 0, end = (n - 1)/n, gamma = 1) 
{
	if(start == end || any(c(start,end) < 0)|| any(c(start,end) > 1))
		stop("'start' and 'end' must be in [0,1] and different from")
	if ((n <- as.integer(n)) > 0) { 
		hsv(seq(start, ifelse(start > end, 1, 0) + end, length= n) %% 1,
		    s, v, gamma)
	} else character(0)
}


"topo.colors" <- function (n) 
{
	j <- n %/% 3
	k <- n %/% 3
	i <- n - j - k
	rval <- rainbow(i, start = 43/60, end = 31/60)
	rval <- c(rval, rainbow(j, start = 23/60, end = 10/60))
	if(k > 0)
	  c(rval, hsv(h = seq(from = 10/60, to = 6/60, length.out = k),
		      s = seq(from = 1,     to = 0.3,  length.out = k), v = 1))
	else rval
}

"terrain.colors" <- function (n) 
{
	j <- n %/% 3
	k <- n %/% 3
	i <- n - j - k
	rval <- hsv(23/60, 1, v = seq(0.6, 0.85, len = i))
	rval <- c(rval, hsv(h = seq(23/60, 10/60, length = j), s = 1,
			    v = seq(0.85 , 1, length = j)))
	if(k > 0)
	  c(rval, hsv(h = seq(from = 10/60, to = 6/60, length.out = k),
		      s = seq(from =    1 , to = 0.3,  length.out = k), v = 1))
	else rval
}

"heat.colors" <- function (n) 
{
	j <- n %/% 4
	i <- n - j
	rval <- rainbow(i, start = 0, end = 1/6)
	if (j > 0)
	  c(rval, hsv(h = 1/6,
		      s = seq(from= 1, to= 1/(2*j), length.out = j), v = 1))
	else rval
}
