OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / sht16.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/sht16.c b/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/sht16.c
new file mode 100644 (file)
index 0000000..c3769bb
--- /dev/null
@@ -0,0 +1,245 @@
+\r
+#include "core.h"\r
+\r
+uint Sheet16_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("Sheet16_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("Sheet16_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 * 2);\r
+               sheet->flags.bit.vram_auto_allocated = True;\r
+               #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+                       debug("Sheet16_Internal_SetBuffer:Auto Allocation.\n");\r
+               #endif\r
+       } else{\r
+               sheet->vram = vram;\r
+       }\r
+\r
+       sheet->vramsize = xsize * ysize * 2;\r
+       sheet->Config_Functions = &Sheet16_Config_Functions;\r
+       sheet->IsVisiblePixel = &Sheet_Internal_IsVisiblePixel_Invalid;\r
+       sheet->flags.bit.using_invcol = False;\r
+\r
+       sheet->Drawing.Fill_Rectangle = &Sheet16_Drawing_Fill_Rectangle;\r
+       sheet->Drawing.Put_String = &Sheet16_Drawing_Put_String;\r
+       sheet->Drawing.Draw_Point = &Sheet16_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 Sheet16_Config_Functions(UI_Sheet *sheet)\r
+{\r
+       if(sheet == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+                       debug("Sheet16_Config_Functions:Null sheet.\n");\r
+               #endif\r
+               return 0;\r
+       }\r
+       if(sheet->parent == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+                       debug("Sheet16_Config_Functions:Null parent.\n");\r
+               #endif\r
+               return 1;\r
+       }\r
+\r
+       if(sheet->parent->bpp == 16){\r
+               sheet->RefreshSheet = &Sheet16_Internal_RefreshSheet_To_16;\r
+       } else if(sheet->parent->bpp == 8){\r
+               sheet->RefreshSheet = &Sheet16_Internal_RefreshSheet_To_08;\r
+       } else if(sheet->parent->bpp == 32){\r
+               sheet->RefreshSheet = &Sheet16_Internal_RefreshSheet_To_32;\r
+       } else{\r
+               #ifdef CHNOSPROJECT_DEBUG_SHEET\r
+                       debug("Sheet16_Config_Functions:Not implemented refresh function to bpp %d.\n", sheet->parent->bpp);\r
+               #endif\r
+       }\r
+       return 0;\r
+}\r
+\r
+uint Sheet16_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("Sheet16_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] = ((ushort *)sheet->vram)[(y - sheet->location.y) * sheet->size.x + (x - sheet->location.x)];\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+uint Sheet16_Internal_RefreshSheet_To_08(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("Sheet16_Internal_RefreshSheet_To_08: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_16_To_08(((ushort *)sheet->vram)[(y - sheet->location.y) * sheet->size.x + (x - sheet->location.x)]);\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+uint Sheet16_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("Sheet16_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] = RGB_16_To_32(((ushort *)sheet->vram)[(y - sheet->location.y) * sheet->size.x + (x - sheet->location.x)]);\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+bool Sheet16_Internal_IsVisiblePixel(UI_Sheet *sheet, int px, int py)\r
+{\r
+       if(((ushort *)(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