diff options
author | N.N. <matju@users.sourceforge.net> | 2008-04-28 18:10:15 +0000 |
---|---|---|
committer | N.N. <matju@users.sourceforge.net> | 2008-04-28 18:10:15 +0000 |
commit | 91c0003b158e5f0ed9d0677fb136ae8bb6f86ec5 (patch) | |
tree | d413a48086819f6a2620cd27d030861d122d4f3f /externals/gridflow/format/jpeg.c | |
parent | 98dfdfa2fc1c92ba69e33fd77ed3392034297c1f (diff) |
this is an old gridflow, and there's already a svn repository at http://gridflow.ca/svn/trunk
svn path=/trunk/; revision=9739
Diffstat (limited to 'externals/gridflow/format/jpeg.c')
-rw-r--r-- | externals/gridflow/format/jpeg.c | 138 |
1 files changed, 0 insertions, 138 deletions
diff --git a/externals/gridflow/format/jpeg.c b/externals/gridflow/format/jpeg.c deleted file mode 100644 index 4363be52..00000000 --- a/externals/gridflow/format/jpeg.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - $Id: jpeg.c,v 1.2 2006-03-15 04:37:46 matju Exp $ - - GridFlow - Copyright (c) 2001,2002,2003,2004 by Mathieu Bouchard - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version 2 - of the License, or (at your option) any later version. - - See file ../COPYING for further informations on licensing terms. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -//!@#$ not handling abort on compress -//!@#$ not handling abort on decompress - -#include "../base/grid.h.fcs" -/* removing macros (removing warnings) */ -#undef HAVE_PROTOTYPES -#undef HAVE_STDLIB_H -#undef EXTERN -extern "C" { -#include <jpeglib.h> -}; - -\class FormatJPEG < Format -struct FormatJPEG : Format { - P<BitPacking> bit_packing; - struct jpeg_compress_struct cjpeg; - struct jpeg_decompress_struct djpeg; - struct jpeg_error_mgr jerr; - int fd; - FILE *f; - \decl Ruby frame (); - \decl void quality (short quality); - \decl void initialize (Symbol mode, Symbol source, String filename); - \grin 0 int -}; - -GRID_INLET(FormatJPEG,0) { - if (in->dim->n != 3) - RAISE("expecting 3 dimensions: rows,columns,channels"); - if (in->dim->get(2) != 3) - RAISE("expecting 3 channels (got %d)",in->dim->get(2)); - in->set_factor(in->dim->get(1)*in->dim->get(2)); - cjpeg.err = jpeg_std_error(&jerr); - jpeg_create_compress(&cjpeg); - jpeg_stdio_dest(&cjpeg,f); - cjpeg.image_width = in->dim->get(1); - cjpeg.image_height = in->dim->get(0); - cjpeg.input_components = 3; - cjpeg.in_color_space = JCS_RGB; - jpeg_set_defaults(&cjpeg); - jpeg_start_compress(&cjpeg,TRUE); -} GRID_FLOW { - int rowsize = in->dim->get(1)*in->dim->get(2); - int rowsize2 = in->dim->get(1)*3; - uint8 row[rowsize2]; - uint8 *rows[1] = { row }; - while (n) { - bit_packing->pack(in->dim->get(1),data,Pt<uint8>(row,rowsize)); - jpeg_write_scanlines(&cjpeg,rows,1); - n-=rowsize; data+=rowsize; - } -} GRID_FINISH { - jpeg_finish_compress(&cjpeg); - jpeg_destroy_compress(&cjpeg); -} GRID_END - -static bool gfeof(FILE *f) { - off_t cur,end; - cur = ftell(f); - fseek(f,0,SEEK_END); - end = ftell(f); - fseek(f,cur,SEEK_SET); - return cur==end; -} - -\def Ruby frame () { - off_t off = NUM2LONG(rb_funcall(rb_ivar_get(rself,SI(@stream)),SI(tell),0)); - fseek(f,off,SEEK_SET); - if (gfeof(f)) return Qfalse; - djpeg.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&djpeg); - jpeg_stdio_src(&djpeg,f); - jpeg_read_header(&djpeg,TRUE); - int sx=djpeg.image_width, sy=djpeg.image_height, chans=djpeg.num_components; - GridOutlet out(this,0,new Dim(sy, sx, chans), - NumberTypeE_find(rb_ivar_get(rself,SI(@cast)))); - jpeg_start_decompress(&djpeg); - uint8 row[sx*chans]; - uint8 *rows[1] = { row }; - for (int n=0; n<sy; n++) { - jpeg_read_scanlines(&djpeg,rows,1); - out.send(sx*chans,Pt<uint8>(row,sx*chans)); - } - jpeg_finish_decompress(&djpeg); - jpeg_destroy_decompress(&djpeg); - return Qnil; -} - -\def void quality (short quality) { - quality = min(max((int)quality,0),100); - // should the last arg ("baseline") be set to true ? - // and what is it for? is it for accuracy of the DC component? - jpeg_set_quality(&cjpeg,quality,false); -} - -\def void initialize (Symbol mode, Symbol source, String filename) { - rb_call_super(argc,argv); - if (source!=SYM(file)) RAISE("usage: jpeg file <filename>"); - rb_funcall(rself,SI(raw_open),3,mode,source,filename); - Ruby stream = rb_ivar_get(rself,SI(@stream)); - fd = NUM2INT(rb_funcall(stream,SI(fileno),0)); - f = fdopen(fd,mode==SYM(in)?"r":"w"); - uint32 mask[3] = {0x0000ff,0x00ff00,0xff0000}; - bit_packing = new BitPacking(is_le(),3,3,mask); -} - -\classinfo { - IEVAL(rself, - "install '#io:jpeg',1,1;@mode=6;" - "include GridFlow::EventIO; suffixes_are'jpeg','jpg'"); -} -\end class FormatJPEG -void startup_jpeg () { - \startall -} |