Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4972 → Rev 4973

/programs/develop/libraries/menuetlibc/src/libmgfx/readjpeg.c
0,0 → 1,137
/* Zgv v2.7 - GIF, JPEG and PBM/PGM/PPM viewer, for VGA PCs running Linux.
* Copyright (C) 1993-1995 Russell Marks. See README for license details.
*
* readjpeg.c - interface to the IJG's JPEG software, derived from
* their example.c.
*/
 
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <setjmp.h>
#include <sys/file.h> /* for open et al */
#include <jpeglib.h>
#include "libmgfx.h"
 
static mgfx_image_t * the_image;
static FILE * global_jpeg_infile;
static struct jpeg_decompress_struct cinfo;
 
struct my_error_mgr
{
struct jpeg_error_mgr pub;
jmp_buf setjmp_buffer;
};
 
typedef struct my_error_mgr * my_error_ptr;
 
static void jpegerr(char *msgtext)
{
}
 
static void my_error_exit(j_common_ptr cinfo)
{
my_error_ptr myerr=(my_error_ptr) cinfo->err;
char buf[JMSG_LENGTH_MAX];
(*cinfo->err->format_message)(cinfo,buf);
jpegerr(buf);
longjmp(myerr->setjmp_buffer, 1);
}
 
static void my_output_message(j_common_ptr cinfo)
{
}
 
static void aborted_file_jpeg_cleanup()
{
jpeg_destroy_decompress(&cinfo);
fclose(global_jpeg_infile);
}
 
int read_JPEG_file(FILE * in,mgfx_image_t * img)
{
struct my_error_mgr jerr;
int row_stride;
int tmp,f;
unsigned char *ptr;
the_image=img;
if((img->pal=(byte *)malloc(768))==NULL) return(_PICERR_NOMEM);
cinfo.err=jpeg_std_error(&jerr.pub);
jerr.pub.error_exit=my_error_exit;
jerr.pub.output_message=my_output_message;
if(setjmp(jerr.setjmp_buffer))
{
jpeg_destroy_decompress(&cinfo);
free(img->pal);
return(_PICERR_CORRUPT);
}
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo,in);
jpeg_read_header(&cinfo,TRUE);
cinfo.dct_method=JDCT_FLOAT;
img->bpp=24;
if(cinfo.jpeg_color_space==JCS_GRAYSCALE)
{
cinfo.out_color_space=JCS_GRAYSCALE;
cinfo.desired_number_of_colors=256;
cinfo.quantize_colors=FALSE;
cinfo.two_pass_quantize=FALSE;
img->bpp=8;
for(f=0;f<256;f++)
img->pal[f]=img->pal[256+f]=img->pal[512+f]=f;
}
img->width=cinfo.image_width;
img->height=cinfo.image_height;
img->the_image=(byte *)malloc(((img->bpp+7)/8)*img->width*img->height);
if(img->the_image==NULL)
{
jpegerr("Out of memory");
longjmp(jerr.setjmp_buffer,1);
}
jpeg_start_decompress(&cinfo);
if(img->bpp==8 && cinfo.jpeg_color_space!=JCS_GRAYSCALE)
for(f=0;f<cinfo.actual_number_of_colors;f++)
{
img->pal[ f]=cinfo.colormap[0][f];
img->pal[256+f]=cinfo.colormap[1][f];
img->pal[512+f]=cinfo.colormap[2][f];
}
ptr=img->the_image;
row_stride=((img->bpp+7)/8)*img->width;
if(img->bpp==8)
while(cinfo.output_scanline<img->height)
{
jpeg_read_scanlines(&cinfo,&ptr,1);
ptr+=row_stride;
}
else
while(cinfo.output_scanline<img->height)
{
jpeg_read_scanlines(&cinfo,&ptr,1);
for(f=0;f<img->width;f++) { tmp=*ptr; *ptr=ptr[2]; ptr[2]=tmp; ptr+=3; }
}
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
return(_PIC_OK);
}
 
static struct mgfx_image_format this_fmt_1={
"JPEG",
"jpg",
read_JPEG_file,
NULL,
};
 
static struct mgfx_image_format this_fmt_2={
"JPEG",
"jpeg",
read_JPEG_file,
NULL,
};
 
void mgfx_register_jpeg(void)
{
register_image_format(&this_fmt_1);
register_image_format(&this_fmt_2);
}