;;;Special Definitions Used for our Procedure
(define rgb-average
  (lambda (c1 c2)
    (rgb-new (quotient (+ (rgb-red c1) (rgb-red c2)) 2)
             (quotient (+ (rgb-green c1) (rgb-green c2)) 2)
             (quotient (+ (rgb-blue c1) (rgb-blue c2)) 2))))

(define fractal-rectangle!
  (lambda (image color left top right bottom level)
    (cond
      ; Base case: We're at a level in which we just draw the rectangle.
      ((= level 0)
       (context-set-fgcolor! color)
       (image-select-rectangle! image selection-replace
                                left top 
                                (- right left)
                                (- bottom top))
       (image-fill! image)
       (image-select-nothing! image)
       (context-update-displays!))
      ; Recursive case: Break the rectangle into a few parts and recurse
      ; on each.
      (else
       (let* ((midcol1 (round (+ left (/ (- right left) 4))))
              (midcol2 (round (+ midcol1 (/ (- right left) 4))))
              (midrow1 (round (+ top (/ (- bottom top) 4))))
              (midrow2 (round (+ midrow1 (/ (- bottom top) 4)))))
         ; First row of squares
         (fractal-rectangle! image 
                             (rgb-average color color-white)
                             left top 
                             midcol1 midrow1
                             (- level 1))
         (fractal-rectangle! image 
                             (rgb-average color color-black)
                             midcol1 top 
                             midcol2 midrow1
                             (- level 1))
         (fractal-rectangle! image 
                             (rgb-average color color-white)
                             midcol2 top 
                             right midrow1
                             (- level 1))
         ; Second row of squares
         (fractal-rectangle! image 
                             (rgb-average color color-black)
                             left midrow1
                             midcol1 midrow2
                             (- level 1))
         (fractal-rectangle! image 
                             (rgb-average color color-white)
                             midcol1 midrow1
                             midcol2 midrow2
                             (- level 1))
         (fractal-rectangle! image 
                             (rgb-average color color-black)
                             midcol2 midrow1
                             right midrow2
                             (- level 1))
         ; Third row of squares
         (fractal-rectangle! image 
                             (rgb-average color color-white)
                             left midrow2
                             midcol1 bottom
                             (- level 1))
         (fractal-rectangle! image 
                             (rgb-average color color-black)
                             midcol1 midrow2
                             midcol2 bottom
                             (- level 1))
         (fractal-rectangle! image 
                             (rgb-average color color-white)
                             midcol2 midrow2
                             right bottom
                             (- level 1))
         )))))

(define darker (o rgb-darker rgb-darker rgb-darker rgb-darker rgb-darker rgb-darker))

(define greener (o rgb-greener rgb-greener rgb-greener rgb-greener rgb-greener rgb-greener))

(define redder (o rgb-redder rgb-redder rgb-redder rgb-redder rgb-redder rgb-redder))

(define bluer (o rgb-bluer rgb-bluer rgb-bluer rgb-bluer rgb-bluer rgb-bluer))

(define lighter (o rgb-lighter rgb-lighter rgb-lighter rgb-lighter rgb-lighter rgb-lighter rgb-lighter))

;;; Our Procedure

(define my-series
  (lambda (n width height)
    (let* ((canvas (image-new width height))
           (vector-colors (list->vector (context-list-colors)))
           (vector-transforms (vector redder
                                      bluer
                                      greener
                                      rgb-rotate
                                      rgb-complement
                                      lighter
                                      darker))
           (some-color1 ((vector-ref vector-transforms (modulo (inexact->exact (round (/ n 5))) (vector-length vector-transforms))) (cname->rgb (vector-ref vector-colors (modulo n (vector-length vector-colors))))))
           (some-color2 ((vector-ref vector-transforms (modulo (inexact->exact (round (/ n 2))) (vector-length vector-transforms))) (cname->rgb (vector-ref vector-colors (modulo n (vector-length vector-colors))))))
           (some-color3 ((vector-ref vector-transforms (modulo (inexact->exact (round (/ n 3))) (vector-length vector-transforms))) (cname->rgb (vector-ref vector-colors (modulo n (vector-length vector-colors))))))
           (some-color4 ((vector-ref vector-transforms (modulo (inexact->exact (round (/ n 3))) (vector-length vector-transforms))) (cname->rgb (vector-ref vector-colors (modulo n (vector-length vector-colors)))))))
      (image-show canvas)
      
    (fractal-rectangle! canvas some-color1 0 0 width height 2)
      
      (fractal-rectangle! canvas ((vector-ref vector-transforms (modulo (* n 5) (vector-length vector-transforms))) some-color1) (/ width 15) (/ height 15) (* .95 width) (* .95 height) 2)
      
      (fractal-rectangle! canvas some-color2 (* 2 (/ width 15)) (* 2 (/ height 15)) (* .90 width) (* .90 height) 2)
      
      (fractal-rectangle! canvas some-color3  (* 3 (/ width 15)) (* 3 (/ height 15)) (* .85 width) (* .85 height) 2)
      
      (fractal-rectangle! canvas ((vector-ref vector-transforms (modulo (* n 3) (vector-length vector-transforms))) some-color2) (* 4 (/ width 15)) (* 4 (/ height 15)) (* .80 width) (* .80 height) 2)
      
      (fractal-rectangle! canvas ((vector-ref vector-transforms (modulo (inexact->exact (round (/ n 6))) (vector-length vector-transforms))) some-color3) (* 5 (/ width 15)) (* 5 (/ height 15)) (* .75 width) (* .75 height) 2)
      
      (fractal-rectangle! canvas some-color4 (* 6 (/ width 15)) (* 6 (/ height 15)) (* .70 width) (* .70 height) 2))))