Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 160 lines (132 sloc) 4.315 kb
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
1 #include "image.h"
2 #include <stdio.h>
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
3 #include "iolayer.h"
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
4 #ifndef _MSC_VER
5 #include <unistd.h>
6 #endif
7 #include <string.h>
faa9b3e Egads
Tony Cook authored
8 #include <errno.h>
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
9
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
10
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
11
12 /*
13
14 Image loader for raw files.
15
16 This is a barebones raw loader...
17
18 fd: filedescriptor
19 x: xsize
20 y: ysize
21 datachannels: the number of channels the file contains
22 storechannels: the bitmap of channels we will read
23 intrl: interlace flag,
24 0 = sample interleaving
25 1 = line interleaving
26 2 = image interleaving
27
28 */
29
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
30 static
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
31 void
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
32 interleave(unsigned char *inbuffer,unsigned char *outbuffer,int rowsize,int channels) {
33 int ch,ind,i;
34 i=0;
35 if (inbuffer == outbuffer) return; /* Check if data is already in interleaved format */
36 for (ind=0; ind<rowsize; ind++)
37 for (ch=0; ch<channels; ch++)
38 outbuffer[i++] = inbuffer[rowsize*ch+ind];
39 }
40
41 static
42 void
43 expandchannels(unsigned char *inbuffer, unsigned char *outbuffer,
44 int chunks, int datachannels, int storechannels) {
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
45 int ch,i;
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
46 if (inbuffer == outbuffer) return; /* Check if data is already in expanded format */
47 for(ch=0; ch<chunks; ch++)
48 for (i=0; i<storechannels; i++)
49 outbuffer[ch*storechannels+i] = inbuffer[ch*datachannels+i];
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
50 }
51
52 i_img *
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
53 i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, int intrl) {
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
54 i_img* im;
55 int rc,k;
56
57 unsigned char *inbuffer;
58 unsigned char *ilbuffer;
59 unsigned char *exbuffer;
60
61 int inbuflen,ilbuflen,exbuflen;
62
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
63 io_glue_commit_types(ig);
64 mm_log((1, "i_readraw(ig %p,x %d,y %d,datachannels %d,storechannels %d,intrl %d)\n",
65 ig, x, y, datachannels, storechannels, intrl));
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
66
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
67 im = i_img_empty_ch(NULL,x,y,storechannels);
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
68
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
69 inbuflen = im->xsize*datachannels;
70 ilbuflen = inbuflen;
71 exbuflen = im->xsize*storechannels;
72 inbuffer = (unsigned char*)mymalloc(inbuflen);
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
73 mm_log((1,"inbuflen: %d, ilbuflen: %d, exbuflen: %d.\n",inbuflen,ilbuflen,exbuflen));
74
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
75 if (intrl==0) ilbuffer = inbuffer;
76 else ilbuffer=mymalloc(inbuflen);
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
77
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
78 if (datachannels==storechannels) exbuffer=ilbuffer;
79 else exbuffer= mymalloc(exbuflen);
80
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
81 k=0;
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
82 while( k<im->ysize ) {
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
83 rc = ig->readcb(ig, inbuffer, inbuflen);
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
84 if (rc != inbuflen) { fprintf(stderr,"Premature end of file.\n"); exit(2); }
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
85 interleave(inbuffer,ilbuffer,im->xsize,datachannels);
86 expandchannels(ilbuffer,exbuffer,im->xsize,datachannels,storechannels);
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
87 /* FIXME: Do we ever want to save to a virtual image? */
faa9b3e Egads
Tony Cook authored
88 memcpy(&(im->idata[im->xsize*storechannels*k]),exbuffer,exbuflen);
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
89 k++;
90 }
91
92 myfree(inbuffer);
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
93 if (intrl != 0) myfree(ilbuffer);
94 if (datachannels != storechannels) myfree(exbuffer);
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
95 return im;
96 }
97
98
99
100 undef_int
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
101 i_writeraw_wiol(i_img* im, io_glue *ig) {
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
102 int rc;
faa9b3e Egads
Tony Cook authored
103
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
104 io_glue_commit_types(ig);
faa9b3e Egads
Tony Cook authored
105 i_clear_error();
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
106 mm_log((1,"writeraw(im %p,ig %p)\n", im, ig));
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
107
108 if (im == NULL) { mm_log((1,"Image is empty\n")); return(0); }
faa9b3e Egads
Tony Cook authored
109 if (!im->virtual) {
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
110 rc = ig->writecb(ig,im->idata,im->bytes);
111 if (rc != im->bytes) {
faa9b3e Egads
Tony Cook authored
112 i_push_error(errno, "Could not write to file");
113 mm_log((1,"i_writeraw: Couldn't write to file\n"));
114 return(0);
115 }
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
116 } else {
faa9b3e Egads
Tony Cook authored
117 int y;
118
119 if (im->type == i_direct_type) {
120 /* just save it as 8-bits, maybe support saving higher bit count
121 raw images later */
122 int line_size = im->xsize * im->channels;
123 unsigned char *data = mymalloc(line_size);
a73aeb5 Fixed most outstanding memory leaks that are revealed in the test cases.
Arnar Mar Hrafnkelsson authored
124
125 int y = 0;
126 rc = line_size;
127 while (rc == line_size && y < im->ysize) {
128 i_gsamp(im, 0, im->xsize, y, data, NULL, im->channels);
129 rc = ig->writecb(ig, data, line_size);
130 ++y;
faa9b3e Egads
Tony Cook authored
131 }
132 if (rc != line_size) {
133 i_push_error(errno, "write error");
134 return 0;
135 }
a73aeb5 Fixed most outstanding memory leaks that are revealed in the test cases.
Arnar Mar Hrafnkelsson authored
136 myfree(data);
5473b91 Cleaned up io.h, io.c which had functions not used any more, removed unu...
Arnar Mar Hrafnkelsson authored
137 } else {
faa9b3e Egads
Tony Cook authored
138 /* paletted image - assumes the caller puts the palette somewhere
139 else
140 */
141 int line_size = sizeof(i_palidx) * im->xsize;
142 i_palidx *data = mymalloc(sizeof(i_palidx) * im->xsize);
a73aeb5 Fixed most outstanding memory leaks that are revealed in the test cases.
Arnar Mar Hrafnkelsson authored
143
144 int y = 0;
145 rc = line_size;
146 while (rc == line_size && y < im->ysize) {
147 i_gpal(im, 0, im->xsize, y, data);
148 rc = ig->writecb(ig, data, line_size);
149 ++y;
faa9b3e Egads
Tony Cook authored
150 }
a73aeb5 Fixed most outstanding memory leaks that are revealed in the test cases.
Arnar Mar Hrafnkelsson authored
151 myfree(data);
faa9b3e Egads
Tony Cook authored
152 if (rc != line_size) {
153 i_push_error(errno, "write error");
154 return 0;
155 }
156 }
895dbd3 Replaced i_readraw() and i_writeraw() with the equivalent _wiol function...
Arnar Mar Hrafnkelsson authored
157 }
02d1d62 Initial revision
Arnar Mar Hrafnkelsson authored
158 return(1);
159 }
Something went wrong with that request. Please try again.