--- /dev/null
+\r
+#include "core.h"\r
+\r
+uint Sheet32_Internal_SetBuffer(UI_Sheet *sheet, void *vram, uint xsize, uint ysize, uint bpp)\r
+{\r
+ if(xsize > SHEET_MAX_XSIZE){\r
+ #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+ debug("Sheet32_Internal_SetBuffer:Too large xsize.\n");\r
+ #endif\r
+ return 1;\r
+ }\r
+ if(ysize > SHEET_MAX_YSIZE){\r
+ #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+ debug("Sheet32_Internal_SetBuffer:Too large ysize.\n");\r
+ #endif\r
+ return 2;\r
+ }\r
+\r
+ sheet->size.x = xsize;\r
+ sheet->size.y = ysize;\r
+ sheet->bpp = bpp;\r
+\r
+ if(sheet->flags.bit.vram_auto_allocated){\r
+ System_Memory_Free(sheet->vram, sheet->vramsize);\r
+ sheet->flags.bit.vram_auto_allocated = False;\r
+ }\r
+\r
+ if(vram == Null){\r
+ sheet->vram = System_Memory_Allocate(xsize * ysize * 4);\r
+ sheet->flags.bit.vram_auto_allocated = True;\r
+ #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+ debug("Sheet32_Internal_SetBuffer:Auto Allocation.\n");\r
+ #endif\r
+ } else{\r
+ sheet->vram = vram;\r
+ }\r
+\r
+ sheet->vramsize = xsize * ysize * 4;\r
+ sheet->Config_Functions = &Sheet32_Config_Functions;\r
+ sheet->IsVisiblePixel = &Sheet_Internal_IsVisiblePixel_Invalid;\r
+ sheet->flags.bit.using_invcol = False;\r
+\r
+ sheet->Drawing.Fill_Rectangle = &Sheet32_Drawing_Fill_Rectangle;\r
+ sheet->Drawing.Put_String = &Sheet32_Drawing_Put_String;\r
+ sheet->Drawing.Draw_Point = &Sheet32_Drawing_Draw_Point;\r
+\r
+ sheet->flags.bit.buffer_configured = True;\r
+\r
+ return 0;\r
+}\r
+\r
+//set function address from parent's bpp and own bpp.\r
+uint Sheet32_Config_Functions(UI_Sheet *sheet)\r
+{\r
+ if(sheet == Null){\r
+ #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+ debug("Sheet32_Config_Functions:Null sheet.\n");\r
+ #endif\r
+ return 0;\r
+ }\r
+ if(sheet->parent == Null){\r
+ #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+ debug("Sheet32_Config_Functions:Null parent.\n");\r
+ #endif\r
+ return 1;\r
+ }\r
+\r
+ if(sheet->parent->bpp == 32){\r
+ sheet->RefreshSheet = &Sheet32_Internal_RefreshSheet_To_32;\r
+ } else if(sheet->parent->bpp == 16){\r
+ sheet->RefreshSheet = &Sheet32_Internal_RefreshSheet_To_16;\r
+ } else if(sheet->parent->bpp == 8){\r
+ sheet->RefreshSheet = &Sheet32_Internal_RefreshSheet_To_08_xy;\r
+ } else{\r
+ #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+ debug("Sheet32_Config_Functions:Not implemented refresh function to bpp %d.\n", sheet->parent->bpp);\r
+ #endif\r
+ }\r
+ return 0;\r
+}\r
+\r
+uint Sheet32_Internal_RefreshSheet_To_32(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
+{\r
+ DATA_Location2D p, r;\r
+ int x, y;\r
+\r
+ if(sheet->parent->map == Null){\r
+ #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+ debug("Sheet32_Internal_RefreshSheet_To_32:Null map.\n");\r
+ #endif\r
+ return 1;\r
+ }\r
+\r
+ Sheet_Internal_GetLocationP(sheet, &p);\r
+ Sheet_Internal_GetLocationR(sheet, &r);\r
+\r
+ if(p.x < px0){\r
+ p.x = px0;\r
+ }\r
+ if(p.y < py0){\r
+ p.y = py0;\r
+ }\r
+ if(r.x > px1){\r
+ r.x = px1;\r
+ }\r
+ if(r.y > py1){\r
+ r.y = py1;\r
+ }\r
+\r
+ if(p.x < 0){\r
+ p.x = 0;\r
+ }\r
+ if(p.y < 0){\r
+ p.y = 0;\r
+ }\r
+ if(r.x >= (int)sheet->parent->size.x){\r
+ r.x = (int)sheet->parent->size.x - 1;\r
+ }\r
+ if(r.y >= (int)sheet->parent->size.y){\r
+ r.y = (int)sheet->parent->size.y - 1;\r
+ }\r
+\r
+ for(y = p.y; y <= r.y; y++){\r
+ for(x = p.x; x <= r.x; x++){\r
+ if(sheet->parent->map[y * sheet->parent->size.x + x] == (uint)sheet){\r
+ ((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
+ }\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+uint Sheet32_Internal_RefreshSheet_To_16(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
+{\r
+ DATA_Location2D p, r;\r
+ int x, y;\r
+\r
+ if(sheet->parent->map == Null){\r
+ #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+ debug("Sheet32_Internal_RefreshSheet_To_16:Null map.\n");\r
+ #endif\r
+ return 1;\r
+ }\r
+\r
+ Sheet_Internal_GetLocationP(sheet, &p);\r
+ Sheet_Internal_GetLocationR(sheet, &r);\r
+\r
+ if(p.x < px0){\r
+ p.x = px0;\r
+ }\r
+ if(p.y < py0){\r
+ p.y = py0;\r
+ }\r
+ if(r.x > px1){\r
+ r.x = px1;\r
+ }\r
+ if(r.y > py1){\r
+ r.y = py1;\r
+ }\r
+\r
+ if(p.x < 0){\r
+ p.x = 0;\r
+ }\r
+ if(p.y < 0){\r
+ p.y = 0;\r
+ }\r
+ if(r.x >= (int)sheet->parent->size.x){\r
+ r.x = (int)sheet->parent->size.x - 1;\r
+ }\r
+ if(r.y >= (int)sheet->parent->size.y){\r
+ r.y = (int)sheet->parent->size.y - 1;\r
+ }\r
+\r
+ for(y = p.y; y <= r.y; y++){\r
+ for(x = p.x; x <= r.x; x++){\r
+ if(sheet->parent->map[y * sheet->parent->size.x + x] == (uint)sheet){\r
+ ((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
+ }\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+uint Sheet32_Internal_RefreshSheet_To_08_xy(UI_Sheet *sheet, int px0, int py0, int px1, int py1)\r
+{\r
+ DATA_Location2D p, r;\r
+ int x, y;\r
+\r
+ if(sheet->parent->map == Null){\r
+ #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+ debug("Sheet32_Internal_RefreshSheet_To_08_xy:Null map.\n");\r
+ #endif\r
+ return 1;\r
+ }\r
+\r
+ Sheet_Internal_GetLocationP(sheet, &p);\r
+ Sheet_Internal_GetLocationR(sheet, &r);\r
+\r
+ if(p.x < px0){\r
+ p.x = px0;\r
+ }\r
+ if(p.y < py0){\r
+ p.y = py0;\r
+ }\r
+ if(r.x > px1){\r
+ r.x = px1;\r
+ }\r
+ if(r.y > py1){\r
+ r.y = py1;\r
+ }\r
+\r
+ if(p.x < 0){\r
+ p.x = 0;\r
+ }\r
+ if(p.y < 0){\r
+ p.y = 0;\r
+ }\r
+ if(r.x >= (int)sheet->parent->size.x){\r
+ r.x = (int)sheet->parent->size.x - 1;\r
+ }\r
+ if(r.y >= (int)sheet->parent->size.y){\r
+ r.y = (int)sheet->parent->size.y - 1;\r
+ }\r
+\r
+ for(y = p.y; y <= r.y; y++){\r
+ for(x = p.x; x <= r.x; x++){\r
+ if(sheet->parent->map[y * sheet->parent->size.x + x] == (uint)sheet){\r
+ ((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
+ }\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+bool Sheet32_Internal_IsVisiblePixel(UI_Sheet *sheet, int px, int py)\r
+{\r
+ if(((uint *)(sheet->vram))[(py - sheet->location.y) * (int)sheet->size.x + (px - sheet->location.x)] >> 24 == 0xff){\r
+ return False;\r
+ }\r
+\r
+ if(((uint *)(sheet->vram))[(py - sheet->location.y) * (int)sheet->size.x + (px - sheet->location.x)] == sheet->invcol){\r
+ return False;\r
+ }\r
+\r
+ return True;\r
+}\r