int visual_morph_run (VisMorph *morph, VisAudio *audio, VisVideo *src1, VisVideo *src2) { VisMorphPlugin *morphplugin; visual_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); visual_return_val_if_fail (audio != NULL, -VISUAL_ERROR_AUDIO_NULL); visual_return_val_if_fail (src1 != NULL, -VISUAL_ERROR_VIDEO_NULL); visual_return_val_if_fail (src2 != NULL, -VISUAL_ERROR_VIDEO_NULL); morphplugin = get_morph_plugin (morph); if (morphplugin == NULL) { visual_log (VISUAL_LOG_ERROR, _("The given morph does not reference any plugin")); return -VISUAL_ERROR_MORPH_PLUGIN_NULL; } /* If we're morphing using the timer, start the timer. */ if (!visual_timer_is_active (morph->timer)) visual_timer_start (morph->timer); if (morphplugin->palette != NULL) morphplugin->palette (morph->plugin, morph->rate, audio, morph->morphpal, src1, src2); else { if (src1->pal != NULL && src2->pal != NULL) visual_palette_blend (morph->morphpal, src1->pal, src2->pal, morph->rate); } morphplugin->apply (morph->plugin, morph->rate, audio, morph->dest, src1, src2); visual_video_set_palette (morph->dest, visual_morph_get_palette (morph)); /* On automatic morphing increase the rate. */ if (morph->mode == VISUAL_MORPH_MODE_STEPS) { morph->rate += (1.000 / morph->steps); morph->stepsdone++; if (morph->rate > 1.0) morph->rate = 1; } else if (morph->mode == VISUAL_MORPH_MODE_TIME) { /** * @todo: We might want to have a bigger type here, but long longs aren't atomic * on most architectures, so that won't do for now, maybe when we can lock (for threading) * we can look into that */ double usec_elapsed = visual_timer_elapsed_usecs (morph->timer); double usec_morph = visual_time_to_usecs (morph->morphtime); morph->rate = usec_elapsed / usec_morph; if (morph->rate > 1.0) morph->rate = 1; } return VISUAL_OK; }
VisPalette *visual_bin_get_palette (VisBin *bin) { visual_log_return_val_if_fail (bin != NULL, NULL); if (bin->morphing == TRUE) return visual_morph_get_palette (bin->morph); else return visual_actor_get_palette (bin->actor); }