/* * readbmp.c This file was taken from the Independent JPEG Group and modified extensively * * Copyright (C) 1994-1995, Thomas G. Lane. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * / /* This code is for reading bmps and translating them to RGB. There are additions that Netscape has * added to read more formats. */ #include "xp_core.h" //used to make library compile faster on win32 do not ifdef this or it wont work /* readbmp : reads bmp and returns colormap (if any), CMN_IMAGEINFO,bits*/ #include #include #include #include "xp_core.h"/*defines of int32 ect*/ #include "xpassert.h" #include "ntypes.h" /* for MWContext to include libcnv.h*/ #include "libcnv.h" #include "readbmp.h" typedef unsigned char U_CHAR; #define UCH(x) ((int16) (x)) typedef uint16 UINT16; #define TRUE !FALSE XP_Bool get_1bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer); XP_Bool get_4bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer); XP_Bool get_8bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer); XP_Bool get_24bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer); XP_Bool get_16bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer); XP_Bool get_32bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer); void process_color_mask(uint32 *p_mask,char *p_shift,uint16 *p_pad); CONVERT_IMAGERESULT read_colormap_bmp (CONVERT_IMGCONTEXT *p_inputparam, BYTE *p_colormap,int16 cmaplen, int16 mapentrysize); /////////////////////////////////////// //////////READ BMP///////////////////// CONVERT_IMAGERESULT start_input_bmp (CONVERT_IMG_INFO *p_imageinfo, CONVERT_IMGCONTEXT *p_inputparam) { CONVERT_IMAGERESULT t_err; U_CHAR bmpfileheader[14]; U_CHAR bmpinfoheader[64]; #define GET_2B(array,offset) ((uint16) UCH(array[offset]) + \ (((uint16) UCH(array[offset+1])) << 8)) #define GET_4B(array,offset) ((int32) UCH(array[offset]) + \ (((int32) UCH(array[offset+1])) << 8) + \ (((int32) UCH(array[offset+2])) << 16) + \ (((int32) UCH(array[offset+3])) << 24)) int32 bfOffBits; int32 headerSize; int32 biWidth = 0; /* initialize to avoid compiler warning */ int32 biHeight = 0; uint16 biPlanes; int32 biCompression; int32 biXPelsPerMeter,biYPelsPerMeter; int32 biClrUsed = 0; int16 mapentrysize = 0; /* 0 indicates no colormap */ DWORD t_index=0;/*index to stream*/ int32 bPad; uint16 row_width; if (p_inputparam->m_stream.m_type==CONVERT_FILE) { if (!read_param(&p_inputparam->m_stream,bmpfileheader,14)) {/*cant read fileheader*/ return CONVERR_INVALIDFILEHEADER; } p_imageinfo->m_image_size+=14; /* Read and verify the bitmap file header */ if (GET_2B(bmpfileheader,0) != 0x4D42) /* 'BM' */ return CONVERR_INVALIDFILEHEADER; bfOffBits = (int32) GET_4B(bmpfileheader,10); } if (! read_param(&p_inputparam->m_stream, bmpinfoheader, 4)) return CONVERR_INVALIDIMAGEHEADER;//cant read 4 bytes p_imageinfo->m_image_size+=4; headerSize = (int32) GET_4B(bmpinfoheader,0); if (headerSize < 12 || headerSize > 64) return CONVERR_INVALIDIMAGEHEADER; if (! read_param( &p_inputparam->m_stream, bmpinfoheader+4, (int16)(headerSize-4))) /*casting here is ok beacause of check for >64 above*/ return CONVERR_INVALIDIMAGEHEADER; p_imageinfo->m_image_size+=headerSize-4; switch ((int16) headerSize) { case 12: /* Decode OS/2 1.x header (Microsoft calls this a BITMAPCOREHEADER) */ biWidth = (int32) GET_2B(bmpinfoheader,4); biHeight = (int32) GET_2B(bmpinfoheader,6); biPlanes = GET_2B(bmpinfoheader,8); p_imageinfo->m_bitsperpixel = (int16) GET_2B(bmpinfoheader,10); switch (p_imageinfo->m_bitsperpixel) { case 8: /* colormapped image */ mapentrysize = 3; /* OS/2 uses RGBTRIPLE colormap */ break; case 16: case 24: /* RGB image */ break; default: return CONVERR_INVALIDBITDEPTH; break; } if (biPlanes != 1) return CONVERR_INVALIDBITDEPTH; break; case 40: case 64: /* Decode Windows 3.x header (Microsoft calls this a BITMAPINFOHEADER) */ /* or OS/2 2.x header, which has additional fields that we ignore */ biWidth = GET_4B(bmpinfoheader,4); biHeight = GET_4B(bmpinfoheader,8); biPlanes = GET_2B(bmpinfoheader,12); p_imageinfo->m_bitsperpixel = (int16) GET_2B(bmpinfoheader,14); biCompression = GET_4B(bmpinfoheader,16); biXPelsPerMeter = GET_4B(bmpinfoheader,24); biYPelsPerMeter = GET_4B(bmpinfoheader,28); biClrUsed = GET_4B(bmpinfoheader,32); /* biSizeImage, biClrImportant fields are ignored */ switch (p_imageinfo->m_bitsperpixel) { case 1: if (!biClrUsed)/* 0 denotes maximum usage of colors*/ biClrUsed=2; case 4: if (!biClrUsed)/* 0 denotes maximum usage of colors*/ biClrUsed=16; case 8: /* colormapped images */ if (!biClrUsed)/* 0 denotes maximum usage of colors*/ biClrUsed=256; mapentrysize = 4; /* Windows uses RGBQUAD colormap */ break; case 24: /* RGB image */ break; case 16: case 32: /* RGB image with masks*/ if (biCompression==3) /*BI_BITFIELDS*/ { biClrUsed=3; /*need to get masks for RGB*/ mapentrysize = 4; /* Windows uses RGBQUAD colormap */ } break; default: return CONVERR_INVALIDBITDEPTH; break; } if (biPlanes != 1) return FALSE; if (biCompression != 0) if (3!=biCompression) return CONVERR_COMPRESSED;//cant handle compressed bitmaps if (biXPelsPerMeter > 0 && biYPelsPerMeter > 0) { /* Set JFIF density parameters from the BMP data */ p_imageinfo->m_X_density = (UINT16) (biXPelsPerMeter/100); /* 100 cm per meter */ p_imageinfo->m_Y_density = (UINT16) (biYPelsPerMeter/100); p_imageinfo->m_density_unit = 2; /* dots/cm */ } break; default: return CONVERR_INVALIDIMAGEHEADER; break; } /* Compute distance to bitmap data --- will adjust for colormap below */ bPad = bfOffBits - (headerSize + 14); /* Read the colormap, if any */ if (mapentrysize > 0) { if (biClrUsed <= 0) biClrUsed = 256; /* assume it's 256 */ else if (biClrUsed > 256) return CONVERR_INVALIDCOLORMAP; /* Allocate space to store the colormap */ p_imageinfo->m_colormap = (BYTE *)malloc(biClrUsed*3); /* and read it from the file */ t_err=read_colormap_bmp(p_inputparam,p_imageinfo->m_colormap, (int16) biClrUsed, mapentrysize); if (t_err!=CONV_OK) return t_err; p_imageinfo->m_image_size+=biClrUsed*mapentrysize;/*mapentrysize for windows bitmaps*/ /* account for size of colormap */ bPad -= biClrUsed * mapentrysize; } if (CONVERT_FILE==p_inputparam->m_stream.m_type)/* Skip any remaining pad bytes */ { if (bPad < 0) /* incorrect bfOffBits value? */ return CONVERR_INVALIDIMAGEHEADER; while (--bPad >= 0) { (void) read_param_byte(&p_inputparam->m_stream); p_imageinfo->m_image_size++; } } /* Compute row width in file, including padding to 4-byte boundary */ switch (p_imageinfo->m_bitsperpixel) { case 1: row_width = biWidth/8; if (biWidth&7) row_width++; break; case 4: row_width = biWidth/2; if (biWidth&1) row_width++; break; case 8: row_width = (uint16) biWidth; break; case 16: row_width = (uint16) (biWidth * 2); break; case 24: row_width = (uint16) (biWidth * 3); break; case 32: row_width = (uint16) (biWidth * 4); break; default: return CONVERR_INVALIDBITDEPTH; } p_imageinfo->m_stride=row_width; while ((row_width & 3) != 0) row_width++; p_imageinfo->m_row_width = row_width; p_imageinfo->m_stride=p_imageinfo->m_row_width-p_imageinfo->m_stride;//difference /* p_imageinfo->m_in_color_space = JCS_RGB;*/ /* in color space is ignored. was only for JPEG PAL format*/ p_imageinfo->m_input_components = 3; p_imageinfo->m_data_precision = 8; p_imageinfo->m_image_width = (uint16) biWidth; p_imageinfo->m_image_height = (uint16) biHeight; p_imageinfo->m_numcolorentries=(short)biClrUsed; return CONV_OK; } /////////////////////////////////// ///////END START READ BMP////////// /////////////////////////////////// /////////////////////////////////// ///////COLOR MAP READ////////////// /////////////////////////////////// CONVERT_IMAGERESULT read_colormap_bmp (CONVERT_IMGCONTEXT *p_inputparam, BYTE *p_colormap,int16 cmaplen, int16 mapentrysize) /* Read the colormap from a BMP file */ { int16 i; switch (mapentrysize) { case 3: /* BGR format (occurs in OS/2 files) */ for (i = 0; i < cmaplen; i++) { p_colormap[i*3+2]=read_param_byte(&p_inputparam->m_stream);//file or mem doesnt matter p_colormap[i*3+1]=read_param_byte(&p_inputparam->m_stream);//file or mem doesnt matter p_colormap[i*3+0]=read_param_byte(&p_inputparam->m_stream);//file or mem doesnt matter } break; case 4: /* BGR0 format (occurs in MS Windows files) */ for (i = 0; i < cmaplen; i++) { p_colormap[i*3+2]=read_param_byte(&p_inputparam->m_stream);//file or mem doesnt matter p_colormap[i*3+1]=read_param_byte(&p_inputparam->m_stream);//file or mem doesnt matter p_colormap[i*3+0]=read_param_byte(&p_inputparam->m_stream);//file or mem doesnt matter (void) read_param_byte(&p_inputparam->m_stream); } break; default: XP_ASSERT(FALSE); return CONVERR_INVALIDCOLORMAP; break; } return CONV_OK; } ///////////////////////////////END COLORMAP READ CONVERT_IMAGERESULT finish_input_bmp(CONVERT_IMG_INFO *p_imageinfo, CONVERT_IMGCONTEXT *p_input,CONVERT_IMG_ARRAY *p_returnarray) { int16 i; CONVERT_IMG_ARRAY t_returnarray; int16 t_absheight=p_imageinfo->m_image_height; int16 t_start,t_end; int16 t_direction; if (t_absheight<0) /* negative height == top down */ { t_absheight*= -1; t_start=0; t_end=t_absheight; t_direction= 1; } else { t_start =t_absheight-1; t_end= -1; t_direction= -1; } t_returnarray=(CONVERT_IMG_ARRAY)malloc(t_absheight*sizeof (CONVERT_IMG_ROW)); if (!t_returnarray) /*out of memory*/ return CONVERR_OUTOFMEMORY; *p_returnarray=t_returnarray; memset(t_returnarray,0,t_absheight*sizeof (CONVERT_IMG_ROW *)); /* want to initialize the memory to 0 so in case of error we can free each row.*/ XP_ASSERT(p_imageinfo); XP_ASSERT(p_input); for (i=t_start;i!=t_end;i+=t_direction) { t_returnarray[i]=(CONVERT_IMG_ROW)malloc(p_imageinfo->m_image_width*3); /* *3 because RGB */; /* pointer to JSAMPLE row[s] */ if (!t_returnarray[i]) { return CONVERR_BADREAD; } switch (p_imageinfo->m_bitsperpixel) { case 1: if (!get_1bit_row_bmp(p_input,p_imageinfo,t_returnarray[i]))/*true if succeeded*/ { return CONVERR_BADREAD; } break; case 4: if (!get_4bit_row_bmp(p_input,p_imageinfo,t_returnarray[i]))/*true if succeeded*/ { return CONVERR_BADREAD; } break; case 8: if (!get_8bit_row_bmp(p_input,p_imageinfo,t_returnarray[i]))/*true if succeeded*/ { return CONVERR_BADREAD; } break; case 16: if (!get_16bit_row_bmp(p_input,p_imageinfo,t_returnarray[i]))/*true if succeeded*/ { return CONVERR_BADREAD; } break; case 24: if (!get_24bit_row_bmp(p_input,p_imageinfo,t_returnarray[i]))/*true if succeeded*/ { return CONVERR_BADREAD; } break; case 32: if (!get_32bit_row_bmp(p_input,p_imageinfo,t_returnarray[i]))/*true if succeeded*/ { return CONVERR_BADREAD; } break; default: { XP_ASSERT(FALSE); /* what the heck happened!*/ return CONVERR_INVALIDBITDEPTH; } } } return CONV_OK; } XP_Bool get_8bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer) /* This version is for reading 8-bit colormap indexes */ { CONVERT_IMG_ROW outptr = p_outputbuffer; BYTE t_byte; int16 col; if (!p_info->m_colormap||!p_outputbuffer||!p_params||!p_info) { XP_ASSERT(FALSE); return FALSE; } for (col = p_info->m_image_width; col > 0; col--) { t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; if (EOF==t_byte) return FALSE; if (t_byte>p_info->m_numcolorentries)/*bad index*/ return FALSE; *outptr++ = p_info->m_colormap[0+t_byte*3]; /* can omit GETJSAMPLE() safely */ if (EOF==t_byte) return FALSE; *outptr++ = p_info->m_colormap[1+t_byte*3]; if (EOF==t_byte) return FALSE; *outptr++ = p_info->m_colormap[2+t_byte*3]; } for (col=0;colm_stride;col++) /*read to 4byte multiple*/ { t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; if (EOF==t_byte) return FALSE; } return TRUE; } void process_color_mask(uint32 *p_mask,char *p_shift,uint16 *p_pad) { uint32 t_mask=*p_mask; *p_shift=0; *p_pad=0; if (!p_mask||!p_shift||!p_pad) { XP_ASSERT(FALSE); return; } while (!(t_mask&1)) { (*p_shift)+=1; t_mask=t_mask>>1; } while (t_mask&256) /*larger than 8bp color key i.e. 10-3-3*/ (*p_shift)+=1; while (t_mask<128)/* dont know where the mask is that is why we dont put this in the same loop*/ { (*p_shift)--; t_mask=t_mask<<1; (*p_pad)=(*p_pad)<<1; (*p_pad)++; } } XP_Bool get_16bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer) /* This version is for reading 8-bit colormap indexes */ { CONVERT_IMG_ROW outptr = p_outputbuffer; BYTE t_byte; int16 col; uint32 t_redmask=0x00007C00; uint32 t_greenmask=0x000003E0; uint32 t_bluemask=0x0000001F; char t_redshift=10; char t_greenshift=5; char t_blueshift=0; uint16 t_redpad=0; uint16 t_greenpad=0; uint16 t_bluepad=0; if (!p_outputbuffer||!p_params||!p_info) { XP_ASSERT(FALSE); return FALSE; } if (p_info->m_numcolorentries==3) { if (!p_info->m_colormap) { XP_ASSERT(FALSE); return FALSE; } t_redmask=(p_info->m_colormap[0]<<16)+(p_info->m_colormap[1]<<8)+p_info->m_colormap[2]; t_greenmask=(p_info->m_colormap[3]<<16)+(p_info->m_colormap[4]<<8)+p_info->m_colormap[5]; t_bluemask=(p_info->m_colormap[6]<<16)+(p_info->m_colormap[7]<<8)+p_info->m_colormap[8]; process_color_mask(&t_redmask,&t_redshift,&t_redpad); process_color_mask(&t_greenmask,&t_greenshift,&t_greenpad); process_color_mask(&t_bluemask,&t_blueshift,&t_bluepad); } for (col = p_info->m_image_width; col > 0; col--) { uint16 t_pixel;/*16bits*/ uint16 t_temppixel; if (-1==read_param(&p_params->m_stream,&t_pixel,sizeof(t_pixel))) return FALSE; p_info->m_image_size+=sizeof(t_pixel); t_temppixel=(uint16)(t_redmask&t_pixel); if (t_redshift>0) t_temppixel=t_temppixel>>t_redshift; else t_temppixel=t_temppixel<<(-1 *t_redshift); t_temppixel=t_temppixel+t_redpad; outptr[0]=(BYTE)t_temppixel; t_temppixel=(uint16)(t_greenmask&t_pixel); if (t_greenshift>0) t_temppixel=t_temppixel>>t_greenshift; else t_temppixel=t_temppixel<<(-1 *t_greenshift); t_temppixel=t_temppixel+t_greenpad; outptr[1]=(BYTE)t_temppixel; t_temppixel=(uint16)(t_bluemask&t_pixel); if (t_blueshift>0) t_temppixel=t_temppixel>>t_blueshift; else t_temppixel=t_temppixel<<(-1 *t_blueshift); t_temppixel=t_temppixel+t_bluepad; outptr[2]=(BYTE)t_temppixel; outptr+=3; } for (col=0;colm_stride;col++) /*read to 4byte multiple*/ { t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; if (EOF==t_byte) return FALSE; } return TRUE; } XP_Bool get_32bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer) /* This version is for reading 8-bit colormap indexes */ { CONVERT_IMG_ROW outptr = p_outputbuffer; BYTE t_byte; int16 col; uint32 t_redmask= 0x00FF0000;/*RGB(8,8,8)*/ uint32 t_greenmask=0x0000FF00; uint32 t_bluemask= 0x000000FF; BYTE t_redshift=16; BYTE t_greenshift=8; BYTE t_blueshift=0; uint16 t_redpad=0; uint16 t_greenpad=0; uint16 t_bluepad=0; if (!p_outputbuffer||!p_params||!p_info) { XP_ASSERT(FALSE); return FALSE; } if (p_info->m_numcolorentries==3) { if (!p_info->m_colormap) { XP_ASSERT(FALSE); return FALSE; } t_redmask=(p_info->m_colormap[0]<<16)+(p_info->m_colormap[1]<<8)+p_info->m_colormap[2]; t_greenmask=(p_info->m_colormap[3]<<16)+(p_info->m_colormap[4]<<8)+p_info->m_colormap[5]; t_bluemask=(p_info->m_colormap[6]<<16)+(p_info->m_colormap[7]<<8)+p_info->m_colormap[8]; process_color_mask(&t_redmask,&t_redshift,&t_redpad); process_color_mask(&t_greenmask,&t_greenshift,&t_greenpad); process_color_mask(&t_bluemask,&t_blueshift,&t_bluepad); } for (col = p_info->m_image_width; col > 0; col--) { uint32 t_pixel; if (-1==read_param(&p_params->m_stream,&t_pixel,sizeof(t_pixel))) return FALSE; p_info->m_image_size+=sizeof(t_pixel); if (t_redshift>0) outptr[0]=(BYTE)((t_redmask&t_pixel)>>t_redshift); else outptr[0]=(BYTE)((t_redmask&t_pixel)<<(-1*t_redshift)); outptr[0]+=t_redpad; if (t_greenshift>0) outptr[1]=(BYTE)((t_greenmask&t_pixel)>>t_greenshift); else outptr[1]=(BYTE)((t_greenmask&t_pixel)<<(-1*t_greenshift)); outptr[1]+=t_greenpad; if (t_blueshift>0) outptr[2]=(BYTE)((t_bluemask&t_pixel)>>t_blueshift); else outptr[2]=(BYTE)((t_bluemask&t_pixel)<<(-1*t_blueshift)); outptr[2]+=t_bluepad; outptr+=3; } for (col=0;colm_stride;col++) /*read to 4byte multiple*/ { t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; if (EOF==t_byte) return FALSE; } return TRUE; } XP_Bool get_4bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer) /* This version is for reading 8-bit colormap indexes */ { CONVERT_IMG_ROW outptr = p_outputbuffer; BYTE t_byte; BYTE t_value; /*4bitvalue for index into color table*/ int16 col; if (!p_info->m_colormap||!p_outputbuffer||!p_params||!p_info) { XP_ASSERT(FALSE); return FALSE; } for (col = 0; col m_image_width; col++) { if (0==(col%2)) { t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; } t_value = (t_byte>>4)& 0x0F; /*high order 4 bits, shift right, mask high order crap*/ if (EOF==t_byte) return FALSE; if (t_value>p_info->m_numcolorentries)/*bad index*/ return FALSE; *outptr++ = p_info->m_colormap[0+t_value*3]; /* can omit GETJSAMPLE() safely */ if (EOF==t_byte) return FALSE; *outptr++ = p_info->m_colormap[1+t_value*3]; if (EOF==t_byte) return FALSE; *outptr++ = p_info->m_colormap[2+t_value*3]; t_byte<<=4; /*next pixel*/ } for (col=0;colm_stride;col++) /*read to 4byte multiple*/ { t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; if (EOF==t_byte) return FALSE; } return TRUE; } XP_Bool get_1bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer) /* This version is for reading 8-bit colormap indexes */ { CONVERT_IMG_ROW outptr = p_outputbuffer; BYTE t_byte; int16 col,bit; if (!p_info->m_colormap||!p_outputbuffer||!p_params||!p_info) { XP_ASSERT(FALSE); return FALSE; } if (!p_outputbuffer) return FALSE; for (bit=0;bitm_image_width;bit++) { if (0==(bit%8)) { t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; } //start from left by & with 128 then shift one at a time if (t_byte&128) { *outptr++ = p_info->m_colormap[3]; *outptr++ = p_info->m_colormap[4]; *outptr++ = p_info->m_colormap[5]; } else { *outptr++ = p_info->m_colormap[0]; *outptr++ = p_info->m_colormap[1]; *outptr++ = p_info->m_colormap[2]; } t_byte<<=1; } for (col=0;colm_stride;col++) /*read to 4byte multiple*/ { t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; if (EOF==t_byte) return FALSE; } return TRUE; } XP_Bool get_24bit_row_bmp (CONVERT_IMGCONTEXT *p_params,CONVERT_IMG_INFO *p_info,CONVERT_IMG_ROW p_outputbuffer) /* This version is for reading 24-bit pixels */ { CONVERT_IMG_ROW outptr = p_outputbuffer; BYTE t_byte; int16 col; if (!p_outputbuffer||!p_params||!p_info) { XP_ASSERT(FALSE); return FALSE; } for (col = p_info->m_image_width; col > 0; col--) { t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; if (EOF==t_byte) return FALSE; outptr[2] =t_byte; t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; if (EOF==t_byte) return FALSE; outptr[1] =t_byte; t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; if (EOF==t_byte) return FALSE; outptr[0] =t_byte; outptr+=3;/*next RGB*/ } for (col=0;colm_stride;col++) /*read to 4byte multiple*/ { t_byte = read_param_byte(&p_params->m_stream); p_info->m_image_size++; if (EOF==t_byte) return FALSE; } return TRUE; } /////////////////////////////////////////////// ////////////////////END READ/////////////////// ///////////////////////////////////////////////