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