# usage: # $iter = range(\@fromRGB, \@toRGB, \@weights, $size); # my $iter = range( # [0,0,0] => [255,255,255], # [ (1) x 100 ], # 255 # ); # # while (my ($rgb_ref, $width) = $iter->()) { ... } sub range { my ($from,$to,$w,$s) = @_; my $i = 0; my @steps = map +($to->[$_] - $from->[$_])/$#$w, 0..2; my $c = $from; my $f = 0; $i += $_ for @$w; # this (CRUFTILY) converts an array of floats # with a sum of X to an array of ints that still # has that same sum of X $w = [ map { my $v = $f + $s*$_/$i; $f = $v - int($v); int $v } @$w ]; $w->[-1] += $f; sub {{ my $ret = [ @$c ]; return if !@$w; $c = [ map $steps[$_] + $c->[$_], 0..2 ]; return ($ret, shift @$w) if $w->[0]; shift @$w, redo; }}; }