function tvrd8,in1,in2,in3,in4,in5,ncolors=nc,_extra=extra
  ; written by Atle Borsholm, Dec. 6, 2000
  true=3
  case n_params() of
  0: im3d=tvrd(true=true,_extra=extra)
  1: im3d=tvrd(in1,true=true,_extra=extra)
  2: im3d=tvrd(in1,in2,true=true,_extra=extra)
  3: im3d=tvrd(in1,in2,in3,true=true,_extra=extra)
  4: im3d=tvrd(in1,in2,in3,in4,true=true,_extra=extra)
  5: im3d=tvrd(in1,in2,in3,in4,in5,true=true,_extra=extra)
  endcase
  ;
  ; algorithm starts here
  ;
  im3d=long(im3d[*,*,0]) or ishft(long(im3d[*,*,1]),8) or ishft(long((temporary(im3d))[*,*,2]),16)
  if (size(nc,/type) eq 0) then nc=!d.table_size
  nx=(size(im3d,/dim))[0]
  ny=(size(im3d,/dim))[1]
  tvlct,red,green,blue,/get
  red=red[0:nc-1]
  green=green[0:nc-1]
  blue=blue[0:nc-1]
  ct=long(red)+ishft(long(green),8)+ishft(long(blue),16)
  ctsort=sort(ct)
  ct=ct[ctsort]
  for hi_bit=0,7 do if (ishft(nc,-hi_bit) le 1) then break
  index=bytarr(nx*ny)+ishft(1b,hi_bit)
  for i=hi_bit,0,-1 do begin
    over=where(im3d gt ct[index<(nc-1)])
    under=where(im3d lt ct[index<(nc-1)])
    if (over[0] ne -1) then index[over]=index[over] or ishft(1b,i-1)
    if (under[0] ne -1) then index[under]=index[under] xor (ishft(1b,i) or ishft(1b,i-1))
  endfor
  im2d=reform(byte(ctsort[index<(nc-1)]),nx,ny)
  return,im2d<byte(nc-1)
end



