+#include "board.h"
+
+static const char shapes[7][4][4][4] = {
+ /*
+ * 4 rotations of 4x4 pixels per shape
+ * high nibble signifies joinage (left, right, top, bottom, from MSB)
+ * low nibble identifies block type (typically 2..8)
+ */
+
+ // J
+ { { { 0, 0, 0, 0000},
+ {0x47, 0xC7, 0x97, 0000},
+ { 0, 0, 0x27, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0x17, 0, 0000},
+ { 0, 0x37, 0, 0000},
+ {0x47, 0xA7, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { {0x17, 0, 0, 0000},
+ {0x67, 0xC7, 0x87, 0000},
+ { 0, 0, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0x57, 0x87, 0000},
+ { 0, 0x37, 0, 0000},
+ { 0, 0x27, 0, 0000},
+ {0000, 0000, 0000, 0000} } },
+
+ // L
+ { { { 0, 0, 0, 0000},
+ {0x53, 0xC3, 0x83, 0000},
+ {0x23, 0, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { {0x43, 0x93, 0, 0000},
+ { 0, 0x33, 0, 0000},
+ { 0, 0x23, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0, 0x13, 0000},
+ {0x43, 0xC3, 0xA3, 0000},
+ { 0, 0, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0x13, 0, 0000},
+ { 0, 0x33, 0, 0000},
+ { 0, 0x63, 0x83, 0000},
+ {0000, 0000, 0000, 0000} } },
+
+ // T
+ { { { 0, 0, 0, 0000},
+ {0x48, 0xD8, 0x88, 0000},
+ { 0, 0x28, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0x18, 0, 0000},
+ {0x48, 0xB8, 0, 0000},
+ { 0, 0x28, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0x18, 0, 0000},
+ {0x48, 0xE8, 0x88, 0000},
+ { 0, 0, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0x18, 0, 0000},
+ { 0, 0x78, 0x88, 0000},
+ { 0, 0x28, 0, 0000},
+ {0000, 0000, 0000, 0000} } },
+
+ // S
+ { { { 0, 0, 0, 0000},
+ { 0, 0x52, 0x82, 0000},
+ {0x42, 0xA2, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { {0x12, 0, 0, 0000},
+ {0x62, 0x92, 0, 0000},
+ { 0, 0x22, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0, 0, 0000},
+ { 0, 0x52, 0x82, 0000},
+ {0x42, 0xA2, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { {0x12, 0, 0, 0000},
+ {0x62, 0x92, 0, 0000},
+ { 0, 0x22, 0, 0000},
+ {0000, 0000, 0000, 0000} } },
+
+ // Z
+ { { { 0, 0, 0, 0000},
+ {0x46, 0x96, 0, 0000},
+ { 0, 0x66, 0x86, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0x16, 0, 0000},
+ {0x56, 0xA6, 0, 0000},
+ {0x26, 0, 0, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0, 0, 0000},
+ {0x46, 0x96, 0, 0000},
+ { 0, 0x66, 0x86, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0x16, 0, 0000},
+ {0x56, 0xA6, 0, 0000},
+ {0x26, 0, 0, 0000},
+ {0000, 0000, 0000, 0000} } },
+
+ // I
+ { { { 0, 0, 0, 0},
+ {0x44, 0xC4, 0xC4, 0x84},
+ { 0, 0, 0, 0},
+ { 0, 0, 0, 0} },
+ { { 0, 0x14, 0, 0},
+ { 0, 0x34, 0, 0},
+ { 0, 0x34, 0, 0},
+ { 0, 0x24, 0, 0} },
+ { { 0, 0, 0, 0},
+ {0x44, 0xC4, 0xC4, 0x84},
+ { 0, 0, 0, 0},
+ { 0, 0, 0, 0} },
+ { { 0, 0x14, 0, 0},
+ { 0, 0x34, 0, 0},
+ { 0, 0x34, 0, 0},
+ { 0, 0x24, 0, 0} } },
+
+ // O
+ { { { 0, 0, 0, 0000},
+ { 0, 0x55, 0x95, 0000},
+ { 0, 0x65, 0xA5, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0, 0, 0000},
+ { 0, 0x55, 0x95, 0000},
+ { 0, 0x65, 0xA5, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0, 0, 0000},
+ { 0, 0x55, 0x95, 0000},
+ { 0, 0x65, 0xA5, 0000},
+ {0000, 0000, 0000, 0000} },
+ { { 0, 0, 0, 0000},
+ { 0, 0x55, 0x95, 0000},
+ { 0, 0x65, 0xA5, 0000},
+ {0000, 0000, 0000, 0000} } }
+};
+
+int shape_iterate(char s, int scr, int y, int x, ShapeDrawFunc func)
+{ //Draw a certain shape using <ShapeDrawFunc>
+ int i, j, result;
+ char type, rotation;
+
+ type = s / 4;
+ rotation = s & 3;
+ for (i = 0; i < 4; i++)
+ for (j = 0; j < 4; j++)
+ if (shapes[type][rotation][i][j])
+ if (result = func(scr, y-i, x+j, shapes[type][rotation][i][j]))
+ return result;
+ return 0;
+}