Annotation of qemu/roms/seabios/src/bmp.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.