OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / color.c
1 \r
2 #include "core.h"\r
3 \r
4 uint RGB_Table_08[16] = {\r
5         0x00000000,     //黒\r
6         0x00ff0000,     //赤\r
7         0x0000ff00,     //緑\r
8         0x00ffff00,     //黄\r
9         0x000000ff,     //青\r
10         0x0000ffff,     //水\r
11         0x00ffffff,     //白\r
12         0x00c6c6c6,     //明るい灰色\r
13         0x00840000,     //暗い赤\r
14         0x00008400,     //暗い緑\r
15         0x00848400,     //暗い黄\r
16         0x00000084,     //暗い青\r
17         0x00840084,     //紫\r
18         0x00008484,     //暗い水\r
19         0x00848484      //暗い灰色\r
20 };\r
21 \r
22 ushort RGB_08_To_16(uchar c8)\r
23 {\r
24         RGB32 c32;\r
25 \r
26         if(c8 < 16){\r
27                 c32.c32 = RGB_Table_08[c8];\r
28                 return ((c32.bit.r / 7) << 11) | ((c32.bit.g / 7) << (5 + 1) | (c32.bit.b / 7));\r
29         }\r
30 \r
31         if(c8 >= 16 + 216){\r
32                 return 0x0000;\r
33         }\r
34 \r
35         c8 -= 16;\r
36 \r
37         c32.bit.b = c8 / 36;\r
38         c8 -= c32.bit.b * 36;\r
39         c32.bit.g = c8 / 6;\r
40         c8 -= c32.bit.g * 6;\r
41         c32.bit.r = c8;\r
42         c32.bit.a = 0x00;\r
43 \r
44         return ((c32.bit.r * 6) << 11) | ((c32.bit.g * 6) << (5 + 1) | (c32.bit.b * 6));\r
45 }\r
46 \r
47 uint RGB_08_To_32(uchar c8)\r
48 {\r
49         RGB32 c32;\r
50 \r
51         if(c8 < 16){\r
52                 return RGB_Table_08[c8];\r
53         }\r
54 \r
55         if(c8 >= 16 + 216){\r
56                 return 0x00000000;\r
57         }\r
58 \r
59         c8 -= 16;\r
60 \r
61         c32.bit.b = c8 / 36;\r
62         c8 -= c32.bit.b * 36;\r
63         c32.bit.g = c8 / 6;\r
64         c8 -= c32.bit.g * 6;\r
65         c32.bit.r = c8;\r
66         c32.bit.a = 0x00;\r
67 \r
68         c32.bit.r *= 51;\r
69         c32.bit.g *= 51;\r
70         c32.bit.b *= 51;\r
71 \r
72         return c32.c32;\r
73 }\r
74 \r
75 uchar RGB_16_To_08(ushort c16)\r
76 {\r
77         uchar c[3];\r
78 \r
79         c[0] = c16 >> (5 + 6);\r
80         c[1] = (c16 & 0x7e0) >> 5;\r
81         c[2] = c16 & 0x1f;\r
82 \r
83         c[0] /= 6;\r
84         c[1] /= 12;\r
85         c[2] /= 6;\r
86 \r
87         return 16 + c[0] + c[1] * 6 + c[2] * 36;\r
88 }\r
89 \r
90 uint RGB_16_To_32(ushort c16)\r
91 {\r
92         uchar c[3];\r
93 \r
94         c[0] = c16 >> (5 + 6);\r
95         c[1] = (c16 & 0x7e0) >> 5;\r
96         c[2] = c16 & 0x1f;\r
97 \r
98         return (c[0] << (16 + 3)) | (c[1] << (8 + 2)) | (c[2] << 3);\r
99 }\r
100 \r
101 uchar RGB_32_To_08(uint c32)\r
102 {\r
103         uchar c8;\r
104         uchar c[4];\r
105 \r
106         c[3] = (c32 << 24) >> 24;\r
107         c[2] = (c32 << 16) >> 24;\r
108         c[1] = (c32 <<  8) >> 24;\r
109 \r
110         c[1] = c[1] / 51;\r
111         c[2] = c[2] / 51;\r
112         c[3] = c[3] / 51;\r
113 \r
114         c8 = (c[1] + c[2] * 6 + c[3] * 36) + 16;\r
115 \r
116         return c8;\r
117 }\r
118 \r
119 uchar RGB_32_To_08_xy(uint c32, int x, int y)\r
120 {\r
121         static int table[4] = { 3, 1, 0, 2 };\r
122         uchar c8;\r
123         uchar c[4];\r
124         int i;\r
125 \r
126         c[3] = (c32 << 24) >> 24;\r
127         c[2] = (c32 << 16) >> 24;\r
128         c[1] = (c32 <<  8) >> 24;\r
129 \r
130         x &= 1; /* 偶数か奇数か */\r
131         y &= 1;\r
132 \r
133         i = table[x + y * 2];   /* 中間色を作るための定数 */\r
134         c[1] = (c[1] * 21) / 256;       /* これで 0~20 になる */\r
135         c[2] = (c[2] * 21) / 256;\r
136         c[3] = (c[3] * 21) / 256;\r
137         c[1] = (c[1] + i) / 4;  /* これで 0~5 になる */\r
138         c[2] = (c[2] + i) / 4;\r
139         c[3] = (c[3] + i) / 4;\r
140 \r
141         c8 = 16 + c[1] + c[2] * 6 + c[3] * 36;\r
142 \r
143         return c8;\r
144 }\r
145 \r
146 ushort RGB_32_To_16(uint c32)\r
147 {\r
148         ushort c16;\r
149         uchar c[4];\r
150 \r
151         c[3] = (c32 << 24) >> 24;\r
152         c[2] = (c32 << 16) >> 24;\r
153         c[1] = (c32 <<  8) >> 24;\r
154 \r
155         c16 = ((c[1] >> 3) << 11 | (c[2] >> 2) << 5 | (c[3] >> 3));\r
156         \r
157         return c16;\r
158 }\r
159 \r