int visual_morph_init (VisMorph *morph, const char *morphname) { visual_return_val_if_fail (morph != NULL, -VISUAL_ERROR_MORPH_NULL); if (morphname && get_morph_plugin_list ().empty ()) { visual_log (VISUAL_LOG_ERROR, _("the plugin list is NULL")); return -VISUAL_ERROR_PLUGIN_NO_LIST; } /* Do the VisObject initialization */ visual_object_clear (VISUAL_OBJECT (morph)); visual_object_set_dtor (VISUAL_OBJECT (morph), morph_dtor); visual_object_set_allocated (VISUAL_OBJECT (morph), FALSE); /* Reset the VisMorph data */ morph->plugin = NULL; morph->dest = NULL; morph->morphpal = visual_palette_new (256); morph->morphtime = visual_time_new (); morph->timer = visual_timer_new (); visual_morph_set_rate (morph, 0); visual_morph_set_steps (morph, 0); morph->stepsdone = 0; visual_morph_set_mode (morph, VISUAL_MORPH_MODE_SET); if (morphname == NULL) return VISUAL_OK; if (!LV::PluginRegistry::instance()->has_plugin (VISUAL_PLUGIN_TYPE_MORPH, morphname)) { return -VISUAL_ERROR_PLUGIN_NOT_FOUND; } morph->plugin = visual_plugin_load (VISUAL_PLUGIN_TYPE_MORPH, morphname); return VISUAL_OK; }
int visual_bin_switch_actor (VisBin *bin, VisActor *actor) { VisVideo *privvid; visual_log_return_val_if_fail (bin != NULL, -1); visual_log_return_val_if_fail (actor != NULL, -1); /* Set the new actor */ bin->actmorph = actor; visual_log (VISUAL_LOG_DEBUG, "entering..."); /* Free the private video */ if (bin->privvid != NULL) { visual_object_unref (VISUAL_OBJECT (bin->privvid)); bin->privvid = NULL; } visual_log (VISUAL_LOG_INFO, _("depth of the main actor: %d"), bin->actor->video->depth); /* Starting the morph, but first check if we don't have anything todo with openGL */ if (bin->morphstyle == VISUAL_SWITCH_STYLE_MORPH && bin->actor->video->depth != VISUAL_VIDEO_DEPTH_GL && bin->actmorph->video->depth != VISUAL_VIDEO_DEPTH_GL && bin->depthfromGL != TRUE) { if (bin->morph != NULL && bin->morph->plugin != NULL) { visual_morph_set_rate (bin->morph, 0); visual_morph_set_video (bin->morph, bin->actvideo); if (bin->morphautomatic == TRUE) visual_morph_set_mode (bin->morph, bin->morphmode); else visual_morph_set_mode (bin->morph, VISUAL_MORPH_MODE_SET); visual_morph_set_time (bin->morph, &bin->morphtime); visual_morph_set_steps (bin->morph, bin->morphsteps); } bin->morphrate = 0; bin->morphstepsdone = 0; visual_log (VISUAL_LOG_DEBUG, "phase 1"); /* Allocate a private video for the main actor, so the morph * can draw to the framebuffer */ privvid = visual_video_new (); visual_log (VISUAL_LOG_DEBUG, "actvideo->depth %d actmorph->video->depth %d", bin->actvideo->depth, bin->actmorph->video->depth); visual_log (VISUAL_LOG_DEBUG, "phase 2"); visual_video_clone (privvid, bin->actvideo); visual_log (VISUAL_LOG_DEBUG, "phase 3 pitch privvid %d actvideo %d", privvid->pitch, bin->actvideo->pitch); visual_video_allocate_buffer (privvid); visual_log (VISUAL_LOG_DEBUG, "phase 4"); /* Initial privvid initialize */ visual_log (VISUAL_LOG_DEBUG, "actmorph->video->depth %d %p", bin->actmorph->video->depth, visual_video_get_pixels (bin->actvideo)); if (visual_video_get_pixels (bin->actvideo) != NULL && visual_video_get_pixels (privvid) != NULL) visual_mem_copy (visual_video_get_pixels (privvid), visual_video_get_pixels (bin->actvideo), visual_video_get_size (privvid)); else if (visual_video_get_pixels (privvid) != NULL) visual_mem_set (visual_video_get_pixels (privvid), 0, visual_video_get_size (privvid)); visual_actor_set_video (bin->actor, privvid); bin->privvid = privvid; } else { visual_log (VISUAL_LOG_DEBUG, "Pointer actvideo->pixels %p", visual_video_get_pixels (bin->actvideo)); if (bin->actor->video->depth != VISUAL_VIDEO_DEPTH_GL && visual_video_get_pixels (bin->actvideo) != NULL) { visual_mem_set (visual_video_get_pixels (bin->actvideo), 0, visual_video_get_size (bin->actvideo)); } } visual_log (VISUAL_LOG_DEBUG, "Leaving, actor->video->depth: %d actmorph->video->depth: %d", bin->actor->video->depth, bin->actmorph->video->depth); bin->morphing = TRUE; return 0; }