--- /dev/null
+\r
+#include "core.h"\r
+\r
+//\83p\83f\83B\83\93\83O\82Ì\8aÖ\8cW\82Å\82±\82ñ\82È\82±\82Æ\82É\82È\82Á\82Ä\82é\r
+typedef struct DATA_FORMAT_BMP_FILE_HEADER {\r
+ uchar sign[2];\r
+ uchar filesize[4];\r
+ uchar reserved0[2];\r
+ uchar reserved1[2];\r
+ uchar offset_to_data[4];\r
+} DATA_Format_BMP_FileHeader;\r
+\r
+//OS/2 Type\r
+typedef struct DATA_FORMAT_BMP_CORE_HEADER {\r
+ uint headersize;\r
+ short xsize;\r
+ short ysize;\r
+ ushort planes;\r
+ ushort bpp;\r
+} DATA_Format_BMP_CoreHeader;\r
+\r
+//Windows Type\r
+typedef struct DATA_FORMAT_BMP_INFO_HEADER {\r
+ uint headersize;\r
+ int xsize;\r
+ int ysize;\r
+ ushort planes;\r
+ ushort bpp;\r
+ uint compression_type; //0:no compression, 1:RLE8 2:RLE4 3:bit field\r
+ uint image_data_size;\r
+ uint pixel_per_meter_x;\r
+ uint pixel_per_meter_y;\r
+ uint colors_in_palette;\r
+ uint index_of_important_color;\r
+} DATA_Format_BMP_InformationHeader;\r
+\r
+typedef struct DATA_FORMAT_BMP_RGB24 {\r
+ uchar b;\r
+ uchar g;\r
+ uchar r;\r
+} DATA_Format_BMP_RGB24;\r
+\r
+uint Format_BMP_DrawPicture(void *vram, uint xsize, uint x, uint y, uint pxsize, uint pysize, void *bmp)\r
+{\r
+ uchar s[128];\r
+ DATA_Format_BMP_FileHeader *fheader;\r
+ DATA_Format_BMP_InformationHeader *infoheader;\r
+ uint *read32;\r
+ DATA_Format_BMP_RGB24 *rgb24;\r
+ uint ix, iy;\r
+\r
+ uint offset_to_data, filesize;\r
+\r
+ fheader = (DATA_Format_BMP_FileHeader *)bmp;\r
+\r
+ if(fheader->sign[0] != 'B' || fheader->sign[1] != 'M'){\r
+ Drawing_Put_String(vram, xsize, x, y, 0x000000, "BMP:Unknown File Format.");\r
+ return 1;\r
+ }\r
+\r
+ read32 = (uint *)(&fheader->filesize[0]);\r
+ filesize = *read32;\r
+ read32 = (uint *)(&fheader->offset_to_data[0]);\r
+ offset_to_data = *read32;\r
+\r
+ //snprintf(s, sizeof(s), "size:%d offset:%d", filesize, offset_to_data);\r
+ //Drawing_Put_String(vram, xsize, x, y, 0x000000, s);\r
+\r
+ read32 = (uint *)(bmp + 0x0e);\r
+\r
+ if(*read32 == 12){\r
+ Drawing_Put_String(vram, xsize, x, y + 16 * 1, 0x000000, "BMP Core Header.(not implemented.)");\r
+ return 2;\r
+ } else if(*read32 == 40){\r
+ //Drawing_Put_String(vram, xsize, x, y + 16 * 1, 0x000000, "BMP INFO Header.");\r
+ infoheader = (DATA_Format_BMP_InformationHeader *)(bmp + 0x0e);\r
+ if(infoheader->ysize > 0){\r
+ //Drawing_Put_String(vram, xsize, x, y + 16 * 2, 0x000000, "Bottom Up.");\r
+ } else{\r
+ Drawing_Put_String(vram, xsize, x, y + 16 * 2, 0x000000, "Top Down (not implemented).");\r
+ return 5;\r
+ }\r
+\r
+ if(infoheader->compression_type == 0){\r
+ //Drawing_Put_String(vram, xsize, x, y + 16 * 3, 0x000000, "No compression.");\r
+ } else{\r
+ Drawing_Put_String(vram, xsize, x, y + 16 * 3, 0x000000, "Compressed (not implemented).");\r
+ return 4;\r
+ }\r
+\r
+ if(infoheader->bpp == 24){\r
+ //Drawing_Put_String(vram, xsize, x, y + 16 * 4, 0x000000, "24 bpp.");\r
+ } else{\r
+ snprintf(s, sizeof(s), "%d bpp(not implemented).", infoheader->bpp);\r
+ Drawing_Put_String(vram, xsize, x, y + 16 * 4, 0x000000, s);\r
+ return 6;\r
+ }\r
+\r
+ //snprintf(s, sizeof(s), "xsize:%d ysize:%d", infoheader->xsize, infoheader->ysize);\r
+ //Drawing_Put_String(vram, xsize, x, y + 16 * 5, 0x000000, s);\r
+\r
+ rgb24 = (DATA_Format_BMP_RGB24 *)(bmp + offset_to_data);\r
+\r
+ for(iy = infoheader->ysize; iy > 0; iy--){\r
+ for(ix = 0; ix < infoheader->xsize; ix++){\r
+ Drawing_Draw_Point(vram, xsize, x + ix, y + iy - 1, rgb24->r << 16 | rgb24->g << 8 | rgb24->b);\r
+ rgb24 = (DATA_Format_BMP_RGB24 *)((uint)rgb24 + 3);\r
+ }\r
+ rgb24 = (DATA_Format_BMP_RGB24 *)((uint)rgb24 + ((infoheader->xsize + 3) & ~3) - infoheader->xsize);\r
+ }\r
+ } else{\r
+ Drawing_Put_String(vram, xsize, x, y + 16 * 1, 0x000000, "Unknown BMP Header.");\r
+ return 3;\r
+ }\r
+\r
+ return 0;\r
+}\r