/*
  #include
*/
#include "svg.h"


/*
  #define
*/
#define RECT_WIDTH  10
#define RECT_HEIGHT 10
#define SPACE        8
#define X_OFFSET    15
#define Y_OFFSET    30

/*
  function
*/
double draw_rects(double x, double y, double color, const double w, const double h, const double s, const double x_offset, const double y_offset);
double draw_rect(double color, const double x, const double y, const double w, const double h, const double s);

/*
  main
*/
int main(void) {
    double color;
    double x, y;
    double w, h, s;
    double ox, oy;
    int i;

    start();

    ox = x = X_OFFSET;
    oy = y = Y_OFFSET;
    for (i = 0, color = 0, s = 100, w = RECT_WIDTH, h = RECT_HEIGHT; i < 10; ++i) {
        // 現在座標や大きさに基づき長方形を描いていく
        color = draw_rects(x, y, color, w, h, s, ox, oy);
        ox = x = randomInRange(X_OFFSET, WIDTH - X_OFFSET - 20);
        oy = y = randomInRange(Y_OFFSET, HEIGHT - Y_OFFSET - 20);
        // 大きさと色成分を縮小
        s *= 0.8;
        w *= 0.9;
        h *= 0.9;
    }

    // 字を書く
    fill(rgb255(40, 80, 40));
    textFont("Verdana", 6);
    text("Kagawa University", 0, 8);
    text("OpenCampus", WIDTH - 60, HEIGHT - 8);

    finish();
    return 0;
}

double draw_rect(double color, const double x, const double y, const double w, const double h, const double s) {
    // カラフルな長方形1個を描く
    if (100 < color * 5) color = 0;
    fill(hsb100(color * 5, s, 100));
    rect(x, y, w, h);
    return color;
}

double draw_rects(double x, double y, double color,
                  const double w, const double h, const double s, const double x_offset, const double y_offset) {
    // ずらしながら長方形を描いていく
    for (; y + h < HEIGHT - h - y_offset; y += h + SPACE, ++color) {
        color = draw_rect(color, x, y, w, h, s);
    }
    for (; x + w < WIDTH - w - x_offset; x += w + SPACE, ++color) {
        color = draw_rect(color, x, y, w, h, s);
    }
    for (; y >= y_offset + h; y -= (h + SPACE), ++color) {
        color = draw_rect(color, x, y, w, h, s);
    }
    for (; x >= x_offset + w; x -= (w + SPACE), ++color) {
        color = draw_rect(color, x, y, w, h, s);
    }

    return color;
}
