2 ======================================================================
\r
5 Functions for LWO2 image references.
\r
7 Ernie Wright 17 Sep 00
\r
8 ====================================================================== */
\r
10 #include "../picointernal.h"
\r
15 ======================================================================
\r
18 Free memory used by an lwClip.
\r
19 ====================================================================== */
\r
21 void lwFreeClip( lwClip *clip )
\r
24 lwListFree( (void*) clip->ifilter, lwFreePlugin );
\r
25 lwListFree( (void*) clip->pfilter, lwFreePlugin );
\r
32 ======================================================================
\r
35 Read image references from a CLIP chunk in an LWO2 file.
\r
36 ====================================================================== */
\r
38 lwClip *lwGetClip( picoMemStream_t *fp, int cksize )
\r
47 /* allocate the Clip structure */
\r
49 clip = _pico_calloc( 1, sizeof( lwClip ));
\r
50 if ( !clip ) goto Fail;
\r
52 clip->contrast.val = 1.0f;
\r
53 clip->brightness.val = 1.0f;
\r
54 clip->saturation.val = 1.0f;
\r
55 clip->gamma.val = 1.0f;
\r
57 /* remember where we started */
\r
60 pos = _pico_memstream_tell( fp );
\r
64 clip->index = getI4( fp );
\r
66 /* first subchunk header */
\r
68 clip->type = getU4( fp );
\r
70 if ( 0 > get_flen() ) goto Fail;
\r
75 switch ( clip->type ) {
\r
77 clip->source.still.name = getS0( fp );
\r
81 clip->source.seq.digits = getU1( fp );
\r
82 clip->source.seq.flags = getU1( fp );
\r
83 clip->source.seq.offset = getI2( fp );
\r
84 getU2( fp ); /* not sure what this is yet */
\r
85 clip->source.seq.start = getI2( fp );
\r
86 clip->source.seq.end = getI2( fp );
\r
87 clip->source.seq.prefix = getS0( fp );
\r
88 clip->source.seq.suffix = getS0( fp );
\r
92 clip->source.anim.name = getS0( fp );
\r
93 clip->source.anim.server = getS0( fp );
\r
95 clip->source.anim.data = getbytes( fp, sz - rlen );
\r
99 clip->source.xref.index = getI4( fp );
\r
100 clip->source.xref.string = getS0( fp );
\r
104 clip->source.cycle.lo = getI2( fp );
\r
105 clip->source.cycle.hi = getI2( fp );
\r
106 clip->source.cycle.name = getS0( fp );
\r
113 /* error while reading current subchunk? */
\r
116 if ( rlen < 0 || rlen > sz ) goto Fail;
\r
118 /* skip unread parts of the current subchunk */
\r
121 _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR );
\r
123 /* end of the CLIP chunk? */
\r
125 rlen = _pico_memstream_tell( fp ) - pos;
\r
126 if ( cksize < rlen ) goto Fail;
\r
127 if ( cksize == rlen )
\r
130 /* process subchunks as they're encountered */
\r
134 if ( 0 > get_flen() ) goto Fail;
\r
142 clip->start_time = getF4( fp );
\r
143 clip->duration = getF4( fp );
\r
144 clip->frame_rate = getF4( fp );
\r
148 clip->contrast.val = getF4( fp );
\r
149 clip->contrast.eindex = getVX( fp );
\r
153 clip->brightness.val = getF4( fp );
\r
154 clip->brightness.eindex = getVX( fp );
\r
158 clip->saturation.val = getF4( fp );
\r
159 clip->saturation.eindex = getVX( fp );
\r
163 clip->hue.val = getF4( fp );
\r
164 clip->hue.eindex = getVX( fp );
\r
168 clip->gamma.val = getF4( fp );
\r
169 clip->gamma.eindex = getVX( fp );
\r
173 clip->negative = getU2( fp );
\r
178 filt = _pico_calloc( 1, sizeof( lwPlugin ));
\r
179 if ( !filt ) goto Fail;
\r
181 filt->name = getS0( fp );
\r
182 filt->flags = getU2( fp );
\r
184 filt->data = getbytes( fp, sz - rlen );
\r
186 if ( id == ID_IFLT ) {
\r
187 lwListAdd( &clip->ifilter, filt );
\r
191 lwListAdd( &clip->pfilter, filt );
\r
200 /* error while reading current subchunk? */
\r
203 if ( rlen < 0 || rlen > sz ) goto Fail;
\r
205 /* skip unread parts of the current subchunk */
\r
208 _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR );
\r
210 /* end of the CLIP chunk? */
\r
212 rlen = _pico_memstream_tell( fp ) - pos;
\r
213 if ( cksize < rlen ) goto Fail;
\r
214 if ( cksize == rlen ) break;
\r
216 /* get the next chunk header */
\r
221 if ( 6 != get_flen() ) goto Fail;
\r
227 lwFreeClip( clip );
\r
233 ======================================================================
\r
236 Returns an lwClip pointer, given a clip index.
\r
237 ====================================================================== */
\r
239 lwClip *lwFindClip( lwClip *list, int index )
\r
245 if ( clip->index == index ) break;
\r