comparison clojure/com/aurellem/run/image.clj @ 489:641e1c511224

cleanup.
author Robert McIntyre <rlm@mit.edu>
date Mon, 07 May 2012 12:37:04 -0500
parents 09b3bc0b71b5
children 151c96d60921
comparison
equal deleted inserted replaced
488:09b3bc0b71b5 489:641e1c511224
16 16
17 ;; use background tiles? they provide greater color depth than 17 ;; use background tiles? they provide greater color depth than
18 ;; sprites, and can still be scrolled, so why not? 18 ;; sprites, and can still be scrolled, so why not?
19 19
20 20
21 ;; First of all, RGB colors in an image are not the same as those in a
22 ;; GameBoy, so I need to convert them. Fortunately, this code is
23 ;; already written for me in this C-code from the public domain
24 ;; hi-color converter by Glen Cook, Jeff Frohwein, and Rob Jones.
25
26 ;; the code snipped itself is by Brett Bibby and is translated here
27 ;; from C into clojure.
28
29
30 ;; This section of code is used to convert an RGB (pc) triplet into
31 ;; a RGB (gameboy) triplet. This section of code was kindly donated
32 ;; by Brett Bibby (GameBrains).
33
34 ;; BYTE intensity[32] = {
35 ;; 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x5e, 0x6c, 0x7a, 0x88, 0x94,
36 ;; 0xa0, 0xae, 0xb7, 0xbf, 0xc6, 0xce, 0xd3, 0xd9, 0xdf, 0xe3, 0xe7,
37 ;; 0xeb, 0xef, 0xf3, 0xf6, 0xf9, 0xfb, 0xfd, 0xfe, 0xff, 0xff };
38
39 ;; unsigned char influence[3][3] =
40 ;; {
41 ;; {16,4,4},
42 ;; {8,16,8},
43 ;; {0,8,16}
44 ;; };
45
46 ;; RGBQUAD translate(BYTE rgb[3])
47 ;; {
48 ;; RGBQUAD color;
49 ;; BYTE tmp[3];
50 ;; BYTE m[3][3];
51 ;; BYTE i,j;
52
53 ;; for (i=0;i<3;i++)
54 ;; for (j=0;j<3;j++)
55 ;; m[i][j] = (intensity[rgb[i]>>3]*influence[i][j]) >> 5;
56
57 ;; for (i=0;i<3;i++)
58 ;; {
59 ;; if (m[0][i]>m[1][i])
60 ;; {
61 ;; j=m[0][i];
62 ;; m[0][i]=m[1][i];
63 ;; m[1][i]=j;
64 ;; }
65
66 ;; if (m[1][i]>m[2][i])
67 ;; {
68 ;; j=m[1][i];
69 ;; m[1][i]=m[2][i];
70 ;; m[2][i]=j;
71 ;; }
72
73 ;; if (m[0][i]>m[1][i])
74 ;; {
75 ;; j=m[0][i];
76 ;; m[0][i]=m[1][i];
77 ;; m[1][i]=j;
78 ;; }
79
80 ;; tmp[i]=(((m[0][i]+m[1][i]*2+m[2][i]*4)*5) >> 4)+32;
81 ;; }
82
83 ;; color.rgbRed = tmp[0];
84 ;; color.rgbGreen = tmp[1];
85 ;; color.rgbBlue = tmp[2];
86
87 ;; return color;
88 ;; }
89
90
91 (def intensity
92 [0x00 0x10 0x20 0x30 0x40 0x50 0x5e 0x6c 0x7a 0x88 0x94
93 0xa0 0xae 0xb7 0xbf 0xc6 0xce 0xd3 0xd9 0xdf 0xe3 0xe7
94 0xeb 0xef 0xf3 0xf6 0xf9 0xfb 0xfd 0xfe 0xff 0xff])
95
96 (def influence
97 [[16 4 4]
98 [8 16 8]
99 [0 8 16]])
100
101 (defn rgb->gb-rb [[r g b]]
102 (let [color-matrix
103 (map
104 (fn [color-row]
105 (map
106 (fn [color]
107 (bit-shift-right
108 (* (intensity (bit-shift-right r 3))
109 color) 5)))))]))
110
111