OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / graphic.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/graphic.c b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/graphic.c
new file mode 100644 (file)
index 0000000..86aec2b
--- /dev/null
@@ -0,0 +1,117 @@
+\r
+#include "core.h"\r
+\r
+void (*Draw_Put_String)(void *vram, uint xsize, uint x, uint y, uint c, const uchar *s);\r
+void (*Draw_Fill_Rectangle)(void *vram, uint xsize, uint c, uint x0, uint y0, uint x1, uint y1);\r
+void (*Draw_Slide_Line)(void *vram, uint xsize, uint ysize, uint vxsize, uint px, uint py);\r
+\r
+void Initialise_Graphic(uint bpp)\r
+{\r
+       if(bpp == 8){\r
+               Draw_Initialise_Palette();\r
+               Draw_Put_String = Draw_Put_String_08;\r
+               Draw_Fill_Rectangle = Draw_Fill_Rectangle_08;\r
+               Draw_Slide_Line = Draw_Slide_Line_08;\r
+       } else if(bpp == 16){\r
+               Draw_Put_String = Draw_Put_String_16;\r
+               Draw_Fill_Rectangle = Draw_Fill_Rectangle_16;\r
+               Draw_Slide_Line = Draw_Slide_Line_16;\r
+       } else if(bpp == 32){\r
+               Draw_Put_String = Draw_Put_String_32;\r
+               Draw_Fill_Rectangle = Draw_Fill_Rectangle_32;\r
+               Draw_Slide_Line = Draw_Slide_Line_32;\r
+       }\r
+       return;\r
+}\r
+\r
+uchar RGB_32_To_08(uint c32)\r
+{\r
+       uchar c8;\r
+       uchar c[4];\r
+\r
+       c[3] = (c32 << 24) >> 24;\r
+       c[2] = (c32 << 16) >> 24;\r
+       c[1] = (c32 <<  8) >> 24;\r
+       c[0] = (c32 >> 24);\r
+\r
+       c[1] = c[1] / 51;\r
+       c[2] = c[2] / 51;\r
+       c[3] = c[3] / 51;\r
+\r
+       c8 = (c[1] + c[2] * 6 + c[3] * 36) + 16;\r
+\r
+       return c8;\r
+}\r
+\r
+uchar RGB_32_To_08_xy(uint c32, int x, int y)\r
+{\r
+       static int table[4] = { 3, 1, 0, 2 };\r
+       uchar c8;\r
+       uchar c[4];\r
+       int i;\r
+\r
+       c[3] = (c32 << 24) >> 24;\r
+       c[2] = (c32 << 16) >> 24;\r
+       c[1] = (c32 <<  8) >> 24;\r
+       c[0] = (c32 >> 24);\r
+\r
+       x &= 1; /* \8bô\90\94\82©\8aï\90\94\82© */\r
+       y &= 1;\r
+\r
+       i = table[x + y * 2];   /* \92\86\8aÔ\90F\82ð\8dì\82é\82½\82ß\82Ì\92è\90\94 */\r
+       c[1] = (c[1] * 21) / 256;       /* \82±\82ê\82Å 0\81`20 \82É\82È\82é */\r
+       c[2] = (c[2] * 21) / 256;\r
+       c[3] = (c[3] * 21) / 256;\r
+       c[1] = (c[1] + i) / 4;  /* \82±\82ê\82Å 0\81`5 \82É\82È\82é */\r
+       c[2] = (c[2] + i) / 4;\r
+       c[3] = (c[3] + i) / 4;\r
+\r
+       c8 = 16 + c[1] + c[2] * 6 + c[3] * 36;\r
+\r
+       return c8;\r
+}\r
+\r
+ushort RGB_32_To_16(uint c32)\r
+{\r
+       ushort c16;\r
+       uchar c[4];\r
+\r
+       c[3] = (c32 << 24) >> 24;\r
+       c[2] = (c32 << 16) >> 24;\r
+       c[1] = (c32 <<  8) >> 24;\r
+       c[0] = (c32 >> 24);\r
+\r
+       c16 = ((c[1] >> 3) << 11 | (c[2] >> 2) << 5 | (c[3] >> 3));\r
+       \r
+       return c16;\r
+}\r
+\r
+uchar Emergency_Out_Count;\r
+\r
+void Emergency_Out_Reset(void)\r
+{\r
+       Emergency_Out_Count = 0;\r
+       return;\r
+}\r
+\r
+int Emergency_Out(const uchar *format, ...)\r
+{\r
+       int i;\r
+       va_list ap;\r
+       uchar s[256];\r
+       DATA_VESAInfo *vesa = (DATA_VESAInfo *) ADR_VESAINFO;\r
+       DATA_BootInfo *boot = (DATA_BootInfo *) ADR_BOOTINFO;\r
+\r
+       va_start(ap, format);\r
+       i = vsprintf(s, format, ap);\r
+       va_end(ap);\r
+\r
+       Draw_Fill_Rectangle(vesa->PhysBasePtr, boot->scrnx, 0x000000, 0, Emergency_Out_Count << 4, boot->scrnx - 1, (Emergency_Out_Count << 4) + 15);\r
+       Draw_Put_String(vesa->PhysBasePtr, boot->scrnx, 0, Emergency_Out_Count << 4, 0xFFFFFF, s);\r
+\r
+       if(Emergency_Out_Count < 12){\r
+               Emergency_Out_Count++;\r
+       }\r
+\r
+       return i;\r
+}\r