/*
 * This program produces a layout of a bed sheet consisting of
 * 3-colour squares.  The colours of the squares are chosen from
 * a palette of six, so there are 120 distinct squares, arranged
 * in a 12×10 matrix.
 *
 * Copyright © 2003 Marko Mäkelä (msmakela@nic.funet.fi).
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 */

#include <stdio.h>

/** colours */
static const unsigned char palette[][3] = {
  { 114, 9, 14 },
  { 113, 69, 102 },
  { 49, 74, 106 },
  { 71, 121, 189 },
  { 69, 80, 66 },
  { 195, 153, 67 },
};
static const unsigned char white[3] = {
  255, 255, 255
};

int
main (int argc, char** argv)
{
  unsigned x, y, xx, yy;
  unsigned middle = 4, inner = 3;
  puts ("P6\n72 60\n255");
  for (y = 10; y--; ) {
    unsigned middle2 = middle, inner2 = inner;
    if (!inner2--) { inner2 = 4; if (!middle2--) middle2 = 4; }
    if (!middle2 && !inner2) middle2 = 4, inner2 = 3;
    else if (inner2 == middle2 && !inner2--) inner2 = 4;
    for (yy = 5; yy--; ) {
      for (x = 12; x--; ) {
	for (xx = 5; xx--; ) {
	  unsigned c;
	  if (yy == 0 || yy == 4 ||
	      xx == 0 || xx == 4) /* outer */
	    c = x / 2;
	  else {
	    if (yy == 2 && xx == 2) /* inner */
	      c = x & 1 ? inner2 : inner;
	    else /* middle */
	      c = x & 1 ? middle2 : middle;
	    if (c >= x / 2)
	      c++;
	  }
	  fwrite (palette[c], 1, 3, stdout);
	}
	fwrite (white, 1, 3, stdout);
      }
    }
    for (xx = 72; xx--; )
      fwrite (white, 1, 3, stdout);
    if (!inner2--) { inner2 = 4; if (!middle2--) middle2 = 4; }
    if (!middle2 && !inner2) middle2 = 4, inner2 = 3;
    else if (inner2 == middle2 && !inner2--) inner2 = 4;
    middle = middle2, inner = inner2;
  }
  return 0;
}
