1 | /*****************************************************************************\ |
2 | Snes9x - Portable Super Nintendo Entertainment System (TM) emulator. |
3 | This file is licensed under the Snes9x License. |
4 | For further information, consult the LICENSE file in the root directory. |
5 | \*****************************************************************************/ |
6 | |
7 | #ifndef _PIXFORM_H_ |
8 | #define _PIXFORM_H_ |
9 | |
10 | /* RGB565 format */ |
11 | #define BUILD_PIXEL_RGB565(R, G, B) (((int)(R) << 11) | ((int)(G) << 6) | (((int)(G) & 0x10) << 1) | (int)(B)) |
12 | #define BUILD_PIXEL2_RGB565(R, G, B) (((int)(R) << 11) | ((int)(G) << 5) | (int)(B)) |
13 | #define DECOMPOSE_PIXEL_RGB565(PIX, R, G, B) \ |
14 | { \ |
15 | (R) = (PIX) >> 11; \ |
16 | (G) = ((PIX) >> 6) & 0x1f; \ |
17 | (B) = (PIX)&0x1f; \ |
18 | } |
19 | #define SPARE_RGB_BIT_MASK_RGB565 (1 << 5) |
20 | |
21 | #define MAX_RED_RGB565 31 |
22 | #define MAX_GREEN_RGB565 63 |
23 | #define MAX_BLUE_RGB565 31 |
24 | #define RED_SHIFT_BITS_RGB565 11 |
25 | #define GREEN_SHIFT_BITS_RGB565 6 |
26 | #define RED_LOW_BIT_MASK_RGB565 0x0800 |
27 | #define GREEN_LOW_BIT_MASK_RGB565 0x0020 |
28 | #define BLUE_LOW_BIT_MASK_RGB565 0x0001 |
29 | #define RED_HI_BIT_MASK_RGB565 0x8000 |
30 | #define GREEN_HI_BIT_MASK_RGB565 0x0400 |
31 | #define BLUE_HI_BIT_MASK_RGB565 0x0010 |
32 | #define FIRST_COLOR_MASK_RGB565 0xF800 |
33 | #define SECOND_COLOR_MASK_RGB565 0x07E0 |
34 | #define THIRD_COLOR_MASK_RGB565 0x001F |
35 | #define ALPHA_BITS_MASK_RGB565 0x0000 |
36 | |
37 | /* RGB555 format */ |
38 | #define BUILD_PIXEL_RGB555(R, G, B) (((int)(R) << 10) | ((int)(G) << 5) | (int)(B)) |
39 | #define BUILD_PIXEL2_RGB555(R, G, B) (((int)(R) << 10) | ((int)(G) << 5) | (int)(B)) |
40 | #define DECOMPOSE_PIXEL_RGB555(PIX, R, G, B) \ |
41 | { \ |
42 | (R) = (PIX) >> 10; \ |
43 | (G) = ((PIX) >> 5) & 0x1f; \ |
44 | (B) = (PIX)&0x1f; \ |
45 | } |
46 | #define SPARE_RGB_BIT_MASK_RGB555 (1 << 15) |
47 | |
48 | #define MAX_RED_RGB555 31 |
49 | #define MAX_GREEN_RGB555 31 |
50 | #define MAX_BLUE_RGB555 31 |
51 | #define RED_SHIFT_BITS_RGB555 10 |
52 | #define GREEN_SHIFT_BITS_RGB555 5 |
53 | #define RED_LOW_BIT_MASK_RGB555 0x0400 |
54 | #define GREEN_LOW_BIT_MASK_RGB555 0x0020 |
55 | #define BLUE_LOW_BIT_MASK_RGB555 0x0001 |
56 | #define RED_HI_BIT_MASK_RGB555 0x4000 |
57 | #define GREEN_HI_BIT_MASK_RGB555 0x0200 |
58 | #define BLUE_HI_BIT_MASK_RGB555 0x0010 |
59 | #define FIRST_COLOR_MASK_RGB555 0x7C00 |
60 | #define SECOND_COLOR_MASK_RGB555 0x03E0 |
61 | #define THIRD_COLOR_MASK_RGB555 0x001F |
62 | #define ALPHA_BITS_MASK_RGB555 0x0000 |
63 | |
64 | #define CONCAT(X, Y) X##Y |
65 | |
66 | // C pre-processor needs a two stage macro define to enable it to concat |
67 | // to macro names together to form the name of another macro. |
68 | #define BUILD_PIXEL_D(F, R, G, B) CONCAT(BUILD_PIXEL_, F) (R, G, B) |
69 | #define BUILD_PIXEL2_D(F, R, G, B) CONCAT(BUILD_PIXEL2_, F) (R, G, B) |
70 | #define DECOMPOSE_PIXEL_D(F, PIX, R, G, B) CONCAT(DECOMPOSE_PIXEL_, F) (PIX, R, G, B) |
71 | |
72 | #define BUILD_PIXEL(R, G, B) BUILD_PIXEL_D(PIXEL_FORMAT, R, G, B) |
73 | #define BUILD_PIXEL2(R, G, B) BUILD_PIXEL2_D(PIXEL_FORMAT, R, G, B) |
74 | #define DECOMPOSE_PIXEL(PIX, R, G, B) DECOMPOSE_PIXEL_D(PIXEL_FORMAT, PIX, R, G, B) |
75 | |
76 | #define MAX_RED_D(F) CONCAT(MAX_RED_, F) |
77 | #define MAX_GREEN_D(F) CONCAT(MAX_GREEN_, F) |
78 | #define MAX_BLUE_D(F) CONCAT(MAX_BLUE_, F) |
79 | #define RED_SHIFT_BITS_D(F) CONCAT(RED_SHIFT_BITS_, F) |
80 | #define GREEN_SHIFT_BITS_D(F) CONCAT(GREEN_SHIFT_BITS_, F) |
81 | #define RED_LOW_BIT_MASK_D(F) CONCAT(RED_LOW_BIT_MASK_, F) |
82 | #define GREEN_LOW_BIT_MASK_D(F) CONCAT(GREEN_LOW_BIT_MASK_, F) |
83 | #define BLUE_LOW_BIT_MASK_D(F) CONCAT(BLUE_LOW_BIT_MASK_, F) |
84 | #define RED_HI_BIT_MASK_D(F) CONCAT(RED_HI_BIT_MASK_, F) |
85 | #define GREEN_HI_BIT_MASK_D(F) CONCAT(GREEN_HI_BIT_MASK_, F) |
86 | #define BLUE_HI_BIT_MASK_D(F) CONCAT(BLUE_HI_BIT_MASK_, F) |
87 | #define FIRST_COLOR_MASK_D(F) CONCAT(FIRST_COLOR_MASK_, F) |
88 | #define SECOND_COLOR_MASK_D(F) CONCAT(SECOND_COLOR_MASK_, F) |
89 | #define THIRD_COLOR_MASK_D(F) CONCAT(THIRD_COLOR_MASK_, F) |
90 | #define ALPHA_BITS_MASK_D(F) CONCAT(ALPHA_BITS_MASK_, F) |
91 | |
92 | #define MAX_RED MAX_RED_D(PIXEL_FORMAT) |
93 | #define MAX_GREEN MAX_GREEN_D(PIXEL_FORMAT) |
94 | #define MAX_BLUE MAX_BLUE_D(PIXEL_FORMAT) |
95 | #define RED_SHIFT_BITS RED_SHIFT_BITS_D(PIXEL_FORMAT) |
96 | #define GREEN_SHIFT_BITS GREEN_SHIFT_BITS_D(PIXEL_FORMAT) |
97 | #define RED_LOW_BIT_MASK RED_LOW_BIT_MASK_D(PIXEL_FORMAT) |
98 | #define GREEN_LOW_BIT_MASK GREEN_LOW_BIT_MASK_D(PIXEL_FORMAT) |
99 | #define BLUE_LOW_BIT_MASK BLUE_LOW_BIT_MASK_D(PIXEL_FORMAT) |
100 | #define RED_HI_BIT_MASK RED_HI_BIT_MASK_D(PIXEL_FORMAT) |
101 | #define GREEN_HI_BIT_MASK GREEN_HI_BIT_MASK_D(PIXEL_FORMAT) |
102 | #define BLUE_HI_BIT_MASK BLUE_HI_BIT_MASK_D(PIXEL_FORMAT) |
103 | #define FIRST_COLOR_MASK FIRST_COLOR_MASK_D(PIXEL_FORMAT) |
104 | #define SECOND_COLOR_MASK SECOND_COLOR_MASK_D(PIXEL_FORMAT) |
105 | #define THIRD_COLOR_MASK THIRD_COLOR_MASK_D(PIXEL_FORMAT) |
106 | #define ALPHA_BITS_MASK ALPHA_BITS_MASK_D(PIXEL_FORMAT) |
107 | |
108 | #define GREEN_HI_BIT ((MAX_GREEN + 1) >> 1) |
109 | #define RGB_LOW_BITS_MASK (RED_LOW_BIT_MASK | GREEN_LOW_BIT_MASK | BLUE_LOW_BIT_MASK) |
110 | #define RGB_HI_BITS_MASK (RED_HI_BIT_MASK | GREEN_HI_BIT_MASK | BLUE_HI_BIT_MASK) |
111 | #define RGB_HI_BITS_MASKx2 ((RED_HI_BIT_MASK | GREEN_HI_BIT_MASK | BLUE_HI_BIT_MASK) << 1) |
112 | #define RGB_REMOVE_LOW_BITS_MASK (~RGB_LOW_BITS_MASK) |
113 | #define FIRST_THIRD_COLOR_MASK (FIRST_COLOR_MASK | THIRD_COLOR_MASK) |
114 | #define TWO_LOW_BITS_MASK (RGB_LOW_BITS_MASK | (RGB_LOW_BITS_MASK << 1)) |
115 | #define HIGH_BITS_SHIFTED_TWO_MASK (((FIRST_COLOR_MASK | SECOND_COLOR_MASK | THIRD_COLOR_MASK) & ~TWO_LOW_BITS_MASK) >> 2) |
116 | |
117 | #endif // _PIXFORM_H_ |
118 | |