Annotation of qemu/roms/seabios/src/bmp.c, revision 1.1.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.