OSDN Git Service

AI003:config.txt, words.txtを追加。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / sht16.c
1 \r
2 #include "core.h"\r
3 \r
4 uint Sheet16_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("Sheet16_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("Sheet16_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 * 2);\r
30                 sheet->flags.bit.vram_auto_allocated = True;\r
31                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
32                         debug("Sheet16_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 * 2;\r
39         sheet->Config_Functions = &Sheet16_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 = &Sheet16_Drawing_Fill_Rectangle;\r
44         sheet->Drawing.Put_String = &Sheet16_Drawing_Put_String;\r
45         sheet->Drawing.Draw_Point = &Sheet16_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 Sheet16_Config_Functions(UI_Sheet *sheet)\r
54 {\r
55         if(sheet == Null){\r
56                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
57                         debug("Sheet16_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("Sheet16_Config_Functions:Null parent.\n");\r
64                 #endif\r
65                 return 1;\r
66         }\r
67 \r
68         if(sheet->parent->bpp == 16){\r
69                 sheet->RefreshSheet = &Sheet16_Internal_RefreshSheet_To_16;\r
70         } else if(sheet->parent->bpp == 8){\r
71                 sheet->RefreshSheet = &Sheet16_Internal_RefreshSheet_To_08;\r
72         } else if(sheet->parent->bpp == 32){\r
73                 sheet->RefreshSheet = &Sheet16_Internal_RefreshSheet_To_32;\r
74         } else{\r
75                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
76                         debug("Sheet16_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 Sheet16_Internal_RefreshSheet_To_16(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("Sheet16_Internal_RefreshSheet_To_16: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                                 ((ushort *)sheet->parent->vram)[y * sheet->parent->size.x + x] = ((ushort *)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 Sheet16_Internal_RefreshSheet_To_08(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("Sheet16_Internal_RefreshSheet_To_08: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                                 ((uchar *)sheet->parent->vram)[y * sheet->parent->size.x + x] = RGB_16_To_08(((ushort *)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 uint Sheet16_Internal_RefreshSheet_To_32(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
187 {\r
188         DATA_Location2D p, r;\r
189         int x, y;\r
190 \r
191         if(sheet->parent->map == Null){\r
192                 #ifdef CHNOSPROJECT_DEBUG_SHEET\r
193                         debug("Sheet16_Internal_RefreshSheet_To_32:Null map.\n");\r
194                 #endif\r
195                 return 1;\r
196         }\r
197 \r
198         Sheet_Internal_GetLocationP(sheet, &p);\r
199         Sheet_Internal_GetLocationR(sheet, &r);\r
200 \r
201         if(p.x < px0){\r
202                 p.x = px0;\r
203         }\r
204         if(p.y < py0){\r
205                 p.y = py0;\r
206         }\r
207         if(r.x > px1){\r
208                 r.x = px1;\r
209         }\r
210         if(r.y > py1){\r
211                 r.y = py1;\r
212         }\r
213 \r
214         if(p.x < 0){\r
215                 p.x = 0;\r
216         }\r
217         if(p.y < 0){\r
218                 p.y = 0;\r
219         }\r
220         if(r.x >= (int)sheet->parent->size.x){\r
221                 r.x = (int)sheet->parent->size.x - 1;\r
222         }\r
223         if(r.y >= (int)sheet->parent->size.y){\r
224                 r.y = (int)sheet->parent->size.y - 1;\r
225         }\r
226 \r
227         for(y = p.y; y <= r.y; y++){\r
228                 for(x = p.x; x <= r.x; x++){\r
229                         if(sheet->parent->map[y * sheet->parent->size.x + x] == (uint)sheet){\r
230                                 ((uint *)sheet->parent->vram)[y * sheet->parent->size.x + x] = RGB_16_To_32(((ushort *)sheet->vram)[(y - sheet->location.y) * sheet->size.x + (x - sheet->location.x)]);\r
231                         }\r
232                 }\r
233         }\r
234 \r
235         return 0;\r
236 }\r
237 \r
238 bool Sheet16_Internal_IsVisiblePixel(UI_Sheet *sheet, int px, int py)\r
239 {\r
240         if(((ushort *)(sheet->vram))[(py - sheet->location.y) * (int)sheet->size.x + (px - sheet->location.x)] == sheet->invcol){\r
241                 return False;\r
242         }\r
243 \r
244         return True;\r
245 }\r