/// <summary> /// このオブジェクトの内容を ExoCharaStyle オブジェクトへ上書きする。 /// </summary> /// <param name="target">上書き対象の ExoCharaStyle オブジェクト。</param> /// <param name="withoutUnused"> /// AviUtl拡張編集ファイル用設定で利用されないパラメータを無視するならば true 。 /// </param> public void CopyTo(ExoCharaStyle target, bool withoutUnused = false) { if (target == null) { throw new ArgumentNullException(nameof(target)); } var src = (!withoutUnused || this.IsUnusedCleared) ? this : new ExoTextStyleTemplate(this); target.Render = src.Render.Clone(); target.Text = src.Text.Clone(); target.IsTextClipping = src.IsTextClipping; }
/// <summary> /// 設定を基にAviUtl拡張編集ファイルの保存処理を行う。 /// </summary> /// <param name="exoFilePath">AviUtl拡張編集ファイルパス。</param> /// <param name="waveFilePath">WAVEファイルパス。</param> /// <param name="text">テキスト。</param> /// <param name="common">共通設定。</param> /// <param name="charaStyle">キャラ別スタイル。</param> /// <returns>保存した拡張編集オブジェクト。失敗したならば null 。</returns> private static async Task <ExEditObject> DoOperateExoSave( string exoFilePath, string waveFilePath, string text, ExoCommonConfig common, ExoCharaStyle charaStyle) { // フレーム数算出 int frameCount = 0; try { var waveTime = await Task.Run(() => (new WaveFileInfo(waveFilePath)).TotalTime); var f = (waveTime.Ticks * common.Fps) / (charaStyle.PlaySpeed.Begin * (TimeSpan.TicksPerSecond / 100)); frameCount = (int)decimal.Floor(f); // 拡張編集の仕様に合わせて切り捨て } catch (Exception ex) { ThreadTrace.WriteException(ex); return(null); } var exo = new ExEditObject { Width = common.Width, Height = common.Height, Length = frameCount + common.ExtraFrames, AudioSampleRate = common.AudioSampleRate, AudioChannelCount = common.AudioChannelCount, }; // decimal の小数部桁数を取得 var scale = (decimal.GetBits(common.Fps)[3] & 0xFF0000) >> 16; exo.FpsScale = (int)Math.Pow(10, scale); exo.FpsBase = decimal.Floor(common.Fps * exo.FpsScale); // テキストレイヤー追加 { var item = new LayerItem { BeginFrame = 1, EndFrame = exo.Length, LayerId = 1, GroupId = common.IsGrouping ? 1 : 0, IsClipping = charaStyle.IsTextClipping }; var c = charaStyle.Text.Clone(); ExoTextStyleTemplate.ClearUnused(c); c.Text = text; item.Components.Add(c); item.Components.Add(charaStyle.Render.Clone()); exo.LayerItems.Add(item); } // 音声レイヤー追加 { var item = new LayerItem { BeginFrame = 1, EndFrame = frameCount, LayerId = 2, GroupId = common.IsGrouping ? 1 : 0, IsAudio = true, }; item.Components.Add( new AudioFileComponent { PlaySpeed = charaStyle.PlaySpeed.Clone(), FilePath = waveFilePath, }); item.Components.Add(charaStyle.Play.Clone()); exo.LayerItems.Add(item); } // ファイル書き出し try { await ExoFileReaderWriter.WriteAsync(exoFilePath, exo); } catch (Exception ex) { ThreadTrace.WriteException(ex); return(null); } return(exo); }