image_p image_load_jpg_buf(const char* mbuf,int bsize, int displaymode) { image_p pimage = NULL; struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; uint8 *rawdata,*scanline, *p,*data = NULL; int rawsize,texw,texh,width,height,bpb=2,size; int r,g,b,x; uint32* p32; uint16* p16; uint16 color16; uint32 color32; if(mbuf == NULL||bsize==0) return 0; memset(&cinfo,0,sizeof(struct jpeg_decompress_struct)); memset(&jerr,0,sizeof(struct jpeg_error_mgr)); rawsize = bsize; rawdata = (uint8*)mbuf; if (rawdata[6] != 'J' || rawdata[7] != 'F' || rawdata[8] != 'I' || rawdata[9] != 'F') { return 0; } cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); jpeg_mem_src(&cinfo, rawdata, rawsize); jpeg_read_header(&cinfo, 1); jpeg_start_decompress(&cinfo); if(cinfo.output_components != 3 && cinfo.output_components != 4) { jpeg_destroy_decompress(&cinfo); return 0; } texw = roundpower2(cinfo.output_width); texh = roundpower2(cinfo.output_height); width = cinfo.output_width; height = cinfo.output_height; if(displaymode == DISPLAY_PIXEL_FORMAT_8888){ bpb = 4; } size = texw * texh * bpb; data = (uint8*)malloc(size); memset(data,0,size); scanline = (uint8*)malloc(cinfo.output_width * 3); if(!scanline){ jpeg_destroy_decompress(&cinfo); SAFE_FREE (data); return 0; } p32 = (uint32*)data; p16 = (uint16*) p32; while(cinfo.output_scanline < cinfo.output_height){ jpeg_read_scanlines(&cinfo, &scanline, 1); p = (uint8*)scanline; for(x=0; x<(int)cinfo.output_width; x++){ r = p[0]; g = p[1]; b = p[2]; switch (displaymode){ case DISPLAY_PIXEL_FORMAT_565: color16 = MAKE_RGBA_565(r,g,b,0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_5551: color16 = MAKE_RGBA_5551(r,g,b,0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_4444: color16 = MAKE_RGBA_4444(r,g,b,0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_8888: color32 = MAKE_RGBA_8888(r,g,b,0xff); *(p32+x) = color32; break; } p+=3; } p32 += texw; p16 += texw; } SAFE_FREE(scanline); jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); pimage = (image_p)malloc(sizeof(image_t)); memset(pimage,0,sizeof(image_t)); pimage->data = (uint8 *)data; pimage->w = width; pimage->h = height; pimage->texw = texw; pimage->texh = texh; pimage->bpb = bpb; pimage->dtype = displaymode; pimage->rcentrex = pimage->w*1.0f/2; pimage->rcentrey = pimage->h*1.0f/2; pimage->mode = GET_PSM_COLOR_MODE(displaymode); pimage->mask = CreateColor(255,255,255,255,displaymode); pimage->texid = image_tid++; return pimage; }
image_p image_load_bmp_buf(const char* mbuf,int bsize, int displaymode) { image_p pimage = NULL; uint8_t *pdata,*data,*line; int dsize,w,h,texw,texh,bpb,size,x,y,done = 0; uint32_t* p32; uint16_t* p16; uint16_t color16; uint32_t color32; PBITMAPFILEHEADER pbfh = (PBITMAPFILEHEADER)mbuf; PBITMAPINFOHEADER pbih; if(pbfh->bfType !=0x4d42){ nge_print("not bmp file\n"); return 0; } pbih = (PBITMAPINFOHEADER)(mbuf+sizeof(BITMAPFILEHEADER)); dsize = sizeof(BITMAPFILEHEADER)+pbih->biSize; pdata = (uint8_t*)mbuf+dsize; w = pbih->biWidth; h = pbih->biHeight; texw = roundpower2(w); texh = roundpower2(h); bpb = 4; if(displaymode != DISPLAY_PIXEL_FORMAT_8888){ bpb = 2; } //int biSizeImage = ((((pbih->biWidth * pbih->biBitCount) + 31) & ~31) / 8) * pbih->biHeight; size = texw * texh * bpb; data = (uint8_t*)malloc(size); memset(data,0,size); p32 = (uint32_t*)data; p16 = (uint16_t*) p32; line = NULL; if(pbih->biBitCount == 24){ for (y = h;y>0;y--){ line = pdata+(y-1)*w*3; for (x=0;x<w;x++){ switch(displaymode) { case DISPLAY_PIXEL_FORMAT_8888: color32 = MAKE_RGBA_8888(line[2],line[1],line[0],0xff); *(p32+x) = color32; break; case DISPLAY_PIXEL_FORMAT_565: color16 = MAKE_RGBA_565(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_5551: color16 = MAKE_RGBA_5551(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_4444: color16 = MAKE_RGBA_4444(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; } line+=3; } p32 += texw; p16 += texw; } done = 1; } else if(pbih->biBitCount == 32){ for (y = h;y>0;y--){ line = pdata+(y-1)*w*4; for (x=0;x<w;x++){ switch(displaymode) { case DISPLAY_PIXEL_FORMAT_8888: color32 = MAKE_RGBA_8888(line[2],line[1],line[0],0xff); *(p32+x) = color32; break; case DISPLAY_PIXEL_FORMAT_565: color16 = MAKE_RGBA_565(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_5551: color16 = MAKE_RGBA_5551(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; case DISPLAY_PIXEL_FORMAT_4444: color16 = MAKE_RGBA_4444(line[2],line[1],line[0],0xff); *(p16+x) = color16; break; } line+=4; } p32 += texw; p16 += texw; } done = 1; } if (done){ pimage = (image_p)malloc(sizeof(image_t)); memset(pimage,0,sizeof(image_t)); pimage->data = (uint8_t *)data; pimage->w = w; pimage->h = h; pimage->texw = texw; pimage->texh = texh; pimage->bpb = bpb; pimage->dtype = displaymode; pimage->rcentrex = pimage->w*1.0f/2; pimage->rcentrey = pimage->h*1.0f/2; pimage->mode = GET_PSM_COLOR_MODE(displaymode); pimage->mask = CreateColor(255,255,255,255,displaymode); pimage->texid = image_tid++; } return pimage; }