void EDL::copy_clips(EDL *edl) { if(this == edl) return; remove_vwindow_edls(); // if(vwindow_edl && !vwindow_edl_shared) // vwindow_edl->Garbage::remove_user(); // vwindow_edl = 0; // vwindow_edl_shared = 0; for(int i = 0; i < edl->total_vwindow_edls(); i++) { EDL *new_edl = new EDL(this); new_edl->create_objects(); new_edl->copy_all(edl->get_vwindow_edl(i)); append_vwindow_edl(new_edl, 0); } for(int i = 0; i < clips.size(); i++) clips.get(i)->Garbage::remove_user(); clips.remove_all(); for(int i = 0; i < edl->clips.total; i++) { add_clip(edl->clips.values[i]); } }
// Emit: // matrix // clip // clip // This tests accumulation of clips in same transform state. It also tests pushing // of the matrix across both the clips. static void emit_mat_clip_clip(SkCanvas* canvas, MatType mat, ClipType clip, DrawOpType draw, SkTDArray<DrawType>* expected, int accumulatedClips) { emit_mat(canvas, mat); emit_clip(canvas, clip); emit_clip(canvas, clip); if (kNone_DrawOpType == draw) { return; } for (int i = 0; i < accumulatedClips; ++i) { add_clip(clip, mat, expected); add_clip(clip, mat, expected); } add_mat(mat, expected); }
// Emit: // matrix // clip // Emitting the matrix first is more challenging since the matrix has to be // pushed across (i.e., applied to) the clip. static void emit_mat_and_clip(SkCanvas* canvas, MatType mat, ClipType clip, DrawOpType draw, SkTDArray<DrawType>* expected, int accumulatedClips) { emit_mat(canvas, mat); emit_clip(canvas, clip); if (kNone_DrawOpType == draw) { return; } // the matrix & clip order will be reversed once collapsed! for (int i = 0; i < accumulatedClips; ++i) { add_clip(clip, mat, expected); } add_mat(mat, expected); }
void EDL::copy_clips(EDL *edl) { if(vwindow_edl && !vwindow_edl_shared) delete vwindow_edl; vwindow_edl = 0; vwindow_edl_shared = 0; if(edl->vwindow_edl) { vwindow_edl = new EDL(this); vwindow_edl->create_objects(); vwindow_edl->copy_all(edl->vwindow_edl); } clips.remove_all_objects(); for(int i = 0; i < edl->clips.total; i++) { add_clip(edl->clips.values[i]); } }
lwSurface *lwGetSurface5( picoMemStream_t *fp, int cksize, lwObject *obj ) { lwSurface *surf; lwTexture *tex; lwPlugin *shdr; char *s; float v[ 3 ]; unsigned int id, flags; unsigned short sz; int pos, rlen, i; tex = NULL; shdr = NULL; /* allocate the Surface structure */ surf = _pico_calloc( 1, sizeof( lwSurface )); if ( !surf ) goto Fail; /* non-zero defaults */ surf->color.rgb[ 0 ] = 0.78431f; surf->color.rgb[ 1 ] = 0.78431f; surf->color.rgb[ 2 ] = 0.78431f; surf->diffuse.val = 1.0f; surf->glossiness.val = 0.4f; surf->bump.val = 1.0f; surf->eta.val = 1.0f; surf->sideflags = 1; /* remember where we started */ set_flen( 0 ); pos = _pico_memstream_tell( fp ); /* name */ surf->name = getS0( fp ); /* first subchunk header */ id = getU4( fp ); sz = getU2( fp ); if ( 0 > get_flen() ) goto Fail; /* process subchunks as they're encountered */ while ( 1 ) { sz += sz & 1; set_flen( 0 ); switch ( id ) { case ID_COLR: surf->color.rgb[ 0 ] = getU1( fp ) / 255.0f; surf->color.rgb[ 1 ] = getU1( fp ) / 255.0f; surf->color.rgb[ 2 ] = getU1( fp ) / 255.0f; break; case ID_FLAG: flags = getU2( fp ); if ( flags & 4 ) surf->smooth = 1.56207f; if ( flags & 8 ) surf->color_hilite.val = 1.0f; if ( flags & 16 ) surf->color_filter.val = 1.0f; if ( flags & 128 ) surf->dif_sharp.val = 0.5f; if ( flags & 256 ) surf->sideflags = 3; if ( flags & 512 ) surf->add_trans.val = 1.0f; break; case ID_LUMI: surf->luminosity.val = getI2( fp ) / 256.0f; break; case ID_VLUM: surf->luminosity.val = getF4( fp ); break; case ID_DIFF: surf->diffuse.val = getI2( fp ) / 256.0f; break; case ID_VDIF: surf->diffuse.val = getF4( fp ); break; case ID_SPEC: surf->specularity.val = getI2( fp ) / 256.0f; break; case ID_VSPC: surf->specularity.val = getF4( fp ); break; case ID_GLOS: surf->glossiness.val = ( float ) log( getU2( fp )) / 20.7944f; break; case ID_SMAN: surf->smooth = getF4( fp ); break; case ID_REFL: surf->reflection.val.val = getI2( fp ) / 256.0f; break; case ID_RFLT: surf->reflection.options = getU2( fp ); break; case ID_RIMG: s = getS0( fp ); surf->reflection.cindex = add_clip( s, &obj->clip, &obj->nclips ); surf->reflection.options = 3; break; case ID_RSAN: surf->reflection.seam_angle = getF4( fp ); break; case ID_TRAN: surf->transparency.val.val = getI2( fp ) / 256.0f; break; case ID_RIND: surf->eta.val = getF4( fp ); break; case ID_BTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->bump.tex, tex ); break; case ID_CTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->color.tex, tex ); break; case ID_DTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->diffuse.tex, tex ); break; case ID_LTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->luminosity.tex, tex ); break; case ID_RTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->reflection.val.tex, tex ); break; case ID_STEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->specularity.tex, tex ); break; case ID_TTEX: s = getbytes( fp, sz ); tex = get_texture( s ); lwListAdd( (void *) &surf->transparency.val.tex, tex ); break; case ID_TFLG: flags = getU2( fp ); i = 0; // greebo: initialise to fix compiler warnings if ( flags & 1 ) i = 0; if ( flags & 2 ) i = 1; if ( flags & 4 ) i = 2; tex->axis = i; if ( tex->type == ID_IMAP ) tex->param.imap.axis = i; else tex->param.proc.axis = i; if ( flags & 8 ) tex->tmap.coord_sys = 1; if ( flags & 16 ) tex->negative = 1; if ( flags & 32 ) tex->param.imap.pblend = 1; if ( flags & 64 ) { tex->param.imap.aa_strength = 1.0f; tex->param.imap.aas_flags = 1; } break; case ID_TSIZ: for ( i = 0; i < 3; i++ ) tex->tmap.size.val[ i ] = getF4( fp ); break; case ID_TCTR: for ( i = 0; i < 3; i++ ) tex->tmap.center.val[ i ] = getF4( fp ); break; case ID_TFAL: for ( i = 0; i < 3; i++ ) tex->tmap.falloff.val[ i ] = getF4( fp ); break; case ID_TVEL: for ( i = 0; i < 3; i++ ) v[ i ] = getF4( fp ); tex->tmap.center.eindex = add_tvel( tex->tmap.center.val, v, &obj->env, &obj->nenvs ); break; case ID_TCLR: if ( tex->type == ID_PROC ) for ( i = 0; i < 3; i++ ) tex->param.proc.value[ i ] = getU1( fp ) / 255.0f; break; case ID_TVAL: tex->param.proc.value[ 0 ] = getI2( fp ) / 256.0f; break; case ID_TAMP: if ( tex->type == ID_IMAP ) tex->param.imap.amplitude.val = getF4( fp ); break; case ID_TIMG: s = getS0( fp ); tex->param.imap.cindex = add_clip( s, &obj->clip, &obj->nclips ); break; case ID_TAAS: tex->param.imap.aa_strength = getF4( fp ); tex->param.imap.aas_flags = 1; break; case ID_TREF: tex->tmap.ref_object = getbytes( fp, sz ); break; case ID_TOPC: tex->opacity.val = getF4( fp ); break; case ID_TFP0: if ( tex->type == ID_IMAP ) tex->param.imap.wrapw.val = getF4( fp ); break; case ID_TFP1: if ( tex->type == ID_IMAP ) tex->param.imap.wraph.val = getF4( fp ); break; case ID_SHDR: shdr = _pico_calloc( 1, sizeof( lwPlugin )); if ( !shdr ) goto Fail; shdr->name = getbytes( fp, sz ); lwListAdd( (void *) &surf->shader, shdr ); surf->nshaders++; break; case ID_SDAT: shdr->data = getbytes( fp, sz ); break; default: break; } /* error while reading current subchunk? */ rlen = get_flen(); if ( rlen < 0 || rlen > sz ) goto Fail; /* skip unread parts of the current subchunk */ if ( rlen < sz ) _pico_memstream_seek( fp, sz - rlen, PICO_SEEK_CUR ); /* end of the SURF chunk? */ if ( cksize <= _pico_memstream_tell( fp ) - pos ) break; /* get the next subchunk header */ set_flen( 0 ); id = getU4( fp ); sz = getU2( fp ); if ( 6 != get_flen() ) goto Fail; } return surf; Fail: if ( surf ) lwFreeSurface( surf ); return NULL; }