mirror of
https://github.com/odrling/Aegisub
synced 2025-04-11 22:56:02 +02:00
Fixed Automation script loading error messages (bug #1)
Fixed karaoke timing not being committed correctly (bug #7) Changed some throw _T() into throw wxString() Several architectural changes to Automation karaskel family. Automation karaskel has Furigana, Inline-fx and Out-of-line-fx support added (still needs tweaking and bugfixing) Originally committed to SVN as r131.
This commit is contained in:
parent
4d498ea184
commit
49acbaa6e5
42
automation/demos/10-furigana.lua
Normal file
42
automation/demos/10-furigana.lua
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
-- Aegisub Automation demonstration script
|
||||||
|
-- Original written by Niels Martin Hansen
|
||||||
|
-- Given into the public domain
|
||||||
|
|
||||||
|
include("karaskel-adv.lua")
|
||||||
|
karaskel.engage_furigana = true
|
||||||
|
karaskel.engage_trace = true
|
||||||
|
|
||||||
|
version = 3
|
||||||
|
kind = "basic_ass"
|
||||||
|
name = "Furigana demo"
|
||||||
|
description = "Demonstrates how to use the Furigana feature in karaskel-adv"
|
||||||
|
|
||||||
|
function do_syllable(meta, styles, config, line, syl)
|
||||||
|
local result = {n=0}
|
||||||
|
function result.add()
|
||||||
|
local l = copy_line(line)
|
||||||
|
table.insert(result, l)
|
||||||
|
return l
|
||||||
|
end
|
||||||
|
-- Place the main text
|
||||||
|
local l = result.add()
|
||||||
|
l.text = string.format("{\\an8\\pos(%d,%d)\\k%d\\kf%d}%s", line.centerleft+syl.center, line.height*1.5, syl.start_time/10, syl.duration, syl.text)
|
||||||
|
l.layer = 5
|
||||||
|
-- Perform the highlights
|
||||||
|
for i = 0, syl.highlights.n-1 do
|
||||||
|
local hl = syl.highlights[i]
|
||||||
|
l = result.add()
|
||||||
|
l.start_time = l.start_time + hl.start_time/10
|
||||||
|
l.end_time = l.start_time + 25
|
||||||
|
l.text = string.format("{\\an8\\k10000\\k0\\move(%d,%d,%d,%d)\\t(\\1a&HFF&\\2a&HFF&\\3a&HFF&\\4a&HFF&)}%s", line.centerleft+syl.center, line.height*1.5, line.centerleft+syl.center, line.height*3, syl.text_stripped)
|
||||||
|
l.layer = 10+i
|
||||||
|
end
|
||||||
|
-- Place the furigana
|
||||||
|
for i = 0, syl.furigana.n-1 do
|
||||||
|
local furi = syl.furigana[i]
|
||||||
|
l = result.add()
|
||||||
|
l.text = string.format("{\\an2\\k%d\\k%d\\bord2\\fscx%.1f\\fs%.1f\\t(%d,%d,\\bord0)\\pos(%d,%d)}%s", furi.start_time/10, furi.duration, syl.furigana.scale, syl.furigana.fontsize, furi.start_time, furi.end_time, line.centerleft+furi.center, line.height*1.5, furi.text)
|
||||||
|
l.layer = 3
|
||||||
|
end
|
||||||
|
return result
|
||||||
|
end
|
@ -10,6 +10,10 @@ the more advanced ones, I'd really like a bit of credit where it's due.
|
|||||||
And remember, it's cheap to use someone else's advanced karaoke effect, especially
|
And remember, it's cheap to use someone else's advanced karaoke effect, especially
|
||||||
without any changes at all. It also gives bad karma. Like, *really* bad :)
|
without any changes at all. It also gives bad karma. Like, *really* bad :)
|
||||||
|
|
||||||
|
Apart from just the .lua files, there's also a few .ass files, used for eg. showing
|
||||||
|
how some special feature is implemented in the ASS itself. It should be obvious
|
||||||
|
what .lua and .ass files are related.
|
||||||
|
|
||||||
|
|
||||||
WARNING!
|
WARNING!
|
||||||
DO NOT ADD YOUR OWN FILES TO THIS DIRECTORY,
|
DO NOT ADD YOUR OWN FILES TO THIS DIRECTORY,
|
||||||
|
@ -32,7 +32,8 @@
|
|||||||
-- positioning of karaoke.
|
-- positioning of karaoke.
|
||||||
|
|
||||||
-- It automatically includes and re-setups karaskel.lua, so you should not include that yourself!
|
-- It automatically includes and re-setups karaskel.lua, so you should not include that yourself!
|
||||||
include("karaskel.lua")
|
include("karaskel-base.lua")
|
||||||
|
karaskel.engage_positioning = true
|
||||||
|
|
||||||
-- The interface here has been greatly simplified, there is only one function to override, do_syllable
|
-- The interface here has been greatly simplified, there is only one function to override, do_syllable
|
||||||
-- The format for that one has changed.
|
-- The format for that one has changed.
|
||||||
@ -44,23 +45,26 @@ include("karaskel.lua")
|
|||||||
-- The return value is different now, though.
|
-- The return value is different now, though.
|
||||||
-- It is required to be in the same format as the do_line function:
|
-- It is required to be in the same format as the do_line function:
|
||||||
-- A table with an "n" key, and keys 0..n-1 with line structures.
|
-- A table with an "n" key, and keys 0..n-1 with line structures.
|
||||||
function default_do_syllable(meta, styles, config, line, syl)
|
function karaskel.do_syllable(meta, styles, config, line, syl)
|
||||||
aegisub.output_debug("default_do_syllable")
|
karaskel.trace("default_do_syllable")
|
||||||
return {n=0}
|
return {n=0}
|
||||||
end
|
end
|
||||||
do_syllable = default_do_syllable
|
do_syllable = karaskel.do_syllable
|
||||||
|
|
||||||
function adv_do_line(meta, styles, config, line)
|
function karaskel.do_line(meta, styles, config, line)
|
||||||
aegisub.output_debug("adv_do_line")
|
karaskel.trace("adv_do_line")
|
||||||
|
if line.kind ~= "dialogue" then
|
||||||
|
return {n=1, [1]=line}
|
||||||
|
end
|
||||||
local result = {n=0}
|
local result = {n=0}
|
||||||
for i = 0, line.karaoke.n-1 do
|
for i = 0, line.karaoke.n-1 do
|
||||||
aegisub.output_debug("adv_do_line:2:"..i)
|
karaskel.trace("adv_do_line:2:"..i)
|
||||||
local out = do_syllable(meta, styles, config, line, line.karaoke[i])
|
local out = do_syllable(meta, styles, config, line, line.karaoke[i])
|
||||||
for j = 1, out.n do
|
for j = 1, out.n do
|
||||||
table.insert(result, out[j])
|
table.insert(result, out[j])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
aegisub.output_debug("adv_do_line:3")
|
karaskel.trace("adv_do_line:3")
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
do_line = adv_do_line
|
do_line = karaskel.do_line
|
||||||
|
274
automation/include/karaskel-base.lua
Normal file
274
automation/include/karaskel-base.lua
Normal file
@ -0,0 +1,274 @@
|
|||||||
|
--[[
|
||||||
|
Copyright (c) 2005, Niels Martin Hansen
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the Aegisub Group nor the names of its contributors
|
||||||
|
may be used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
]]
|
||||||
|
|
||||||
|
-- Aegisub Automation include file
|
||||||
|
-- This file is meant as a support file for the various karaoke skeleton
|
||||||
|
-- scripts, to avoid including unneeded code
|
||||||
|
|
||||||
|
include("utils.lua")
|
||||||
|
|
||||||
|
-- karaskel
|
||||||
|
-- This is a gloabl table defining various parameters, controlling what the
|
||||||
|
-- skeleton will do. Not all parameters are defined in this base.
|
||||||
|
karaskel = {
|
||||||
|
-- Does this script need positioning information?
|
||||||
|
engage_positioning = false,
|
||||||
|
-- Syllable precalc parameters
|
||||||
|
precalc_start_progress = 0, -- progress precalc starts at
|
||||||
|
precalc_end_progress = 50, -- and where it ends at
|
||||||
|
-- Does this script use furigana information? (has no effect without positioning)
|
||||||
|
engage_furigana = false,
|
||||||
|
-- Furigana parameters
|
||||||
|
furigana_scale = 0.4, -- relative size of furigana
|
||||||
|
-- Default effect-name for inline effects (read manual)
|
||||||
|
inline_fx_default = "regular",
|
||||||
|
-- Set this to the name of the style used for out-of-line effect specifications, if any (read manual on this!)
|
||||||
|
ool_fx_style = false,
|
||||||
|
-- Show tracing messages?
|
||||||
|
engage_trace = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function karaskel.warning(s)
|
||||||
|
aegisub.output_debug("WARNING! " .. s)
|
||||||
|
end
|
||||||
|
|
||||||
|
function karaskel.trace(s)
|
||||||
|
if karaskel.engage_trace then
|
||||||
|
aegisub.output_debug(s)
|
||||||
|
else
|
||||||
|
-- A little optimisation
|
||||||
|
karaskel.trace = function() end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- precalc_syllable_data
|
||||||
|
-- Adds various extra fields to the line and syllable tables
|
||||||
|
-- See the implementation and/or Aegisub help file for more information
|
||||||
|
function karaskel.precalc_syllable_data(meta, styles, lines)
|
||||||
|
karaskel.trace("precalc_syllable_data")
|
||||||
|
aegisub.set_status("Preparing syllable-data")
|
||||||
|
for i = 0, lines.n-1 do
|
||||||
|
karaskel.trace("precalc_syllable_data:2:"..i)
|
||||||
|
aegisub.report_progress(karaskel.precalc_start_progress + i/lines.n*(karaskel.precalc_end_progress-karaskel.precalc_start_progress))
|
||||||
|
local line, style = lines[i]
|
||||||
|
-- Index number of the line
|
||||||
|
line.i = i
|
||||||
|
-- Linked list-style access
|
||||||
|
line.prev = lines[i-1]
|
||||||
|
line.next = lines[i+1]
|
||||||
|
karaskel.trace("precalc_syllable_data:3:")
|
||||||
|
if line.kind == "dialogue" or line.kind == "comment" then
|
||||||
|
karaskel.trace("precalc_syllable_data:4:")
|
||||||
|
local style = styles[line.style]
|
||||||
|
if not style then
|
||||||
|
-- ok, so the named style does not exist... well there MUST be at least ONE style
|
||||||
|
-- pick the first one
|
||||||
|
style = styles[0]
|
||||||
|
karaskel.warning(string.format("You have a line using a style named \"%s\", but that style does not exist! Using the first defined style (\"%s\") instead.", line.style, style.name))
|
||||||
|
end
|
||||||
|
if karaskel.engage_furigana then
|
||||||
|
karaskel.split_furigana_data(line)
|
||||||
|
line.text_stripped = ""
|
||||||
|
for k = 0, line.karaoke.n-1 do
|
||||||
|
line.text_stripped = line.text_stripped .. line.karaoke[k].text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if karaskel.engage_positioning then
|
||||||
|
-- Line dimensions
|
||||||
|
line.width, line.height, line.ascent, line.extlead = aegisub.text_extents(style, line.text_stripped)
|
||||||
|
karaskel.trace("precalc_syllable_data:5:")
|
||||||
|
-- Line position
|
||||||
|
line.centerleft = math.floor((meta.res_x - line.width) / 2)
|
||||||
|
line.centerright = meta.res_x - line.centerleft
|
||||||
|
end
|
||||||
|
-- Line duration, in miliseconds
|
||||||
|
line.duration = (line.end_time - line.start_time) * 10
|
||||||
|
-- Style reference
|
||||||
|
line.styleref = style
|
||||||
|
karaskel.trace("precalc_syllable_data:6:")
|
||||||
|
-- Process the syllables
|
||||||
|
local curx, curtime = 0, 0
|
||||||
|
local inline_fx = karaskel.inline_fx_default
|
||||||
|
for j = 0, line.karaoke.n-1 do
|
||||||
|
karaskel.trace("precalc_syllable_data:7::"..j)
|
||||||
|
local syl = line.karaoke[j]
|
||||||
|
-- Syllable index
|
||||||
|
syl.i = j
|
||||||
|
-- Check for inline-effect
|
||||||
|
karaskel.trace("testing for inline_fx in: " .. syl.text)
|
||||||
|
local a, b, new_inline_fx = string.find(syl.text, "{%\\?%-(.*)}")
|
||||||
|
if new_inline_fx then
|
||||||
|
karaskel.trace("caught new inline_fx: " .. new_inline_fx)
|
||||||
|
inline_fx = new_inline_fx
|
||||||
|
end
|
||||||
|
syl.inline_fx = inline_fx
|
||||||
|
-- Do positioning calculations, if applicable
|
||||||
|
if karaskel.engage_positioning then
|
||||||
|
-- Syllable dimensions
|
||||||
|
syl.width, syl.height, syl.ascent, syl.extlead = aegisub.text_extents(style, syl.text_stripped)
|
||||||
|
karaskel.trace("precalc_syllable_data:8::")
|
||||||
|
-- Syllable positioning
|
||||||
|
syl.left = curx
|
||||||
|
syl.center = math.floor(curx + syl.width/2)
|
||||||
|
syl.right = curx + syl.width
|
||||||
|
curx = syl.right
|
||||||
|
if syl.furigana then
|
||||||
|
karaskel.calc_furigana_sizes(line, syl)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Start and end times in miliseconds
|
||||||
|
syl.start_time = curtime
|
||||||
|
syl.end_time = curtime + syl.duration*10
|
||||||
|
curtime = syl.end_time
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Rebuild the entire karaoke data list, splitting out and adding furigana data
|
||||||
|
-- This also does joining of syllables with "#" as text
|
||||||
|
-- (Joining of furigana syllables with # as text seems useless for now, so it's not done.)
|
||||||
|
function karaskel.split_furigana_data(line)
|
||||||
|
if line.kind ~= "dialogue" then
|
||||||
|
karaskel.trace("skipping line, not dialogue")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
karaskel.trace("split_furigana_data:1")
|
||||||
|
line.furigana = {n=0}
|
||||||
|
local newkara = {n=0}
|
||||||
|
local curtime = 0
|
||||||
|
for i = 0, line.karaoke.n-1 do
|
||||||
|
karaskel.trace("split_furigana_data:2:"..i)
|
||||||
|
local syl = line.karaoke[i]
|
||||||
|
local a, b, maintext, furitext = string.find(syl.text_stripped, "^(.*)|(.*)$")
|
||||||
|
if not maintext then
|
||||||
|
maintext = syl.text_stripped
|
||||||
|
end
|
||||||
|
karaskel.trace("split_furigana_data:3:"..i..":"..maintext)
|
||||||
|
local highlight = { duration = syl.duration, start_time = curtime*10, end_time = curtime*10+syl.duration*10 }
|
||||||
|
curtime = curtime + syl.duration
|
||||||
|
if maintext == "#" then
|
||||||
|
karaskel.trace("split_furigana_data:4:"..i..":a")
|
||||||
|
-- repeat character
|
||||||
|
newkara[newkara.n-1].duration = newkara[newkara.n-1].duration + syl.duration
|
||||||
|
syl = newkara[newkara.n-1]
|
||||||
|
else
|
||||||
|
karaskel.trace("split_furigana_data:4:"..i..":b")
|
||||||
|
syl.furigana = {n=0, text=""} -- essentially a list of syllables in the syllable :o
|
||||||
|
syl.highlights = {n=0}
|
||||||
|
syl.text_stripped = maintext
|
||||||
|
newkara[newkara.n] = syl
|
||||||
|
newkara.n = newkara.n + 1
|
||||||
|
end
|
||||||
|
karaskel.trace("split_furigana_data:5:"..i)
|
||||||
|
syl.highlights[syl.highlights.n] = highlight
|
||||||
|
syl.highlights.n = syl.highlights.n + 1
|
||||||
|
if a then
|
||||||
|
karaskel.trace("split_furigana_data:6:"..i)
|
||||||
|
local furi = { text = furitext, duration = highlight.duration, start_time = highlight.start_time, end_time = highlight.end_time }
|
||||||
|
syl.furigana[syl.furigana.n] = furi
|
||||||
|
syl.furigana.n = syl.furigana.n + 1
|
||||||
|
syl.furigana.text = syl.furigana.text .. furitext
|
||||||
|
end
|
||||||
|
end
|
||||||
|
line.karaoke = newkara
|
||||||
|
end
|
||||||
|
|
||||||
|
function karaskel.calc_furigana_sizes(line, syl)
|
||||||
|
-- assume the sizes for the main syllable itself has been calculated already
|
||||||
|
local ls = line.styleref
|
||||||
|
local style = { -- only copy what's needed for text_extents
|
||||||
|
fontname = ls.fontname,
|
||||||
|
fontsize = ls.fontsize * karaskel.furigana_scale,
|
||||||
|
bold = ls.bold,
|
||||||
|
italic = ls.italic,
|
||||||
|
underline = ls.underline,
|
||||||
|
strikeout = ls.strikeout,
|
||||||
|
scale_x = ls.scale_x,
|
||||||
|
scale_y = ls.scale_y,
|
||||||
|
spacing = ls.spacing,
|
||||||
|
encoding = ls.encoding
|
||||||
|
}
|
||||||
|
syl.furigana.width, syl.furigana.height = aegisub.text_extents(style, syl.furigana.text)
|
||||||
|
syl.furigana.scale = syl.width / syl.furigana.width * 100
|
||||||
|
syl.furigana.fontsize = style.fontsize
|
||||||
|
if syl.furigana.scale > 100 then
|
||||||
|
syl.furigana.scale = 100
|
||||||
|
else
|
||||||
|
syl.furigana.width = syl.width
|
||||||
|
end
|
||||||
|
style.scale_x = style.scale_x * syl.furigana.scale / 100
|
||||||
|
local left = syl.left + (syl.width - syl.furigana.width)/2
|
||||||
|
for i = 0, syl.furigana.n-1 do
|
||||||
|
local f = syl.furigana[i]
|
||||||
|
f.width, f.height = aegisub.text_extents(style, f.text)
|
||||||
|
f.left = left
|
||||||
|
f.center = f.left + f.width/2
|
||||||
|
f.right = f.left + f.width
|
||||||
|
left = f.right
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Everything else is done in the process_lines function
|
||||||
|
function karaskel.process_lines(meta, styles, lines, config)
|
||||||
|
karaskel.trace("new skeleton")
|
||||||
|
karaskel.trace("skel_process_lines")
|
||||||
|
-- Do a little pre-calculation for each line and syllable
|
||||||
|
karaskel.precalc_syllable_data(meta, styles, lines)
|
||||||
|
karaskel.trace("skel_process_lines:2")
|
||||||
|
-- A var for the new output
|
||||||
|
local result = {n=0}
|
||||||
|
local ool_fx = {}
|
||||||
|
aegisub.set_status("Running main-processing")
|
||||||
|
-- Now do the usual processing
|
||||||
|
for i = 0, lines.n-1 do
|
||||||
|
karaskel.trace("skel_process_lines:3:"..i)
|
||||||
|
aegisub.report_progress(50+i/lines.n*50)
|
||||||
|
if (lines[i].kind == "dialogue" or lines[i].kind == "comment") and lines[i].style == karaskel.ool_fx_style then
|
||||||
|
local fx = {}
|
||||||
|
fx.head, fx.tail = string.headtail(lines[i])
|
||||||
|
fx.line = lines[i]
|
||||||
|
fx.start_time, fx.end_time = fx.line.start_time, fx.line.end_time
|
||||||
|
ool_fx[fx.head] = fx
|
||||||
|
else
|
||||||
|
-- Get replacement lines
|
||||||
|
lines[i].ool_fx = ool_fx
|
||||||
|
repl = do_line(meta, styles, config, lines[i])
|
||||||
|
karaskel.trace("skel_process_lines:4:"..i)
|
||||||
|
-- Append to result table
|
||||||
|
for j = 1, repl.n do
|
||||||
|
table.insert(result, repl[j])
|
||||||
|
end
|
||||||
|
ool_fx = {}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Done, return the stuff
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
process_lines = karaskel.process_lines
|
@ -65,67 +65,59 @@
|
|||||||
-- start_time - Start time of the syllable, in miliseconds, relative to the start of the line
|
-- start_time - Start time of the syllable, in miliseconds, relative to the start of the line
|
||||||
-- end_time - End time of the syllable, similar to start_time
|
-- end_time - End time of the syllable, similar to start_time
|
||||||
|
|
||||||
-- Since utils.lua is always useful, include it here
|
include("karaskel-base.lua")
|
||||||
include("utils.lua")
|
|
||||||
|
|
||||||
-- This one is used
|
|
||||||
aegisub.output_warning = aegisub.output_debug
|
|
||||||
-- Set the variable show_debug_output to non-nil non-false before including karaskel.lua, to get debug output
|
|
||||||
if not show_debug_output then
|
|
||||||
aegisub.output_debug = function() end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Return a replacement text for a syllable
|
-- Return a replacement text for a syllable
|
||||||
function default_do_syllable(meta, styles, config, line, syl)
|
function karaskel.do_syllable(meta, styles, config, line, syl)
|
||||||
aegisub.output_debug("default_do_syllable")
|
karaskel.trace("default_do_syllable")
|
||||||
return syl.text
|
return syl.text
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Decide whether or not to process a line
|
-- Decide whether or not to process a line
|
||||||
function default_do_line_decide(meta, styles, config, line)
|
function karaskel.do_line_decide(meta, styles, config, line)
|
||||||
aegisub.output_debug("default_do_line_decide")
|
karaskel.trace("default_do_line_decide")
|
||||||
return line.kind == "dialogue"
|
return line.kind == "dialogue"
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Return a text to prefix the line
|
-- Return a text to prefix the line
|
||||||
function default_do_line_start(meta, styles, config, line)
|
function karaskel.do_line_start(meta, styles, config, line)
|
||||||
aegisub.output_debug("default_do_line_start")
|
karaskel.trace("default_do_line_start")
|
||||||
return ""
|
return ""
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Return a text to suffix the line
|
-- Return a text to suffix the line
|
||||||
function default_do_line_end(meta, styles, config, line)
|
function karaskel.do_line_end(meta, styles, config, line)
|
||||||
aegisub.output_debug("default_do_line_end")
|
karaskel.trace("default_do_line_end")
|
||||||
return ""
|
return ""
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Process an entire line (which has pre-calculated extra data in it already)
|
-- Process an entire line (which has pre-calculated extra data in it already)
|
||||||
-- Return a table of replacement lines
|
-- Return a table of replacement lines
|
||||||
function default_do_line(meta, styles, config, line)
|
function karaskel.do_line(meta, styles, config, line)
|
||||||
aegisub.output_debug("default_do_line")
|
karaskel.trace("default_do_line")
|
||||||
|
|
||||||
-- Check if the line should be processed at all
|
-- Check if the line should be processed at all
|
||||||
if not do_line_decide(meta, styles, config, line) then
|
if not do_line_decide(meta, styles, config, line) then
|
||||||
return {n=0}
|
return {n=0}
|
||||||
end
|
end
|
||||||
aegisub.output_debug("default_do_line:2")
|
karaskel.trace("default_do_line:2")
|
||||||
|
|
||||||
-- Create a new local var for the line replacement text, set it to line prefix
|
-- Create a new local var for the line replacement text, set it to line prefix
|
||||||
-- This is to make sure the actual line text isn't replaced before the line has been completely processed
|
-- This is to make sure the actual line text isn't replaced before the line has been completely processed
|
||||||
local newtext = do_line_start(meta, styles, config, line)
|
local newtext = do_line_start(meta, styles, config, line)
|
||||||
aegisub.output_debug("default_do_line:3")
|
karaskel.trace("default_do_line:3")
|
||||||
|
|
||||||
-- Loop over the syllables
|
-- Loop over the syllables
|
||||||
for i = 0, line.karaoke.n-1 do
|
for i = 0, line.karaoke.n-1 do
|
||||||
aegisub.output_debug("default_do_line:4:"..i)
|
karaskel.trace("default_do_line:4:"..i)
|
||||||
-- Append the replacement for each syllable onto the line
|
-- Append the replacement for each syllable onto the line
|
||||||
newtext = newtext .. do_syllable(meta, styles, config, line, line.karaoke[i])
|
newtext = newtext .. do_syllable(meta, styles, config, line, line.karaoke[i])
|
||||||
end
|
end
|
||||||
aegisub.output_debug("default_do_line:5")
|
karaskel.trace("default_do_line:5")
|
||||||
|
|
||||||
-- Append line suffix
|
-- Append line suffix
|
||||||
newtext = newtext .. do_line_end(meta, styles, config, line)
|
newtext = newtext .. do_line_end(meta, styles, config, line)
|
||||||
aegisub.output_debug("default_do_line:6")
|
karaskel.trace("default_do_line:6")
|
||||||
|
|
||||||
-- Now replace the line text
|
-- Now replace the line text
|
||||||
line.text = newtext
|
line.text = newtext
|
||||||
@ -135,95 +127,8 @@ function default_do_line(meta, styles, config, line)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Now assign all the default functions to the names that are actually called
|
-- Now assign all the default functions to the names that are actually called
|
||||||
do_syllable = default_do_syllable
|
do_syllable = karaskel.do_syllable
|
||||||
do_line_decide = default_do_line_decide
|
do_line_decide = karaskel.do_line_decide
|
||||||
do_line_start = default_do_line_start
|
do_line_start = karaskel.do_line_start
|
||||||
do_line_end = default_do_line_end
|
do_line_end = karaskel.do_line_end
|
||||||
do_line = default_do_line
|
do_line = karaskel.do_line
|
||||||
|
|
||||||
precalc_start_progress = 0
|
|
||||||
precalc_end_progress = 50
|
|
||||||
function precalc_syllable_data(meta, styles, lines)
|
|
||||||
aegisub.output_debug("precalc_syllable_data")
|
|
||||||
aegisub.set_status("Preparing syllable-data")
|
|
||||||
for i = 0, lines.n-1 do
|
|
||||||
aegisub.output_debug("precalc_syllable_data:2:"..i)
|
|
||||||
aegisub.report_progress(precalc_start_progress + i/lines.n*(precalc_end_progress-precalc_start_progress))
|
|
||||||
local line, style = lines[i]
|
|
||||||
-- Index number of the line
|
|
||||||
line.i = i
|
|
||||||
-- Linked list-style access
|
|
||||||
line.prev = lines[i-1]
|
|
||||||
line.next = lines[i+1]
|
|
||||||
aegisub.output_debug("precalc_syllable_data:3:")
|
|
||||||
if line.kind == "dialogue" or line.kind == "comment" then
|
|
||||||
aegisub.output_debug("precalc_syllable_data:4:")
|
|
||||||
local style = styles[line.style]
|
|
||||||
if not style then
|
|
||||||
-- ok, so the named style does not exist... well there MUST be at least ONE style
|
|
||||||
-- pick the first one
|
|
||||||
style = styles[0]
|
|
||||||
aegisub.output_warning(string.format("WARNING! You have a line using a style named \"%s\", but that style does not exist! Using the first defined style (\"%s\") instead.", line.style, style.name))
|
|
||||||
end
|
|
||||||
-- Line dimensions
|
|
||||||
line.width, line.height, line.ascent, line.extlead = aegisub.text_extents(style, line.text_stripped)
|
|
||||||
aegisub.output_debug("precalc_syllable_data:5:")
|
|
||||||
-- Line position
|
|
||||||
line.centerleft = math.floor((meta.res_x - line.width) / 2)
|
|
||||||
line.centerright = meta.res_x - line.centerleft
|
|
||||||
-- Line duration, in miliseconds
|
|
||||||
line.duration = (line.end_time - line.start_time) * 10
|
|
||||||
-- Style reference
|
|
||||||
line.styleref = style
|
|
||||||
aegisub.output_debug("precalc_syllable_data:6:")
|
|
||||||
-- Process the syllables
|
|
||||||
local curx, curtime = 0, 0
|
|
||||||
for j = 0, line.karaoke.n-1 do
|
|
||||||
aegisub.output_debug("precalc_syllable_data:7::"..j)
|
|
||||||
local syl = line.karaoke[j]
|
|
||||||
-- Syllable index
|
|
||||||
syl.i = j
|
|
||||||
-- Syllable dimensions
|
|
||||||
syl.width, syl.height, syl.ascent, syl.extlead = aegisub.text_extents(style, syl.text_stripped)
|
|
||||||
aegisub.output_debug("precalc_syllable_data:8::")
|
|
||||||
-- Syllable positioning
|
|
||||||
syl.left = curx
|
|
||||||
syl.center = math.floor(curx + syl.width/2)
|
|
||||||
syl.right = curx + syl.width
|
|
||||||
curx = syl.right
|
|
||||||
-- Start and end times in miliseconds
|
|
||||||
syl.start_time = curtime
|
|
||||||
syl.end_time = curtime + syl.duration*10
|
|
||||||
curtime = syl.end_time
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Everything else is done in the process_lines function
|
|
||||||
function skel_process_lines(meta, styles, lines, config)
|
|
||||||
aegisub.output_debug("skel_process_lines")
|
|
||||||
-- Do a little pre-calculation for each line and syllable
|
|
||||||
precalc_syllable_data(meta, styles, lines)
|
|
||||||
aegisub.output_debug("skel_process_lines:2")
|
|
||||||
-- A var for the new output
|
|
||||||
local result = {n=0}
|
|
||||||
aegisub.set_status("Running main-processing")
|
|
||||||
-- Now do the usual processing
|
|
||||||
for i = 0, lines.n-1 do
|
|
||||||
aegisub.output_debug("skel_process_lines:3:"..i)
|
|
||||||
aegisub.report_progress(50+i/lines.n*50)
|
|
||||||
if do_line_decide(meta, styles, config, lines[i]) then
|
|
||||||
aegisub.output_debug("skel_process_lines:4:..i")
|
|
||||||
-- Get replacement lines
|
|
||||||
repl = do_line(meta, styles, config, lines[i])
|
|
||||||
-- Append to result table
|
|
||||||
for j = 1, repl.n do
|
|
||||||
table.insert(result, repl[j])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-- Done, return the stuff
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
process_lines = skel_process_lines
|
|
||||||
|
@ -67,7 +67,7 @@ AssExportFilter::~AssExportFilter() {
|
|||||||
void AssExportFilter::Register (wxString name,int priority) {
|
void AssExportFilter::Register (wxString name,int priority) {
|
||||||
// Check if it's registered
|
// Check if it's registered
|
||||||
if (RegisterName != _T("")) {
|
if (RegisterName != _T("")) {
|
||||||
throw _T("Register export filter: filter with name \"") + name + _T("\" is already registered.");
|
throw wxString::Format(_T("Register export filter: filter with name \"%s\" is already registered."), name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove pipes from name
|
// Remove pipes from name
|
||||||
@ -78,7 +78,7 @@ void AssExportFilter::Register (wxString name,int priority) {
|
|||||||
FilterList::iterator end = AssExportFilterChain::GetFilterList()->end();
|
FilterList::iterator end = AssExportFilterChain::GetFilterList()->end();
|
||||||
for (FilterList::iterator cur=begin;cur!=end;cur++) {
|
for (FilterList::iterator cur=begin;cur!=end;cur++) {
|
||||||
if ((*cur)->RegisterName == name) {
|
if ((*cur)->RegisterName == name) {
|
||||||
throw _T("Register export filter: name \"") + name + _T("\" already exists.");
|
throw wxString::Format(_T("Register export filter: name \"%s\" already exists."), name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ void AssExportFilter::Register (wxString name,int priority) {
|
|||||||
// Unregister
|
// Unregister
|
||||||
void AssExportFilter::Unregister () {
|
void AssExportFilter::Unregister () {
|
||||||
// Check if it's registered
|
// Check if it's registered
|
||||||
if (!IsRegistered()) throw _T("Unregister export filter: name \"") + RegisterName + _T("\" is not registered.");
|
if (!IsRegistered()) throw wxString::Format(_T("Unregister export filter: name \"%s\" is not registered."), RegisterName);
|
||||||
|
|
||||||
// Unregister
|
// Unregister
|
||||||
RegisterName = _T("");
|
RegisterName = _T("");
|
||||||
|
@ -91,7 +91,7 @@ void AssExporter::AddFilter(wxString name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check
|
// Check
|
||||||
if (!filter) throw _T("Filter not found");
|
if (!filter) throw wxString::Format(_T("Filter not found: %s"), name);
|
||||||
|
|
||||||
// Add to list
|
// Add to list
|
||||||
Filters.push_back(filter);
|
Filters.push_back(filter);
|
||||||
@ -176,5 +176,5 @@ wxString AssExporter::GetDescription(wxString name) {
|
|||||||
return (*cur)->Description;
|
return (*cur)->Description;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw _T("Filter not found.");
|
throw wxString::Format(_T("Filter not found: %s"), name);
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,15 @@ AudioKaraoke::AudioKaraoke(wxWindow *parent)
|
|||||||
splitting = false;
|
splitting = false;
|
||||||
split_cursor_syl = -1;
|
split_cursor_syl = -1;
|
||||||
curSyllable = 0;
|
curSyllable = 0;
|
||||||
diag = NULL;
|
diag = 0;
|
||||||
|
workDiag = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////
|
||||||
|
// Destructor
|
||||||
|
AudioKaraoke::~AudioKaraoke() {
|
||||||
|
delete workDiag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -81,6 +89,7 @@ bool AudioKaraoke::LoadFromDialogue(AssDialogue *_diag) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set dialogue
|
// Set dialogue
|
||||||
|
delete workDiag;
|
||||||
diag = _diag;
|
diag = _diag;
|
||||||
if (!diag) {
|
if (!diag) {
|
||||||
Refresh(false);
|
Refresh(false);
|
||||||
@ -88,8 +97,10 @@ bool AudioKaraoke::LoadFromDialogue(AssDialogue *_diag) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Split
|
// Split
|
||||||
|
workDiag = new AssDialogue(diag->data, false);
|
||||||
|
workDiag->ParseASSTags();
|
||||||
must_rebuild = false;
|
must_rebuild = false;
|
||||||
bool hasKar = ParseDialogue(diag);
|
bool hasKar = ParseDialogue(workDiag);
|
||||||
|
|
||||||
// No karaoke, autosplit
|
// No karaoke, autosplit
|
||||||
if (!hasKar) {
|
if (!hasKar) {
|
||||||
@ -137,12 +148,14 @@ void AudioKaraoke::Commit() {
|
|||||||
KaraokeSyllable *syl;
|
KaraokeSyllable *syl;
|
||||||
size_t n = syllables.size();
|
size_t n = syllables.size();
|
||||||
if (must_rebuild) {
|
if (must_rebuild) {
|
||||||
|
workDiag->ClearBlocks();
|
||||||
for (size_t i=0;i<n;i++) {
|
for (size_t i=0;i<n;i++) {
|
||||||
syl = &syllables.at(i);
|
syl = &syllables.at(i);
|
||||||
finalText += wxString::Format(_T("{%s%i}"), syl->tag, syl->length) + syl->contents;
|
finalText += wxString::Format(_T("{%s%i}"), syl->tag, syl->length) + syl->contents;
|
||||||
}
|
}
|
||||||
|
workDiag->Text = finalText;
|
||||||
|
workDiag->ParseASSTags();
|
||||||
diag->Text = finalText;
|
diag->Text = finalText;
|
||||||
//diag->ParseASSTags();
|
|
||||||
} else {
|
} else {
|
||||||
wxLogDebug(_T("Updating karaoke without rebuild"));
|
wxLogDebug(_T("Updating karaoke without rebuild"));
|
||||||
for (size_t i = 0; i < n; i++) {
|
for (size_t i = 0; i < n; i++) {
|
||||||
@ -152,7 +165,10 @@ void AudioKaraoke::Commit() {
|
|||||||
syl->original_tagdata->SetInt(syl->length);
|
syl->original_tagdata->SetInt(syl->length);
|
||||||
}
|
}
|
||||||
wxLogDebug(_T("Done updating syllables"));
|
wxLogDebug(_T("Done updating syllables"));
|
||||||
diag->UpdateText();
|
workDiag->UpdateText();
|
||||||
|
workDiag->ClearBlocks();
|
||||||
|
workDiag->ParseASSTags();
|
||||||
|
diag->Text = workDiag->Text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ typedef std::vector<KaraokeSyllable> SylVector;
|
|||||||
class AudioKaraoke : public wxWindow {
|
class AudioKaraoke : public wxWindow {
|
||||||
private:
|
private:
|
||||||
AssDialogue *diag;
|
AssDialogue *diag;
|
||||||
|
AssDialogue *workDiag;
|
||||||
int startClickSyl;
|
int startClickSyl;
|
||||||
bool must_rebuild;
|
bool must_rebuild;
|
||||||
|
|
||||||
@ -112,6 +113,8 @@ public:
|
|||||||
SylVector syllables;
|
SylVector syllables;
|
||||||
|
|
||||||
AudioKaraoke(wxWindow *parent);
|
AudioKaraoke(wxWindow *parent);
|
||||||
|
virtual ~AudioKaraoke();
|
||||||
|
|
||||||
bool LoadFromDialogue(AssDialogue *diag);
|
bool LoadFromDialogue(AssDialogue *diag);
|
||||||
void Commit();
|
void Commit();
|
||||||
void SetSyllable(int n);
|
void SetSyllable(int n);
|
||||||
|
@ -76,7 +76,7 @@ AudioProvider::AudioProvider(wxString _filename, AudioDisplay *_display) {
|
|||||||
if (!pa_refcount) {
|
if (!pa_refcount) {
|
||||||
PaError err = Pa_Initialize();
|
PaError err = Pa_Initialize();
|
||||||
if (err != paNoError)
|
if (err != paNoError)
|
||||||
throw _T("Failed opening PortAudio with error: ") + wxString(Pa_GetErrorText(err),wxConvLocal);
|
throw wxString::Format(_T("Failed opening PortAudio with error: %s"), wxString(Pa_GetErrorText(err),wxConvLocal));
|
||||||
pa_refcount++;
|
pa_refcount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ void AudioProvider::OpenAVSAudio() {
|
|||||||
LoadFromClip(script);
|
LoadFromClip(script);
|
||||||
|
|
||||||
} catch (AvisynthError &err) {
|
} catch (AvisynthError &err) {
|
||||||
throw _T("AviSynth error: ") + wxString(err.msg,wxConvLocal);
|
throw wxString::Format(_T("AviSynth error: %s"), wxString(err.msg,wxConvLocal));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1320,7 +1320,7 @@ void AutomationScript::process_lines(AssFile *input)
|
|||||||
switch ((*block)->type) {
|
switch ((*block)->type) {
|
||||||
|
|
||||||
case BLOCK_BASE:
|
case BLOCK_BASE:
|
||||||
throw _T("BLOCK_BASE found processing dialogue blocks. This should never happen.");
|
throw wxString(_T("BLOCK_BASE found processing dialogue blocks. This should never happen."));
|
||||||
|
|
||||||
case BLOCK_PLAIN:
|
case BLOCK_PLAIN:
|
||||||
ktext += (*block)->text;
|
ktext += (*block)->text;
|
||||||
|
@ -147,7 +147,7 @@ AutomationFilterConfigDialog::AutomationFilterConfigDialog(wxWindow *parent, Aut
|
|||||||
AssAutomationFilter::AssAutomationFilter(AutomationScript *a_script)
|
AssAutomationFilter::AssAutomationFilter(AutomationScript *a_script)
|
||||||
: script(a_script), dialog(0)
|
: script(a_script), dialog(0)
|
||||||
{
|
{
|
||||||
Register(wxString::Format(_T("Automation: %s"), script->name.c_str()), 100);
|
Register(wxString::Format(_T("Automation: %s"), script->name.c_str()), 2000);
|
||||||
if (script->description.IsEmpty()) {
|
if (script->description.IsEmpty()) {
|
||||||
Description = wxString::Format(_T("%s\r\n(This Automation script has not provided a description.)"), script->name.c_str());
|
Description = wxString::Format(_T("%s\r\n(This Automation script has not provided a description.)"), script->name.c_str());
|
||||||
} else {
|
} else {
|
||||||
|
@ -177,6 +177,9 @@ void DialogAutomationManager::OnAdd(wxCommandEvent &event)
|
|||||||
catch (AutomationError &err) {
|
catch (AutomationError &err) {
|
||||||
wxMessageBox(wxString::Format(_T("Error loading Automation script '%s':\r\n\r\n%s"), sfnames.c_str(), err.message.c_str()), _T("Error loading Automation script"), wxOK | wxICON_ERROR, this);
|
wxMessageBox(wxString::Format(_T("Error loading Automation script '%s':\r\n\r\n%s"), sfnames.c_str(), err.message.c_str()), _T("Error loading Automation script"), wxOK | wxICON_ERROR, this);
|
||||||
}
|
}
|
||||||
|
catch (wxString &err) {
|
||||||
|
wxMessageBox(wxString::Format(_T("Error loading Automation script %s:\r\n\r\n%s"), sfnames.c_str(), err), _T("Error loading Automation script"), wxOK|wxICON_ERROR, this);
|
||||||
|
}
|
||||||
catch (wchar_t *err) {
|
catch (wchar_t *err) {
|
||||||
wxMessageBox(wxString::Format(_T("Error loading Automation script %s:\r\n\r\n%s"), sfnames.c_str(), err), _T("Error loading Automation script"), wxOK|wxICON_ERROR, this);
|
wxMessageBox(wxString::Format(_T("Error loading Automation script %s:\r\n\r\n%s"), sfnames.c_str(), err), _T("Error loading Automation script"), wxOK|wxICON_ERROR, this);
|
||||||
}
|
}
|
||||||
|
@ -55,12 +55,12 @@ AviSynthWrapper::AviSynthWrapper() {
|
|||||||
hLib=LoadLibrary(_T("avisynth.dll"));
|
hLib=LoadLibrary(_T("avisynth.dll"));
|
||||||
|
|
||||||
if (hLib == NULL)
|
if (hLib == NULL)
|
||||||
throw _T("Could not load avisynth.dll");
|
throw wxString(_T("Could not load avisynth.dll"));
|
||||||
|
|
||||||
FUNC *CreateScriptEnv = (FUNC*)GetProcAddress(hLib, "CreateScriptEnvironment");
|
FUNC *CreateScriptEnv = (FUNC*)GetProcAddress(hLib, "CreateScriptEnvironment");
|
||||||
|
|
||||||
if (CreateScriptEnv == NULL)
|
if (CreateScriptEnv == NULL)
|
||||||
throw _T("Failed to get function from avisynth.dll");
|
throw wxString(_T("Failed to get function from avisynth.dll"));
|
||||||
|
|
||||||
// Require Avisynth 2.5.6+?
|
// Require Avisynth 2.5.6+?
|
||||||
if (Options.AsBool(_T("Allow Ancient Avisynth")))
|
if (Options.AsBool(_T("Allow Ancient Avisynth")))
|
||||||
@ -69,8 +69,7 @@ AviSynthWrapper::AviSynthWrapper() {
|
|||||||
env = CreateScriptEnv(AVISYNTH_INTERFACE_VERSION);
|
env = CreateScriptEnv(AVISYNTH_INTERFACE_VERSION);
|
||||||
|
|
||||||
if (env == NULL)
|
if (env == NULL)
|
||||||
throw _T("Failed to create a new avisynth script environment. Avisynth is too old?");
|
throw wxString(_T("Failed to create a new avisynth script environment. Avisynth is too old?"));
|
||||||
|
|
||||||
// Set memory limit
|
// Set memory limit
|
||||||
int memoryMax = Options.AsInt(_T("Avisynth MemoryMax"));
|
int memoryMax = Options.AsInt(_T("Avisynth MemoryMax"));
|
||||||
if (memoryMax != 0)
|
if (memoryMax != 0)
|
||||||
|
@ -49,6 +49,7 @@ Please visit http://aegisub.net to download latest version
|
|||||||
- Added reading of keyframe and timecode data from Matroska files (which are still not recommended, due to their dependency on DirectShowSource). (AMZ)
|
- Added reading of keyframe and timecode data from Matroska files (which are still not recommended, due to their dependency on DirectShowSource). (AMZ)
|
||||||
- Added forums and bugtracker to Help menu. (AMZ)
|
- Added forums and bugtracker to Help menu. (AMZ)
|
||||||
- Fixed Fonts Collector behavior with font shortcuts. (AMZ)
|
- Fixed Fonts Collector behavior with font shortcuts. (AMZ)
|
||||||
|
- Better error reporting when loading Automation scripts (jfs)
|
||||||
|
|
||||||
|
|
||||||
= 1.09 beta - 2006.01.16 ===========================
|
= 1.09 beta - 2006.01.16 ===========================
|
||||||
|
@ -515,7 +515,7 @@ wxString *SearchReplaceEngine::GetText(int n,int field) {
|
|||||||
if (field == 0) return &cur->Text;
|
if (field == 0) return &cur->Text;
|
||||||
else if (field == 1) return &cur->Style;
|
else if (field == 1) return &cur->Style;
|
||||||
else if (field == 2) return &cur->Actor;
|
else if (field == 2) return &cur->Actor;
|
||||||
else throw _T("Invalid field");
|
else throw wxString(_T("Invalid field"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ void AssTransformFramerateFilter::TransformTimeTags (wxString name,int n,AssOver
|
|||||||
curKarPos = lineData->ko;
|
curKarPos = lineData->ko;
|
||||||
lineData->ko += parVal/10;
|
lineData->ko += parVal/10;
|
||||||
}
|
}
|
||||||
else throw _T("Unknown karaoke tag!");
|
else throw wxString::Format(_T("Unknown karaoke tag! '%s'"), name);
|
||||||
curKarPos *= 10;
|
curKarPos *= 10;
|
||||||
parVal += curKarPos;
|
parVal += curKarPos;
|
||||||
}
|
}
|
||||||
|
@ -211,7 +211,7 @@ wxArrayString FontsCollectorThread::GetFontFiles (wxString face) {
|
|||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (n==0) throw _T("Font not found");
|
if (n==0) throw wxString(_T("Font not found: %s"), face);
|
||||||
|
|
||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user