view clojure/com/aurellem/run/image.clj @ 488:09b3bc0b71b5

added rgb->gbRGB translation code.
author Robert McIntyre <rlm@mit.edu>
date Mon, 07 May 2012 12:31:16 -0500
parents 3f0156038802
children 641e1c511224 2304906d443b
line wrap: on
line source
1 (ns com.aurellem.run.image
2 (:use (com.aurellem.gb saves gb-driver util constants
3 items vbm characters money
4 rlm-assembly))
5 (:use (com.aurellem.run util title save-corruption
6 bootstrap-0 bootstrap-1))
7 (:require clojure.string)
8 (:import [com.aurellem.gb.gb_driver SaveState])
9 (:import java.io.File))
11 ;; want to display an image onto the screen.
12 ;; probably will be the six ponies, possibly with scrolling.
14 ;; probably don't need hi-color mode since the images shuld be
15 ;; simple.
17 ;; use background tiles? they provide greater color depth than
18 ;; sprites, and can still be scrolled, so why not?
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.
26 ;; the code snipped itself is by Brett Bibby and is translated here
27 ;; from C into clojure.
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).
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 };
39 ;; unsigned char influence[3][3] =
40 ;; {
41 ;; {16,4,4},
42 ;; {8,16,8},
43 ;; {0,8,16}
44 ;; };
46 ;; RGBQUAD translate(BYTE rgb[3])
47 ;; {
48 ;; RGBQUAD color;
49 ;; BYTE tmp[3];
50 ;; BYTE m[3][3];
51 ;; BYTE i,j;
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;
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 ;; }
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 ;; }
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 ;; }
80 ;; tmp[i]=(((m[0][i]+m[1][i]*2+m[2][i]*4)*5) >> 4)+32;
81 ;; }
83 ;; color.rgbRed = tmp[0];
84 ;; color.rgbGreen = tmp[1];
85 ;; color.rgbBlue = tmp[2];
87 ;; return color;
88 ;; }
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])
96 (def influence
97 [[16 4 4]
98 [8 16 8]
99 [0 8 16]])
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)))))]))