OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / sheet.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/sheet.c b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/sheet.c
new file mode 100644 (file)
index 0000000..5c8cf5e
--- /dev/null
@@ -0,0 +1,795 @@
+\r
+#include "core.h"\r
+\r
+extern IO_MemoryControl sys_mem_ctrl;\r
+\r
+UI_Sheet_Control sys_sheet_ctrl;\r
+\r
+void Sheet_Initialise(UI_Sheet_Control *sheetctrl, IO_MemoryControl *memctrl, void *vram, uint xsize, uint ysize, uint bpp)\r
+{\r
+       uint x, y;\r
+\r
+       sheetctrl->memctrl = memctrl;\r
+\r
+       sheetctrl->mainvram = vram;\r
+       sheetctrl->map = MemoryBlock_Allocate_User(xsize * ysize * 4, sheetctrl->memctrl);\r
+       MemoryBlock_Write_Description(sheetctrl->map, "SHTCTRL_MAP");\r
+       for(y = 0; y < ysize; y++){\r
+               for(x = 0; x < xsize; x++){\r
+                       sheetctrl->map[(y * xsize) + x] = 0;\r
+               }\r
+       }\r
+       sheetctrl->mainvramsize.x = xsize;\r
+       sheetctrl->mainvramsize.y = ysize;\r
+       sheetctrl->mainvrambpp = bpp;\r
+\r
+       sheetctrl->base.vram = 0;\r
+       sheetctrl->base.position.x = 0;\r
+       sheetctrl->base.position.y = 0;\r
+       sheetctrl->base.size.x = 0;\r
+       sheetctrl->base.size.y = 0;\r
+       sheetctrl->base.bpp = 0;\r
+       sheetctrl->base.invcol = 0;\r
+       sheetctrl->base.next = 0;\r
+       sheetctrl->base.before = 0;\r
+       sheetctrl->base.Refresh = 0;\r
+       sheetctrl->base.WriteMap = 0;\r
+       sheetctrl->base.visible = false;\r
+       sheetctrl->base.mouse_movable = false;\r
+       sheetctrl->base.myctrl = sheetctrl;\r
+       sheetctrl->base.fifo = 0;\r
+       sheetctrl->base.msignal_flags = 0;\r
+       sheetctrl->base.ksignal_flags = 0;\r
+\r
+       sheetctrl->sheets = 0;\r
+       return;\r
+}\r
+\r
+UI_Sheet *Sheet_Get(UI_Sheet_Control *ctrl, uint xsize, uint ysize, uint bpp, uint invcol)\r
+{\r
+       UI_Sheet *sheet;\r
+\r
+       if(bpp == 0){\r
+               bpp = ctrl->mainvrambpp;\r
+       }\r
+\r
+       sheet = MemoryBlock_Allocate_User(sizeof(UI_Sheet), ctrl->memctrl);\r
+       MemoryBlock_Write_Description(sheet, "UI_Sheet");\r
+       sheet->vram = MemoryBlock_Allocate_User(xsize * ysize * (bpp >> 3), ctrl->memctrl);\r
+       MemoryBlock_Write_Description(sheet->vram, "UI_Sheet_VRAM");\r
+       sheet->position.x = 0;\r
+       sheet->position.y = 0;\r
+       sheet->size.x = xsize;\r
+       sheet->size.y = ysize;\r
+       sheet->bpp = bpp;\r
+       sheet->invcol = invcol;\r
+       if(sheet->invcol == 0){\r
+               sheet->WriteMap = Sheet_Write_Map_NoInvisible;\r
+       } else if(sheet->bpp == 32){\r
+               sheet->WriteMap = Sheet_Write_Map_32;\r
+       } else if(sheet->bpp == 16){\r
+               sheet->WriteMap = Sheet_Write_Map_16;\r
+               sheet->invcol = RGB_32_To_16(sheet->invcol);\r
+       } else if(sheet->bpp == 8){\r
+               sheet->WriteMap = Sheet_Write_Map_08;\r
+               sheet->invcol = RGB_32_To_08(sheet->invcol);\r
+       }\r
+       sheet->next = 0;\r
+       sheet->before = 0;\r
+\r
+       sheet->Refresh = Sheet_Refresh_Invalid;\r
+       sheet->myctrl = ctrl;\r
+\r
+       sheet->visible = false;\r
+       sheet->mouse_movable = false;\r
+       sheet->MouseEventProcedure = 0;\r
+       sheet->fifo = 0;\r
+       sheet->msignal_flags = 0;\r
+       sheet->ksignal_flags = 0;\r
+\r
+       return sheet;\r
+}\r
+\r
+uint Sheet_Show(UI_Sheet *sheet, int px, int py, uint height)\r
+{\r
+       uint i;\r
+       UI_Sheet *now;\r
+       UI_Sheet_Control *ctrl;\r
+       uint eflags;\r
+\r
+       eflags = IO_Load_EFlags();\r
+       IO_CLI();\r
+\r
+       ctrl = sheet->myctrl;\r
+\r
+       now = &ctrl->base;\r
+       for(i = 0; i <= height; i++){\r
+               if(now->next == 0){\r
+                       break;\r
+               }\r
+               if(i == height){\r
+                       break;\r
+               }\r
+               now = now->next;\r
+       }\r
+       now->next->before = sheet;\r
+       sheet->next = now->next;\r
+       sheet->before = now;\r
+       now->next = sheet;\r
+\r
+       ctrl->sheets++;\r
+       sheet->position.x = px;\r
+       sheet->position.y = py;\r
+       sheet->visible = true;\r
+\r
+       if(ctrl->mainvrambpp == 32){\r
+               if(sheet->bpp == 32){\r
+                       sheet->Refresh = Sheet_Refresh_32from32;\r
+//             } else if(sheet->bpp == 16){\r
+\r
+//             } else if(sheet->bpp == 8){\r
+\r
+               }\r
+       } else if(ctrl->mainvrambpp == 16){\r
+               if(sheet->bpp == 32){\r
+                       sheet->Refresh = Sheet_Refresh_16from32;\r
+               } else if(sheet->bpp == 16){\r
+                       sheet->Refresh = Sheet_Refresh_16from16;\r
+//             } else if(sheet->bpp == 8){\r
+\r
+               }\r
+       } else if(ctrl->mainvrambpp == 8){\r
+               if(sheet->bpp == 32){\r
+                       sheet->Refresh = Sheet_Refresh_08from32;\r
+//             } else if(sheet->bpp == 16){\r
+\r
+               } else if(sheet->bpp == 8){\r
+                       sheet->Refresh = Sheet_Refresh_08from08;\r
+               }\r
+       }\r
+       IO_Store_EFlags(eflags);\r
+\r
+       Sheet_Refresh_Map(sheet, sheet->position.x, sheet->position.y, sheet->position.x + sheet->size.x - 1, sheet->position.y + sheet->size.y - 1);\r
+       sheet->Refresh(sheet, 0, 0, sheet->size.x - 1, sheet->size.y - 1);\r
+\r
+       return i;\r
+}\r
+\r
+void Sheet_Set_Movable(UI_Sheet *sheet, bool movable)\r
+{\r
+       sheet->mouse_movable = movable;\r
+       return;\r
+}\r
+\r
+void Sheet_Set_MouseEventProcedure(UI_Sheet *sheet, void (*procedure)(UI_MouseEventArguments *e), uint flags)\r
+{\r
+       sheet->MouseEventProcedure = procedure;\r
+       sheet->msignal_flags = flags;\r
+       return;\r
+}\r
+\r
+void Sheet_Set_FIFO(UI_Sheet *sheet, DATA_FIFO *fifo, uint flags)\r
+{\r
+       sheet->fifo = fifo;\r
+       sheet->ksignal_flags = flags;\r
+       return;\r
+}\r
+\r
+void Sheet_Slide(UI_Sheet *sheet, int px, int py)\r
+{\r
+       int movex, movey;\r
+       DATA_Position2D target0, target1;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       movex = px - sheet->position.x;\r
+       movey = py - sheet->position.y;\r
+\r
+       if(movex == 0 && movey == 0){   //\93®\82©\82È\82¢\r
+               return;\r
+       }\r
+       if(movey == 0){ //\89¡\82É\83X\83\89\83C\83h\82·\82é\82¾\82¯\r
+               target0.y = sheet->position.y;\r
+               target1.y = sheet->position.y + sheet->size.y - 1;\r
+               if(movex > 0){  //\89E\95û\8cü\r
+                       target0.x = sheet->position.x;\r
+                       target1.x = sheet->position.x + sheet->size.x - 1 + movex;\r
+               } else{ //\8d\95û\8cü\r
+                       target0.x = sheet->position.x + movex;\r
+                       target1.x = sheet->position.x + sheet->size.x - 1;\r
+               }\r
+       } else if(movex == 0){  //\8fc\82É\83X\83\89\83C\83h\82·\82é\82¾\82¯\r
+               target0.x = sheet->position.x;\r
+               target1.x = sheet->position.x + sheet->size.x - 1;\r
+               if(movey > 0){  //\89º\95û\8cü\r
+                       target0.y = sheet->position.y;\r
+                       target1.y = sheet->position.y + sheet->size.y - 1 + movey;\r
+               } else{ //\8fã\95û\8cü\r
+                       target0.y = sheet->position.y + movey;\r
+                       target1.y = sheet->position.y + sheet->size.y - 1;\r
+               }\r
+       } else if(movex > 0 && movey > 0){      //\89E\89º\82Ö\83X\83\89\83C\83h\r
+               target0.x = sheet->position.x;\r
+               target0.y = sheet->position.y;\r
+               target1.x = sheet->position.x + sheet->size.x - 1 + movex;\r
+               target1.y = sheet->position.y + sheet->size.y - 1 + movey;\r
+       } else if(movex > 0 && movey < 0){      //\89E\8fã\82Ö\83X\83\89\83C\83h\r
+               target0.x = sheet->position.x;\r
+               target0.y = sheet->position.y + movey;\r
+               target1.x = sheet->position.x + sheet->size.x - 1 + movex;\r
+               target1.y = sheet->position.y + sheet->size.y - 1;\r
+       } else if(movex < 0 && movey > 0){      //\8d\89º\82Ö\83X\83\89\83C\83h\r
+               target0.x = sheet->position.x + movex;\r
+               target0.y = sheet->position.y;\r
+               target1.x = sheet->position.x + sheet->size.x - 1;\r
+               target1.y = sheet->position.y + sheet->size.y - 1 + movey;\r
+       } else if(movex < 0 && movey < 0){      //\8d\8fã\82Ö\83X\83\89\83C\83h\r
+               target0.x = sheet->position.x + movex;\r
+               target0.y = sheet->position.y + movey;\r
+               target1.x = sheet->position.x + sheet->size.x - 1;\r
+               target1.y = sheet->position.y + sheet->size.y - 1;\r
+       }\r
+\r
+       sheet->visible = false;\r
+       Sheet_Refresh_Map(sheet, sheet->position.x, sheet->position.y, sheet->position.x + sheet->size.x - 1, sheet->position.y + sheet->size.y - 1);\r
+       sheet->position.x = px;\r
+       sheet->position.y = py;\r
+       sheet->visible = true;\r
+       Sheet_Refresh_Map(sheet, sheet->position.x, sheet->position.y, sheet->position.x + sheet->size.x - 1, sheet->position.y + sheet->size.y - 1);\r
+       Sheet_Refresh_All(ctrl->base.next, sheet->next, target0.x, target0.y, target1.x, target1.y);\r
+       return;\r
+}\r
+\r
+uint Sheet_UpDown(UI_Sheet *sheet, uint height)\r
+{\r
+       uint i;\r
+       UI_Sheet *now;\r
+\r
+       if(sheet->before == 0){\r
+               return 0;\r
+       }\r
+\r
+       now = &sheet->myctrl->base;\r
+\r
+       for(i = 0; now != sheet; i++){\r
+               now = now->next;\r
+       }\r
+       if(i == height){\r
+               return i;\r
+       }\r
+       Sheet_Remove(sheet);\r
+       return Sheet_Show(sheet, sheet->position.x, sheet->position.y, height - 1);\r
+}\r
+\r
+void Sheet_Remove(UI_Sheet *sheet)\r
+{\r
+       UI_Sheet_Control *ctrl;\r
+       uint eflags;\r
+\r
+       eflags = IO_Load_EFlags();\r
+       IO_CLI();\r
+\r
+       ctrl = sheet->myctrl;\r
+\r
+       ctrl->sheets--;\r
+       sheet->visible = false;\r
+       Sheet_Refresh_Map(sheet, sheet->position.x, sheet->position.y, sheet->position.x + sheet->size.x - 1, sheet->position.y + sheet->size.y - 1);\r
+       sheet->before->next = sheet->next;\r
+       sheet->next->before = sheet->before;\r
+       Sheet_Refresh_All(ctrl->base.next, sheet->next, sheet->position.x, sheet->position.y, sheet->position.x + sheet->size.x - 1, sheet->position.y + sheet->size.y - 1);\r
+       sheet->next = 0;\r
+       sheet->before = 0;\r
+\r
+       IO_Store_EFlags(eflags);\r
+       return;\r
+}\r
+\r
+void Sheet_Refresh_Map(UI_Sheet *sheet, int x0, int y0, int x1, int y1)\r
+{\r
+       UI_Sheet **before;\r
+       uint i, x, y;\r
+       DATA_Position2D target0, target1;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       if(x0 >= ctrl->mainvramsize.x || y0 >= ctrl->mainvramsize.y || x1 < 0 || y1 < 0){\r
+               return;\r
+       }\r
+       if(x0 < 0){\r
+               x0 = 0;\r
+       }\r
+       if(y0 < 0){\r
+               y0 = 0;\r
+       }\r
+       if(x1 >= ctrl->mainvramsize.x){\r
+               x1 = ctrl->mainvramsize.x - 1;\r
+       }\r
+       if(y1 >= ctrl->mainvramsize.y){\r
+               y1 = ctrl->mainvramsize.y - 1;\r
+       }\r
+\r
+       before = &ctrl->base.next;\r
+       for(i = 0; i < ctrl->sheets; i++){\r
+               for(y = y0; y <= y1; y++){\r
+                       for(x = x0; x <= x1; x++){\r
+                               if(ctrl->map[(y * ctrl->mainvramsize.x) + x] == (uint)*before){\r
+                                       ctrl->map[(y * ctrl->mainvramsize.x) + x] = 0;\r
+                               }\r
+                       }\r
+               }\r
+               if(*before == sheet){\r
+                       break;\r
+               }\r
+               before = &(*before)->next;\r
+       }\r
+\r
+       i++;\r
+\r
+       for(; i > 0; i--){\r
+               target0.x = (*before)->position.x;\r
+               target0.y = (*before)->position.y;\r
+               target1.x = (*before)->position.x + (*before)->size.x - 1;\r
+               target1.y = (*before)->position.y + (*before)->size.y - 1;\r
+\r
+               if(target0.x <= x1 && target0.y <= y1 && target1.x >= x0 && target1.y >= y0 && (*before)->visible){\r
+                       if(target0.x < x0){\r
+                               target0.x = x0;\r
+                       }\r
+                       if(target0.y < y0){\r
+                               target0.y = y0;\r
+                       }\r
+                       if(target1.x > x1){\r
+                               target1.x = x1;\r
+                       }\r
+                       if(target1.y > y1){\r
+                               target1.y = y1;\r
+                       }\r
+                       (*before)->WriteMap(*before, target0.x, target0.y, target1.x, target1.y);\r
+               }\r
+               before = &(*before)->before;\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Write_Map_32(UI_Sheet *sheet, int x0, int y0, int x1, int y1)\r
+{\r
+       int x, y;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       for(y = y0; y <= y1; y++){\r
+               for(x = x0; x <= x1; x++){\r
+                       if(ctrl->map[(y * ctrl->mainvramsize.x) + x] == 0 && ((uint *)sheet->vram)[((y - sheet->position.y) * sheet->size.x) + (x - sheet->position.x)] != sheet->invcol){\r
+                               ctrl->map[(y * ctrl->mainvramsize.x) + x] = (uint)sheet;\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Write_Map_16(UI_Sheet *sheet, int x0, int y0, int x1, int y1)\r
+{\r
+       int x, y;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       for(y = y0; y <= y1; y++){\r
+               for(x = x0; x <= x1; x++){\r
+                       if(ctrl->map[(y * ctrl->mainvramsize.x) + x] == 0 && ((ushort *)sheet->vram)[((y - sheet->position.y) * sheet->size.x) + (x - sheet->position.x)] != (ushort)sheet->invcol){\r
+                               ctrl->map[(y * ctrl->mainvramsize.x) + x] = (uint)sheet;\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Write_Map_08(UI_Sheet *sheet, int x0, int y0, int x1, int y1)\r
+{\r
+       int x, y;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       for(y = y0; y <= y1; y++){\r
+               for(x = x0; x <= x1; x++){\r
+                       if(ctrl->map[(y * ctrl->mainvramsize.x) + x] == 0 && ((uchar *)sheet->vram)[((y - sheet->position.y) * sheet->size.x) + (x - sheet->position.x)] != (uchar)sheet->invcol){\r
+                               ctrl->map[(y * ctrl->mainvramsize.x) + x] = (uint)sheet;\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Write_Map_NoInvisible(UI_Sheet *sheet, int x0, int y0, int x1, int y1)\r
+{\r
+       int x, y;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       for(y = y0; y <= y1; y++){\r
+               for(x = x0; x <= x1; x++){\r
+                       if(ctrl->map[(y * ctrl->mainvramsize.x) + x] == 0){\r
+                               ctrl->map[(y * ctrl->mainvramsize.x) + x] = (uint)sheet;\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Refresh_All(UI_Sheet *sheet0, UI_Sheet *sheet1, int x0, int y0, int x1, int y1)\r
+{\r
+       UI_Sheet *now;\r
+       uint i;\r
+       DATA_Position2D target0, target1;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet0->myctrl;\r
+       now = sheet0;\r
+       for(i = 0; i < ctrl->sheets; i++){\r
+               target0.x = now->position.x;\r
+               target0.y = now->position.y;\r
+               target1.x = now->position.x + now->size.x - 1;\r
+               target1.y = now->position.y + now->size.y - 1;\r
+\r
+               if(target0.x <= x1 && target0.y <= y1 && target1.x >= x0 && target1.y >= y0 && now->visible){\r
+                       if(target0.x < x0){\r
+                               target0.x = x0;\r
+                       }\r
+                       if(target0.y < y0){\r
+                               target0.y = y0;\r
+                       }\r
+                       if(target1.x > x1){\r
+                               target1.x = x1;\r
+                       }\r
+                       if(target1.y > y1){\r
+                               target1.y = y1;\r
+                       }\r
+                       now->Refresh(now, target0.x - now->position.x, target0.y - now->position.y, target1.x - now->position.x, target1.y - now->position.y);\r
+               }\r
+               if(now->next == sheet1 || now->next == 0){\r
+                       break;\r
+               }\r
+               now = now->next;\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Refresh_32from32(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
+{\r
+       int x, y;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       px0 = px0 + sheet->position.x;\r
+       py0 = py0 + sheet->position.y;\r
+       px1 = px1 + sheet->position.x;\r
+       py1 = py1 + sheet->position.y;\r
+\r
+       if(px0 >= ctrl->mainvramsize.x || py0 >= ctrl->mainvramsize.y || px1 < 0 || py1 < 0){\r
+               return;\r
+       }\r
+       if(px0 < 0){\r
+               px0 = 0;\r
+       }\r
+       if(py0 < 0){\r
+               py0 = 0;\r
+       }\r
+       if(px1 >= ctrl->mainvramsize.x){\r
+               px1 = ctrl->mainvramsize.x - 1;\r
+       }\r
+       if(py1 >= ctrl->mainvramsize.y){\r
+               py1 = ctrl->mainvramsize.y - 1;\r
+       }\r
+\r
+       for(y = py0; y <= py1; y++){\r
+               for(x = px0; x <= px1; x++){\r
+                       if(ctrl->map[(y * ctrl->mainvramsize.x) + x] == (uint)sheet){\r
+                               ((uint *)ctrl->mainvram)[(y * ctrl->mainvramsize.x) + x] = ((uint *)sheet->vram)[((y - sheet->position.y) * sheet->size.x) + (x - sheet->position.x)];\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Refresh_16from32(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
+{\r
+       int x, y;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       px0 = px0 + sheet->position.x;\r
+       py0 = py0 + sheet->position.y;\r
+       px1 = px1 + sheet->position.x;\r
+       py1 = py1 + sheet->position.y;\r
+\r
+       if(px0 >= ctrl->mainvramsize.x || py0 >= ctrl->mainvramsize.y || px1 < 0 || py1 < 0){\r
+               return;\r
+       }\r
+       if(px0 < 0){\r
+               px0 = 0;\r
+       }\r
+       if(py0 < 0){\r
+               py0 = 0;\r
+       }\r
+       if(px1 >= ctrl->mainvramsize.x){\r
+               px1 = ctrl->mainvramsize.x - 1;\r
+       }\r
+       if(py1 >= ctrl->mainvramsize.y){\r
+               py1 = ctrl->mainvramsize.y - 1;\r
+       }\r
+\r
+       for(y = py0; y <= py1; y++){\r
+               for(x = px0; x <= px1; x++){\r
+                       if(ctrl->map[(y * ctrl->mainvramsize.x) + x] == (uint)sheet){\r
+                               ((ushort *)ctrl->mainvram)[(y * ctrl->mainvramsize.x) + x] = RGB_32_To_16(((uint *)sheet->vram)[((y - sheet->position.y) * sheet->size.x) + (x - sheet->position.x)]);\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Refresh_08from32(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
+{\r
+       int x, y;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       px0 = px0 + sheet->position.x;\r
+       py0 = py0 + sheet->position.y;\r
+       px1 = px1 + sheet->position.x;\r
+       py1 = py1 + sheet->position.y;\r
+\r
+       if(px0 >= ctrl->mainvramsize.x || py0 >= ctrl->mainvramsize.y || px1 < 0 || py1 < 0){\r
+               return;\r
+       }\r
+       if(px0 < 0){\r
+               px0 = 0;\r
+       }\r
+       if(py0 < 0){\r
+               py0 = 0;\r
+       }\r
+       if(px1 >= ctrl->mainvramsize.x){\r
+               px1 = ctrl->mainvramsize.x - 1;\r
+       }\r
+       if(py1 >= ctrl->mainvramsize.y){\r
+               py1 = ctrl->mainvramsize.y - 1;\r
+       }\r
+\r
+       for(y = py0; y <= py1; y++){\r
+               for(x = px0; x <= px1; x++){\r
+                       if(ctrl->map[(y * ctrl->mainvramsize.x) + x] == (uint)sheet){\r
+                               ((uchar *)ctrl->mainvram)[(y * ctrl->mainvramsize.x) + x] = RGB_32_To_08_xy(((uint *)sheet->vram)[((y - sheet->position.y) * sheet->size.x) + (x - sheet->position.x)], x, y);\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Refresh_16from16(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
+{\r
+       int x, y;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       px0 = px0 + sheet->position.x;\r
+       py0 = py0 + sheet->position.y;\r
+       px1 = px1 + sheet->position.x;\r
+       py1 = py1 + sheet->position.y;\r
+\r
+       if(px0 >= ctrl->mainvramsize.x || py0 >= ctrl->mainvramsize.y || px1 < 0 || py1 < 0){\r
+               return;\r
+       }\r
+       if(px0 < 0){\r
+               px0 = 0;\r
+       }\r
+       if(py0 < 0){\r
+               py0 = 0;\r
+       }\r
+       if(px1 >= ctrl->mainvramsize.x){\r
+               px1 = ctrl->mainvramsize.x - 1;\r
+       }\r
+       if(py1 >= ctrl->mainvramsize.y){\r
+               py1 = ctrl->mainvramsize.y - 1;\r
+       }\r
+\r
+       for(y = py0; y <= py1; y++){\r
+               for(x = px0; x <= px1; x++){\r
+                       if(ctrl->map[(y * ctrl->mainvramsize.x) + x] == (uint)sheet){\r
+                               ((ushort *)ctrl->mainvram)[(y * ctrl->mainvramsize.x) + x] = ((ushort *)sheet->vram)[((y - sheet->position.y) * sheet->size.x) + (x - sheet->position.x)];\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Refresh_08from08(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
+{\r
+       int x, y;\r
+       UI_Sheet_Control *ctrl;\r
+\r
+       ctrl = sheet->myctrl;\r
+       px0 = px0 + sheet->position.x;\r
+       py0 = py0 + sheet->position.y;\r
+       px1 = px1 + sheet->position.x;\r
+       py1 = py1 + sheet->position.y;\r
+\r
+       if(px0 >= ctrl->mainvramsize.x || py0 >= ctrl->mainvramsize.y || px1 < 0 || py1 < 0){\r
+               return;\r
+       }\r
+       if(px0 < 0){\r
+               px0 = 0;\r
+       }\r
+       if(py0 < 0){\r
+               py0 = 0;\r
+       }\r
+       if(px1 >= ctrl->mainvramsize.x){\r
+               px1 = ctrl->mainvramsize.x - 1;\r
+       }\r
+       if(py1 >= ctrl->mainvramsize.y){\r
+               py1 = ctrl->mainvramsize.y - 1;\r
+       }\r
+\r
+       for(y = py0; y <= py1; y++){\r
+               for(x = px0; x <= px1; x++){\r
+                       if(ctrl->map[(y * ctrl->mainvramsize.x) + x] == (uint)sheet){\r
+                               ((uchar *)ctrl->mainvram)[(y * ctrl->mainvramsize.x) + x] = ((uchar *)sheet->vram)[((y - sheet->position.y) * sheet->size.x) + (x - sheet->position.x)];\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void Sheet_Refresh_Invalid(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
+{\r
+       return;\r
+}\r
+\r
+void Sheet_Draw_Put_String(UI_Sheet *sheet, uint x, uint y, uint c, const uchar *s)\r
+{\r
+       uint i;\r
+\r
+       for(i = 0; s[i] != 0x00; i++){\r
+\r
+       }\r
+\r
+       if(y > sheet->size.y - 16){\r
+               return;\r
+       }\r
+\r
+       if(sheet->bpp == 32){\r
+               Draw_Put_String_32(sheet->vram, sheet->size.x, x, y, c, s);\r
+       } else if(sheet->bpp == 16){\r
+               Draw_Put_String_16(sheet->vram, sheet->size.x, x, y, c, s);\r
+       } else if(sheet->bpp == 8){\r
+               Draw_Put_String_08(sheet->vram, sheet->size.x, x, y, c, s);\r
+       }\r
+\r
+       sheet->Refresh(sheet, x, y, x + (i * 8), y + 16);\r
+       return;\r
+}\r
+\r
+void Sheet_Draw_Put_String_With_BackColor(UI_Sheet *sheet, uint x, uint y, uint c, uint bc, const uchar *s)\r
+{\r
+       uint i;\r
+\r
+       for(i = 0; s[i] != 0x00; i++){\r
+\r
+       }\r
+\r
+       Sheet_Draw_Fill_Rectangle(sheet, bc, x, y, x + (i * 8) - 1,  y + 16 - 1);\r
+\r
+       if(y > sheet->size.y - 16){\r
+               return;\r
+       }\r
+\r
+       if(sheet->bpp == 32){\r
+               Draw_Put_String_32(sheet->vram, sheet->size.x, x, y, c, s);\r
+       } else if(sheet->bpp == 16){\r
+               Draw_Put_String_16(sheet->vram, sheet->size.x, x, y, c, s);\r
+       } else if(sheet->bpp == 8){\r
+               Draw_Put_String_08(sheet->vram, sheet->size.x, x, y, c, s);\r
+       }\r
+\r
+       sheet->Refresh(sheet, x, y, x + (i * 8), y + 16);\r
+       return;\r
+}\r
+\r
+void Sheet_Draw_Fill_Rectangle(UI_Sheet *sheet, uint c, uint x0, uint y0, uint x1, uint y1)\r
+{\r
+       if(x1 >= sheet->size.x || y1 >= sheet->size.y){\r
+               return;\r
+       }\r
+\r
+       if(sheet->bpp == 32){\r
+               Draw_Fill_Rectangle_32(sheet->vram, sheet->size.x, c, x0, y0, x1, y1);\r
+       } else if(sheet->bpp == 16){\r
+               Draw_Fill_Rectangle_16(sheet->vram, sheet->size.x, c, x0, y0, x1, y1);\r
+       } else if(sheet->bpp == 8){\r
+               Draw_Fill_Rectangle_08(sheet->vram, sheet->size.x, c, x0, y0, x1, y1);\r
+       }\r
+       sheet->Refresh(sheet, x0, y0, x1, y1);\r
+       return;\r
+}\r
+\r
+void Sheet_Draw_Fill_Rectangle_Gradation_Vertical(UI_Sheet *sheet, uint c0, uint c1, uint x0, uint y0, uint x1, uint y1)\r
+{\r
+       int nowcol, nowcol_R, nowcol_G, nowcol_B, add_R, add_G, add_B;\r
+       uint x, y;\r
+\r
+       if(x1 >= sheet->size.x || y1 >= sheet->size.y){\r
+               return;\r
+       }\r
+\r
+       if(y1 == y0){\r
+               return;\r
+       }\r
+\r
+       c0 &= 0x00ffffff;\r
+       c1 &= 0x00ffffff;\r
+\r
+       add_R = (((int)((c1 & 0x00ff0000) >> 16) << 10) - ((int)((c0 & 0x00ff0000) >> 16) << 10)) / (int)(y1 - y0);\r
+       add_G = (((int)((c1 & 0x0000ff00) >> 8) << 10) - ((int)((c0 & 0x0000ff00) >> 8) << 10)) / (int)(y1 - y0);\r
+       add_B = (((int)(c1 & 0x000000ff) << 10) - ((int)(c0 & 0x000000ff) << 10)) / (int)(y1 - y0);\r
+\r
+       nowcol_R = ((c0 & 0x00ff0000) >> 16) << 10;\r
+       nowcol_G = ((c0 & 0x0000ff00) >> 8) << 10;\r
+       nowcol_B = (c0 & 0x000000ff) << 10;\r
+\r
+       for(y = y0; y <= y1; y++){\r
+               nowcol = ((nowcol_R >> 10) << 16) | ((nowcol_G >> 10) << 8) | (nowcol_B >> 10);\r
+               for(x = x0; x <= x1; x++){\r
+                       Sheet_Draw_Point(sheet, (uint)nowcol, x, y);\r
+               }\r
+               nowcol_R += add_R;\r
+               nowcol_G += add_G;\r
+               nowcol_B += add_B;\r
+       }\r
+\r
+       return;\r
+}\r
+void Sheet_Draw_Point(UI_Sheet *sheet, uint c, uint x, uint y)\r
+{\r
+       if(sheet->bpp == 32){\r
+               ((uint *)sheet->vram)[y * sheet->size.x + x] = c;\r
+       } else if(sheet->bpp == 16){\r
+               c = RGB_32_To_16(c);\r
+               ((ushort *)sheet->vram)[y * sheet->size.x + x] = (ushort)c;\r
+       } else if(sheet->bpp == 8){\r
+//             c = RGB_32_To_08(c);\r
+               c = RGB_32_To_08_xy(c, x, y);\r
+               ((uchar *)sheet->vram)[y * sheet->size.x + x] = (uchar)c;\r
+       }\r
+       sheet->Refresh(sheet, x, y, x, y);\r
+       return;\r
+}\r
+\r
+void System_Sheet_Initialise(void *vram, uint xsize, uint ysize, uint bpp)\r
+{\r
+       Sheet_Initialise(&sys_sheet_ctrl, &sys_mem_ctrl, vram, xsize, ysize, bpp);\r
+       return;\r
+}\r
+\r
+UI_Sheet *System_Sheet_Get(uint xsize, uint ysize, uint bpp, uint invcol)\r
+{\r
+       return Sheet_Get(&sys_sheet_ctrl, xsize, ysize, bpp, invcol);\r
+}\r
+\r
+UI_Sheet *Sheet_Get_From_Position(UI_Sheet_Control *ctrl, int x, int y)\r
+{\r
+       if(x < 0 || y < 0 || x > ctrl->mainvramsize.x || y > ctrl->mainvramsize.y){\r
+               return 0;\r
+       }\r
+       return (UI_Sheet *)ctrl->map[(y * ctrl->mainvramsize.x) + x];\r
+}\r
+\r
+uint Sheet_Get_Top_Of_Height(UI_Sheet_Control *ctrl)\r
+{\r
+       if(ctrl->sheets < 1){\r
+               return 0;\r
+       }\r
+       return ctrl->sheets - 1;\r
+}\r
+\r
+uint System_Sheet_Get_Top_Of_Height(void)\r
+{\r
+       return Sheet_Get_Top_Of_Height(&sys_sheet_ctrl);\r
+}\r