|
|
1.1 ! root 1: /* ! 2: * Basic BMP data process and Raw picture data handle functions. ! 3: * Could be used to adjust pixel data format, get infomation, etc. ! 4: * ! 5: * Copyright (C) 2011 Wayne Xia <[email protected]> ! 6: * ! 7: * This work is licensed under the terms of the GNU LGPLv3. ! 8: */ ! 9: #include "util.h" ! 10: #include "bmp.h" ! 11: ! 12: #define bmp_load4byte(addr) (*(u32 *)(addr)) ! 13: #define bmp_load2byte(addr) (*(u16 *)(addr)) ! 14: ! 15: typedef struct tagBITMAPFILEHEADER { ! 16: u8 bfType[2]; ! 17: u8 bfSize[4]; ! 18: u8 bfReserved1[2]; ! 19: u8 bfReserved2[2]; ! 20: u8 bfOffBits[4]; ! 21: } BITMAPFILEHEADER, tagBITMAPFILEHEADER; ! 22: ! 23: typedef struct tagBITMAPINFOHEADER { ! 24: u8 biSize[4]; ! 25: u8 biWidth[4]; ! 26: u8 biHeight[4]; ! 27: u8 biPlanes[2]; ! 28: u8 biBitCount[2]; ! 29: u8 biCompression[4]; ! 30: u8 biSizeImage[4]; ! 31: u8 biXPelsPerMeter[4]; ! 32: u8 biYPelsPerMeter[4]; ! 33: u8 biClrUsed[4]; ! 34: u8 biClrImportant[4]; ! 35: } BITMAPINFOHEADER, tagBITMAPINFOHEADER; ! 36: ! 37: typedef struct tagRGBQUAD { ! 38: u8 rgbBlue; ! 39: u8 rgbGreen; ! 40: u8 rgbRed; ! 41: u8 rgbReserved; ! 42: } RGBQUAD, tagRGBQUAD; ! 43: ! 44: /* flat picture data adjusting function ! 45: * description: ! 46: * switch the vertical line sequence ! 47: * arrange horizontal pixel data, add extra space in the dest buffer ! 48: * for every line ! 49: */ ! 50: static void raw_data_format_adjust_24bpp(u8 *src, u8 *dest, int width, ! 51: int height, int bytes_per_line_dest) ! 52: { ! 53: int bytes_per_line_src = 3 * width; ! 54: int i; ! 55: for (i = 0 ; i < height ; i++) { ! 56: memcpy(dest + i * bytes_per_line_dest, ! 57: src + (height - 1 - i) * bytes_per_line_src, bytes_per_line_src); ! 58: } ! 59: } ! 60: ! 61: struct bmp_decdata *bmp_alloc(void) ! 62: { ! 63: struct bmp_decdata *bmp = malloc_tmphigh(sizeof(*bmp)); ! 64: return bmp; ! 65: } ! 66: ! 67: int bmp_decode(struct bmp_decdata *bmp, unsigned char *data, int data_size) ! 68: { ! 69: if (data_size < 54) ! 70: return 1; ! 71: ! 72: u16 bmp_filehead = bmp_load2byte(data + 0); ! 73: if (bmp_filehead != 0x4d42) ! 74: return 2; ! 75: u32 bmp_recordsize = bmp_load4byte(data + 2); ! 76: if (bmp_recordsize != data_size) ! 77: return 3; ! 78: u32 bmp_dataoffset = bmp_load4byte(data + 10); ! 79: bmp->datap = (unsigned char *)data + bmp_dataoffset; ! 80: bmp->width = bmp_load4byte(data + 18); ! 81: bmp->height = bmp_load4byte(data + 22); ! 82: bmp->bpp = bmp_load2byte(data + 28); ! 83: return 0; ! 84: } ! 85: ! 86: void bmp_get_size(struct bmp_decdata *bmp, int *width, int *height) ! 87: { ! 88: *width = bmp->width; ! 89: *height = bmp->height; ! 90: } ! 91: ! 92: ! 93: int bmp_show(struct bmp_decdata *bmp, unsigned char *pic, int width ! 94: , int height, int depth, int bytes_per_line_dest) ! 95: { ! 96: if (bmp->datap == pic) ! 97: return 0; ! 98: /* now only support 24bpp bmp file */ ! 99: if ((depth == 24) && (bmp->bpp == 24)) { ! 100: raw_data_format_adjust_24bpp(bmp->datap, pic, width, height, ! 101: bytes_per_line_dest); ! 102: return 0; ! 103: } ! 104: return 1; ! 105: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.