random bug fixes
[drnoksnes] / pixform.h
1 /*
2  * Snes9x - Portable Super Nintendo Entertainment System (TM) emulator.
3  *
4  * (c) Copyright 1996 - 2001 Gary Henderson (gary.henderson@ntlworld.com) and
5  *                           Jerremy Koot (jkoot@snes9x.com)
6  *
7  * Super FX C emulator code 
8  * (c) Copyright 1997 - 1999 Ivar (ivar@snes9x.com) and
9  *                           Gary Henderson.
10  * Super FX assembler emulator code (c) Copyright 1998 zsKnight and _Demo_.
11  *
12  * DSP1 emulator code (c) Copyright 1998 Ivar, _Demo_ and Gary Henderson.
13  * C4 asm and some C emulation code (c) Copyright 2000 zsKnight and _Demo_.
14  * C4 C code (c) Copyright 2001 Gary Henderson (gary.henderson@ntlworld.com).
15  *
16  * DOS port code contains the works of other authors. See headers in
17  * individual files.
18  *
19  * Snes9x homepage: http://www.snes9x.com
20  *
21  * Permission to use, copy, modify and distribute Snes9x in both binary and
22  * source form, for non-commercial purposes, is hereby granted without fee,
23  * providing that this license information and copyright notice appear with
24  * all copies and any derived work.
25  *
26  * This software is provided 'as-is', without any express or implied
27  * warranty. In no event shall the authors be held liable for any damages
28  * arising from the use of this software.
29  *
30  * Snes9x is freeware for PERSONAL USE only. Commercial users should
31  * seek permission of the copyright holders first. Commercial use includes
32  * charging money for Snes9x or software derived from Snes9x.
33  *
34  * The copyright holders request that bug fixes and improvements to the code
35  * should be forwarded to them so everyone can benefit from the modifications
36  * in future versions.
37  *
38  * Super NES and Super Nintendo Entertainment System are trademarks of
39  * Nintendo Co., Limited and its subsidiary companies.
40  */
41 #ifndef _PIXFORM_H_
42 #define _PIXFORM_H_
43
44 #ifdef GFX_MULTI_FORMAT
45
46 enum { RGB565, RGB555, BGR565, BGR555, GBR565, GBR555, RGB5551 };
47
48 #define BUILD_PIXEL(R,G,B) ((*GFX.BuildPixel) (R, G, B))
49 #define BUILD_PIXEL2(R,G,B) ((*GFX.BuildPixel2) (R, G, B))
50 #define DECOMPOSE_PIXEL(Pixel,R,G,B) ((*GFX.DecomposePixel) (Pixel, R,G,B))
51
52 extern uint32 RED_LOW_BIT_MASK;
53 extern uint32 GREEN_LOW_BIT_MASK;
54 extern uint32 BLUE_LOW_BIT_MASK;
55 extern uint32 RED_HI_BIT_MASK;
56 extern uint32 GREEN_HI_BIT_MASK;
57 extern uint32 BLUE_HI_BIT_MASK;
58 extern uint32 MAX_RED;
59 extern uint32 MAX_GREEN;
60 extern uint32 MAX_BLUE;
61 extern uint32 SPARE_RGB_BIT_MASK;
62 extern uint32 GREEN_HI_BIT;
63 extern uint32 RGB_LOW_BITS_MASK;
64 extern uint32 RGB_HI_BITS_MASK;
65 extern uint32 RGB_HI_BITS_MASKx2;
66 extern uint32 RGB_REMOVE_LOW_BITS_MASK;
67 extern uint32 FIRST_COLOR_MASK;
68 extern uint32 SECOND_COLOR_MASK;
69 extern uint32 THIRD_COLOR_MASK;
70 extern uint32 ALPHA_BITS_MASK;
71 extern uint32 FIRST_THIRD_COLOR_MASK;
72 extern uint32 TWO_LOW_BITS_MASK;
73 extern uint32 HIGH_BITS_SHIFTED_TWO_MASK;
74
75 #endif
76
77 // RGB565 format
78 #define BUILD_PIXEL_RGB565(R,G,B) (((int) (R) << 11) | ((int) (G) << 6) | (int) (B))
79 #define BUILD_PIXEL2_RGB565(R,G,B) (((int) (R) << 11) | ((int) (G) << 5) | (int) (B))
80 #define DECOMPOSE_PIXEL_RGB565(PIX,R,G,B) {(R) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (B) = (PIX) & 0x1f; }
81 #define SPARE_RGB_BIT_MASK_RGB565 (1 << 5)
82
83 #define MAX_RED_RGB565            31
84 #define MAX_GREEN_RGB565          63
85 #define MAX_BLUE_RGB565           31
86 #define RED_LOW_BIT_MASK_RGB565   0x0800
87 #define GREEN_LOW_BIT_MASK_RGB565 0x0020
88 #define BLUE_LOW_BIT_MASK_RGB565  0x0001
89 #define RED_HI_BIT_MASK_RGB565    0x8000
90 #define GREEN_HI_BIT_MASK_RGB565  0x0400
91 #define BLUE_HI_BIT_MASK_RGB565   0x0010
92 #define FIRST_COLOR_MASK_RGB565   0xF800
93 #define SECOND_COLOR_MASK_RGB565  0x07E0
94 #define THIRD_COLOR_MASK_RGB565   0x001F
95 #define ALPHA_BITS_MASK_RGB565    0x0000 
96
97 // RGB555 format
98 #define BUILD_PIXEL_RGB555(R,G,B) (((int) (R) << 10) | ((int) (G) << 5) | (int) (B))
99 #define BUILD_PIXEL2_RGB555(R,G,B) (((int) (R) << 10) | ((int) (G) << 5) | (int) (B))
100 #define DECOMPOSE_PIXEL_RGB555(PIX,R,G,B) {(R) = (PIX) >> 10; (G) = ((PIX) >> 5) & 0x1f; (B) = (PIX) & 0x1f; }
101 #define SPARE_RGB_BIT_MASK_RGB555 (1 << 15)
102
103 #define MAX_RED_RGB555            31
104 #define MAX_GREEN_RGB555          31
105 #define MAX_BLUE_RGB555           31
106 #define RED_LOW_BIT_MASK_RGB555   0x0400
107 #define GREEN_LOW_BIT_MASK_RGB555 0x0020
108 #define BLUE_LOW_BIT_MASK_RGB555  0x0001
109 #define RED_HI_BIT_MASK_RGB555    0x4000
110 #define GREEN_HI_BIT_MASK_RGB555  0x0200
111 #define BLUE_HI_BIT_MASK_RGB555   0x0010
112 #define FIRST_COLOR_MASK_RGB555   0x7C00
113 #define SECOND_COLOR_MASK_RGB555  0x03E0
114 #define THIRD_COLOR_MASK_RGB555   0x001F
115 #define ALPHA_BITS_MASK_RGB555    0x0000
116
117 // BGR565 format
118 #define BUILD_PIXEL_BGR565(R,G,B) (((int) (B) << 11) | ((int) (G) << 6) | (int) (R))
119 #define BUILD_PIXEL2_BGR565(R,G,B) (((int) (B) << 11) | ((int) (G) << 5) | (int) (R))
120 #define DECOMPOSE_PIXEL_BGR565(PIX,R,G,B) {(B) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (R) = (PIX) & 0x1f; }
121 #define SPARE_RGB_BIT_MASK_BGR565 (1 << 5)
122
123 #define MAX_RED_BGR565            31
124 #define MAX_GREEN_BGR565          63
125 #define MAX_BLUE_BGR565           31
126 #define RED_LOW_BIT_MASK_BGR565   0x0001
127 #define GREEN_LOW_BIT_MASK_BGR565 0x0040
128 #define BLUE_LOW_BIT_MASK_BGR565  0x0800
129 #define RED_HI_BIT_MASK_BGR565    0x0010
130 #define GREEN_HI_BIT_MASK_BGR565  0x0400
131 #define BLUE_HI_BIT_MASK_BGR565   0x8000
132 #define FIRST_COLOR_MASK_BGR565   0xF800
133 #define SECOND_COLOR_MASK_BGR565  0x07E0
134 #define THIRD_COLOR_MASK_BGR565   0x001F
135 #define ALPHA_BITS_MASK_BGR565    0x0000
136
137 // BGR555 format
138 #define BUILD_PIXEL_BGR555(R,G,B) (((int) (B) << 10) | ((int) (G) << 5) | (int) (R))
139 #define BUILD_PIXEL2_BGR555(R,G,B) (((int) (B) << 10) | ((int) (G) << 5) | (int) (R))
140 #define DECOMPOSE_PIXEL_BGR555(PIX,R,G,B) {(B) = (PIX) >> 10; (G) = ((PIX) >> 5) & 0x1f; (R) = (PIX) & 0x1f; }
141 #define SPARE_RGB_BIT_MASK_BGR555 (1 << 15)
142
143 #define MAX_RED_BGR555            31
144 #define MAX_GREEN_BGR555          31
145 #define MAX_BLUE_BGR555           31
146 #define RED_LOW_BIT_MASK_BGR555   0x0001
147 #define GREEN_LOW_BIT_MASK_BGR555 0x0020
148 #define BLUE_LOW_BIT_MASK_BGR555  0x0400
149 #define RED_HI_BIT_MASK_BGR555    0x0010
150 #define GREEN_HI_BIT_MASK_BGR555  0x0200
151 #define BLUE_HI_BIT_MASK_BGR555   0x4000
152 #define FIRST_COLOR_MASK_BGR555   0x7C00
153 #define SECOND_COLOR_MASK_BGR555  0x03E0
154 #define THIRD_COLOR_MASK_BGR555   0x001F
155 #define ALPHA_BITS_MASK_BGR555    0x0000
156
157 // GBR565 format
158 #define BUILD_PIXEL_GBR565(R,G,B) (((int) (G) << 11) | ((int) (B) << 6) | (int) (R))
159 #define BUILD_PIXEL2_GBR565(R,G,B) (((int) (G) << 11) | ((int) (B) << 5) | (int) (R))
160 #define DECOMPOSE_PIXEL_GBR565(PIX,R,G,B) {(G) = (PIX) >> 11; (B) = ((PIX) >> 6) & 0x1f; (R) = (PIX) & 0x1f; }
161 #define SPARE_RGB_BIT_MASK_GBR565 (1 << 5)
162
163 #define MAX_RED_GBR565            31
164 #define MAX_BLUE_GBR565           63
165 #define MAX_GREEN_GBR565          31
166 #define RED_LOW_BIT_MASK_GBR565   0x0001
167 #define BLUE_LOW_BIT_MASK_GBR565  0x0040
168 #define GREEN_LOW_BIT_MASK_GBR565 0x0800
169 #define RED_HI_BIT_MASK_GBR565    0x0010
170 #define BLUE_HI_BIT_MASK_GBR565   0x0400
171 #define GREEN_HI_BIT_MASK_GBR565  0x8000
172 #define FIRST_COLOR_MASK_GBR565   0xF800
173 #define SECOND_COLOR_MASK_GBR565  0x07E0
174 #define THIRD_COLOR_MASK_GBR565   0x001F
175 #define ALPHA_BITS_MASK_GBR565    0x0000
176
177 // GBR555 format
178 #define BUILD_PIXEL_GBR555(R,G,B) (((int) (G) << 10) | ((int) (B) << 5) | (int) (R))
179 #define BUILD_PIXEL2_GBR555(R,G,B) (((int) (G) << 10) | ((int) (B) << 5) | (int) (R))
180 #define DECOMPOSE_PIXEL_GBR555(PIX,R,G,B) {(G) = (PIX) >> 10; (B) = ((PIX) >> 5) & 0x1f; (R) = (PIX) & 0x1f; }
181 #define SPARE_RGB_BIT_MASK_GBR555 (1 << 15)
182
183 #define MAX_RED_GBR555            31
184 #define MAX_BLUE_GBR555           31
185 #define MAX_GREEN_GBR555          31
186 #define RED_LOW_BIT_MASK_GBR555   0x0001
187 #define BLUE_LOW_BIT_MASK_GBR555  0x0020
188 #define GREEN_LOW_BIT_MASK_GBR555 0x0400
189 #define RED_HI_BIT_MASK_GBR555    0x0010
190 #define BLUE_HI_BIT_MASK_GBR555   0x0200
191 #define GREEN_HI_BIT_MASK_GBR555  0x4000
192 #define FIRST_COLOR_MASK_GBR555   0x7C00
193 #define SECOND_COLOR_MASK_GBR555  0x03E0
194 #define THIRD_COLOR_MASK_GBR555   0x001F
195 #define ALPHA_BITS_MASK_GBR555    0x0000
196
197 // RGB5551 format
198 #define BUILD_PIXEL_RGB5551(R,G,B) (((int) (R) << 11) | ((int) (G) << 6) | (int) ((B) << 1) | 1)
199 #define BUILD_PIXEL2_RGB5551(R,G,B) (((int) (R) << 11) | ((int) (G) << 6) | (int) ((B) << 1) | 1)
200 #define DECOMPOSE_PIXEL_RGB5551(PIX,R,G,B) {(R) = (PIX) >> 11; (G) = ((PIX) >> 6) & 0x1f; (B) = ((PIX) >> 1) & 0x1f; }
201 #define SPARE_RGB_BIT_MASK_RGB5551 (1)
202
203 #define MAX_RED_RGB5551            31
204 #define MAX_GREEN_RGB5551          31
205 #define MAX_BLUE_RGB5551           31
206 #define RED_LOW_BIT_MASK_RGB5551   0x0800
207 #define GREEN_LOW_BIT_MASK_RGB5551 0x0040
208 #define BLUE_LOW_BIT_MASK_RGB5551  0x0002
209 #define RED_HI_BIT_MASK_RGB5551    0x8000
210 #define GREEN_HI_BIT_MASK_RGB5551  0x0400
211 #define BLUE_HI_BIT_MASK_RGB5551   0x0020
212 #define FIRST_COLOR_MASK_RGB5551   0xf800
213 #define SECOND_COLOR_MASK_RGB5551  0x07c0
214 #define THIRD_COLOR_MASK_RGB5551   0x003e
215 #define ALPHA_BITS_MASK_RGB5551    0x0001
216
217 #ifndef GFX_MULTI_FORMAT
218 #define CONCAT(X,Y) X##Y
219
220 // C pre-processor needs a two stage macro define to enable it to concat
221 // to macro names together to form the name of another macro.
222 #define BUILD_PIXEL_D(F,R,G,B) CONCAT(BUILD_PIXEL_,F) (R,G,B)
223 #define BUILD_PIXEL2_D(F,R,G,B) CONCAT(BUILD_PIXEL2_,F) (R,G,B)
224 #define DECOMPOSE_PIXEL_D(F,PIX,R,G,B) CONCAT(DECOMPOSE_PIXEL_,F) (PIX,R,G,B)
225
226 #define BUILD_PIXEL(R,G,B) BUILD_PIXEL_D(PIXEL_FORMAT,R,G,B)
227 #define BUILD_PIXEL2(R,G,B) BUILD_PIXEL2_D(PIXEL_FORMAT,R,G,B)
228 #define DECOMPOSE_PIXEL(PIX,R,G,B) DECOMPOSE_PIXEL_D(PIXEL_FORMAT,PIX,R,G,B)
229
230 #define MAX_RED_D(F)            CONCAT(MAX_RED_,F)
231 #define MAX_BLUE_D(F)           CONCAT(MAX_BLUE_,F)
232 #define MAX_GREEN_D(F)          CONCAT(MAX_GREEN_,F)
233 #define RED_LOW_BIT_MASK_D(F)   CONCAT(RED_LOW_BIT_MASK_,F)
234 #define BLUE_LOW_BIT_MASK_D(F)  CONCAT(BLUE_LOW_BIT_MASK_,F)
235 #define GREEN_LOW_BIT_MASK_D(F) CONCAT(GREEN_LOW_BIT_MASK_,F)
236 #define RED_HI_BIT_MASK_D(F)    CONCAT(RED_HI_BIT_MASK_,F)
237 #define BLUE_HI_BIT_MASK_D(F)   CONCAT(BLUE_HI_BIT_MASK_,F)
238 #define GREEN_HI_BIT_MASK_D(F)  CONCAT(GREEN_HI_BIT_MASK_,F)
239 #define FIRST_COLOR_MASK_D(F)   CONCAT(FIRST_COLOR_MASK_,F)
240 #define SECOND_COLOR_MASK_D(F)  CONCAT(SECOND_COLOR_MASK_,F)
241 #define THIRD_COLOR_MASK_D(F)   CONCAT(THIRD_COLOR_MASK_,F)
242 #define ALPHA_BITS_MASK_D(F)    CONCAT(ALPHA_BITS_MASK_,F)
243
244 #define MAX_RED                 MAX_RED_D(PIXEL_FORMAT)
245 #define MAX_BLUE                MAX_BLUE_D(PIXEL_FORMAT)
246 #define MAX_GREEN               MAX_GREEN_D(PIXEL_FORMAT)
247 #define RED_LOW_BIT_MASK        RED_LOW_BIT_MASK_D(PIXEL_FORMAT)
248 #define BLUE_LOW_BIT_MASK       BLUE_LOW_BIT_MASK_D(PIXEL_FORMAT)
249 #define GREEN_LOW_BIT_MASK      GREEN_LOW_BIT_MASK_D(PIXEL_FORMAT)
250 #define RED_HI_BIT_MASK         RED_HI_BIT_MASK_D(PIXEL_FORMAT)
251 #define BLUE_HI_BIT_MASK        BLUE_HI_BIT_MASK_D(PIXEL_FORMAT)
252 #define GREEN_HI_BIT_MASK       GREEN_HI_BIT_MASK_D(PIXEL_FORMAT)
253 #define FIRST_COLOR_MASK        FIRST_COLOR_MASK_D(PIXEL_FORMAT)
254 #define SECOND_COLOR_MASK       SECOND_COLOR_MASK_D(PIXEL_FORMAT)
255 #define THIRD_COLOR_MASK        THIRD_COLOR_MASK_D(PIXEL_FORMAT)
256 #define ALPHA_BITS_MASK         ALPHA_BITS_MASK_D(PIXEL_FORMAT)
257
258 #define GREEN_HI_BIT       ((MAX_GREEN + 1) >> 1)
259 #define RGB_LOW_BITS_MASK (RED_LOW_BIT_MASK | GREEN_LOW_BIT_MASK | \
260                            BLUE_LOW_BIT_MASK)
261 #define RGB_HI_BITS_MASK  (RED_HI_BIT_MASK | GREEN_HI_BIT_MASK | \
262                            BLUE_HI_BIT_MASK)
263 #define RGB_HI_BITS_MASKx2 ((RED_HI_BIT_MASK | GREEN_HI_BIT_MASK | \
264                              BLUE_HI_BIT_MASK) << 1)
265 #define RGB_REMOVE_LOW_BITS_MASK (~RGB_LOW_BITS_MASK)
266 #define FIRST_THIRD_COLOR_MASK (FIRST_COLOR_MASK | THIRD_COLOR_MASK)
267 #define TWO_LOW_BITS_MASK (RGB_LOW_BITS_MASK | (RGB_LOW_BITS_MASK << 1))
268 #define HIGH_BITS_SHIFTED_TWO_MASK (( (FIRST_COLOR_MASK | SECOND_COLOR_MASK | THIRD_COLOR_MASK) & \
269                                 ~TWO_LOW_BITS_MASK ) >> 2)
270 #endif
271
272 #endif