/* * EnvSettings.cs * Copyright (c) 2007-2009 kbinani * * This file is part of LipSync. * * LipSync is free software; you can redistribute it and/or * modify it under the terms of the BSD License. * * LipSync is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Windows.Forms; using System.Xml.Serialization; using Boare.Lib.AppUtil; namespace LipSync { /// /// 操作環境の設定値を格納します /// public class EnvSettings : ICloneable{ private static XmlSerializer m_xml_serializer = null; public float PixelPerSec = 150.0f; public float WheelRatio = 0.2f; public int TimeLineInterval = 5; public Rectangle WindowPosition = new Rectangle( 0, 0, 473, 435 ); public bool WindowIsMaximized = false; public Rectangle PreviewWindowPos = new Rectangle( 0, 0, 349, 340 ); public Rectangle CurveWindowPos = new Rectangle( 0, 0, 349, 340 ); public bool PreviewMaximized = false; public bool CurveMaximized = false; public PictureBoxSizeMode PreviewZoomMode = PictureBoxSizeMode.Zoom; public string Language = ""; public ColorSet TimeLineTitleColor = new ColorSet( Color.LightPink ); public ColorSet TimeLineVsqColor = new ColorSet( Color.FromArgb( 175, 222, 82 ) ); public ColorSet TimeLinePluginColor = new ColorSet( Color.FromArgb( 255, 184, 51 ) ); public ColorSet TimeLineDefaultColor = new ColorSet( Color.LightBlue ); public string PathFFmpeg = ""; public string PathMEncoder = ""; public bool PreviewHidden = false; public float LastPreviewAspecto = 0.5f; public FontConfig TelopDefaultFont = new FontConfig( "MS UI Gothic", 18 ); public ColorSet TelopDefaultColor = new ColorSet( Color.Black ); public bool PropertyHidden = false; public int LastPropertyWidth = 175; public int VerticalStringOffset = 3; public bool CloseMouthWhenSameVowelsRepeated = true; public bool GenerateCharacterAutomatically = true; public float EntryCombineThreshold = 0f; public string LastCharacterPath = ""; public string LastMusicPath = ""; public string LastVsqPath = ""; public bool UseHeavyDialogInOpeningCharacterSettings = false; public bool DrawBars = true; /// /// Vsqトラックを常に表示するかどうかを表す /// public bool FixVsqTrackPosition = false; /// /// 最後に使用されたAviファイルへのパス /// public string LastAviPath = ""; public FontConfig Font = new FontConfig( "MS UI Gothic", 9 ); /// /// キャラクタ設定ファイルの編集時に、静止画ファイルの名前をそのまま画像のタイトルとするかどうか /// public bool FileNameAsImageTitle = true; private QuantizeMode m_quantize_mode = QuantizeMode.off; // 音符編集時の量子化モード private bool m_quantize_triplet = false; // 3連符モードが有効かどうか private bool m_sync_at_centre = true; private int m_track_height = 15; private bool m_save_character_config_outside = false; private List m_close_mouth_phonetic_symbols = new List( new string[] { "b", "p", "m", "b'", "p'", "m'" } ); private List m_i_mouth_phonetic_symbols = new List( new string[] { "k'", "g'", "S", "dZ", "tS", "J", "C" } ); private List m_u_mouth_phonetic_symbols = new List( new string[] { @"p\", @"p\'", "w", "ts", "dz" } ); public int TrackHeight { get { return m_track_height; } set { m_track_height = value; Size font_size = Misc.MeasureString( "abQBHqj", Font.GetFont() ); VerticalStringOffset = (m_track_height - font_size.Height) / 2; } } public static EnvSettings FromFile( string config_file ) { EnvSettings env; if ( File.Exists( config_file ) ) { if ( m_xml_serializer == null ) { m_xml_serializer = new XmlSerializer( typeof( EnvSettings ) ); } FileStream fs = null; try { fs = new FileStream( config_file, FileMode.Open ); env = (EnvSettings)m_xml_serializer.Deserialize( fs ); } catch { #if DEBUG Common.DebugWriteLine( "EnvSettings2+FromFile" ); Common.DebugWriteLine( " ctor from xml has been failed. trying ctor from EnvSettings." ); #endif /*if ( fs != null ) { fs.Close(); } try { fs = new FileStream( config_file, FileMode.Open ); BinaryFormatter bf = new BinaryFormatter(); EnvSettings env1 = (EnvSettings)bf.Deserialize( fs ); env = new EnvSettings2( env1 ); } catch ( Exception ex ){ #if DEBUG Common.DebugWriteLine( " ex=" + ex.ToString() ); #endif env = new EnvSettings2(); } finally { if ( fs != null ) { fs.Close(); } }*/ env = new EnvSettings(); } finally { if ( fs != null ) { fs.Close(); } } } else { env = new EnvSettings(); env.Save( config_file ); } return env; } public EnvSettings() { } /*internal EnvSettings2( EnvSettings old ) { PixelPerSec = old.PIXEL_PER_SEC; WheelRatio = old.WHEEL_RATIO; TimeLineInterval = old.TIMELINE_INTERVAL; WindowPosition = old.WINDOW_POS; WindowIsMaximized = old.MAXIMIZED; PreviewWindowPos = old.PREVIEW_WINDOW_POS; CurveWindowPos = new Rectangle( 0, 0, 349, 340 ); PreviewMaximized = false; CurveMaximized = false; PreviewZoomMode = old.PREVIEW_PICTUREMODE; if ( old.LANGUAGE == LipSync.Language.ja ) { Language = "ja"; } else { Language = ""; } TimeLineTitleColor = new ColorSet( old.TIMELINE_TITLE ); TimeLineVsqColor = new ColorSet( old.TIMELINE_VSQ_ENTRY ); TimeLinePluginColor = new ColorSet( old.TIMELINE_PLUGIN_ENTRY ); TimeLineDefaultColor = new ColorSet( old.TIMELINE_DEFAULT_ENTRY ); PathFFmpeg = old.PATH_FFMPEG; PathMEncoder = old.PATH_MENCODER; PreviewHidden = old.PREVIEW_HIDDEN; LastPreviewAspecto = old.LAST_ASPECTO; TelopDefaultFont = new FontConfig( old.TELOP_DEFAULT_FONT ); TelopDefaultColor = new ColorSet( old.TELOP_DEFAULT_COLOR ); PropertyHidden = old.PROPERTY_HIDDEN; LastPropertyWidth = old.LAST_PROPERTY_WIDTH; VerticalStringOffset = old.STRING_OFFSET; CloseMouthWhenSameVowelsRepeated = old.CLOSE_MOUTH_WHEN_SAME_VOWEL_REPEATED; GenerateCharacterAutomatically = old.GEN_CHARACTER_AUTOMATICELY; EntryCombineThreshold = old.COMBINE_THRESHOLD; LastCharacterPath = old.LAST_CHARACTER_PATH; LastMusicPath = old.LAST_MUSIC_PATH; LastVsqPath = old.LAST_VSQ_PATH; UseHeavyDialogInOpeningCharacterSettings = old.USE_HEAVY_DIALOG; DrawBars = true; FixVsqTrackPosition = false; LastAviPath = ""; Font = new FontConfig( "MS UI Gothic", 9 ); m_quantize_mode = QuantizeMode.off; m_quantize_triplet = false; m_sync_at_centre = true; m_track_height = old.TRACK_HEIGHT; m_save_character_config_outside = false; m_close_mouth_phonetic_symbols = old.LIST_NN; m_i_mouth_phonetic_symbols = old.LIST_I; m_u_mouth_phonetic_symbols = old.LIST_U; }*/ public void Save( string file ) { if ( m_xml_serializer == null ) { m_xml_serializer = new XmlSerializer( typeof( EnvSettings ) ); } using ( FileStream fs = new FileStream( file, FileMode.Create ) ) { m_xml_serializer.Serialize( fs, this ); } } public bool SaveCharacterConfigOutside { get { return m_save_character_config_outside; } } [XmlArrayItem(typeof(string), ElementName="PhoneticSymbol")] public List CloseMouthPhoneticSymbols { get { return m_close_mouth_phonetic_symbols; } set { m_close_mouth_phonetic_symbols = new List( value.ToArray() ); } } [XmlArrayItem( typeof( string ), ElementName = "PhoneticSymbol" )] public List IMouthPhoneticSymbols { get { return m_i_mouth_phonetic_symbols; } set { m_i_mouth_phonetic_symbols = new List( value.ToArray() ); } } [XmlArrayItem( typeof( string ), ElementName = "PhoneticSymbol" )] public List UMouthPhoneticSymbols { get { return m_u_mouth_phonetic_symbols; } set { m_u_mouth_phonetic_symbols = new List( value.ToArray() ); } } public QuantizeMode QuantizeMode { get { return m_quantize_mode; } set { m_quantize_mode = value; } } public bool QuantizeTripletEnabled { get { return m_quantize_triplet; } set { m_quantize_triplet = value; } } public void CleanUpMouthList() { for ( int i = 0; i < IMouthPhoneticSymbols.Count - 1; i++ ) { bool changed = true; while ( changed ) { changed = false; for ( int j = i + 1; j < IMouthPhoneticSymbols.Count; j++ ) { if ( IMouthPhoneticSymbols[i] == IMouthPhoneticSymbols[j] ) { IMouthPhoneticSymbols.RemoveAt( j ); changed = true; break; } } } } for ( int i = 0; i < UMouthPhoneticSymbols.Count - 1; i++ ) { bool changed = true; while ( changed ) { changed = false; for ( int j = i + 1; j < UMouthPhoneticSymbols.Count; j++ ) { if ( UMouthPhoneticSymbols[i] == UMouthPhoneticSymbols[j] ) { UMouthPhoneticSymbols.RemoveAt( j ); changed = true; break; } } } } for ( int i = 0; i < CloseMouthPhoneticSymbols.Count - 1; i++ ) { bool changed = true; while ( changed ) { changed = false; for ( int j = i + 1; j < CloseMouthPhoneticSymbols.Count; j++ ) { if ( CloseMouthPhoneticSymbols[i] == CloseMouthPhoneticSymbols[j] ) { CloseMouthPhoneticSymbols.RemoveAt( j ); changed = true; break; } } } } } public bool SyncAtCentre { get { return m_sync_at_centre; } set { m_sync_at_centre = value; } } public object Clone() { EnvSettings res = new EnvSettings(); res.CloseMouthWhenSameVowelsRepeated = this.CloseMouthWhenSameVowelsRepeated; res.EntryCombineThreshold = this.EntryCombineThreshold; res.GenerateCharacterAutomatically = this.GenerateCharacterAutomatically; res.Language = this.Language; res.LastPreviewAspecto = this.LastPreviewAspecto; res.LastCharacterPath = this.LastCharacterPath; res.LastMusicPath = this.LastMusicPath; res.LastPropertyWidth = this.LastPropertyWidth; res.LastVsqPath = this.LastVsqPath; res.IMouthPhoneticSymbols = new List( this.IMouthPhoneticSymbols.ToArray() ); res.CloseMouthPhoneticSymbols = new List( this.CloseMouthPhoneticSymbols.ToArray() ); res.UMouthPhoneticSymbols = new List( this.UMouthPhoneticSymbols.ToArray() ); res.WindowIsMaximized = this.WindowIsMaximized; res.PathFFmpeg = this.PathFFmpeg; res.PathMEncoder = this.PathMEncoder; res.PixelPerSec = this.PixelPerSec; res.PreviewZoomMode = this.PreviewZoomMode; res.PropertyHidden = this.PropertyHidden; res.Font = (FontConfig)this.Font.Clone(); res.VerticalStringOffset = this.VerticalStringOffset; res.TelopDefaultColor = this.TelopDefaultColor; res.TelopDefaultFont = this.TelopDefaultFont; res.TimeLineDefaultColor = this.TimeLineDefaultColor; res.TimeLineInterval = this.TimeLineInterval; res.TimeLinePluginColor = this.TimeLinePluginColor; res.TimeLineTitleColor = this.TimeLineTitleColor; res.TimeLineVsqColor = this.TimeLineVsqColor; res.TrackHeight = this.TrackHeight; res.UseHeavyDialogInOpeningCharacterSettings = this.UseHeavyDialogInOpeningCharacterSettings; res.WheelRatio = this.WheelRatio; res.WindowPosition = this.WindowPosition; res.DrawBars = this.DrawBars; res.m_quantize_mode = this.m_quantize_mode; res.m_quantize_triplet = this.m_quantize_triplet; res.m_sync_at_centre = this.m_sync_at_centre; return res; } } }