OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / sht32.c
1 \r
2 #include "core.h"\r
3 \r
4 uint Sheet32_Internal_SetBuffer(UI_Sheet *sheet, void *vram, uint xsize, uint ysize, uint bpp)\r
5 {\r
6         if(xsize > SHEET_MAX_XSIZE){\r
7                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
8                         debug("Sheet32_Internal_SetBuffer:Too large xsize.\n");\r
9                 #endif\r
10                 return 1;\r
11         }\r
12         if(ysize > SHEET_MAX_YSIZE){\r
13                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
14                         debug("Sheet32_Internal_SetBuffer:Too large ysize.\n");\r
15                 #endif\r
16                 return 2;\r
17         }\r
18 \r
19         sheet->size.x = xsize;\r
20         sheet->size.y = ysize;\r
21         sheet->bpp = bpp;\r
22 \r
23         if(sheet->flags.bit.vram_auto_allocated){\r
24                 System_Memory_Free(sheet->vram, sheet->vramsize);\r
25                 sheet->flags.bit.vram_auto_allocated = False;\r
26         }\r
27 \r
28         if(vram == Null){\r
29                 sheet->vram = System_Memory_Allocate(xsize * ysize * 4);\r
30                 sheet->flags.bit.vram_auto_allocated = True;\r
31                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
32                         debug("Sheet32_Internal_SetBuffer:Auto Allocation.\n");\r
33                 #endif\r
34         } else{\r
35                 sheet->vram = vram;\r
36         }\r
37 \r
38         sheet->vramsize = xsize * ysize * 4;\r
39         sheet->Config_Functions = &Sheet32_Config_Functions;\r
40         sheet->IsVisiblePixel = &Sheet_Internal_IsVisiblePixel_Invalid;\r
41         sheet->flags.bit.using_invcol = False;\r
42 \r
43         sheet->Drawing.Fill_Rectangle = &Sheet32_Drawing_Fill_Rectangle;\r
44         sheet->Drawing.Put_String = &Sheet32_Drawing_Put_String;\r
45         sheet->Drawing.Draw_Point = &Sheet32_Drawing_Draw_Point;\r
46 \r
47         sheet->flags.bit.buffer_configured = True;\r
48 \r
49         return 0;\r
50 }\r
51 \r
52 //set function address from parent's bpp and own bpp.\r
53 uint Sheet32_Config_Functions(UI_Sheet *sheet)\r
54 {\r
55         if(sheet == Null){\r
56                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
57                         debug("Sheet32_Config_Functions:Null sheet.\n");\r
58                 #endif\r
59                 return 0;\r
60         }\r
61         if(sheet->parent == Null){\r
62                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
63                         debug("Sheet32_Config_Functions:Null parent.\n");\r
64                 #endif\r
65                 return 1;\r
66         }\r
67 \r
68         if(sheet->parent->bpp == 32){\r
69                 sheet->RefreshSheet = &Sheet32_Internal_RefreshSheet_To_32;\r
70         } else if(sheet->parent->bpp == 16){\r
71                 sheet->RefreshSheet = &Sheet32_Internal_RefreshSheet_To_16;\r
72         } else if(sheet->parent->bpp == 8){\r
73                 sheet->RefreshSheet = &Sheet32_Internal_RefreshSheet_To_08_xy;\r
74         } else{\r
75                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
76                         debug("Sheet32_Config_Functions:Not implemented refresh function to bpp %d.\n", sheet->parent->bpp);\r
77                 #endif\r
78         }\r
79         return 0;\r
80 }\r
81 \r
82 uint Sheet32_Internal_RefreshSheet_To_32(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
83 {\r
84         DATA_Location2D p, r;\r
85         int x, y;\r
86 \r
87         if(sheet->parent->map == Null){\r
88                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
89                         debug("Sheet32_Internal_RefreshSheet_To_32:Null map.\n");\r
90                 #endif\r
91                 return 1;\r
92         }\r
93 \r
94         Sheet_Internal_GetLocationP(sheet, &p);\r
95         Sheet_Internal_GetLocationR(sheet, &r);\r
96 \r
97         if(p.x < px0){\r
98                 p.x = px0;\r
99         }\r
100         if(p.y < py0){\r
101                 p.y = py0;\r
102         }\r
103         if(r.x > px1){\r
104                 r.x = px1;\r
105         }\r
106         if(r.y > py1){\r
107                 r.y = py1;\r
108         }\r
109 \r
110         if(p.x < 0){\r
111                 p.x = 0;\r
112         }\r
113         if(p.y < 0){\r
114                 p.y = 0;\r
115         }\r
116         if(r.x >= (int)sheet->parent->size.x){\r
117                 r.x = (int)sheet->parent->size.x - 1;\r
118         }\r
119         if(r.y >= (int)sheet->parent->size.y){\r
120                 r.y = (int)sheet->parent->size.y - 1;\r
121         }\r
122 \r
123         for(y = p.y; y <= r.y; y++){\r
124                 for(x = p.x; x <= r.x; x++){\r
125                         if(sheet->parent->map[y * sheet->parent->size.x + x] == (uint)sheet){\r
126                                 ((uint *)sheet->parent->vram)[y * sheet->parent->size.x + x] = ((uint *)sheet->vram)[(y - sheet->location.y) * sheet->size.x + (x - sheet->location.x)];\r
127                         }\r
128                 }\r
129         }\r
130 \r
131         return 0;\r
132 }\r
133 \r
134 uint Sheet32_Internal_RefreshSheet_To_16(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
135 {\r
136         DATA_Location2D p, r;\r
137         int x, y;\r
138 \r
139         if(sheet->parent->map == Null){\r
140                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
141                         debug("Sheet32_Internal_RefreshSheet_To_16:Null map.\n");\r
142                 #endif\r
143                 return 1;\r
144         }\r
145 \r
146         Sheet_Internal_GetLocationP(sheet, &p);\r
147         Sheet_Internal_GetLocationR(sheet, &r);\r
148 \r
149         if(p.x < px0){\r
150                 p.x = px0;\r
151         }\r
152         if(p.y < py0){\r
153                 p.y = py0;\r
154         }\r
155         if(r.x > px1){\r
156                 r.x = px1;\r
157         }\r
158         if(r.y > py1){\r
159                 r.y = py1;\r
160         }\r
161 \r
162         if(p.x < 0){\r
163                 p.x = 0;\r
164         }\r
165         if(p.y < 0){\r
166                 p.y = 0;\r
167         }\r
168         if(r.x >= (int)sheet->parent->size.x){\r
169                 r.x = (int)sheet->parent->size.x - 1;\r
170         }\r
171         if(r.y >= (int)sheet->parent->size.y){\r
172                 r.y = (int)sheet->parent->size.y - 1;\r
173         }\r
174 \r
175         for(y = p.y; y <= r.y; y++){\r
176                 for(x = p.x; x <= r.x; x++){\r
177                         if(sheet->parent->map[y * sheet->parent->size.x + x] == (uint)sheet){\r
178                                 ((ushort *)sheet->parent->vram)[y * sheet->parent->size.x + x] = RGB_32_To_16(((uint *)sheet->vram)[(y - sheet->location.y) * sheet->size.x + (x - sheet->location.x)]);\r
179                         }\r
180                 }\r
181         }\r
182 \r
183         return 0;\r
184 }\r
185 \r
186 \r
187 uint Sheet32_Internal_RefreshSheet_To_08_xy(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
188 {\r
189         DATA_Location2D p, r;\r
190         int x, y;\r
191 \r
192         if(sheet->parent->map == Null){\r
193                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
194                         debug("Sheet32_Internal_RefreshSheet_To_08_xy:Null map.\n");\r
195                 #endif\r
196                 return 1;\r
197         }\r
198 \r
199         Sheet_Internal_GetLocationP(sheet, &p);\r
200         Sheet_Internal_GetLocationR(sheet, &r);\r
201 \r
202         if(p.x < px0){\r
203                 p.x = px0;\r
204         }\r
205         if(p.y < py0){\r
206                 p.y = py0;\r
207         }\r
208         if(r.x > px1){\r
209                 r.x = px1;\r
210         }\r
211         if(r.y > py1){\r
212                 r.y = py1;\r
213         }\r
214 \r
215         if(p.x < 0){\r
216                 p.x = 0;\r
217         }\r
218         if(p.y < 0){\r
219                 p.y = 0;\r
220         }\r
221         if(r.x >= (int)sheet->parent->size.x){\r
222                 r.x = (int)sheet->parent->size.x - 1;\r
223         }\r
224         if(r.y >= (int)sheet->parent->size.y){\r
225                 r.y = (int)sheet->parent->size.y - 1;\r
226         }\r
227 \r
228         for(y = p.y; y <= r.y; y++){\r
229                 for(x = p.x; x <= r.x; x++){\r
230                         if(sheet->parent->map[y * sheet->parent->size.x + x] == (uint)sheet){\r
231                                 ((uchar *)sheet->parent->vram)[y * sheet->parent->size.x + x] = RGB_32_To_08_xy(((uint *)sheet->vram)[(y - sheet->location.y) * sheet->size.x + (x - sheet->location.x)], x, y);\r
232                         }\r
233                 }\r
234         }\r
235 \r
236         return 0;\r
237 }\r
238 \r
239 bool Sheet32_Internal_IsVisiblePixel(UI_Sheet *sheet, int px, int py)\r
240 {\r
241         if(((uint *)(sheet->vram))[(py - sheet->location.y) * (int)sheet->size.x + (px - sheet->location.x)] >> 24 == 0xff){\r
242                 return False;\r
243         }\r
244 \r
245         if(((uint *)(sheet->vram))[(py - sheet->location.y) * (int)sheet->size.x + (px - sheet->location.x)] == sheet->invcol){\r
246                 return False;\r
247         }\r
248 \r
249         return True;\r
250 }\r