jpeg.c
上传用户:hengzhunsh
上传日期:2013-09-07
资源大小:19k
文件大小:4k
源码类别:

浏览器

开发平台:

Unix_Linux

  1. /*
  2.     fbv  --  simple image viewer for the linux framebuffer
  3.     Copyright (C) 2000, 2001, 2003  Mateusz Golicz
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. #include "config.h"
  17. #ifdef FBV_SUPPORT_JPEG
  18. #include <stdio.h>
  19. #include <sys/types.h>
  20. #include <sys/stat.h>
  21. #include <fcntl.h>
  22. #include <jpeglib.h>
  23. #include <setjmp.h>
  24. #include <unistd.h>
  25. #include <string.h>
  26. #include "fbv.h"
  27. struct r_jpeg_error_mgr
  28. {
  29.     struct jpeg_error_mgr pub;
  30.     jmp_buf envbuffer;
  31. };
  32. int fh_jpeg_id(char *name)
  33. {
  34.     int fd;
  35.     unsigned char id[10];
  36.     fd=open(name,O_RDONLY); if(fd==-1) return(0);
  37.     read(fd,id,10);
  38.     close(fd);
  39.     if(id[6]=='J' && id[7]=='F' && id[8]=='I' && id[9]=='F') return(1);
  40.     if(id[0]==0xff && id[1]==0xd8 && id[2]==0xff) return(1);
  41.     return(0);
  42. }
  43.     
  44. void jpeg_cb_error_exit(j_common_ptr cinfo)
  45. {
  46.     struct r_jpeg_error_mgr *mptr;
  47.     mptr=(struct r_jpeg_error_mgr*) cinfo->err;
  48.     (*cinfo->err->output_message) (cinfo);
  49.     longjmp(mptr->envbuffer,1);
  50. }
  51. int fh_jpeg_load(char *filename,unsigned char *buffer, unsigned char ** alpha, int x,int y)
  52. {
  53.     struct jpeg_decompress_struct cinfo;
  54.     struct jpeg_decompress_struct *ciptr;
  55.     struct r_jpeg_error_mgr emgr;
  56.     unsigned char *bp;
  57.     int px,py,c;
  58.     FILE *fh;
  59.     JSAMPLE *lb;
  60.     ciptr=&cinfo;
  61.     if(!(fh=fopen(filename,"rb"))) return(FH_ERROR_FILE);
  62.     ciptr->err=jpeg_std_error(&emgr.pub);
  63.     emgr.pub.error_exit=jpeg_cb_error_exit;
  64.     if(setjmp(emgr.envbuffer)==1)
  65.     {
  66. // FATAL ERROR - Free the object and return...
  67. jpeg_destroy_decompress(ciptr);
  68. fclose(fh);
  69. return(FH_ERROR_FORMAT);
  70.     }
  71.     
  72.     jpeg_create_decompress(ciptr);
  73.     jpeg_stdio_src(ciptr,fh);
  74.     jpeg_read_header(ciptr,TRUE);
  75.     ciptr->out_color_space=JCS_RGB;
  76.     jpeg_start_decompress(ciptr);
  77.     px=ciptr->output_width; py=ciptr->output_height;
  78.     c=ciptr->output_components;
  79.     if(c==3)
  80.     {
  81. lb=(*ciptr->mem->alloc_small)((j_common_ptr) ciptr,JPOOL_PERMANENT,c*px);
  82. bp=buffer;
  83. while (ciptr->output_scanline < ciptr->output_height)
  84. {
  85.     jpeg_read_scanlines(ciptr, &lb, 1);
  86.     memcpy(bp,lb,px*c);
  87.     bp+=px*c;
  88. }    
  89.     }
  90.     jpeg_finish_decompress(ciptr);
  91.     jpeg_destroy_decompress(ciptr);
  92.     fclose(fh);
  93.     return(FH_ERROR_OK);
  94. }
  95. int fh_jpeg_getsize(char *filename,int *x,int *y)
  96. {
  97.     struct jpeg_decompress_struct cinfo;
  98.     struct jpeg_decompress_struct *ciptr;
  99.     struct r_jpeg_error_mgr emgr;
  100.     int px,py,c;
  101.     FILE *fh;
  102.     ciptr=&cinfo;
  103.     if(!(fh=fopen(filename,"rb"))) return(FH_ERROR_FILE);
  104.     
  105.     ciptr->err=jpeg_std_error(&emgr.pub);
  106.     emgr.pub.error_exit=jpeg_cb_error_exit;
  107.     if(setjmp(emgr.envbuffer)==1)
  108.     {
  109. // FATAL ERROR - Free the object and return...
  110. jpeg_destroy_decompress(ciptr);
  111. fclose(fh);
  112. return(FH_ERROR_FORMAT);
  113.     }
  114.     
  115.     jpeg_create_decompress(ciptr);
  116.     jpeg_stdio_src(ciptr,fh);
  117.     jpeg_read_header(ciptr,TRUE);
  118.     ciptr->out_color_space=JCS_RGB;
  119.     jpeg_start_decompress(ciptr);
  120.     px=ciptr->output_width; py=ciptr->output_height;
  121.     c=ciptr->output_components;
  122.     *x=px; *y=py;
  123.     jpeg_destroy_decompress(ciptr);
  124.     fclose(fh);
  125.     return(FH_ERROR_OK);
  126. }
  127. #endif