From 362e40049821ab73d9d80ca5a364316399f6983f Mon Sep 17 00:00:00 2001 From: Revan654 Date: Sun, 2 Sep 2018 13:32:47 -0400 Subject: [PATCH] 1.9.0.0 --- Encoding/AOMEnc.vb | 310 - Encoding/VideoEncoder.vb | 35 +- Encoding/ffmpegEnc.vb | 4 +- Encoding/x265Enc.vb | 4 +- Resources/FontAwesome.ttf => FontAwesome.ttf | Bin Forms/MainForm.vb | 56 +- Forms/MediaInfoFolderViewForm.vb | 2 +- General/GlobalCommands.vb | 100 +- General/Package.vb | 422 +- General/VideoScript.vb | 92 +- My Project/Application.Designer.vb | 13 + My Project/Application.myapp | 9 + My Project/AssemblyInfo.vb | 4 +- My Project/Resources.Designer.vb | 26 +- My Project/app.manifest | 20 +- Segoe-MDL2-Assets.ttf | Bin 0 -> 144960 bytes StaxRip.vbproj | 12 +- UI/ImageUtils.vb | 7 +- app.config | 2 +- docs/_static/ajax-loader.gif | Bin 673 -> 0 bytes docs/_static/alabaster.css | 693 -- docs/_static/basic.css | 665 -- docs/_static/comment-bright.png | Bin 756 -> 0 bytes docs/_static/comment-close.png | Bin 829 -> 0 bytes docs/_static/comment.png | Bin 641 -> 0 bytes docs/_static/custom.css | 1 - docs/_static/doctools.js | 313 - docs/_static/documentation_options.js | 9 - docs/_static/down-pressed.png | Bin 222 -> 0 bytes docs/_static/down.png | Bin 202 -> 0 bytes docs/_static/file.png | Bin 286 -> 0 bytes docs/_static/jquery-3.1.0.js | 10074 ---------------- docs/_static/jquery-3.2.1.js | 10253 ----------------- docs/_static/jquery.js | 4 - docs/_static/minus.png | Bin 90 -> 0 bytes docs/_static/plus.png | Bin 90 -> 0 bytes docs/_static/pygments.css | 69 - docs/_static/searchtools.js | 761 -- docs/_static/underscore-1.3.1.js | 999 -- docs/_static/underscore.js | 31 - docs/_static/up-pressed.png | Bin 214 -> 0 bytes docs/_static/up.png | Bin 203 -> 0 bytes docs/_static/websupport.js | 808 -- 43 files changed, 468 insertions(+), 25330 deletions(-) delete mode 100644 Encoding/AOMEnc.vb rename Resources/FontAwesome.ttf => FontAwesome.ttf (100%) create mode 100644 My Project/Application.Designer.vb create mode 100644 My Project/Application.myapp create mode 100644 Segoe-MDL2-Assets.ttf delete mode 100644 docs/_static/ajax-loader.gif delete mode 100644 docs/_static/alabaster.css delete mode 100644 docs/_static/basic.css delete mode 100644 docs/_static/comment-bright.png delete mode 100644 docs/_static/comment-close.png delete mode 100644 docs/_static/comment.png delete mode 100644 docs/_static/custom.css delete mode 100644 docs/_static/doctools.js delete mode 100644 docs/_static/documentation_options.js delete mode 100644 docs/_static/down-pressed.png delete mode 100644 docs/_static/down.png delete mode 100644 docs/_static/file.png delete mode 100644 docs/_static/jquery-3.1.0.js delete mode 100644 docs/_static/jquery-3.2.1.js delete mode 100644 docs/_static/jquery.js delete mode 100644 docs/_static/minus.png delete mode 100644 docs/_static/plus.png delete mode 100644 docs/_static/pygments.css delete mode 100644 docs/_static/searchtools.js delete mode 100644 docs/_static/underscore-1.3.1.js delete mode 100644 docs/_static/underscore.js delete mode 100644 docs/_static/up-pressed.png delete mode 100644 docs/_static/up.png delete mode 100644 docs/_static/websupport.js diff --git a/Encoding/AOMEnc.vb b/Encoding/AOMEnc.vb deleted file mode 100644 index 1bb48480..00000000 --- a/Encoding/AOMEnc.vb +++ /dev/null @@ -1,310 +0,0 @@ -Imports System.Text -Imports StaxRip.CommandLine -Imports StaxRip.UI - - -Public Class AOMEnc - Inherits BasicVideoEncoder - - Property ParamsStore As New PrimitiveStore - - Sub New() - Name = "AV1" - End Sub - - - Private ParamsValue As AV1Params - - Property Params As AV1Params - Get - If ParamsValue Is Nothing Then - ParamsValue = New AV1Params - ParamsValue.Init(ParamsStore) - End If - - Return ParamsValue - End Get - Set(value As AV1Params) - ParamsValue = value - End Set - End Property - - Overrides ReadOnly Property OutputExt As String - Get - Return "webm" - End Get - End Property - - Overrides Sub Encode() - p.Script.Synchronize() - Encode("Video encoding using aomenc " + Package.AOMEnc.Version, GetArgs(1, p.Script)) - - If Params.Mode.Value = 1 Then - Encode("Video encoding second pass using aomenc " + Package.AOMEnc.Version, GetArgs(2, p.Script)) - End If - - AfterEncoding() - End Sub - - Overloads Sub Encode(passName As String, commandLine As String) - p.Script.Synchronize() - - Using proc As New Proc - proc.Header = passName - proc.Package = Package.AOMEnc - proc.SkipString = "[ETA" - proc.File = "cmd.exe" - proc.Arguments = "/S /C """ + commandLine + """" - proc.Start() - End Using - End Sub - - Overloads Function GetArgs(pass As Integer, script As VideoScript, Optional includePaths As Boolean = True) As String - Return Params.GetArgs(pass, script, OutputPath.DirAndBase + OutputExtFull, includePaths, True) - End Function - - Overrides Function GetMenu() As MenuList - Dim r As New MenuList - r.Add("Encoder Options", AddressOf ShowConfigDialog) - r.Add("Container Configuration", AddressOf OpenMuxerConfigDialog) - Return r - End Function - - Shared WarningShown As Boolean - - Overrides Sub ShowConfigDialog() - If Not WarningShown Then - MsgWarn( -"Please note that AV1 is experimental!", -"The bitstream format is not yet frozen. It's very -likely that files created with the current encoder -become unplayable in the future.") - - WarningShown = True - End If - - Dim newParams As New AV1Params - Dim store = DirectCast(ObjectHelp.GetCopy(ParamsStore), PrimitiveStore) - newParams.Init(store) - - Using form As New CommandLineForm(newParams) - Dim saveProfileAction = Sub() - Dim enc = ObjectHelp.GetCopy(Of AOMEnc)(Me) - Dim params2 As New AV1Params - Dim store2 = DirectCast(ObjectHelp.GetCopy(store), PrimitiveStore) - params2.Init(store2) - enc.Params = params2 - enc.ParamsStore = store2 - SaveProfile(enc) - End Sub - - ActionMenuItem.Add(form.cms.Items, "Save Profile...", saveProfileAction).SetImage(Symbol.Save) - - If form.ShowDialog() = DialogResult.OK Then - Params = newParams - ParamsStore = store - OnStateChange() - End If - End Using - End Sub - - Overrides Property QualityMode() As Boolean - Get - Return Params.RateMode.OptionText.EqualsAny("CQ", "Q") - End Get - Set(Value As Boolean) - End Set - End Property - - Public Overrides ReadOnly Property CommandLineParams As CommandLineParams - Get - Return Params - End Get - End Property -End Class - -Public Class AV1Params - Inherits CommandLineParams - - Sub New() - Title = "aomenc Options" - Separator = "=" - End Sub - - Property Mode As New OptionParam With { - .Name = "Mode", - .Text = "Mode", - .Path = "Basic", - .Options = {"One Pass", "Two Pass"}} - - Property RateMode As New OptionParam With { - .Path = "Basic", - .Switch = "--end-usage", - .Text = "Rate Mode", - .Options = {"VBR", "CBR", "CQ", "Q"}} - - Property Custom As New StringParam With { - .Text = "Custom", - .Path = "Misc 1", - .AlwaysOn = True} - - Overrides ReadOnly Property Items As List(Of CommandLineParam) - Get - If ItemsValue Is Nothing Then - ItemsValue = New List(Of CommandLineParam) - - Add(Mode) - - Add(RateMode, - New OptionParam With {.Path = "Basic", .Switch = "--bit-depth", .Text = "Depth", .Options = {"8", "10", "12"}}, - New NumParam With {.Path = "Basic", .Switch = "--cq-level", .Text = "CQ Level"}, - New StringParam With {.Path = "Analysis", .Switch = "--tile-loopfilter", .Text = "Tile Loopfilter"}, - New OptionParam With {.Path = "Analysis", .Switch = "--tune", .Text = "Tune", .Options = {"Disabled", "PSNR", "SSIM", "Cdef-Dist", "Daala-Dist"}}, - New NumParam With {.Path = "Analysis", .Switch = "--tile-columns", .Text = "Tile Columns"}, - New NumParam With {.Path = "Analysis", .Switch = "--tile-rows", .Text = "Tile Rows"}, - New NumParam With {.Path = "Analysis", .Switch = "--num-tile-groups", .Text = "Num Tile Groups"}, - New NumParam With {.Path = "Analysis", .Switch = "--mtu-size", .Text = "MTU Size"}, - New BoolParam With {.Path = "Analysis", .Switch = "--output-partitions", .Text = "Output Partitions"}, - New BoolParam With {.Path = "Analysis", .Switch = "--disable-tempmv", .Text = "Disable temporal MV prediction", .IntegerValue = True}, - New OptionParam With {.Path = "Rate Control 1", .Switch = "--aq-mode", .Text = "AQ Mode", .IntegerValue = True, .Options = {"Disabled", "Variance", "Complexity", "Cyclic", "Refresh"}}, - New OptionParam With {.Path = "Rate Control 1", .Switch = "--deltaq-mode", .Text = "Delta QIndex Mode", .IntegerValue = True, .Options = {"Disabled", "Deltaq", "Deltaq + Deltalf"}}, - New BoolParam With {.Path = "Rate Control 1", .Switch = "--lossless", .Text = "Lossless", .IntegerValue = True}, - New BoolParam With {.Path = "Rate Control 1", .Switch = "--enable-qm", .Text = "Enable QM", .IntegerValue = True}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--bias-pct", .Text = "Bias PCT", .Config = {0, 100}}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--max-intra-rate", .Text = "Max Intra Rate"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--max-inter-rate", .Text = "Max Inter Rate"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--undershoot-pct", .Text = "Undershoot PCT"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--overshoot-pct", .Text = "Overshoot PCT"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--minsection-pct", .Text = "Minsection PCT"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--maxsection-pct", .Text = "Maxsection PCT"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--gf-cbr-boost", .Text = "GF CBR Boost"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--min-q", .Text = "Minimum Quantizer"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--max-q", .Text = "Maximum Quantizer"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--qm-min", .Text = "Min QM Flatness", .Init = 8, .Config = {0, 16}}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--qm-max", .Text = "Max QM Flatness", .Init = 16, .Config = {0, 16}}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--buf-sz", .Text = "Buffer Size"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--buf-initial-sz", .Text = "Buf Initial Size"}, - New NumParam With {.Path = "Rate Control 2", .Switch = "--buf-optimal-sz", .Text = "Buf Optimal Size"}, - New NumParam With {.Path = "Slice Decision", .Switch = "--kf-min-dist", .Text = "Min GOP Size"}, - New NumParam With {.Path = "Slice Decision", .Switch = "--kf-max-dist", .Text = "Max GOP Size"}, - New NumParam With {.Path = "Slice Decision", .Switch = "--lag-in-frames", .Text = "Lag In Frames"}, - New BoolParam With {.Path = "Slice Decision", .Switch = "--disable-kf", .Text = "Disable keyframe placement"}, - New StringParam With {.Path = "Input/Output", .Switch = "--timebase", .Text = "Timebase"}, - New NumParam With {.Path = "Input/Output", .Switch = "--input-bit-depth", .Text = "Input Bit Depth"}, - New NumParam With {.Path = "Input/Output", .Switch = "--fps", .Text = "Frame Rate"}, - New NumParam With {.Path = "Input/Output", .Switch = "--limit", .Text = "Limit"}, - New NumParam With {.Path = "Input/Output", .Switch = "--skip", .Text = "Skip"}, - New BoolParam With {.Path = "Input/Output", .Switch = "--yv12", .Text = "YV12"}, - New BoolParam With {.Path = "Input/Output", .Switch = "--i420", .Text = "I420"}, - New BoolParam With {.Path = "Input/Output", .Switch = "--i422", .Text = "I422"}, - New BoolParam With {.Path = "Input/Output", .Switch = "--i444", .Text = "I444"}, - New BoolParam With {.Path = "Input/Output", .Switch = "--i440", .Text = "I440"}, - New OptionParam With {.Path = "VUI", .Switch = "--color-space", .Text = "Color Space", .Options = {"Unknown", "BT 2020", "BT 601", "BT 709", "SMPTE 170", "SMPTE 240", "sRGB"}}, - New OptionParam With {.Path = "VUI", .Switch = "--transfer-function", .Text = "Transfer Function", .Options = {"Unknown", "BT 709", "HLG", "PQ"}}, - New NumParam With {.Path = "Performance", .Switch = "--threads", .Text = "Threads"}, - New NumParam With {.Path = "Performance", .Switch = "--cpu-used", .Text = "CPUs Used", .Config = {0, 8}}, - New BoolParam With {.Path = "Performance", .Switch = "--frame-parallel", .Text = "Frame Parallel", .IntegerValue = True}, - New OptionParam With {.Path = "Statistic", .Switch = "--test-decode", .Text = "Test Decode", .Options = {"Disabled", "Fatal", "Warn"}}, - New BoolParam With {.Path = "Statistic", .Switch = "--psnr", .Text = "PSNR"}, - New BoolParam With {.Path = "Statistic", .Switch = "--debug", .Text = "Debug"}, - New BoolParam With {.Path = "Statistic", .Switch = "--disable-warnings", .Text = "Disable Warnings"}, - New BoolParam With {.Path = "Statistic", .Switch = "--disable-warning-prompt", .Text = "Disable Warning Prompt"}, - New BoolParam With {.Path = "Statistic", .Switch = "--quiet", .Text = "Quiet"}, - New NumParam With {.Path = "Frame Size", .Switch = "--width", .Text = "Width"}, - New NumParam With {.Path = "Frame Size", .Switch = "--height", .Text = "Height"}, - New NumParam With {.Path = "Frame Size", .Switch = "--resize-mode", .Text = "Resize Mode"}, - New NumParam With {.Path = "Frame Size", .Switch = "--resize-numerator", .Text = "Resize Numerator"}, - New NumParam With {.Path = "Frame Size", .Switch = "--resize-kf-numerator", .Text = "Resize KF Numerator"}, - Custom, - New StringParam With {.Path = "Misc 1", .Switch = "--error-resilient", .Text = "Error Resilient"}, - New StringParam With {.Path = "Misc 1", .Switch = "--deadline", .Text = "Deadline"}, - New StringParam With {.Path = "Misc 1", .Switch = "--q-hist", .Text = "Q-Hist"}, - New StringParam With {.Path = "Misc 1", .Switch = "--codec", .Text = "Codec"}, - New StringParam With {.Path = "Misc 1", .Switch = "--rate-hist", .Text = "Rate Hist"}, - New OptionParam With {.Path = "Misc 1", .Switch = "--stereo-mode", .Text = "Stereo Mode", .Options = {"None", "Mono", "Left-Right", "Bottom-Top", "Top-Bottom", "Right-Left"}}, - New OptionParam With {.Path = "Misc 1", .Switch = "--tune-content", .Text = "Tune Content", .Options = {"Default", "Screen"}}, - New OptionParam With {.Path = "Misc 1", .Switch = "--chroma-sample-position", .Text = "Chroma Sample Pos", .Options = {"Unknown", "Vertical", "Colocated"}}, - New BoolParam With {.Path = "Misc 1", .Switch = "--good", .Text = "Good"}, - New BoolParam With {.Path = "Misc 1", .Switch = "--verbose", .Text = "Verbose"}, - New BoolParam With {.Path = "Misc 1", .Switch = "--webm", .Text = "WEBM"}, - New BoolParam With {.Path = "Misc 1", .Switch = "--ivf", .Text = "IVF"}, - New BoolParam With {.Path = "Misc 1", .Switch = "--frame-boost", .Text = "Enable frame periodic boost", .IntegerValue = True}, - New NumParam With {.Path = "Misc 2", .Switch = "--usage", .Text = "Usage"}, - New NumParam With {.Path = "Misc 2", .Switch = "--profile", .Text = "Profile"}, - New NumParam With {.Path = "Misc 2", .Switch = "--drop-frame", .Text = "Drop Frame"}, - New NumParam With {.Path = "Misc 2", .Switch = "--auto-alt-ref", .Text = "Auto Alt Ref"}, - New NumParam With {.Path = "Misc 2", .Switch = "--sharpness", .Text = "Sharpness", .Config = {0, 7}}, - New NumParam With {.Path = "Misc 2", .Switch = "--static-thresh", .Text = "Static Thresh"}, - New NumParam With {.Path = "Misc 2", .Switch = "--arnr-maxframes", .Text = "ARNR Maxframes", .Config = {0, 15}}, - New NumParam With {.Path = "Misc 2", .Switch = "--arnr-strength", .Text = "ARNR Strength", .Config = {0, 6}}, - New NumParam With {.Path = "Misc 2", .Switch = "--noise-sensitivity", .Text = "Noise Sensitivity"}, - New NumParam With {.Path = "Misc 2", .Switch = "--min-gf-interval", .Text = "Min GF Interval"}, - New NumParam With {.Path = "Misc 2", .Switch = "--max-gf-interval", .Text = "Max GF Interval"}) - End If - - Return ItemsValue - End Get - End Property - - Public Overrides Sub ShowHelp(id As String) - g.ShowCommandLineHelp(Package.AOMEnc, id) - End Sub - - Shadows Sub Add(ParamArray items As CommandLineParam()) - For Each i In items - If i.HelpSwitch = "" Then - Dim switches = i.GetSwitches - If Not switches.NothingOrEmpty Then i.HelpSwitch = switches(0) - End If - - ItemsValue.Add(i) - Next - End Sub - - Overloads Overrides Function GetCommandLine(includePaths As Boolean, - includeExecutable As Boolean, - Optional pass As Integer = 1) As String - - Return GetArgs(1, p.Script, p.VideoEncoder.OutputPath.DirAndBase + - p.VideoEncoder.OutputExtFull, includePaths, includeExecutable) - End Function - - Overloads Function GetArgs(pass As Integer, - script As VideoScript, - targetPath As String, - includePaths As Boolean, - includeExecutable As Boolean) As String - - Dim sb As New StringBuilder - - If includePaths AndAlso includeExecutable Then - If p.Script.Engine = ScriptEngine.VapourSynth Then - sb.Append(Package.vspipe.Path.Escape + " " + script.Path.Escape + " - --y4m | " + Package.AOMEnc.Path.Escape + " -") - Else - sb.Append(Package.ffmpeg.Path.Escape + " -i " + script.Path.Escape + " -f yuv4mpegpipe -loglevel fatal -hide_banner - | " + Package.AOMEnc.Path.Escape + " -") - End If - End If - - Select Case Mode.Value - Case 0 - sb.Append(" --passes=1") - Case 1 - sb.Append(" --passes=2 --pass=" & pass) - End Select - - If Not RateMode.OptionText.EqualsAny("CQ", "Q") Then sb.Append(" --target-bitrate=" & p.VideoBitrate) - Dim q = From i In Items Where i.GetArgs <> "" - If q.Count > 0 Then sb.Append(" " + q.Select(Function(item) item.GetArgs).Join(" ")) - - If includePaths Then - If Mode.Value = 1 Then sb.Append(" --fpf=" + (p.TempDir + p.TargetFile.Base + ".txt").Escape) - sb.Append(" -o " + targetPath.Escape) - End If - - Return Macro.Expand(sb.ToString.Trim.FixBreak.Replace(BR, " ")) - End Function - - Public Overrides Function GetPackage() As Package - Return Package.AOMEnc - End Function -End Class \ No newline at end of file diff --git a/Encoding/VideoEncoder.vb b/Encoding/VideoEncoder.vb index 8e314348..c76a83fb 100644 --- a/Encoding/VideoEncoder.vb +++ b/Encoding/VideoEncoder.vb @@ -72,8 +72,6 @@ Public MustInherit Class VideoEncoder cl += " --transfer smpte2084" Case "BT.709" If height <= 576 Then cl += " --transfer bt709" - '' Case "HLG", "HLG / BT.2020" - '' cl += " --Transfer arib-std-b67" End Select Dim matrix_coefficients = MediaInfo.GetVideo(sourceFile, "matrix_coefficients") @@ -87,13 +85,15 @@ Public MustInherit Class VideoEncoder Dim MasteringDisplay_Luminance = MediaInfo.GetVideo(sourceFile, "MasteringDisplay_Luminance") If MasteringDisplay_ColorPrimaries <> "" AndAlso MasteringDisplay_Luminance <> "" Then - Dim match1 = Regex.Match(MasteringDisplay_ColorPrimaries, "R: x=([0-9\.]+) y=([0-9\.]+), G: x=([0-9\.]+) y=([0-9\.]+), B: x=([0-9\.]+) y=([0-9\.]+), White point: x=([0-9\.]+) y=([0-9\.]+)") + Dim match1 = Regex.Match(MasteringDisplay_ColorPrimaries, "BT.2020") + ''Dim match1 = Regex.Match(MasteringDisplay_ColorPrimaries, "R: x=([0-9\.]+) y=([0-9\.]+), G: x=([0-9\.]+) y=([0-9\.]+), B: x=([0-9\.]+) y=([0-9\.]+), White point: x=([0-9\.]+) y=([0-9\.]+)") Dim match2 = Regex.Match(MasteringDisplay_Luminance, "min: ([0-9\.]+) cd/m2, max: ([0-9\.]+)") If match1.Success AndAlso match2.Success Then - Dim strings1 = match1.Groups.OfType(Of Group).Skip(1).Select(Function(group) CInt(group.Value.ToDouble * 50000).ToString) + ''Dim strings1 = match1.Groups.OfType(Of Group).Skip(1).Select(Function(group) CInt(group.Value.ToDouble * 50000).ToString) Dim strings2 = match2.Groups.OfType(Of Group).Skip(1).Select(Function(group) CInt(group.Value.ToDouble * 10000).ToString) - cl += $" --master-display ""G({strings1(2)},{strings1(3)})B({strings1(4)},{strings1(5)})R({strings1(0)},{strings1(1)})WP({strings1(6)},{strings1(7)})L({strings2(1)},{strings2(0)})""" + cl += "--master-display ""G(8500,39850)B(6550,2300)R(35400,14600)WP(15635,16450)L(10000000,1)""" + ''cl += $" --master-display ""G({strings1(2)},{strings1(3)})B({strings1(4)},{strings1(5)})R({strings1(0)},{strings1(1)})WP({strings1(6)},{strings1(7)})L({strings2(1)},{strings2(0)})""" cl += " --range limited" End If End If @@ -310,9 +310,17 @@ Public MustInherit Class VideoEncoder Gif.Name = "Command Line | Gif Maker" Gif.QualityMode = True Gif.Muxer = New NullMuxer("No Muxing") - Gif.CommandLines = "x264 --pass 1 --bitrate %video_bitrate% --stats ""%target_temp_file%.stats"" --output NUL ""%script_file%"" || exit" + BR + "x264 --pass 2 --bitrate %video_bitrate% --stats ""%target_temp_file%.stats"" --output ""%encoder_out_file%"" ""%script_file%""" + Gif.CommandLines = "ffmpeg -i ""%script_file%"" -vf ""fps=15,scale=%target_width%:-1:flags=spline,palettegen=stats_mode=diff"" -loglevel quiet -y ""%target_temp_file%.png"" || exit" + BR + "ffmpeg -i ""%script_file%"" -i ""%target_temp_file%.png"" -lavfi ""fps=15,scale=%target_width%:-1:flags=spline [x]; [x][1:v] paletteuse=dither=floyd_steinberg"" -loglevel quiet -y ""%target_file%""" ret.Add(Gif) + Dim Thumbs As New BatchEncoder() + Thumbs.OutputFileTypeValue = "jpg" + Thumbs.Name = "Command Line | jpg Maker" + Thumbs.QualityMode = True + Thumbs.Muxer = New NullMuxer("No Muxing") + Thumbs.CommandLines = "wsl python Thumbnailer.py /mnt/c/Users/Revan/Desktop/mtn/mtn ""/mnt/c/Users/Revan/Desktop/Lara.avi"" -c 4 -r 6 -w 1280 -h 150 -j 95 -D 12 -O /mnt/c/Users/Revan/Desktop -f /mnt/c/Users/Revan/Desktop/mtn/LiberationMono-Bold.ttf" + ret.Add(Thumbs) + Dim x264cli As New BatchEncoder() x264cli.OutputFileTypeValue = "h264" x264cli.Name = "Command Line | x264" @@ -526,7 +534,22 @@ Public Class BatchEncoder Return {" [ETA ", ", eta ", "frames: ", "frame= "} End If End Function + Function GetLinuxShell(value As String) As String + Dim ret = "" + + For Each pack In Package.Items.Values + If TypeOf pack Is PluginPackage Then Continue For + Dim dir = pack.GetDir + If Not Directory.Exists(dir) Then Continue For + If Not dir.Contains(Folder.Startup) Then Continue For + If value.ToLower.Contains(pack.Name.ToLower) Then + ret += "PATH=""""" + dir + """" + BR + End If + Next + + Return ret + BR + value + End Function Function GetBatchCode(value As String) As String Dim ret = "" diff --git a/Encoding/ffmpegEnc.vb b/Encoding/ffmpegEnc.vb index 8df1677a..4d195a79 100644 --- a/Encoding/ffmpegEnc.vb +++ b/Encoding/ffmpegEnc.vb @@ -142,7 +142,7 @@ Public Class ffmpegEnc .Switch = "-c:v", .Text = "Codec", .AlwaysOn = True, - .Options = {"x264", "x265", "VP8", "VP9", "Xvid", "ASP", "Theora", "ProRes", "UT Video", "Intel | Intel H.264", "Intel | Intel H.265", "Nvidia | Nvidia H.264", "Nvidia | Nvidia H.265"}, + .Options = {"x264", "x265", "VP8", "VP9", "XviD", "ASP", "Theora", "ProRes", "UT Video", "Intel | Intel H.264", "Intel | Intel H.265", "Nvidia | Nvidia H.264", "Nvidia | Nvidia H.265"}, .Values = {"libx264", "libx265", "libvpx", "libvpx-vp9", "libxvid", "mpeg4", "libtheora", "prores", "utvideo", "h264_qsv", "hevc_qsv", "h264_nvenc", "hevc_nvenc"}} Property Mode As New OptionParam With { @@ -224,7 +224,7 @@ Public Class ffmpegEnc ret += $" -b:v {p.VideoBitrate}k" End Select - If Codec.OptionText = "Xvid" Then ret += " -tag:v xvid" + If Codec.OptionText = "XviD" Then ret += " -tag:v xvid" Dim targetPath As String If Mode.OptionText = "Two Pass" AndAlso pass = 1 Then diff --git a/Encoding/x265Enc.vb b/Encoding/x265Enc.vb index e3f5ae48..fbd9ce2e 100644 --- a/Encoding/x265Enc.vb +++ b/Encoding/x265Enc.vb @@ -520,7 +520,7 @@ Public Class x265Params .Switch = "--profile", .Text = "Profile", .Value = 2, - .Options = {"Unrestricted", "Main", "Main 10", "Main - Intra", "Main Still Picture", "Main 422 - 8", "Main 444 - Intra", "Main 444 - Still Picture", "Main 444 - 8", "Main 10 - Intra", "Main 422 - 10", "Main 422 - 10 - Intra", "Main 444 - 10", "Main 444 - 10 - Intra", "main12", "main12-intra", "main422-12", "main422-12-intra", "main444-12", "main444-12-intra"}} + .Options = {"Unrestricted", "Main", "Main 10", "Main - Intra", "Main Still Picture", "Main 422 - 8", "Main 444 - Intra", "Main 444 - Still Picture", "Main 444 - 8", "Main 10 - Intra", "Main 422 - 10", "Main 422 - 10 - Intra", "Main 444 - 10", "Main 444 - 10 - Intra", "Main12", "Main12-intra", "Main422-12", "Main422-12-intra", "Main444-12", "Main444-12-intra"}} Property OutputDepth As New OptionParam With { .Switch = "--output-depth", @@ -850,7 +850,7 @@ Public Class x265Params New OptionParam With {.Switch = "--transfer", .Text = "Transfer", .Options = {"Undefined", "ARIB-STD-B67", "BT 1361 E", "BT 2020-10", "BT 2020-12", "BT 470 BG", "BT 470 M", "BT 709", "IEC 61966-2-1", "IEC 61966-2-4", "Linear", "Log 100", "Log 316", "SMPTE 170 M", "SMPTE 2084", "SMPTE 240 M", "SMPTE 428"}}, New OptionParam With {.Switch = "--overscan", .Text = "Overscan", .Options = {"Undefined", "Show", "Crop"}}, New OptionParam With {.Switch = "--range", .Text = "Range", .Options = {"Undefined", "Limited", "Full"}}, - minLuma, maxLuma, MaxCLL, MaxFALL, + Chromaloc, minLuma, maxLuma, MaxCLL, MaxFALL, New BoolParam With {.Switch = "--hdr", .Text = "Force signalling of HDR parameters in SEI packets"}, New BoolParam With {.Switch = "--hdr-opt", .Text = "Add luma and chroma offsets for HDR/WCG content"}, New BoolParam With {.Switch = "--dhdr10-opt", .Text = "Limit frames for which tone mapping information is inserted as SEI message"}) diff --git a/Resources/FontAwesome.ttf b/FontAwesome.ttf similarity index 100% rename from Resources/FontAwesome.ttf rename to FontAwesome.ttf diff --git a/Forms/MainForm.vb b/Forms/MainForm.vb index 6d95b4ed..cc158a1b 100644 --- a/Forms/MainForm.vb +++ b/Forms/MainForm.vb @@ -4296,8 +4296,9 @@ Public Class MainForm ret.Add("Tools|Folders|Working", NameOf(g.DefaultCommands.ExecuteCommandLine), {"""%working_dir%"""}) ret.Add("Tools|Advanced", Symbol.More) - If Application.StartupPath = "D:\Projekte\VS\VB\StaxRip\bin" Then ret.Add("Tools|Advanced|Test...", NameOf(g.DefaultCommands.Test), Keys.F12) + If Application.StartupPath = "C:\Users\Revan\Desktop\staxrip-1.8.2.0\bin" Then ret.Add("Tools|Advanced|Test...", NameOf(g.DefaultCommands.Test), Keys.F12) ret.Add("Tools|Advanced|Video Comparison...", NameOf(ShowVideoComparison)) + ret.Add("Tools|Advanced|Bash Prompt", NameOf(g.DefaultCommands.BashCommandPrompt), Symbol.fa_terminal) ret.Add("Tools|Advanced|Command Prompt", NameOf(g.DefaultCommands.ShowCommandPrompt), Symbol.fa_terminal) ret.Add("Tools|Advanced|PowerShell", NameOf(g.DefaultCommands.ShowPowerShell), Keys.Control Or Keys.P, Symbol.fa_terminal) ret.Add("Tools|Advanced|Event Commands...", NameOf(ShowEventCommandsDialog), Symbol.LightningBolt) @@ -4306,13 +4307,17 @@ Public Class MainForm ret.Add("Tools|Advanced|LAV Filters video decoder configuration...", NameOf(ShowLAVFiltersConfigDialog), Symbol.Filter) ret.Add("Tools|Advanced|MediaInfo Folder View...", NameOf(ShowMediaInfoFolderViewDialog), Symbol.Info) ret.Add("Tools|Advanced|Reset Setting...", NameOf(ResetSettings)) - ret.Add("Tools|Advanced|Thumbnails Generator...", NameOf(ShowBatchGenerateThumbnailsDialog)) + ret.Add("Tools|Advanced|Thumbnails|StaxRip Thumbnail Generator", NameOf(ShowBatchGenerateThumbnailsDialog)) + ret.Add("Tools|Advanced|Thumbnails|MTN Thumbnail Generator", NameOf(g.DefaultCommands.MTNCommand)) + ret.Add("Tools|Advanced|Thumbnails|VCS Thumbnail Generator", NameOf(g.DefaultCommands.VCSPythonPrompt)) ret.Add("Tools|Scripts", NameOf(DynamicMenuItem), Symbol.Code, {DynamicMenuItemID.Scripts}) ret.Add("Tools|Edit Menu...", NameOf(ShowMainMenuEditor)) ret.Add("Tools|Settings...", NameOf(ShowSettingsDialog), Symbol.Settings, {""}) ret.Add("Apps|AVSMeter", NameOf(g.DefaultCommands.StartTool), {"AVSMeter"}) + ret.Add("Apps|MKVInfo", NameOf(g.DefaultCommands.StartTool), {"MKVInfo"}) + ret.Add("Apps|MKVHDR", NameOf(g.DefaultCommands.StartTool), {"MKVHDR"}) ret.Add("Apps|BDSup2Sub++", NameOf(g.DefaultCommands.StartTool), {"BDSup2Sub++"}) ret.Add("Apps|DGIndex", NameOf(g.DefaultCommands.StartTool), {"DGIndex"}) ret.Add("Apps|DGIndexNV", NameOf(g.DefaultCommands.StartTool), {"DGIndexNV"}) @@ -5483,6 +5488,52 @@ Public Class MainForm SourceFileMenu.Add("Paste", Sub() tbSourceFile.Paste(), "Copies the full source file path to the clipboard.", Clipboard.GetText.Trim <> "").SetImage(Symbol.Paste) End Sub + + Sub ShowBatchGenerateThumbnailsDialog() + Using fd As New OpenFileDialog + fd.Title = "Select files" + fd.SetFilter(FileTypes.Video) + fd.Multiselect = False + + If fd.ShowDialog = DialogResult.OK Then + Using f As New SimpleSettingsForm("Thumbnail Options") + f.ScaleClientSize(27, 15) + + Dim ui = f.SimpleUI + Dim page = ui.CreateFlowPage("main page") + ui.Store = s + page.SuspendLayout() + + Dim row As SimpleUI.NumBlock + Dim interval As SimpleUI.NumBlock + + Dim mode = ui.AddMenu(Of Integer) + Dim m = ui.AddMenu(Of Integer) + + Dim nb = ui.AddNum() + nb.Text = "Thumbnail Width:" + nb.Config = {200, 4000, 10} + nb.NumEdit.Value = s.Storage.GetInt("Thumbnail Width", 500) + nb.NumEdit.SaveAction = Sub(value) s.Storage.SetInt("Thumbnail Width", CInt(value)) + + nb = ui.AddNum() + nb.Text = "Column Count:" + nb.Config = {1, 1000} + nb.NumEdit.Value = s.Storage.GetInt("Thumbnail Columns", 3) + nb.NumEdit.SaveAction = Sub(value) s.Storage.SetInt("Thumbnail Columns", CInt(value)) + + row = ui.AddNum() + row.Text = "Row Count:" + row.Config = {1, 1000} + row.NumEdit.Value = s.Storage.GetInt("Thumbnail Rows", 12) + row.NumEdit.SaveAction = Sub(value) s.Storage.SetInt("Thumbnail Rows", CInt(value)) + + interval = ui.AddNum() + interval.Text = "Interval (seconds):" + interval.NumEdit.Value = s.Storage.GetInt("Thumbnail Interval") + interval.NumEdit.SaveAction = Sub(value) s.Storage.SetInt("Thumbnail Interval", CInt(value)) + + Sub ShowBatchGenerateThumbnailsDialog() Using fd As New OpenFileDialog @@ -5577,7 +5628,6 @@ Public Class MainForm End If End Using End Sub - Sub ShowMediaInfoFolderViewDialog() Using d As New FolderBrowserDialog diff --git a/Forms/MediaInfoFolderViewForm.vb b/Forms/MediaInfoFolderViewForm.vb index 1d487526..2fac3d52 100644 --- a/Forms/MediaInfoFolderViewForm.vb +++ b/Forms/MediaInfoFolderViewForm.vb @@ -62,7 +62,7 @@ Public Class MediaInfoFolderViewForm MyBase.New() InitializeComponent() - Icon = My.Resources.RipIcon + Icon = My.Resources.MainIcon lv.View = View.Details lv.FullRowSelect = True diff --git a/General/GlobalCommands.vb b/General/GlobalCommands.vb index d3e6a9c5..773bd28a 100644 --- a/General/GlobalCommands.vb +++ b/General/GlobalCommands.vb @@ -78,6 +78,73 @@ Public Class GlobalCommands Sub StartJobs() g.ProcessJobs() End Sub + + Sub MTNCommand() + Dim val As String + 'g.DefaultCommands.ExecuteCommandLine(Package.Items("AVSMeter").Path.Escape+ " -avsinfo" + BR + "pause", False, False, True) + + If p.TempDir <> "" Then val += "cd \""" + p.TempDir + """" + g.StartProcess("powershell.exe", "-command wsl python3 '/mnt/c/Users/Revan/Desktop/Thumbnailer.py'" + val) + End Sub + + Sub VCSPythonPrompt() + Dim batchCode = "" + + For Each pack In Package.Items.Values + If TypeOf pack Is PluginPackage Then Continue For + Dim dir = pack.GetDir + If Not Directory.Exists(dir) Then Continue For + If Not dir.Contains(Folder.Startup) Then Continue For + + batchCode += "@set PATH=" + dir + ";%PATH%" + BR + batchCode += "wsl python3 '/mnt/c/Users/Revan/Desktop/Thumbnailer.py'" + Next + + Dim batchPath = Folder.Temp + Guid.NewGuid.ToString + ".bat" + Proc.WriteBatchFile(batchPath, batchCode) + + AddHandler g.MainForm.Disposed, Sub() FileHelp.Delete(batchPath) + + Dim batchProcess As New Process + batchProcess.StartInfo.FileName = "cmd.exe" + batchProcess.StartInfo.Arguments = "/C """ + batchPath + """" + batchProcess.StartInfo.WorkingDirectory = p.TempDir + batchProcess.Start() + End Sub + + + + ' + 'Sub VCSCommand() + + ' Using fd As New OpenFileDialog + ' fd.Title = "Select files" + ' fd.SetFilter(FileTypes.Video) + ' fd.Multiselect = False + + ' g. + + ' If fd.ShowDialog = DialogResult.OK Then + + ' p.StartInfo.FileName = "C:\Python33\python.exe" + + ' Dim Val As String + ' Dim Cmds As String + ' Cmds += "wsl python3 VCS.py " + ' If p.TempDir <> "" Then Val += "cd \""" + p.TempDir + """" + ' g.DefaultCommands.BashCommandPrompt() + ' g.StartProcess("python3 VCS.py " + p.SourceFile + " /mnt/c/users/Revan/Desktop/vcs.bash") + ' End If + ' End Using + 'End Sub + + + Sub BashCommandPrompt() + Dim val As String + + If p.TempDir <> "" Then val += "cd \""" + p.TempDir + """" + g.StartProcess("powershell.exe", "-noexit -command bash" + val) + End Sub Sub ShowCommandPrompt() @@ -103,7 +170,6 @@ Public Class GlobalCommands batchProcess.StartInfo.WorkingDirectory = p.TempDir batchProcess.Start() End Sub - Sub ShowPowerShell() Dim val As String @@ -384,22 +450,6 @@ Public Class GlobalCommands If x265Missing.Count > 0 Then msg += BR2 + "# Removed from x265" + BR2 + x265Missing.Join(" ") If x265Unknown.Count > 0 Then msg += BR2 + "# x265 Todo" + BR2 + x265Unknown.Join(" ") - '' Dim aomExcept = "--output".Split((" " + BR).ToCharArray()) - '' Dim aomCodeExcept = "--y4m".Split((" " + BR).ToCharArray()) - '' Dim aomHelp = ProcessHelp.GetErrOut(Package.AOMEnc.Path, Nothing) - '' File.WriteAllText(Package.AOMEnc.GetDir + "aomenc.txt", aomHelp) - '' aomHelp = aomHelp.Replace("(no-)", "").Replace("--no-", "--") - '' Dim aomHelpSwitches = Regex.Matches(aomHelp, "--[\w-]+").OfType(Of Match)().Select(Function(x) x.Value) - '' Dim aomCode = File.ReadAllText(Folder.Startup.Parent + "Encoding\aomenc.vb").Replace("--no-", "--") - '' Dim aomPresentInCode = Regex.Matches(aomCode, "--[\w-]+").OfType(Of Match)().Select(Function(x) x.Value) - '' Dim aomMissing = aomPresentInCode.Where(Function(arg) Not aomHelpSwitches.Contains(arg) AndAlso Not aomCodeExcept.Contains(arg)) - '' Dim aomUnknown = aomHelpSwitches.Where(Function(x) Not aomPresentInCode.Contains(x) AndAlso Not aomExcept.Contains(x)).ToList() - '' aomUnknown.Sort() - '' Dim aomNoNeedToExcept = aomExcept.Where(Function(arg) aomPresentInCode.Contains(arg)) - '' If aomNoNeedToExcept.Count > 0 Then msg += BR2 + "# Unnecessary aomenc Exception:" + BR2 + aomNoNeedToExcept.Join(" ") - '' If aomMissing.Count > 0 Then msg += BR2 + "# Removed from aomenc" + BR2 + aomMissing.Join(" ") - '' If aomUnknown.Count > 0 Then msg += BR2 + "# aomenc Todo" + BR2 + aomUnknown.Join(" ") - File.WriteAllText(Package.fdkaac.GetDir + "help.txt", ProcessHelp.GetStdOut(Package.fdkaac.Path, "-h")) For Each pack In Package.Items.Values @@ -459,10 +509,10 @@ Public Class GlobalCommands End If Next - supportedTools.WriteUTF8File("C:\Users\Revan\Desktop\StaxRip.Source\docs\tools.rst") + supportedTools.WriteUTF8File("D:\Projekte\VS\VB\StaxRip\docs\tools.rst") Dim screenshots = "Screenshots" + BR + "===========" + BR2 + ".. contents::" + BR2 - Dim screenshotFiles = Directory.GetFiles("C:\Users\Revan\Desktop\StaxRip.Source\docs\screenshots").ToList + Dim screenshotFiles = Directory.GetFiles("D:\Projekte\VS\VB\StaxRip\docs\screenshots").ToList screenshotFiles.Sort(New StringLogicalComparer) For Each i In screenshotFiles @@ -470,7 +520,7 @@ Public Class GlobalCommands screenshots += name + BR + "-".Multiply(name.Length) + BR2 + ".. image:: screenshots/" + i.FileName + BR2 Next - screenshots.WriteUTF8File("C:\Users\Revan\Desktop\StaxRip.Source\docs\screenshots.rst") + screenshots.WriteUTF8File("D:\Projekte\VS\VB\StaxRip\docs\screenshots.rst") Dim macros = "Macros" + BR + "======" + BR2 @@ -478,7 +528,7 @@ Public Class GlobalCommands macros += "``" + i.Name + "``" + BR2 + i.Value + BR2 Next - macros.WriteUTF8File("C:\Users\Revan\Desktop\StaxRip.Source\docs\macros.rst") + macros.WriteUTF8File("D:\Projekte\VS\VB\StaxRip\docs\macros.rst") Dim powershell = "PowerShell Scripting ==================== @@ -515,18 +565,18 @@ Default Scripts --------------- " - Dim psdir = "C:\Users\Revan\Desktop\StaxRip.Source\docs\powershell\" + Dim psdir = "D:\Projekte\VS\VB\StaxRip\docs\powershell\" DirectoryHelp.Delete(psdir) Directory.CreateDirectory(psdir) - For Each i In Directory.GetFiles("C:\Users\Revan\Desktop\StaxRip.Source\bin\Apps\Scripts") + For Each i In Directory.GetFiles("D:\Projekte\VS\VB\StaxRip\bin\Apps\Scripts") FileHelp.Copy(i, psdir + i.FileName) Dim filename = i.FileName powershell += filename + BR + "~".Multiply(filename.Length) + BR2 powershell += ".. literalinclude:: " + "powershell/" + i.FileName + BR + " :language: powershell" + BR2 Next - powershell.WriteUTF8File("C:\Users\Revan\Desktop\StaxRip.Source\docs\powershell.rst") + powershell.WriteUTF8File("D:\Projekte\VS\VB\StaxRip\docs\powershell.rst") Dim switches = "Command Line Interface ====================== @@ -595,7 +645,7 @@ Switches switches += command.Attribute.Description + BR2 + BR Next - switches.WriteUTF8File("C:\Users\Revan\Desktop\StaxRip.Source\docs\cli.rst") + switches.WriteUTF8File("D:\Projekte\VS\VB\StaxRip\docs\cli.rst") If msg <> "" Then Dim fs = Folder.Temp + "staxrip todo.txt" diff --git a/General/Package.vb b/General/Package.vb index 9663b613..f5099ec8 100644 --- a/General/Package.vb +++ b/General/Package.vb @@ -53,6 +53,7 @@ Public Class Package End Property Shared Property Items As New SortedDictionary(Of String, Package) + Shared Property Python As Package = Add(New PythonPackage) Shared Property DGIndexIM As Package = Add(New DGIndexIMPackage) Shared Property DGIndexNV As Package = Add(New DGIndexNVPackage) @@ -154,6 +155,28 @@ Public Class Package .WebURL = "http://forum.doom9.org/showthread.php?p=1613303", .Description = "Converts Blu-ray subtitles to other formats like VobSub."}) + Shared Property VCS As Package = Add(New Package With { + .Name = "VCS", + .Filename = "vcs.bash", + .DirPath = "/Apps/Thumbnailer", + .Description = "This is a bash script meant to create video contact sheets (previews) of videos.", + .WebURL = "http://p.outlyer.net/vcs", + .HelpURL = "http://p.outlyer.net/vcs/docs"}) + + Shared Property Thumbnailer As Package = Add(New Package With { + .Name = "Thumbnailer", + .Filename = "VCS.py", + .DirPath = "/Apps/Thumbnailer", + .Description = "Custom Launcher Script for VCS"}) + + Shared Property MTN As Package = Add(New Package With { + .Name = "MTN", + .Filename = "mtn", + .DirPath = "/Apps/Thumbnailer", + .Description = "movie thumbnailer saves thumbnails (screenshots) of movie or video files to jpeg files. StaxRip uses a custom built version with HEVC support added in and also includes the latest FFMPEG.", + .WebURL = "http://moviethumbnail.sourceforge.net/", + .HelpURL = "http://moviethumbnail.sourceforge.net/usage.en.html"}) + Shared Property SubtitleEdit As Package = Add(New Package With { .Name = "SubtitleEdit", .Filename = "SubtitleEdit.exe", @@ -172,15 +195,6 @@ Public Class Package .URL = "https://portableapps.com/apps/music_video/potplayer-portable", .Description = "mpv is a fork of mplayer2 and MPlayer. It shares some features with the former projects while introducing many more."}) - '' Shared Property AOMEnc As Package = Add(New Package With { - ''.Name = "aomenc", - ''.Filename = "aomenc.exe", - ''.HelpFile = "aomenc.txt", - ''.WebURL = "http://aomedia.org", - ''.DownloadURL = "http://tmod.nmm-hd.org/aom/", - ''.IsRequiredFunc = Function() TypeOf p.VideoEncoder Is AOMEnc, - ''.Description = "AOMedia Video 1 (AV1) is an open, royalty-free video coding format designed for video transmissions over the Internet."}) - Shared Property modPlus As Package = Add(New PluginPackage With { .Name = "modPlus", .Filename = "modPlus.dll", @@ -245,16 +259,17 @@ Public Class Package .HelpURL = "http://f3kdb.readthedocs.io/en/latest/#", .Description = "Simple debanding filter that can be quite effective for some anime sources.", .VSFilterNames = {"f3kdb.Deband"}, - .VSFiltersFunc = Function() {New VideoFilter("Misc", "F3KDB...", "clip = core.f3kdb.Deband(clip, preset = ""$select:msg:Select a preset.;depth;low;medium;high;veryhigh;nograin;luma;chroma$"")")}, .AvsFilterNames = {"f3kdb"}}) - ''.AvsFiltersFunc = Function() {New VideoFilter("Misc", "F3KDB...", "f3kdb(preset = ""$select:msg:Select a preset.;depth;low;medium;high;veryhigh;nograin;luma;chroma$"")")}}) Shared Property vinverse As Package = Add(New PluginPackage With { .Name = "vinverse", .Filename = "vinverse.dll", .WebURL = "http://avisynth.nl/index.php/Vinverse", .Description = "A modern rewrite of a simple but effective plugin to remove residual combing originally based on an AviSynth script by Didée and then written as a plugin by tritical.", - .AvsFilterNames = {"vinverse", "vinverse2"}}) + .AvsFilterNames = {"vinverse", "vinverse2"}, + .AvsFiltersFunc = Function() { + New VideoFilter("Restoration", "RCR | Vinverse", "vinverse()"), + New VideoFilter("Restoration", "RCR | Vinverse2", "vinverse2()")}}) Shared Property scenechange As Package = Add(New PluginPackage With { .Name = "scenechange", @@ -266,7 +281,6 @@ Public Class Package .Filename = "avs2pipemod64.exe", .WebURL = "http://github.com/chikuzen/avs2pipemod", .Description = "Given an AviSynth script as input, avs2pipemod can send video, audio, or information of various types to stdout for consumption by command line encoders or other tools."}) - Shared ReadOnly Property x264 As Package Get If IsX264_10Required() Then Return x264_10 Else Return x264_8 @@ -397,7 +411,6 @@ Public Class Package .WebURL = "http://avisynth.nl/index.php/SangNom2", .Description = "SangNom2 is a reimplementation of MarcFD's old SangNom filter. Originally it's a single field deinterlacer using edge-directed interpolation but nowadays it's mainly used in anti-aliasing scripts. The output is not completely but mostly identical to the original SangNom.", .AvsFilterNames = {"SangNom2"}}) - Shared Function Add(pack As Package) As Package Items(pack.ID) = pack Return pack @@ -465,6 +478,26 @@ Public Class Package .HelpFile = "doc\AVSMeter.html", .WebURL = "http://forum.doom9.org/showthread.php?t=174797"}) + Add(New Package With { + .Name = "MKVInfo", + .Filename = "MKVInfo.exe", + .DirPath = "Apps/MKVToolNix", + .Description = "MKVToolNix is a set of tools to create, alter and inspect Matroska files", + .StartActionValue = Sub() + g.DefaultCommands.ExecuteCommandLine(Package.Items("MKVInfo").Path.Escape + " " + p.SourceFile + BR + "pause", False, False, True) + End Sub, + .WebURL = "https://mkvtoolnix.download/doc/mkvinfo.html"}) + + Add(New Package With { + .Name = "MKVHDR", + .Filename = "MKVInfo.exe", + .DirPath = "Apps/MKVToolNix", + .Description = "MKVToolNix is a set of tools to create, alter and inspect Matroska files", + .StartActionValue = Sub() + g.DefaultCommands.ExecuteCommandLine(Package.Items("MKVInfo").Path.Escape + " " + "-o " + p.SourceFile + " --colour-matrix 0:9 --colour-range 0:1 --colour-transfer-characteristics 0:16 --colour-primaries 0:9 --max-content-light 0:1000 --max-frame-light 0:300 --max-luminance 0:1000 --min-luminance 0:0.01 --chromaticity-coordinates 0:0.68,0.32,0.265,0.690,0.15,0.06 --white-colour-coordinates 0:0.3127,0.3290 " + p.TargetFile + BR + "pause", False, False, True) + End Sub, + .WebURL = "https://mkvtoolnix.download/doc/mkvinfo.html"}) + Add(New PluginPackage With { .Name = "KNLMeansCL", .Filename = "KNLMeansCL.dll", @@ -505,8 +538,6 @@ Public Class Package .AvsFilterNames = {"DSS2"}, .AvsFiltersFunc = Function() {New VideoFilter("Source", "DSS2", "DSS2(""%source_file%"")")}}) - ''Start of Custom Plugins - Add(New PluginPackage With { .Name = "Deblock", .Filename = "Deblock.dll", @@ -574,7 +605,7 @@ Public Class Package .Filename = "Shader.avsi", .HelpFile = "Readme.txt", .WebURL = "http://avisynth.nl/index.php/Shader", - .AvsFilterNames = {"SuperRes", "SuperResXBR", "SuperXBR", "ResizeShader", "Shader", "ShaderExecute", "ConvertToShader", "ConvertFromShader"}}) + .AvsFilterNames = {"SuperRes", "SuperResXBR", "SuperXBR", "ResizeShader", "SuperResPass", "SuperXbrMulti", "ResizeShader", "ResizeInternal", "CreateParamXY", "CreateParamDivXY", "CreateParamFloat4"}}) Add(New PluginPackage With { .Name = "Shader DLL", @@ -582,7 +613,7 @@ Public Class Package .Filename = "Shader.dll", .HelpFile = "Readme.txt", .WebURL = "http://avisynth.nl/index.php/Shader", - .AvsFilterNames = {"SuperRes", "SuperResXBR", "SuperXBR", "ResizeShader", "Shader", "ShaderExecute", "ConvertToShader", "ConvertFromShader"}}) + .AvsFilterNames = {"Shader", "ShaderExecute", "ConvertToShader", "ConvertFromShader"}}) Add(New PluginPackage With { .Name = "JincResize", @@ -795,8 +826,8 @@ Public Class Package .WebURL = "http://avisynth.nl/index.php/MAA2", .AvsFilterNames = {"MAA2", "Sangnom2AA", "maa2ee"}, .AvsFiltersFunc = Function() { - New VideoFilter("Line", "Anti-Aliasing | MAA2 | MMA2 with nnedi3", "MAA2(mask=1, chroma=false, ss=2.0, aa=48, aac=40, threads=4, show=0, ext_aa=nnedi3_resize16())"), - New VideoFilter("Line", "Anti-Aliasing | MAA2 | MMA2", "MAA2(mask=1, chroma=false, ss=2.0, aa=48, aac=40, threads=4, show=0)")}}) + New VideoFilter("Line", "MAA2 | MMA2 with nnedi3", "MAA2(mask=1, chroma=false, ss=2.0, aa=48, aac=40, threads=4, show=0, ext_aa=nnedi3_resize16())"), + New VideoFilter("Line", "MAA2 | MMA2", "MAA2(mask=1, chroma=false, ss=2.0, aa=48, aac=40, threads=4, show=0)")}}) Add(New PluginPackage With { .Name = "DAA3Mod", @@ -805,8 +836,8 @@ Public Class Package .WebURL = "http://avisynth.nl/index.php/daa3", .AvsFilterNames = {"daa3mod", "mcdaa3"}, .AvsFiltersFunc = Function() { - New VideoFilter("Line", "Anti-Aliasing | DAA3 | MCDAA3", "mcdaa3()"), - New VideoFilter("Line", "Anti-Aliasing | DAA3 | DAA3", "daa3mod()")}}) + New VideoFilter("Line", "DAA3 | MCDAA3", "mcdaa3()"), + New VideoFilter("Line", "DAA3 | DAA3", "daa3mod()")}}) Add(New PluginPackage With { .Name = "eedi3_resize", @@ -832,7 +863,7 @@ Public Class Package .WebURL = "http://avisynth.nl", .AvsFilterNames = {"DeNoiseMD1", "BlendClips", "Range8to16", "DenoiseMD2"}, .AvsFiltersFunc = Function() { - New VideoFilter("Noise", "DeNoise | Denoise MD | DeNoiseMD 16Bit", "DeNoiseMD1(sigma=4, overlap=2, thcomp=80, str=0.8)" + BR + "#Functions" + BR + "Dither_convey_yuv4xxp16_on_yvxx()"), + New VideoFilter("Noise", "DeNoise | Denoise MD | DeNoiseMD 16Bit", "DeNoiseMD1(sigma=4, overlap=2, thcomp=80, str=0.8)" + BR + "Functions" + BR + "Dither_convey_yuv4xxp16_on_yvxx()"), New VideoFilter("Noise", "DeNoise | Denoise MD | DeNoiseMD Histogram", "a = last" + BR + "DenoiseMD1(sigma = 4, overlap = 2, thcomp = 80, str = 0.8)" + BR + "b = last.DitherPost(mode = -1)" + BR + "DiffCol(a, b, col = 1, colnum = 4, hista = False, histb = False)"), New VideoFilter("Noise", "DeNoise | Denoise MD | DeNoiseMD 8Bit", "DeNoiseMD1(sigma=4, overlap=2, thcomp=80, str=0.8)" + BR + "#Functions" + BR + "DitherPost(mode=7, ampo=1, ampn=0)")}}) @@ -843,7 +874,7 @@ Public Class Package .WebURL = "http://avisynth.nl", .AvsFilterNames = {"DeNoiseMF1", "DenoiseMF2"}, .AvsFiltersFunc = Function() { - New VideoFilter("Noise", "DeNoise | Denoise MF | DeNoiseMF 16Bit", "DenoiseMF2(s1=2.0, s2=2.5, s3=3.0, s4=2.0, overlap=4, thcomp=80, str=0.8, gpu=$select:msg:Use GPU Enabled Feature?;True;False$)" + BR + "#Functions" + BR + "Dither_convey_yuv4xxp16_on_yvxx()"), + New VideoFilter("Noise", "DeNoise | Denoise MF | DeNoiseMF 16Bit", "DenoiseMF2(s1=2.0, s2=2.5, s3=3.0, s4=2.0, overlap=4, thcomp=80, str=0.8, gpu=$select:msg:Use GPU Enabled Feature?;True;False$)" + BR + "#Functions" + BR + "#16Bit Functions" + BR + "Dither_convey_yuv4xxp16_on_yvxx()"), New VideoFilter("Noise", "DeNoise | Denoise MF | DeNoiseMF Histogram", "a = last" + BR + "DenoiseMF1(s1=2.0, s2=2.5, s3=3.0, s4=2.0, overlap=4, thcomp=80, str=0.8)" + BR + "b = last.DitherPost(mode = -1)" + BR + "DiffCol(a, b, col = 1, colnum = 4, hista = False, histb = False)"), New VideoFilter("Noise", "DeNoise | Denoise MF | DeNoiseMF 8Bit", "DenoiseMF2(s1=2.0, s2=2.5, s3=3.0, s4=2.0, overlap=4, thcomp=80, str=0.8, gpu=$select:msg:Use GPU Enabled Feature?;True;False$)" + BR + "#Functions" + BR + "DitherPost(mode=7, ampo=1, ampn=0)")}}) @@ -915,87 +946,87 @@ Public Class Package ''.HelpFile = "HDRColor.txt", ''.AvsFilterNames = {"cube", "Repair Y", "DynRangeY", "DynRange", "Color"}, ''.AvsFiltersFunc = Function() { - '' New VideoFilter("Color", "HDRCore | HDRColor | Cube", "Cube(file=""$browse_file$"", from=$select:msg:Select Input Color Space;601;709;2020$, to=$select:msg:Select Output Color Space;601;709;2020$, rg=1.0, gg=1.0, bg=1.0, $select:msg:Select the Range you Wish to Use;TV Range|a=16, b=235, ao=16, bo=235;PC Range|a=0, b=255, ao=0, bo=255$, sat=1.0, sato=1.0, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), - '' New VideoFilter("Color", "HDRCore | HDRColor | Repair Y", "RepairY($select:msg:Select Input Range;TV Range|a=16,b=235;PC Range|a=0,b=255$, black=0.0, hl=0.5, hlg=1.0, gain=1.0, $select:msg:Select Output Range;TV Range|ao=16,bo=235;PC Range|ao=0,bo=255$, g=2.2, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), - '' New VideoFilter("Color", "HDRCore | HDRColor | DynRangeY", "DynRangeY($select:msg:Select Y-Channel Range for Start Frame;TV Range|a1=16,b1=235;PCRange|a1=0,b1=255$, $select:msg:Select Y-Channel Range for End Frame;TV Range|a2=16,b2=235;PCRange|a2=0,b2=255$, g1=1.0, g2=1.0, $select:msg:Select The Output Range;TV Range|ao=16,bo=235;PC Range|ao=0,bo=255$, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), - ''New VideoFilter("Color", "HDRCore | HDRColor | Color", "Color(sat=1.0, g=1.0, saty=1.0, satb=1.0, satg=1.0, satr=1.0, gy=1.0, gb=1.0, gg=1.0, gr=1.0, dyb=0.0, dgr=0.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), - '' New VideoFilter("Color", "HDRCore | HDRColor | DynColor", "DynColor(sat1=1.0, sat2=1.0, g1=1.0, g2=1.0, saty1=1.0, saty2=1.0, satb1=1.0, satb2=1.0, satg1=1.0, satg2=1.0, satr1=1.0, satr2=1.0, gy1=1.0, gy2=1.0, gb1=1.0, gb2=1.0, gg1=1.0, gg2=1.0, gr1=1.0, gr2=1.0, dyb1=0.0, dyb2=0.0, dgr1=0.0, dgr2=0.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")}}) - - Add(New PluginPackage With { - .Name = "HDRMatrix", - .Filename = "HDRMatrix.dll", - .Description = "HDRMatrix is a color matrix conversion filter library to work with HDR frames in AviSynth.", - .WebURL = "http://www.videoartifact.com/hdr/", - .IsRequired = False, - .HelpFile = "HDRMatrix.txt", - .AvsFilterNames = {"Matrix"}, - .AvsFiltersFunc = Function() { - New VideoFilter("Color", "HDR Core | HDRColor | Matrix", "Matrix(from=$select:msg:Select Input For Color Matrix;601;709;2020$, to=$select:msg:Select Output For Color Matrix;601;709;2020$, rg=1.0, gg=1.0, bg=1.0, a=16, b=235, ao=0, bo=255, bitdepth=$select:msg:Select BitDepth;8;88;16;32$)")}}) - - Add(New PluginPackage With { - .Name = "BicubicSharp", - .Filename = "BicubicSharp.avsi", - .Description = "HDRSharp is a sharpening library to work with HDR frames in AviSynth.", - .DirPath = "Plugins\AVS\HDRSharp", - .WebURL = "http://www.videoartifact.com/hdr/", - .IsRequired = False, - .HelpFile = "HDRSharp.txt", - .AvsFilterNames = {"BicubicSharp", "UnsharpMask8Y", "UnsharpMask16Y", "BicubicSharp8"}}) - - Add(New PluginPackage With { - .Name = "HDRSharp", - .Filename = "HDRSharp.dll", - .Description = "HDRSharp is a sharpening library to work with HDR frames in AviSynth.", - .WebURL = "http://www.videoartifact.com/hdr/", - .DirPath = "Plugins\AVS\HDRSharp", - .IsRequired = False, - .HelpFile = "HDRSharp.txt", - .AvsFilterNames = {"BicubicSharp", "UnsharpMask8Y", "UnsharpMask16Y", "BicubicSharp8"}, - .AvsFiltersFunc = Function() { - New VideoFilter("Line", "Sharpen | HDRSharp | UnsharpMask8Y", "UnsharpMask8Y(mask, edges=1.0, g=2.2, wg=1.0, bl=0.0, str=1.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;88;16$)" + BR + "#Mask=Yourmasking filter, Masking filter needs to be used with this Function"), - New VideoFilter("Line", "Sharpen | HDRSharp | UnsharpMask8Y", "UnsharpMask8Y(mask, edges=1.0, g=2.2, wg=1.0, bl=0.0, str=1.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;88;16$)" + BR + "#Mask=Yourmasking filter, Masking filter needs to be used with this Function"), - New VideoFilter("Line", "Sharpen | HDRSharp | BicubicSharp", "BicubicSharp(bitdepth=$select:msg:Select BitDepth;8;88;16$)"), - New VideoFilter("Line", "Sharpen | HDRSharp | BicubicSharp8", "BicubicSharp8()")}}) - - Add(New PluginPackage With { - .Name = "HDRCore", - .DirPath = "Plugins\AVS\HDRCore", - .Description = "HDRCore library adds 16-bit integer (stacked and linear) and 32-bit floating point pixel types. ", - .IsRequired = False, - .HelpFile = "HDRCore.txt", - .Filename = "HDRCore.dll", - .WebURL = "http://www.videoartifact.com/hdr/", - .AvsFilterNames = {"BitdepthMsb", "BitdepthMsbLsb", "BitdepthLsb", "Bitdepth", "RangeY", "RangeUV", "ClampHDR"}}) - - Add(New PluginPackage With { - .Name = "HDRNoise", - .DirPath = "Plugins\AVS\HDRNoise", - .Description = "HDRNoise is a noise library to work with HDR frames in AviSynth.", - .IsRequired = False, - .HelpFile = "HDRNoise.txt", - .Filename = "HDRNoise.dll", - .WebURL = "http://www.videoartifact.com/hdr/", - .AvsFilterNames = {"NoiseY", "NoiseYM", "NoiseUV", "NoisedGrayY8", "NoiseMix1Y", "NoiseMix2Y"}}) - - Add(New PluginPackage With { - .Name = "FilmGrain", - .DirPath = "Plugins\AVS\HDRNoise", - .Description = "HDRNoise is a noise library to work with HDR frames in AviSynth.", - .IsRequired = False, - .HelpFile = "HDRNoise.txt", - .Filename = "FilmGrain.avsi", - .WebURL = "http://www.videoartifact.com/hdr/", - .AvsFilterNames = {"FilmGrain1", "FilmGrain2"}}) - - Add(New PluginPackage With { - .Name = "HDR Sources", - .Description = "HDRCore library adds 16-bit integer (stacked and linear) and 32-bit floating point pixel types.", - .DirPath = "Plugins\AVS\HDRCore", - .IsRequired = False, - .Filename = "HDR-sources.avsi", - .HelpFile = "HDRCore.txt", - .WebURL = "http://www.videoartifact.com/hdr/", - .AvsFilterNames = {"VideoDS", "AudioDS", "VideoLS", "AudioLS", "VideoLA", "AudioLA", "AudioSilent"}}) + '' New VideoFilter("Color", "HDRColor | Cube", "Cube(file=""$browse_file$"", from=$select:msg:Select Input Color Space;601;709;2020$, to=$select:msg:Select Output Color Space;601;709;2020$, rg=1.0, gg=1.0, bg=1.0, $select:msg:Select the Range you Wish to Use;TV Range|a=16, b=235, ao=16, bo=235;PC Range|a=0, b=255, ao=0, bo=255$, sat=1.0, sato=1.0, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), + '' New VideoFilter("Color", "HDRColor | Repair Y", "RepairY($select:msg:Select Input Range;TV Range|a=16,b=235;PC Range|a=0,b=255$, black=0.0, hl=0.5, hlg=1.0, gain=1.0, $select:msg:Select Output Range;TV Range|ao=16,bo=235;PC Range|ao=0,bo=255$, g=2.2, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), + '' New VideoFilter("Color", "HDRColor | DynRangeY", "DynRangeY($select:msg:Select Y-Channel Range for Start Frame;TV Range|a1=16,b1=235;PCRange|a1=0,b1=255$, $select:msg:Select Y-Channel Range for End Frame;TV Range|a2=16,b2=235;PCRange|a2=0,b2=255$, g1=1.0, g2=1.0, $select:msg:Select The Output Range;TV Range|ao=16,bo=235;PC Range|ao=0,bo=255$, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), + ''New VideoFilter("Color", "HDRColor | Color", "Color(sat=1.0, g=1.0, saty=1.0, satb=1.0, satg=1.0, satr=1.0, gy=1.0, gb=1.0, gg=1.0, gr=1.0, dyb=0.0, dgr=0.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)"), + '' New VideoFilter("Color", "HDRColor | DynColor", "DynColor(sat1=1.0, sat2=1.0, g1=1.0, g2=1.0, saty1=1.0, saty2=1.0, satb1=1.0, satb2=1.0, satg1=1.0, satg2=1.0, satr1=1.0, satr2=1.0, gy1=1.0, gy2=1.0, gb1=1.0, gb2=1.0, gg1=1.0, gg2=1.0, gr1=1.0, gr2=1.0, dyb1=0.0, dyb2=0.0, dgr1=0.0, dgr2=0.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")}}) + + ' Add(New PluginPackage With { + '.Name = "HDRMatrix", + '.Filename = "HDRMatrix.dll", + '.Description = "HDRMatrix is a color matrix conversion filter library to work with HDR frames in AviSynth.", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.IsRequired = False, + '.HelpFile = "HDRMatrix.txt", + '.AvsFilterNames = {"matrix"}, + '.AvsFiltersFunc = Function() { + ' New VideoFilter("Color", "HDRColor | Matrix", "Matrix(from=$select:msg:Select Input For Color Matrix;601;709$, to=$select:msg:Select Output For Color Matrix;601;709$, rg=1.0, gg=1.0, bg=1.0, a=16, b=235, ao=0, bo=255, bitdepth=$select:msg:Select BitDepth;8;88;16;32$)")}}) + + ' Add(New PluginPackage With { + '.Name = "BicubicSharp", + '.Filename = "BicubicSharp.avsi", + '.Description = "HDRSharp is a sharpening library to work with HDR frames in AviSynth.", + '.DirPath = "Plugins\AVS\HDRSharp", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.IsRequired = False, + '.HelpFile = "HDRSharp.txt", + '.AvsFilterNames = {"BicubicSharp", "UnsharpMask8Y", "UnsharpMask16Y", "BicubicSharp8"}}) + + ' Add(New PluginPackage With { + '.Name = "HDRSharp", + '.Filename = "HDRSharp.dll", + '.Description = "HDRSharp is a sharpening library to work with HDR frames in AviSynth.", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.DirPath = "Plugins\AVS\HDRSharp", + '.IsRequired = False, + '.HelpFile = "HDRSharp.txt", + '.AvsFilterNames = {"BicubicSharp", "UnsharpMask8Y", "UnsharpMask16Y", "BicubicSharp8"}, + '.AvsFiltersFunc = Function() { + ' New VideoFilter("Line", "HDRSharp | UnsharpMask8Y", "UnsharpMask8Y(mask, edges=1.0, g=2.2, wg=1.0, bl=0.0, str=1.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;88;16$)" + BR + "#Mask=Yourmasking filter, Masking filter needs to be used with this Function"), + ' New VideoFilter("Line", "HDRSharp | UnsharpMask8Y", "UnsharpMask8Y(mask, edges=1.0, g=2.2, wg=1.0, bl=0.0, str=1.0, mode=1, bitdepth=$select:msg:Select BitDepth;8;88;16$)" + BR + "#Mask=Yourmasking filter, Masking filter needs to be used with this Function"), + ' New VideoFilter("Line", "HDRSharp | BicubicSharp", "BicubicSharp(bitdepth=$select:msg:Select BitDepth;8;88;16$)"), + ' New VideoFilter("Line", "HDRSharp | BicubicSharp8", "BicubicSharp8()")}}) + + ' Add(New PluginPackage With { + '.Name = "HDRCore", + '.DirPath = "Plugins\AVS\HDRCore", + '.Description = "HDRCore library adds 16-bit integer (stacked and linear) and 32-bit floating point pixel types. ", + '.IsRequired = False, + '.HelpFile = "HDRCore.txt", + '.Filename = "HDRCore.dll", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.AvsFilterNames = {"BitdepthMsb", "BitdepthMsbLsb", "BitdepthLsb", "Bitdepth", "RangeY", "RangeUV", "ClampHDR"}}) + + ' Add(New PluginPackage With { + '.Name = "HDRNoise", + '.DirPath = "Plugins\AVS\HDRNoise", + '.Description = "HDRNoise is a noise library to work with HDR frames in AviSynth.", + '.IsRequired = False, + '.HelpFile = "HDRNoise.txt", + '.Filename = "HDRNoise.dll", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.AvsFilterNames = {"NoiseY", "NoiseYM", "NoiseUV", "NoisedGrayY8", "NoiseMix1Y", "NoiseMix2Y"}}) + + ' Add(New PluginPackage With { + '.Name = "FilmGrain", + '.DirPath = "Plugins\AVS\HDRNoise", + '.Description = "HDRNoise is a noise library to work with HDR frames in AviSynth.", + '.IsRequired = False, + '.HelpFile = "HDRNoise.txt", + '.Filename = "FilmGrain.avsi", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.AvsFilterNames = {"FilmGrain1", "FilmGrain2"}}) + + ' Add(New PluginPackage With { + '.Name = "HDR Sources", + '.Description = "HDRCore library adds 16-bit integer (stacked and linear) and 32-bit floating point pixel types.", + '.DirPath = "Plugins\AVS\HDRCore", + '.IsRequired = False, + '.Filename = "HDR-sources.avsi", + '.HelpFile = "HDRCore.txt", + '.WebURL = "http://www.videoartifact.com/hdr/", + '.AvsFilterNames = {"VideoDS", "AudioDS", "VideoLS", "AudioLS", "VideoLA", "AudioLA", "AudioSilent"}}) Add(New PluginPackage With { .Name = "DeGrainMedian", @@ -1057,14 +1088,13 @@ Public Class Package .Name = "MCTemporalDenoise", .Filename = "MCTemporalDenoise.avsi", .HelpFile = "Readme.txt", - .WebURL = "http://avisynth.nl/index.php/mctemporaldenoise", + .WebURL = "http://avisynth.nl/index.php/Abcxyz", .Description = "A motion compensated noise removal script with an accompanying post-processing component.", .AvsFilterNames = {"MCTemporalDenoise", "MCTemporalDenoisePP"}, .AvsFiltersFunc = Function() { New VideoFilter("Noise", "MCTemporalDenoise | MCTemporalDenoise", "MCTemporalDenoise(settings=""medium"")"), New VideoFilter("Noise", "MCTemporalDenoise | MCTemporalDenoisePP", "source=last" + BR + "denoised=FFT3Dfilter()" + BR + "MCTemporalDenoisePP(denoised)")}}) - ''End of Custom Plugins Add(New PluginPackage With { .Name = "L-SMASH-Works", @@ -1096,7 +1126,7 @@ Public Class Package .URL = "http://github.com/HomeOfVapourSynthEvolution/VapourSynth-Deblock/", .VSFilterNames = {"deblock.Deblock"}, .VSFiltersFunc = Function() { - New VideoFilter("Misc", "Deblock", "clip = core.deblock.Deblock(clip, quant = 25, aoffset = 0, boffset = 0)")}}) + New VideoFilter("Restoration", "Deblock | Deblock", "clip = core.deblock.Deblock(clip, quant = 25, aoffset = 0, boffset = 0)")}}) Add(New PluginPackage With { .Name = "MSharpen", @@ -1105,7 +1135,7 @@ Public Class Package .HelpFile = "Readme.txt", .AvsFilterNames = {"MSharpen"}, .AvsFiltersFunc = Function() { - New VideoFilter("Line", "MSharpen", "MSharpen(threshold = 10, strength = 100, highq = true, mask = false)")}}) + New VideoFilter("Line", "Sharpen | MSharpen", "MSharpen(threshold = 10, strength = 100, highq = true, mask = false)")}}) Add(New PluginPackage With { .Name = "aWarpSharp2", @@ -1115,7 +1145,7 @@ Public Class Package .Description = "This filter implements the same warp sharpening algorithm as aWarpSharp by Marc FD, but with several bugfixes and optimizations.", .WebURL = "http://avisynth.nl/index.php/AWarpSharp2", .AvsFiltersFunc = Function() { - New VideoFilter("Line", "aWarpSharp2", "aWarpSharp2(thresh=128, blur=2, type=0, depth=16, chroma=3)")}}) + New VideoFilter("Line", "Sharpen | aWarpSharp2", "aWarpSharp2(thresh=128, blur=2, type=0, depth=16, chroma=3)")}}) Add(New PluginPackage With { .Name = "QTGMC", @@ -1125,7 +1155,7 @@ Public Class Package .AvsFilterNames = {"QTGMC"}, .AvsFiltersFunc = Function() { New VideoFilter("Field", "QTGMC | QTGMC...", "QTGMC(Preset = ""$select:msg:Select a preset.;Draft;Ultra Fast;Super Fast;Very Fast;Faster;Fast;Medium;Slow;Slower;Very Slow;Placebo$"", InputType=$select:msg:Select Input Type;Interlaced|0;Progressive Type 1|1;Progressive Type 2|2;Progressive Type 3|3$, SourceMatch=3, Sharpness=0.2, TR2=2, EdiThreads=8)"), - New VideoFilter("Field", "QTGMC | QTGMC With Repair", "QTGMC1 = QTGMC( Preset=""Slower"", InputType=2 )" + BR + "QTGMC2 = QTGMC( Preset=""Slower"", InputType=3, PrevGlobals=""Reuse"")" + BR + "$Select:msg:Select the Filter Form you Wish to use. Repair|Repair(QTGMC1, QTGMC2, 1);Repair16|Repair16(QTGMC1, QTGMC2, 1)$")}}) + New VideoFilter("Field", "QTGMC | QTGMC With Repair", "QTGMC1 = QTGMC( Preset=""Slower"", InputType=2 )" + BR + "QTGMC2 = QTGMC( Preset=""Slower"", InputType=3, PrevGlobals=""Reuse"")" + BR + "$select:msg:Select the Filter Form you Wish to use. Repair|Repair(QTGMC1, QTGMC2, 1);Repair16|Repair16(QTGMC1, QTGMC2, 1)$")}}) Add(New PluginPackage With { .Name = "SMDegrain", @@ -1152,7 +1182,18 @@ Public Class Package .URL = "http://avisynth.nl/index.php/LSFmod", .Description = "A LimitedSharpenFaster mod with a lot of new features and optimizations.", .AvsFilterNames = {"LSFmod"}, - .AvsFiltersFunc = Function() {New VideoFilter("Line", "LSFmod", "LSFmod(strength = 100, Smode=5, Smethod=3, kernel=11, preblur=""OFF"", secure=true, Szrp= 16, Spwr= 4, SdmpLo= 4, SdmpHi= 48, Lmode=4, overshoot=1, undershoot=1, Overshoot2=1, Undershoot2=1, soft=-2, soothe=true, keep=20, edgemode=0, edgemaskHQ=true, ss_x= 1.50, ss_y=1.50 , dest_x=%target_width%, dest_y=%target_height%, show=false, screenW=1280, screenH=1024)")}}) + .AvsFiltersFunc = Function() {New VideoFilter("Line", "Sharpen | LSFmod", "LSFmod(strength = 100, Smode=5, Smethod=3, kernel=11, preblur=""OFF"", secure=true, Szrp= 16, Spwr= 4, SdmpLo= 4, SdmpHi= 48, Lmode=4, overshoot=1, undershoot=1, Overshoot2=1, Undershoot2=1, soft=-2, soothe=true, keep=20, edgemode=0, edgemaskHQ=true, ss_x= 1.50, ss_y=1.50 , dest_x=%target_width%, dest_y=%target_height%, show=false, screenW=1280, screenH=1024)")}}) + + Add(New PluginPackage With { + .Name = "vsCube", + .Filename = "vscube.dll", + .Description = "Deblocking plugin using the deblocking filter of h264.", + .HelpFile = "Readme.txt", + .WebURL = "http://rationalqm.us/mine.html", + .DirPath = "Plugins\AVS\VSCube", + .AvsFilterNames = {"Cube"}, + .AvsFiltersFunc = Function() { + New VideoFilter("Color", "HDRColor | 3DLutCube", "Cube(""$browse_file$"")")}}) Add(New PluginPackage With { .Name = "RgTools", @@ -1268,9 +1309,7 @@ Public Class Package .Filename = "fft3dfilter.dll", .WebURL = "http://github.com/VFR-maniac/VapourSynth-FFT3DFilter", .Description = "FFT3DFilter uses Fast Fourier Transform method for image processing in frequency domain.", - .VSFilterNames = {"fft3dfilter.FFT3DFilter"}, - .VSFiltersFunc = Function() { - New VideoFilter("Noise", "FFT3DFilter", "clip = core.fft3dfilter.FFT3DFilter(clip)")}}) + .VSFilterNames = {"fft3dfilter.FFT3DFilter"}}) Add(New PluginPackage With { .Name = "mvtools", @@ -1330,25 +1369,12 @@ Public Class Package .VSFiltersFunc = Function() { New VideoFilter("Source", "d2vsource", "clip = core.d2v.Source(r""%source_file%"")")}}) - Add(New PluginPackage With { - .Name = "DeLogo", - .Filename = "libdelogo.dll", - .Description = "DeLogo Plugin Ported for VapourSynth.", - .URL = "http://github.com/HomeOfVapourSynthEvolution/VapourSynth-DeLogo", - .VSFilterNames = {"delogo.AddLogo", "delogo.EraseLogo"}, - .VSFiltersFunc = Function() { - New VideoFilter("Misc", "Delogo AddLogo", "clip = core.delogo.AddLogo(clip, logofile = r""$browse_file$"")"), - New VideoFilter("Misc", "Delogo EraseLogo", "clip = core.delogo.EraseLogo(clip, logofile = r""$browse_file$"")")}}) - Add(New PluginPackage With { .Name = "FluxSmooth", .Filename = "libfluxsmooth.dll", .VSFilterNames = {"SmoothT", "SmoothST"}, .Description = "FluxSmooth is a filter for smoothing of fluctuations.", - .WebURL = "http://github.com/dubhater/vapoursynth-fluxsmooth", - .VSFiltersFunc = Function() { - New VideoFilter("Noise", "FluxSmooth SmoothT", "clip = core.flux.SmoothT(clip, temporal_threshold = 7, planes = [0, 1, 2])"), - New VideoFilter("Noise", "FluxSmooth SmoothST", "clip = core.flux.SmoothST(clip, temporal_threshold = 7, spatial_threshold = 7, planes = [0, 1, 2])")}}) + .WebURL = "http://github.com/dubhater/vapoursynth-fluxsmooth"}) Add(New PluginPackage With { .Name = "msmoosh", @@ -1357,8 +1383,8 @@ Public Class Package .Description = "MSmooth is a spatial smoother that doesn't touch edges." + BR + "MSharpen is a sharpener that tries to sharpen only edges.", .WebURL = "http://github.com/dubhater/vapoursynth-msmoosh", .VSFiltersFunc = Function() { - New VideoFilter("Noise", "MSmooth", "clip = core.msmoosh.MSmooth(clip, threshold = 6.0, strength = 3)"), - New VideoFilter("Misc", "MSharpen", "clip = core.msmoosh.MSharpen(clip, threshold = 6.0, strength = 39)")}}) + New VideoFilter("Restoration", "Deblock | MSmooth", "clip = core.msmoosh.MSmooth(clip, threshold = 6.0, strength = 3)"), + New VideoFilter("Line", "Sharpen | MSharpen", "clip = core.msmoosh.MSharpen(clip, threshold = 6.0, strength = 39)")}}) Add(New PluginPackage With { .Name = "fmtconv", @@ -1366,7 +1392,7 @@ Public Class Package .WebURL = "http://github.com/EleonoreMizo/fmtconv", .HelpFile = "fmtconv.html", .Description = "Fmtconv is a format-conversion plug-in for the Vapoursynth video processing engine. It does resizing, bitdepth conversion with dithering and colorspace conversion.", - .VSFilterNames = {"fmtc.bitdepth", "fmtc.convert", "fmtc.matrix", "fmtc.resample", "fmtc.transfer"}}) + .VSFilterNames = {"fmtc.bitdepth", "fmtc.convert", "fmtc.matrix", "fmtc.resample", "fmtc.transfer", "fmtc.primaries"}}) Add(New PluginPackage With { .Name = "finesharp", @@ -1375,7 +1401,7 @@ Public Class Package .WebURL = "http://forum.doom9.org/showthread.php?p=1777860#post1777860", .VSFilterNames = {"finesharp.sharpen"}, .VSFiltersFunc = Function() { - New VideoFilter("Misc", "finesharp", "clip = finesharp.sharpen(clip)")}}) + New VideoFilter("Line", "Sharpen | finesharp", "clip = finesharp.sharpen(clip)")}}) Add(New PluginPackage With { .Name = "FineSharp", @@ -1385,43 +1411,35 @@ Public Class Package .WebURL = "http://avisynth.nl/index.php/FineSharp", .AvsFilterNames = {"FineSharp"}, .AvsFiltersFunc = Function() { - New VideoFilter("Line", "FineSharp | Light", "FineSharp(mode=1, sstr=2, cstr=0.8, xstr=0.19, lstr=1.49, pstr=1.272, ldmp=2.1)"), - New VideoFilter("Line", "FineSharp | Moderate", "FineSharp(mode=2, sstr=2.0, cstr=1.3, xstr=0.0, lstr=1.49, pstr=1.472, ldmp=4.2)"), - New VideoFilter("Line", "FineSharp | Strong", "FineSharp(mode=3, sstr=6.0, cstr=1.3, xstr=0.0, lstr=1.49, pstr=1.472, ldmp=9.2)")}}) - - 'Add(New PluginPackage With { - ' .Name = "Plum", - ' .Filename = "Plum.py", - ' .Description = "Plum is a sharpening/blind deconvolution suite with certain advanced features like Non-Local error, Block Matching, etc..", - ' .URL = "http://github.com/IFeelBloated/Plum", - ' .VSFilterNames = {"Plum.Basic", "Plum.Final", "Plum.Super"}, - ' .VSFiltersFunc = Function() {New VideoFilter("Misc", "Plum", $"ref = Plum.Basic(clip){BR}clip = Plum.Final([clip, ref], [Plum.Super(clip), Plum.Super(ref)], cutoff = 8, freq_margin = 12)")}}) + New VideoFilter("Line", "Sharpen | FineSharp | Light", "FineSharp(mode=1, sstr=2, cstr=0.8, xstr=0.19, lstr=1.49, pstr=1.272)"), + New VideoFilter("Line", "Sharpen | FineSharp | Moderate", "FineSharp(mode=2, sstr=2.0, cstr=1.3, xstr=0.0, lstr=1.49, pstr=1.472)"), + New VideoFilter("Line", "Sharpen | FineSharp | Strong", "FineSharp(mode=3, sstr=6.0, cstr=1.3, xstr=0.0, lstr=1.49, pstr=1.472)")}}) Dim fp = Folder.Settings + "Versions.txt" - Try - If Not File.Exists(fp) OrElse Not File.ReadAllText(fp).Contains(Application.ProductVersion + BR2) Then - FileHelp.Delete(fp) - fp = Folder.Apps + "Versions.txt" - End If - - For Each line In File.ReadAllLines(fp) - For Each pack In Items.Values - If line Like "*=*;*" Then - Dim name = line.Left("=").Trim - - If name = pack.ID Then - pack.Version = line.Right("=").Right(";").Trim - Dim a = line.Right("=").Left(";").Trim.Split("-"c) - pack.VersionDate = New DateTime(CInt(a(0)), CInt(a(1)), CInt(a(2))) - End If - End If - Next - Next - Catch ex As Exception - g.ShowException(ex) - End Try - End Sub + Try + If Not File.Exists(fp) OrElse Not File.ReadAllText(fp).Contains(Application.ProductVersion + BR2) Then + FileHelp.Delete(fp) + fp = Folder.Apps + "Versions.txt" + End If + + For Each line In File.ReadAllLines(fp) + For Each pack In Items.Values + If line Like "*=*;*" Then + Dim name = line.Left("=").Trim + + If name = pack.ID Then + pack.Version = line.Right("=").Right(";").Trim + Dim a = line.Right("=").Left(";").Trim.Split("-"c) + pack.VersionDate = New DateTime(CInt(a(0)), CInt(a(1)), CInt(a(2))) + End If + End If + Next + Next + Catch ex As Exception + g.ShowException(ex) + End Try + End Sub ReadOnly Property ID As String Get @@ -1470,18 +1488,6 @@ Public Class Package End Set End Property - ''Sub StartWithJava() - ''Try - ''Dim p As New Process - '' p.StartInfo.FileName = Package.Java.GetDir + "javaw.exe" - '' p.StartInfo.Arguments = "-jar """ + Path + """" - '' p.StartInfo.WorkingDirectory = GetDir() - ''p.Start() - ''Catch ex As Exception - '' g.ShowException(ex) - ''End Try - ''End Sub - Function GetHelpPath(Optional engine As ScriptEngine = ScriptEngine.AviSynth) As String If HelpFile <> "" Then Return GetDir() + HelpFile @@ -1689,7 +1695,7 @@ Public Class AviSynthPlusPackage WebURL = "http://avisynth.nl/index.php/AviSynth%2B" Description = "StaxRip support both AviSynth+ x64 and VapourSynth x64 as scripting based video processing tool." FixedDir = Folder.System - SetupFilename = "AviSynthPlus-MT-r2580.exe" + SetupFilename = "AviSynthPlus-MT-r2728.exe" End Sub Public Overrides Property IsRequired As Boolean @@ -1735,7 +1741,7 @@ Public Class PythonPackage If File.Exists(ret) Then Return ret For Each i In { - Registry.CurrentUser.GetString("SOFTWARE\Python\PythonCore\3.6\InstallPath", "ExecutablePath"), + Registry.CurrentUser.GetString("SOFTWARE\Python\PythonCore\3.6\InstallPath", "ExecutablePath"), ''Location will be Changed for next VS Release Registry.LocalMachine.GetString("SOFTWARE\Python\PythonCore\3.6\InstallPath", "ExecutablePath"), Registry.CurrentUser.GetString("SOFTWARE\Python\PythonCore\3.6\InstallPath", Nothing).FixDir + "python.exe", Registry.LocalMachine.GetString("SOFTWARE\Python\PythonCore\3.6\InstallPath", Nothing).FixDir + "python.exe"} @@ -1812,60 +1818,6 @@ Public Class PluginPackage End Function End Class -''Public Class JavaPackage -''Inherits Package - -''Sub New() -''Name = "Java" -''Filename = "Java.exe" -''WebURL = "http://java.com" -''TreePath = "Runtimes" -''Description = "Java is required by ProjectX. " + Strings.ProjectX -''DownloadURL = "http://java.com/en/download" -''IsRequired = False -''IgnoreVersion = True -''End Sub - -''Public Overrides ReadOnly Property Path As String -''Get -''Dim ret = MyBase.Path -''If ret <> "" Then Return ret - -''ret = "C:\ProgramData\Oracle\Java\javapath\" + Filename -''If File.Exists(ret) Then Return ret - -''ret = "C:\Windows\Sysnative\" + Filename -''If File.Exists(ret) Then Return ret - -''ret = "C:\Windows\System32\" + Filename -''If File.Exists(ret) Then Return ret -''End Get -''End Property -''End Class - -''Public Class ProjectXPackage -''Inherits Package - -''Sub New() -''Name = "ProjectX" -''Filename = "ProjectX.jar" -''WebURL = "http://project-x.sourceforge.net" -''Description = Strings.ProjectX -''IsRequired = False -''End Sub - -''Overrides ReadOnly Property StartAction As Action -''Get -''Return AddressOf StartWithJava -''End Get -''End Property - -''Public Overrides Function GetStatus() As String -''If Package.Java.Path = "" Then Return "Failed to locate Java, ProjectX requires Java." -''Return MyBase.GetStatus() -''End Function -''End Class - Public Class qaacPackage Inherits Package diff --git a/General/VideoScript.vb b/General/VideoScript.vb index 69f5e0fa..569fb94d 100644 --- a/General/VideoScript.vb +++ b/General/VideoScript.vb @@ -642,15 +642,17 @@ Public Class FilterCategory Dim color As New FilterCategory("Color") color.Filters.Add(New VideoFilter(color.Name, "Convert | Format", "z_ConvertFormat(pixel_type=""$select:msg:Select Pixel Type.;RGBPS;RGBP10;RGBP12;RGBP16;YV12;YV16;YV24;YUV420P10;YUV420P12;YUV420P16;YUV444P10;YUV444P12;YUV444P16;YUV422P10;YUV422P12;YUV422P16$"",colorspace_op=""$select:msg:Select Color Matrix Input;RGB;FCC;YCGCO;240m;709;2020ncl$:$select:msg:Select Color Transfer Input;Linear;Log100;Log316;470m;470bg;240m;XVYCC;SRGB;709;2020;st2084$:$select:msg:Select Color Primaries Input;470m;470bg;FILM;709;2020$:l=>$select:msg:Select Color Matrix output;RGB;FCC;YCGCO;240m;709;2020ncl$:$select:msg:Select Color Transfer Output;Linear;Log100;Log316;470m;470bg;240m;XVYCC;SRGB;709;2020;st2084$:$select:msg:Select Color Primaries Output;470m;470bg;FILM;709;2020$:l"", dither_type=""$select:msg:Select Dither Type;None;ordered$"")")) color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | AutoAdjust", "AutoAdjust( gamma_limit=1.0, scd_threshold=16, gain_mode=1, auto_gain=$select:msg:Enable Auto Gain?;True;False$, auto_balance=$select:msg:Enable Auto Balance?;True;False$, Input_tv=$select:msg:Is the Input using TV Range?;True;False$, output_tv=$select:msg:Do you want to use TV Range for Output?;True;False$, use_dither=$select:msg:Use Dither?;True;False$, high_quality=$select:msg:Use High Quality Mode?;True;False$, high_bitdepth=$select:msg:Use High Bit Depth Mode?;True;False$, threads_count=$enter_text:How Many Threads do You Wish to use?$)")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | Bitdepth(8Bit to 16 Bit)", "Bitdepth(from=$select:msg:Select Input BitDepth;8;16;32;88$, to=$select:msg:Select Output BitDepth;8;16;32;88$)")) - color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (16-235 to 0-255)", "$select:msg:Select BitDepth;8Bit|Levels(16, 1, 235, 0, 255, coring=False);10Bit|Levels(64, 1, 940, 0, 1020, coring=false);12Bit|Levels(256, 1, 3670, 0, 4080, coring=false);14Bit|Levels(1024, 1, 15040, 0, 16320, coring=false);16Bit|Levels(4096, 1, 60160, 0, 65535, coring=false)$")) - color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (0-255 to 16-235)", "$select:msg:Select BitDepth;8Bit|Levels(0, 1, 255, 16, 235, coring=False);10Bit|Levels(0, 1, 1020, 64, 940, coring=false);12Bit|Levels(0, 1, 4080, 256, 3670, coring=false);14Bit|Levels(0, 1, 16320, 1024, 15040, coring=false);16Bit|Levels(0, 1, 65535, 4096, 60160, coring=false)$")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | Bitdepth", "Bitdepth(from=$select:msg:Select Input BitDepth;8;16;32;88$, to=$select:msg:Select Output BitDepth;8;16;32;88$)")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (16-235 to 0-255)", "Levels(16, 1, 235, 0, 255, coring=False)")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (0-255 to 16-235)", "Levels(0, 1, 255, 16, 235, coring=False)")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Stack | ToStack", "ConvertToStacked()")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Stack | FromStack", "ConvertFromStacked()")) color.Filters.Add(New VideoFilter(color.Name, "Convert | ConvertTo", "ConvertTo$enter_text:Enter The Format You Wish To Convert To$()")) color.Filters.Add(New VideoFilter(color.Name, "Convert | ConvertBits", "ConvertBits($select:msg:Select the Bit Depth You want to Convert To;8;10;12;14;16;32$)")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthLsb", "LSB = BitdepthLsb(bitdepth=$select:msg:Select BitDepth;16;32;88$)")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthMsb", "MSB = BitdepthMsb(bitdepth=$select:msg:Select BitDepth;16;32;88$)")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthMsbLsb", "BitdepthMsbLsb(MSB, LSB, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | Clamp HDR", "ClampHDR($select:msg:Select the Range you Wish to Use;TV Range|ay=16,by=235,au=16,bu=240,av=16,bv=240;PC Range|ay=0,by=255,au=0,bu=255,av=0,bv=255$, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthLsb", "LSB = BitdepthLsb(bitdepth=$select:msg:Select BitDepth;16;32;88$)")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthMsb", "MSB = BitdepthMsb(bitdepth=$select:msg:Select BitDepth;16;32;88$)")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | BitdepthMsbLsb", "BitdepthMsbLsb(MSB, LSB, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRCore | Clamp HDR", "ClampHDR($select:msg:Select the Range you Wish to Use;TV Range|ay=16,by=235,au=16,bu=240,av=16,bv=240;PC Range|ay=0,by=255,au=0,bu=255,av=0,bv=255$, bitdepth=$select:msg:Select BitDepth;8;16;32;88$)")) color.Filters.Add(New VideoFilter(color.Name, "Dither | Gamma to Linear", "Dither_y_gamma_to_linear(Curve=""$select:msg:Select the Color Curve;601;709;2020$"")")) color.Filters.Add(New VideoFilter(color.Name, "Dither | Linear to Gamma", "Dither_y_linear_to_gamma(Curve=""$select:msg:Select the Color Curve;601;709;2020$"")")) color.Filters.Add(New VideoFilter(color.Name, "Dither | Sigmoid Direct", "Dither_sigmoid_direct()")) @@ -664,7 +666,7 @@ Public Class FilterCategory color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | AutoGain", "ColorYUV(autogain=$select:msg:Enable AutoGain?;True;False$, autowhite=$select:msg:Enable AutoWhite?;True;False$)")) color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Histogram | BitDepth Version", "Histogram(""levels"", Bits=$select:msg:Select BitDepth;8;10;12$)")) color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Tweak", "Tweak(realcalc=true, dither_strength= 1.0, sat=0.75, startHue=105, endHue=138 )")) - color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRToneMapping", "$select:msg:Select the Map Tone You Wish to Use;DGReinhard|DGReinhard();DGHable|DGHable()$")) + ''color.Filters.Add(New VideoFilter(color.Name, "HDRCore | HDRToneMapping", "$select:msg:Select the Map Tone You Wish to Use;DGReinhard|DGReinhard();DGHable|DGHable()$")) ret.Add(color) Dim line As New FilterCategory("Line") @@ -680,9 +682,7 @@ Public Class FilterCategory ret.Add(field) Dim noise As New FilterCategory("Noise") - noise.Filters.Add(New VideoFilter(noise.Name, "Soften | TemporalSoften", "TemporalSoften(3, 4, 8, scenechange=15, mode=2)")) - noise.Filters.Add(New VideoFilter(noise.Name, "Soften | SpatialSoften", "SpatialSoften(3,4,8)")) - noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | RemoveGrain16 with Repair16", "Processed = Dither_removegrain16(Unprocessed, mode=2, modeU=2, modeV=2)" + BR + "Dither_repair16(Processed, Unprocessed, mode=2, modeU=2, modeV=2)" + BR + "#Unprocessed Is Clip Source, You must make this adjustment manually")) + noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | RemoveGrain16 with Repair16", "Processed = Dither_removegrain16(mode=2, modeU=2, modeV=2)" + BR + "Dither_repair16(Processed, mode=2, modeU=2, modeV=2)")) ret.Add(noise) Dim misc As New FilterCategory("Misc") @@ -695,12 +695,11 @@ Public Class FilterCategory Dim resize As New FilterCategory("Resize") resize.Filters.Add(New VideoFilter(resize.Name, "Resize | Resize", "$select:BicubicResize;BilinearResize;BlackmanResize;GaussResize;Lanczos4Resize;LanczosResize;PointResize;SincResize;Spline16Resize;Spline36Resize;Spline64Resize$(%target_width%, %target_height%)")) - resize.Filters.Add(New VideoFilter(resize.Name, "Resize | Resize(Z)", "$select:z_BicubicResize;z_BilinearResize;z_BlackmanResize;z_GaussResize;z_Lanczos4Resize;z_LanczosResize;z_PointResize;z_SincResize;z_Spline16Resize;z_Spline36Resize;z_Spline64Resize$(%target_width%, %target_height%)")) - resize.Filters.Add(New VideoFilter(resize.Name, "Hardware Encoder", "# hardware encoder resizes")) + resize.Filters.Add(New VideoFilter(resize.Name, "Resize | Hardware Encoder", "# hardware encoder resizes")) resize.Filters.Add(New VideoFilter(resize.Name, "SuperRes | SuperResXBR", "SuperResXBR(Passes=$select:msg:How Many Passes Do you wish to Perform?;2;3;4;5$, Factor=$select:msg:Factor Increase by?;2;4$)")) resize.Filters.Add(New VideoFilter(resize.Name, "SuperRes | SuperRes", "SuperRes(Passes=$select:msg:How Many Passes Do you wish to Perform?;2;3;4;5$, Factor=$select:msg:Factor Increase by?;2;4$))")) resize.Filters.Add(New VideoFilter(resize.Name, "SuperRes | SuperXBR", "SuperXBR(Factor=$select:msg:Factor Increase by?;2;4$)")) - resize.Filters.Add(New VideoFilter(resize.Name, "JincResize", "$select:Jinc36Resize;Jinc64Resize;Jinc144Resize;Jinc256Resize$(%target_width%, %target_height%)")) + resize.Filters.Add(New VideoFilter(resize.Name, "Resize | JincResize", "$select:Jinc36Resize;Jinc64Resize;Jinc144Resize;Jinc256Resize$(%target_width%, %target_height%)")) resize.Filters.Add(New VideoFilter(resize.Name, "Dither_Resize16 | Dither_Resize16", "Dither_resize16(%target_width%, %target_height%)")) resize.Filters.Add(New VideoFilter(resize.Name, "Dither_Resize16 | Dither_Resize16 In Linear Light", "Dither_convert_yuv_to_rgb (matrix=""2020"", output=""rgb48y"", lsb_in=true)" + BR + "Dither_y_gamma_to_linear(tv_range_in=false, tv_range_out=false, curve=""2020"", sigmoid=true)" + BR + "Dither_resize16nr(%target_width%, %target_height%, kernel=""spline36"")" + BR + "Dither_y_linear_to_gamma(tv_range_in=false, tv_range_out=false, curve=""2020"", sigmoid=true)" + BR + "r = SelectEvery (3, 0)" + BR + "g = SelectEvery (3, 1)" + BR + "b = SelectEvery (3, 2)" + BR + "Dither_convert_rgb_to_yuv(r, g, b, matrix=""2020"", lsb=true)")) ret.Add(resize) @@ -730,34 +729,73 @@ Public Class FilterCategory New VideoFilter("Source", "AVISource", "clip = core.avisource.AVISource(r""%source_file%"")")}) ret.Add(src) + Dim framerate As New FilterCategory("FrameRate") + framerate.Filters.Add(New VideoFilter(framerate.Name, "AssumeFPS | AssumeFPS Source", "clip = core.std.AssumeFPS(clip, fpsnum = int(%media_info_video:FrameRate% * 1000), fpsden = 1000)")) + framerate.Filters.Add(New VideoFilter(framerate.Name, "AssumeFPS | AssumeFPS...", "clip = core.std.AssumeFPS(clip, None, $select:msg:Select a frame rate.;24000/1001|24000, 1001;24|24, 1;25|25, 1;30000/1001|30000, 1001;30|30, 1;50|50, 1;60000/1001|60000, 1001;60|60, 1$)")) + framerate.Filters.Add(New VideoFilter(framerate.Name, "InterFrame", "clip = havsfunc.InterFrame(clip, Preset=""Medium"", Tuning=""$select:msg:Select the Tuning Preset;Animation;Film;Smooth;Weak$"", NewNum=$enter_text:Enter the NewNum Value$, NewDen=$enter_text:Enter the NewDen Value$, OverrideAlgo=$select:msg:Which Algorithm Do you Wish to Use?;Strong Predictions|2;Intelligent|13;Smoothest|23$, GPU=$select:msg:Enable GPU Feature?;True;False$)")) + framerate.Filters.Add(New VideoFilter(framerate.Name, "SVPFlow", "sup = core.mv.Super(clip, pel=2, hpad=0, vpad=0)" + BR + "bvec = core.mv.Analyse(sup, blksize=16, isb=True, chroma=True, search=3, searchparam=1)" + BR + "fvec = core.mv.Analyse(sup, blksize=16, isb=False, chroma=True, search=3, searchparam=1)" + BR + "clip = core.mv.FlowFPS(clip, sup, bvec, fvec, num=60000, den=1001, mask=2)")) + ret.Add(framerate) + + Dim color As New FilterCategory("Color") + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Tweak", "clip = core.adjust.Tweak(clip, sat=0.75, hue=105-138)")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | AutoAdjust", "core.avs.AutoAdjust(clip, gamma_limit=1.0, scd_threshold=16, gain_mode=1, auto_gain=$select:msg:Enable Auto Gain?;True;False$, auto_balance=$select:msg:Enable Auto Balance?;True;False$, input_tv=$select:msg:Is the Input using TV Range?;True;False$, output_tv=$select:msg:Do you want to use TV Range for Output?;True;False$, use_dither=$select:msg:Use Dither?;True;False$, high_quality=$select:msg:Use High Quality Mode?;True;False$, high_bitdepth=$select:msg:Use High Bit Depth Mode?;True;False$, threads_count=$enter_text:How Many Threads do You Wish to use?$)")) + color.Filters.Add(New VideoFilter(color.Name, "Dither | SmoothGrad", "clip = fvsfunc.GradFun3(src=clip, mode=6, smode=1)")) + color.Filters.Add(New VideoFilter(color.Name, "HDRColor | Cube", "clip = core.timecube.Cube(clip, cube = r""$browse_file$"")")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Range", "clip = core.resize.Point(clip, range_in_s = ""$select:msg:Select Input;TV|limited;PC|full$"", range_s = ""$select:msg:Select Output;TV|limited;PC|full$"")")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (16-235 to 0-255)", "clip = core.std.Levels(clip, min_in=16, max_in=235, min_out=0, max_out=255, planes=0)" + BR + "clip = core.std.Levels(clip, min_in=16, max_in=240, min_out=0, max_out=255, planes=[1,2])")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Levels | Levels (0-255 to 16-235)", "clip = core.std.Levels(clip, min_in=0, max_in=255, min_out=16, max_out=235, planes=0)" + BR + "clip = core.std.Levels(clip, min_in=0, max_in=255, min_out=16, max_out=240, planes=[1,2])")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | Format", "clip = core.avs.z_ConvertFormat(clip, pixel_type = ""$select: Msg():Select Pixel Type.;RGBPS;RGBP10;RGBP12;RGBP16;YV12;YV16;YV24;YUV420P10;YUV420P12;YUV420P16;YUV444P10;YUV444P12;YUV444P16;YUV422P10;YUV422P12;YUV422P16$"",colorspace_op=""$select:msg:Select Color Matrix Input;RGB;FCC;YCGCO;240m;709;2020ncl$:$select:msg:Select Color Transfer Input;Linear;Log100;Log316;470m;470bg;240m;XVYCC;SRGB;709;2020;st2084$:$select:msg:Select Color Primaries Input;470m;470bg;FILM;709;2020$:l=>$select:msg:Select Color Matrix output;RGB;FCC;YCGCO;240m;709;2020ncl$:$select:msg:Select Color Transfer Output;Linear;Log100;Log316;470m;470bg;240m;XVYCC;SRGB;709;2020;st2084$:$select:msg:Select Color Primaries Output;470m;470bg;FILM;709;2020$:l"", dither_type=""$select:msg:Select Dither Type;None;ordered$"")")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | Convert To", "clip = core.resize.Bicubic(clip, format=vs.$enter_text:Enter The Format You Wish To Convert To$)")) ''Ex: resize.Bicubic( format=vs.YUV444P8) + color.Filters.Add(New VideoFilter(color.Name, "Convert | ReSample", "clip = core.fmtc.resample(clip, w=%target_width%, h=%target_height%)")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | BitDepth", "clip = core.fmtc.bitdepth (clip, bits=$select:msg:Select BitDepth;8;10;12;16;32$)")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | YUV to RGB", "clip = core.fmtc.resample (clip, css=""444"")" + BR + "clip = core.fmtc.matrix (clip, mat=""709"", col_fam=vs.RGB)" + BR + "clip = core.fmtc.bitdepth (clip, bits=8)")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | RGB to YUV", "clip = core.fmtc.matrix (clip, mat=""709"", col_fam=vs.YUV, bits=16)" + BR + "clip = core.fmtc.resample (clip, css=""420"")" + BR + "clip = core.fmtc.bitdepth (clip, bits=8)")) + color.Filters.Add(New VideoFilter(color.Name, "Convert | Anamorphic to Standard", "clip = core.fmtc.resample (clip, w=1280, h=720, css=""444"")" + BR + "clip = core.fmtc.matrix (clip, mat=""709"", col_fam=vs.RGB)" + BR + "clip = core.fmtc.transfer (clip, transs=""1886"", transd=""srgb"")" + BR + "clip = core.fmtc.bitdepth (clip, bits=8)")) + color.Filters.Add(New VideoFilter(color.Name, "ColorYUV | Matrix", "clip = core.fmtc.resample (clip, css=""444"")" + BR + "clip = core.fmtc.matrix (clip, mats=""601"", matd=""709"")" + BR + "clip = core.fmtc.resample (clip, css=""420"")" + BR + "clip = core.fmtc.bitdepth (clip, bits=8)")) + color.Filters.Add(New VideoFilter(color.Name, "Dither | Gamma to Linear", "clip =Dither.y_gamma_to_linear(clip, Curve=""$select:msg:Select the Color Curve;601;709;2020$"")")) + color.Filters.Add(New VideoFilter(color.Name, "Dither | Linear to Gamma", "clip = Dither.y_linear_to_gamma(clip, Curve=""$select:msg:Select the Color Curve;601;709;2020$"")")) + color.Filters.Add(New VideoFilter(color.Name, "Dither | Sigmoid Direct", "clip = Dither.sigmoid_direct(clip)")) + color.Filters.Add(New VideoFilter(color.Name, "Dither | Sigmoid Inverse", "clip = Dither.sigmoid_inverse(clip)")) + Dim crop As New FilterCategory("Crop") - crop.Filters.AddRange( - {New VideoFilter("Crop", "Crop", "clip = core.std.Crop(clip, %crop_left%, %crop_right%, %crop_top%, %crop_bottom%)", False)}) + crop.Filters.Add(New VideoFilter(crop.Name, "Crop", "clip = core.std.Crop(clip, %crop_left%, %crop_right%, %crop_top%, %crop_bottom%)")) ret.Add(crop) + Dim line As New FilterCategory("Line") + line.Filters.Add(New VideoFilter(line.Name, "Anti-Aliasing | DAA", "clip = havsfunc.daa(c = clip, nns = 1)")) + line.Filters.Add(New VideoFilter(line.Name, "Anti-Aliasing | MAA", "clip = muvsfunc.maa(clip)")) + ret.Add(line) + Dim resize As New FilterCategory("Resize") resize.Filters.Add(New VideoFilter("Resize", "Resize...", "clip = core.resize.$select:Bilinear;Bicubic;Point;Lanczos;Spline16;Spline36$(clip, %target_width%, %target_height%)")) + resize.Filters.Add(New VideoFilter(resize.Name, "Dither_Resize16 | Dither_Resize16", "clip = Dither.Resize16nr(clip, %target_width%, %target_height%)")) ret.Add(resize) Dim field As New FilterCategory("Field") field.Filters.Add(New VideoFilter(field.Name, "IVTC", "clip = core.vivtc.VFM(clip, 1)" + BR + "clip = core.vivtc.VDecimate(clip)")) field.Filters.Add(New VideoFilter(field.Name, "Vinverse", "clip = core.vinverse.Vinverse(clip)")) - field.Filters.Add(New VideoFilter(field.Name, "Select Even", "clip = clip[::2]")) - field.Filters.Add(New VideoFilter(field.Name, "Select Odd", "clip = clip[1::2]")) - field.Filters.Add(New VideoFilter(field.Name, "Set Frame Based", "clip = core.std.SetFieldBased(clip, 0) # 1 = BFF, 2 = TFF")) - field.Filters.Add(New VideoFilter(field.Name, "Set Bottom Field First", "clip = core.std.SetFieldBased(clip, 1) # 1 = BFF, 2 = TFF")) - field.Filters.Add(New VideoFilter(field.Name, "Set Top Field First", "clip = core.std.SetFieldBased(clip, 2) # 1 = BFF, 2 = TFF")) + field.Filters.Add(New VideoFilter(field.Name, "Select | Select Even", "clip = clip[::2]")) + field.Filters.Add(New VideoFilter(field.Name, "Select | Select Odd", "clip = clip[1::2]")) + field.Filters.Add(New VideoFilter(field.Name, "Set | Set Frame Based", "clip = core.std.SetFieldBased(clip, 0) # 1 = BFF, 2 = TFF")) + field.Filters.Add(New VideoFilter(field.Name, "Set | Set Bottom Field First", "clip = core.std.SetFieldBased(clip, 1) # 1 = BFF, 2 = TFF")) + field.Filters.Add(New VideoFilter(field.Name, "Set | Set Top Field First", "clip = core.std.SetFieldBased(clip, 2) # 1 = BFF, 2 = TFF")) ret.Add(field) Dim noise As New FilterCategory("Noise") - noise.Filters.Add(New VideoFilter(noise.Name, "SMDegrain", "clip = havsfunc.SMDegrain(clip, contrasharp = True)")) - noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain", "clip = core.rgvs.RemoveGrain(clip, 1)")) + noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | SMDegrain", "clip = havsfunc.SMDegrain(clip, contrasharp = True)")) + noise.Filters.Add(New VideoFilter(noise.Name, "RemoveGrain | RemoveGrain", "clip = core.rgvs.RemoveGrain(clip, 1)")) + noise.Filters.Add(New VideoFilter(noise.Name, "MCTemporalDenoise", "clip = havsfunc.MCTemporalDenoise(i=clip, settings=""$select:msg:Select Strength;very low;low;medium;high;very high$"")")) ret.Add(noise) - Dim misc As New FilterCategory("Misc") - misc.Filters.Add(New VideoFilter(misc.Name, "AssumeFPS MediaInfo", "clip = core.std.AssumeFPS(clip, fpsnum = int(%media_info_video:FrameRate% * 1000), fpsden = 1000)")) - misc.Filters.Add(New VideoFilter(misc.Name, "AssumeFPS...", "clip = core.std.AssumeFPS(clip, None, $select:msg:Select a frame rate.;24000/1001|24000, 1001;24|24, 1;25|25, 1;30000/1001|30000, 1001;30|30, 1;50|50, 1;60000/1001|60000, 1001;60|60, 1$)")) - ret.Add(misc) + Dim restoration As New FilterCategory("Restoration") + restoration.Filters.Add(New VideoFilter(restoration.Name, "Deblock | Deblock_QED", "clip = havsfunc.Deblock_QED(clip)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | DeHaloAlpha", "clip = havsfunc.DeHalo_alpha(clip)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | BlindDeHalo3", "clip = muvsfunc.BlindDeHalo3(clip, interlaced=False)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | EdgeCleaner", "clip = havsfunc.EdgeCleaner(clip)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | YAHR", "clip = havsfunc.YAHR(clip)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "DeHalo | HQDering", "clip = havsfunc.HQDeringmod(clip, nrmode=2, darkthr=3.0)")) + restoration.Filters.Add(New VideoFilter(restoration.Name, "FixChromaBleeding", "clip = havsfunc.FixChromaBleedingMod(input=clip)")) + ret.Add(restoration) FilterCategory.AddDefaults(ScriptEngine.VapourSynth, ret) diff --git a/My Project/Application.Designer.vb b/My Project/Application.Designer.vb new file mode 100644 index 00000000..88dd01c7 --- /dev/null +++ b/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/My Project/Application.myapp b/My Project/Application.myapp new file mode 100644 index 00000000..43cf9b4c --- /dev/null +++ b/My Project/Application.myapp @@ -0,0 +1,9 @@ + + + false + false + 0 + true + 0 + true + \ No newline at end of file diff --git a/My Project/AssemblyInfo.vb b/My Project/AssemblyInfo.vb index 2bd53f9d..62f84226 100644 --- a/My Project/AssemblyInfo.vb +++ b/My Project/AssemblyInfo.vb @@ -7,5 +7,5 @@ Imports System.Runtime.InteropServices - - + + diff --git a/My Project/Resources.Designer.vb b/My Project/Resources.Designer.vb index 8632f25f..48ef4a1a 100644 --- a/My Project/Resources.Designer.vb +++ b/My Project/Resources.Designer.vb @@ -26,7 +26,7 @@ Namespace My.Resources Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _ Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _ Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _ - Public Module Resources + Friend Module Resources Private resourceMan As Global.System.Resources.ResourceManager @@ -36,7 +36,7 @@ Namespace My.Resources ''' Returns the cached ResourceManager instance used by this class. ''' _ - Public ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager Get If Object.ReferenceEquals(resourceMan, Nothing) Then Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("StaxRip.Resources", GetType(Resources).Assembly) @@ -51,7 +51,7 @@ Namespace My.Resources ''' resource lookups using this strongly typed resource class. ''' _ - Public Property Culture() As Global.System.Globalization.CultureInfo + Friend Property Culture() As Global.System.Globalization.CultureInfo Get Return resourceCulture End Get @@ -63,7 +63,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property BracketClose() As System.Drawing.Bitmap + Friend ReadOnly Property BracketClose() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("BracketClose", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -73,7 +73,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property BracketOpen() As System.Drawing.Bitmap + Friend ReadOnly Property BracketOpen() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("BracketOpen", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -83,7 +83,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Left1() As System.Drawing.Bitmap + Friend ReadOnly Property Left1() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Left1", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -93,7 +93,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Left2() As System.Drawing.Bitmap + Friend ReadOnly Property Left2() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Left2", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -103,7 +103,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Left3() As System.Drawing.Bitmap + Friend ReadOnly Property Left3() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Left3", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -113,7 +113,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon). ''' - Public ReadOnly Property MainIcon() As System.Drawing.Icon + Friend ReadOnly Property MainIcon() As System.Drawing.Icon Get Dim obj As Object = ResourceManager.GetObject("MainIcon", resourceCulture) Return CType(obj,System.Drawing.Icon) @@ -123,7 +123,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Right1() As System.Drawing.Bitmap + Friend ReadOnly Property Right1() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Right1", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -133,7 +133,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Right2() As System.Drawing.Bitmap + Friend ReadOnly Property Right2() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Right2", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -143,7 +143,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property Right3() As System.Drawing.Bitmap + Friend ReadOnly Property Right3() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("Right3", resourceCulture) Return CType(obj,System.Drawing.Bitmap) @@ -153,7 +153,7 @@ Namespace My.Resources ''' ''' Looks up a localized resource of type System.Drawing.Bitmap. ''' - Public ReadOnly Property X() As System.Drawing.Bitmap + Friend ReadOnly Property X() As System.Drawing.Bitmap Get Dim obj As Object = ResourceManager.GetObject("X", resourceCulture) Return CType(obj,System.Drawing.Bitmap) diff --git a/My Project/app.manifest b/My Project/app.manifest index e93d2f58..40993c7b 100644 --- a/My Project/app.manifest +++ b/My Project/app.manifest @@ -1,14 +1,15 @@  - - + + + + + + @@ -30,14 +31,7 @@ - + \ No newline at end of file diff --git a/Segoe-MDL2-Assets.ttf b/Segoe-MDL2-Assets.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d3d1ee298dde999443bfeff57031364621126d2a GIT binary patch literal 144960 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 Uk)5gzezAMkPuJ`30HON-0GBv)`v3p{ literal 0 HcmV?d00001 diff --git a/StaxRip.vbproj b/StaxRip.vbproj index cea4b229..252b62b2 100644 --- a/StaxRip.vbproj +++ b/StaxRip.vbproj @@ -415,14 +415,11 @@ MyApplicationCodeGenerator Application.Designer.vb - - - - - - + + Always + @@ -582,6 +579,9 @@ StringEditorForm.vb + + Always + diff --git a/UI/ImageUtils.vb b/UI/ImageUtils.vb index 71939bed..774af148 100644 --- a/UI/ImageUtils.vb +++ b/UI/ImageUtils.vb @@ -41,11 +41,10 @@ Public Class ImageHelp Dim fontHeight = font.Height Dim bitmap As New Bitmap(CInt(fontHeight * 1.1F), CInt(fontHeight * 1.1F)) Dim graphics = Drawing.Graphics.FromImage(bitmap) - graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias + graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit graphics.DrawString(Convert.ToChar(CInt(symbol)), font, Brushes.Black, -fontHeight * 0.1F, fontHeight * 0.07F) graphics.Dispose() font.Dispose() - Return bitmap End Function End Class @@ -81,7 +80,7 @@ Public Class Thumbnails Dim cachePath = Folder.Settings + "Thumbnails.ffindex" Dim avsdoc As New VideoScript avsdoc.Path = Folder.Settings + "Thumbnails.avs" - avsdoc.Filters.Add(New VideoFilter("FFVideoSource(""" + inputFile + """, cachefile = """ + cachePath + """, colorspace = ""YV12"").LanczosResize(" & width & "," & height & ")")) + avsdoc.Filters.Add(New VideoFilter("FFVideoSource(""" + inputFile + """, cachefile = """ + cachePath + """, colorspace = ""YV12"").Spline64Resize(" & width & "," & height & ")")) avsdoc.Filters.Add(New VideoFilter("ConvertToRGB()")) g.ffmsindex(inputFile, cachePath, False, proj) @@ -202,7 +201,7 @@ Public Class Thumbnails g.DrawString(caption, font, brush, rect, format) format.Alignment = StringAlignment.Far format.LineAlignment = StringAlignment.Center - g.DrawString("StaxRip", New Font(fontname, font.Height * 2, FontStyle.Regular, GraphicsUnit.Pixel), brush, rect, format) + g.DrawString("StaxRip", New Font(fontname, font.Height * 2, FontStyle.Bold, GraphicsUnit.Pixel), brush, rect, format) End Using For x = 0 To bitmaps.Count - 1 diff --git a/app.config b/app.config index 65284fbe..e96024dd 100644 --- a/app.config +++ b/app.config @@ -1,7 +1,7 @@ - + diff --git a/docs/_static/ajax-loader.gif b/docs/_static/ajax-loader.gif deleted file mode 100644 index 61faf8cab23993bd3e1560bff0668bd628642330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN diff --git a/docs/_static/alabaster.css b/docs/_static/alabaster.css deleted file mode 100644 index be65b137..00000000 --- a/docs/_static/alabaster.css +++ /dev/null @@ -1,693 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; - font-size: 17px; - background-color: #fff; - color: #000; - margin: 0; - padding: 0; -} - - -div.document { - width: 940px; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 220px; -} - -div.sphinxsidebar { - width: 220px; - font-size: 14px; - line-height: 1.5; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #fff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -div.body > .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: 'Garamond', 'Georgia', serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatting between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} \ No newline at end of file diff --git a/docs/_static/basic.css b/docs/_static/basic.css deleted file mode 100644 index 19ced105..00000000 --- a/docs/_static/basic.css +++ /dev/null @@ -1,665 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -dl { - margin-bottom: 15px; -} - -dd p { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -div.code-block-caption { - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: relative; - left: 0px; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/_static/comment-bright.png b/docs/_static/comment-bright.png deleted file mode 100644 index 15e27edb12ac25701ac0ac21b97b52bb4e45415e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmVgfIX78 z$8Pzv({A~p%??+>KickCb#0FM1rYN=mBmQ&Nwp<#JXUhU;{|)}%&s>suq6lXw*~s{ zvHx}3C%<;wE5CH!BR{p5@ml9ws}y)=QN-kL2?#`S5d*6j zk`h<}j1>tD$b?4D^N9w}-k)bxXxFg>+#kme^xx#qg6FI-%iv2U{0h(Y)cs%5a|m%Pn_K3X_bDJ>EH#(Fb73Z zfUt2Q3B>N+ot3qb*DqbTZpFIn4a!#_R-}{?-~Hs=xSS6p&$sZ-k1zDdtqU`Y@`#qL z&zv-~)Q#JCU(dI)Hf;$CEnK=6CK50}q7~wdbI->?E07bJ0R;!GSQTs5Am`#;*WHjvHRvY?&$Lm-vq1a_BzocI^ULXV!lbMd%|^B#fY;XX)n<&R^L z=84u1e_3ziq;Hz-*k5~zwY3*oDKt0;bM@M@@89;@m*4RFgvvM_4;5LB!@OB@^WbVT zjl{t;a8_>od-~P4 m{5|DvB&z#xT;*OnJqG}gk~_7HcNkCr0000W zanA~u9RIXo;n7c96&U)YLgs-FGlx~*_c{Jgvesu1E5(8YEf&5wF=YFPcRe@1=MJmi zag(L*xc2r0(slpcN!vC5CUju;vHJkHc*&70_n2OZsK%O~A=!+YIw z7zLLl7~Z+~RgWOQ=MI6$#0pvpu$Q43 zP@36QAmu6!_9NPM?o<1_!+stoVRRZbW9#SPe!n;#A_6m8f}|xN1;H{`0RoXQ2LM47 zt(g;iZ6|pCb@h2xk&(}S3=EVBUO0e90m2Lp5CB<(SPIaB;n4))3JB87Or#XPOPcum z?<^(g+m9}VNn4Y&B`g8h{t_$+RB1%HKRY6fjtd-<7&EsU;vs0GM(Lmbhi%Gwcfs0FTF}T zL{_M6Go&E0Eg8FuB*(Yn+Z*RVTBE@10eIOb3El^MhO`GabDll(V0&FlJi2k^;q8af zkENdk2}x2)_KVp`5OAwXZM;dG0?M-S)xE1IKDi6BY@5%Or?#aZ9$gcX)dPZ&wA1a< z$rFXHPn|TBf`e?>Are8sKtKrKcjF$i^lp!zkL?C|y^vlHr1HXeVJd;1I~g&Ob-q)& z(fn7s-KI}G{wnKzg_U5G(V%bX6uk zIa+<@>rdmZYd!9Y=C0cuchrbIjuRB_Wq{-RXlic?flu1*_ux}x%(HDH&nT`k^xCeC ziHi1!ChH*sQ6|UqJpTTzX$aw8e(UfcS^f;6yBWd+(1-70zU(rtxtqR%j z-lsH|CKQJXqD{+F7V0OTv8@{~(wp(`oIP^ZykMWgR>&|RsklFMCnOo&Bd{le} zV5F6424Qzl;o2G%oVvmHgRDP9!=rK8fy^!yV8y*4p=??uIRrrr0?>O!(z*g5AvL2!4z0{sq%vhG*Po}`a<6%kTK5TNhtC8}rXNu&h^QH4A&Sk~Autm*s~45(H7+0bi^MraaRVzr05hQ3iK?j` zR#U@^i0WhkIHTg29u~|ypU?sXCQEQgXfObPW;+0YAF;|5XyaMAEM0sQ@4-xCZe=0e z7r$ofiAxn@O5#RodD8rh5D@nKQ;?lcf@tg4o+Wp44aMl~c47azN_(im0N)7OqdPBC zGw;353_o$DqGRDhuhU$Eaj!@m000000NkvXXu0mjfjZ7Z_ diff --git a/docs/_static/custom.css b/docs/_static/custom.css deleted file mode 100644 index 2a924f1d..00000000 --- a/docs/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js deleted file mode 100644 index d8928926..00000000 --- a/docs/_static/doctools.js +++ /dev/null @@ -1,313 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var bbox = span.getBBox(); - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - var parentOfText = node.parentNode.parentNode; - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keyup(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); \ No newline at end of file diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js deleted file mode 100644 index ca7136ea..00000000 --- a/docs/_static/documentation_options.js +++ /dev/null @@ -1,9 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.9', - LANGUAGE: 'None', - COLLAPSE_INDEX: false, - FILE_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt' -}; \ No newline at end of file diff --git a/docs/_static/down-pressed.png b/docs/_static/down-pressed.png deleted file mode 100644 index 5756c8cad8854722893dc70b9eb4bb0400343a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;`PZ^+1>KjR?B@S0W7 z%OS_REiHONoJ6{+Ks@6k3590|7k9F+ddB6!zw3#&!aw#S`x}3V3&=A(a#84O-&F7T z^k3tZB;&iR9siw0|F|E|DAL<8r-F4!1H-;1{e*~yAKZN5f0|Ei6yUmR#Is)EM(Po_ zi`qJR6|P<~+)N+kSDgL7AjdIC_!O7Q?eGb+L+qOjm{~LLinM4NHn7U%HcK%uoMYO5 VJ~8zD2B3o(JYD@<);T3K0RV0%P>BEl diff --git a/docs/_static/down.png b/docs/_static/down.png deleted file mode 100644 index 1b3bdad2ceffae91cee61b32f3295f9bbe646e48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CVIL!hEy=F?b*7pIY7kW{q%Rg zx!yQ<9v8bmJwa`TQk7YSw}WVQ()mRdQ;TC;* diff --git a/docs/_static/file.png b/docs/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/docs/_static/jquery-3.1.0.js b/docs/_static/jquery-3.1.0.js deleted file mode 100644 index f2fc2747..00000000 --- a/docs/_static/jquery-3.1.0.js +++ /dev/null @@ -1,10074 +0,0 @@ -/*eslint-disable no-unused-vars*/ -/*! - * jQuery JavaScript Library v3.1.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2016-07-07T21:44Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - - - - function DOMEval( code, doc ) { - doc = doc || document; - - var script = doc.createElement( "script" ); - - script.text = code; - doc.head.appendChild( script ).parentNode.removeChild( script ); - } -/* global Symbol */ -// Defining this global in .eslintrc would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.1.0", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return all the elements in a clean array - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = jQuery.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.0 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-01-04 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - // Known :disabled false positives: - // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset) - // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Check form elements and option elements for explicit disabling - return "label" in elem && elem.disabled === disabled || - "form" in elem && elem.disabled === disabled || - - // Check non-disabled form elements for fieldset[disabled] ancestors - "form" in elem && elem.disabled === false && ( - // Support: IE6-11+ - // Ancestry is covered for us - elem.isDisabled === disabled || - - // Otherwise, assume any non-