OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / window.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/window.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/window.c
new file mode 100644 (file)
index 0000000..1c73f1a
--- /dev/null
@@ -0,0 +1,307 @@
+#include "core.h"\r
+\r
+void scrool_win_8(UI_Window *winfo, uchar *vram);\r
+void scrool_win_16(UI_Window *winfo, ushort *vram);\r
+void scrool_win_32(UI_Window *winfo, uint *vram);\r
+\r
+char closebtn[16][40] = {\r
+       "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",\r
+       "OQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQJJQQQQQQQQJJQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQJJJQQQQQQJJJQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQJJJQQQQJJJQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQJJJQQJJJQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQQJJJJJJQQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQQQJJJJQQQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQQQJJJJQQQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQQJJJJJJQQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQJJJQQJJJQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQJJJQQQQJJJQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQJJJQQQQQQJJJQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQJJQQQQQQQQJJQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ$@",\r
+       "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"\r
+};\r
+\r
+void init_windows(void)\r
+{\r
+       int i;\r
+\r
+       for(i = 0;i < MAX_WINDOWS;i++){\r
+               system.ui.window.ctrl.winfos[i].flags = initialized;\r
+               system.ui.window.ctrl.winfos[i].buf = (void *)0x00000000;\r
+               system.ui.window.ctrl.winfos[i].app_buf = (void *)0x00000000;\r
+               system.ui.window.ctrl.winfos[i].app_buf_bits = 0;\r
+               system.ui.window.ctrl.winfos[i].task = (UI_Task *)0;\r
+       }\r
+       return;\r
+}\r
+\r
+UI_Window *window_alloc(void)\r
+{\r
+       UI_Window *win;\r
+       int i;\r
+\r
+       for(i = 0;i < MAX_WINDOWS;i++){\r
+               if(system.ui.window.ctrl.winfos[i].flags == initialized){\r
+                       win = &system.ui.window.ctrl.winfos[i];\r
+                       win->flags = allocated;\r
+                       win->buf = (void *)0x00000000;\r
+                       win->app_buf = (void *)0x00000000;\r
+                       win->app_buf_bits = 0;\r
+                       win->task = (UI_Task *)0;\r
+                       return win;\r
+               }\r
+       }\r
+       return 0;\r
+}\r
+\r
+void window_free(UI_Window *winfo)\r
+{\r
+       winfo->flags = initialized;\r
+       winfo->task = (UI_Task *)0;\r
+       return;\r
+}\r
+\r
+UI_Window *make_window(uchar *title, int xsize, int ysize, int px, int py, int height, bool active)\r
+{\r
+       UI_Window *winfo = window_alloc();\r
+\r
+       if(winfo == 0) goto err;\r
+       winfo->winxsize = xsize + 8;\r
+       winfo->winysize = ysize + 28;\r
+       winfo->xsize = xsize;\r
+       winfo->ysize = ysize;\r
+       winfo->position.x = px;\r
+       winfo->position.y = py;\r
+       winfo->origin.x = 4;\r
+       winfo->origin.y = 24;\r
+       winfo->win = sheet_alloc();\r
+       winfo->buf = (uint *)sys_memman_alloc((winfo->winxsize * winfo->winysize) * (system.data.info.vesa.BitsPerPixel >> 2));\r
+\r
+       sheet_setbuf(winfo->win, winfo->buf, winfo->winxsize, winfo->winysize,INV_COL32);       \r
+\r
+       change_window(winfo, title, active);\r
+       boxfill_win(winfo, 0xFFFFFF, 0, 0, winfo->xsize, winfo->ysize);\r
+\r
+       sheet_slide(winfo->win, px, py);\r
+       sheet_updown(winfo->win, height);       \r
+err:\r
+       return winfo;\r
+}\r
+\r
+UI_Window *make_window_app(uchar *title, int xsize, int ysize, int px, int py, int height, bool active, uint *buf, UI_Task *task)\r
+{\r
+       UI_Window *winfo = window_alloc();\r
+\r
+       if(winfo == 0) goto err;\r
+       winfo->winxsize = xsize + 8;\r
+       winfo->winysize = ysize + 28;\r
+       winfo->xsize = xsize;\r
+       winfo->ysize = ysize;\r
+       winfo->position.x = px;\r
+       winfo->position.y = py;\r
+       winfo->origin.x = 4;\r
+       winfo->origin.y = 24;\r
+       winfo->win = sheet_alloc();\r
+       winfo->buf = buf;\r
+       winfo->task = task;\r
+\r
+       sheet_setbuf(winfo->win, winfo->buf, winfo->winxsize, winfo->winysize,INV_COL32);       \r
+\r
+       change_window(winfo, title, active);\r
+       boxfill_win(winfo, 0xFFFFFF, 0, 0, winfo->xsize, winfo->ysize);\r
+\r
+       sheet_slide(winfo->win, px, py);\r
+       sheet_updown(winfo->win, height);       \r
+err:\r
+       return winfo;\r
+}\r
+\r
+UI_Window *make_window_app_compatible_hrb(uchar *title, int xsize, int ysize, int px, int py, int height, bool active, uint *buf, UI_Task *task)\r
+{\r
+       xsize = xsize - 8;\r
+       ysize = ysize - 28;\r
+       return make_window_app(title, xsize, ysize, px, py, height, active, buf, task);\r
+}\r
+\r
+void free_window_app(UI_Window *winfo)\r
+{\r
+       sheet_free(winfo->win);\r
+       window_free(winfo);\r
+       return;\r
+}\r
+\r
+void change_window(UI_Window *winfo, uchar *title, bool active)\r
+{\r
+       uint color = 0;\r
+       int x = 0, y = 0;\r
+       char c;\r
+\r
+       for (; *title != 0x00; title++) {\r
+               winfo->title[x] = *title;               \r
+               x++;\r
+       }\r
+       winfo->title[x] = 0x00;\r
+       winfo->active = active; \r
+\r
+       if(system.data.info.vesa.BitsPerPixel == 8){\r
+               if(active) color = WIN_COL8_ACTIVE;\r
+               else color = WIN_COL8_INACTIVE;\r
+       } else if(system.data.info.vesa.BitsPerPixel == 16){\r
+               if(active) color = WIN_COL16_ACTIVE;\r
+               else color = WIN_COL16_INACTIVE;\r
+       } else if(system.data.info.vesa.BitsPerPixel == 32){\r
+               if(active) color = WIN_COL32_ACTIVE;\r
+               else color = WIN_COL32_INACTIVE;\r
+       }\r
+\r
+       boxfill_i(winfo->buf, winfo->winxsize, color, 0, 0, winfo->winxsize, 24);       \r
+       boxfill_i(winfo->buf, winfo->winxsize, color, 0, 0, 4, winfo->winysize);\r
+       boxfill_i(winfo->buf, winfo->winxsize, color, winfo->winxsize - 4, 0, winfo->winxsize, winfo->winysize);\r
+       boxfill_i(winfo->buf, winfo->winxsize, color, 0, winfo->winysize - 4, winfo->winxsize, winfo->winysize);\r
+\r
+\r
+       line_i(winfo->buf, winfo->winxsize, 0, 0, winfo->winxsize - 1, 0, 0xFFFFFF);\r
+       line_i(winfo->buf, winfo->winxsize, 0, 0, 0, winfo->winysize - 1, 0xFFFFFF);\r
+       line_i(winfo->buf, winfo->winxsize, winfo->winxsize - 1, 0, winfo->winxsize - 1, winfo->winysize - 1, 0x000000);\r
+       line_i(winfo->buf, winfo->winxsize, 0, winfo->winysize - 1, winfo->winxsize - 1, winfo->winysize - 1, 0x000000);\r
+\r
+       putfonts_asc_sht_i(winfo->win, 4, 4, 0xFFFFFF, color, winfo->title);\r
+\r
+       for(y = 0; y < 16; y++){\r
+               for(x = 0; x < 40; x++){\r
+                       c = closebtn[y][x];\r
+                       if(c == '@')            color = 0xFF0000;\r
+                       else if(c == '$')       color = 0xFF0000;\r
+                       else if(c == 'Q')       color = 0xFF0000;\r
+                       else if(c == 'J')       color = 0xFFFFFF;\r
+                       else if(c == 'O')       color = 0xFFFFFF;\r
+                       point_i(winfo->buf, winfo->winxsize - 44 + x, y, color, winfo->winxsize);\r
+               }\r
+       }\r
+       refresh_window(winfo);\r
+       return;\r
+}\r
+\r
+void change_window_title(UI_Window *winfo, uchar *title)\r
+{\r
+       change_window(winfo, title, winfo->active);\r
+}\r
+\r
+void change_window_active(UI_Window *winfo, bool active)\r
+{\r
+       change_window(winfo, winfo->title, active);\r
+}\r
+\r
+void slide_window(UI_Window *winfo, int px, int py)\r
+{\r
+       winfo->position.x = px;\r
+       winfo->position.y = py;\r
+\r
+       sheet_slide(winfo->win, winfo->position.x, winfo->position.y);\r
+       return;\r
+}\r
+\r
+void refresh_window(UI_Window *winfo)\r
+{\r
+       sheet_refresh_full(winfo->win);\r
+       return;\r
+}\r
+\r
+void refresh_window_alpha(UI_Window *winfo)\r
+{\r
+       sheet_refresh_full_alpha(winfo->win);\r
+       return;\r
+}\r
+\r
+void boxfill_win(UI_Window *winfo, uint c, int x0, int y0, int x1, int y1)\r
+{\r
+       if(x0 < 0 || y0 < 0 || x1 > winfo->xsize || y1 > winfo->ysize) goto err;\r
+\r
+       boxfill_i(winfo->buf, winfo->winxsize, c, winfo->origin.x + x0, winfo->origin.y + y0, winfo->origin.x + x1, winfo->origin.y + y1);\r
+       sheet_refresh(winfo->win, x0 + winfo->origin.x, y0 + winfo->origin.y, x1 + winfo->origin.x, y1 + winfo->origin.y);\r
+err:\r
+       return;\r
+}\r
+\r
+void point_win(UI_Window *winfo, uint c, int x, int y)\r
+{\r
+       point_i(winfo->buf, x + winfo->origin.x, y + winfo->origin.y, c, winfo->winxsize);\r
+       return;\r
+}\r
+\r
+void putfonts_win(UI_Window *winfo, int x, int y, uint c, uint bc, const uchar *s)\r
+{\r
+       if(x < 0 || y < 0 || x > winfo->xsize || y > winfo->ysize) goto err;\r
+       putfonts_asc_sht_i(winfo->win, x + winfo->origin.x, y + winfo->origin.y, c, bc, s);\r
+err:\r
+       return;\r
+}\r
+\r
+void putfonts_win_no_bc(UI_Window *winfo, int x, int y, uint c, const uchar *s)\r
+{\r
+       if(x < 0 || y < 0 || x > winfo->xsize || y > winfo->ysize) goto err;\r
+       putfonts_asc_sht_i_no_bc(winfo->win, x + winfo->origin.x, y + winfo->origin.y, c, s);\r
+err:\r
+       return;\r
+}\r
+\r
+void scrool_win(UI_Window *winfo)\r
+{\r
+       if(system.data.info.vesa.BitsPerPixel == 8) scrool_win_8(winfo, winfo->buf);\r
+       else if(system.data.info.vesa.BitsPerPixel == 16) scrool_win_16(winfo, winfo->buf);\r
+       else if(system.data.info.vesa.BitsPerPixel == 32) scrool_win_32(winfo, winfo->buf);\r
+       boxfill_win(winfo, 0x000000, 0, winfo->ysize - 16, winfo->xsize, winfo->ysize);\r
+       return;\r
+}\r
+\r
+void scrool_win_32(UI_Window *winfo, uint *vram)\r
+{\r
+       int x, y;\r
+       for (y = winfo->origin.y; y < winfo->ysize + winfo->origin.y - 16; y++) {\r
+               for (x = winfo->origin.x; x < winfo->xsize + winfo->origin.x; x++) {\r
+                       vram[x + y * winfo->winxsize] = vram[x + (y + 16) * winfo->winxsize];\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void scrool_win_16(UI_Window *winfo, ushort *vram)\r
+{\r
+       int x, y;\r
+\r
+       for (y = winfo->origin.y; y < winfo->ysize + winfo->origin.y - 16; y++) {\r
+               for (x = winfo->origin.x; x < winfo->xsize + winfo->origin.x; x++) {\r
+                       vram[x + y * winfo->winxsize] = vram[x + (y + 16) * winfo->winxsize];\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void scrool_win_8(UI_Window *winfo, uchar *vram)\r
+{\r
+       int x, y;\r
+\r
+       for (y = winfo->origin.y; y < winfo->ysize + winfo->origin.y - 16; y++) {\r
+               for (x = winfo->origin.x; x < winfo->xsize + winfo->origin.x; x++) {\r
+                       vram[x + y * winfo->winxsize] = vram[x + (y + 16) * winfo->winxsize];\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void line_win(UI_Window *winfo, int x0, int y0, int x1, int y1, uint c)\r
+{\r
+       line_i(winfo->buf, winfo->winxsize, x0 + winfo->origin.x, y0 + winfo->origin.y, x1 + winfo->origin.x, y1 + winfo->origin.y, c);\r
+       return;\r
+}\r
+\r
+void draw_hexagon_win(UI_Window *winfo, int a, int x, int y, uint c)\r
+{\r
+       draw_hexagon_i(winfo->buf, winfo->winxsize, a, x + winfo->origin.x, y + winfo->origin.y, c);\r
+       return;\r
+}\r
+\r
+\r
+\r