コード例 #1
0
ファイル: nge_jpg.c プロジェクト: kimonline/libnge2
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;
}
コード例 #2
0
ファイル: nge_bmp.c プロジェクト: doorxp/libnge2
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;
}