/// <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;
        }
예제 #2
0
        /// <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);
        }