forked from mia/Aegisub
6dcb5ff4a8
Apparently Lua 5.1 has changed the semantics of table.insert so it's incompatible with the way used in all Auto3 demo scripts etc. Now it's overridden in utils.auto3 and all instances of it in sample scripts etc. replaced with code having the expected behaviour. Originally committed to SVN as r926.
56 lines
2.3 KiB
Lua
56 lines
2.3 KiB
Lua
-- Aegisub Automation demonstration script
|
|
-- Original written by Niels Martin Hansen
|
|
-- Given into the public domain
|
|
|
|
include("utils.lua")
|
|
|
|
name = "Text placement demo"
|
|
description = "Demonstration of the text_extents function, to do per-syllable placement of text."
|
|
version, kind, configuration = 3, 'basic_ass', {}
|
|
|
|
function process_lines(meta, styles, lines, config)
|
|
-- Prepare local variables
|
|
local output = { n=0 }
|
|
-- Loop through every line
|
|
for i = 0, lines.n-1 do
|
|
aegisub.report_progress(i/lines.n*100)
|
|
-- Only process dialogue lines
|
|
if lines[i].kind ~= "dialogue" then
|
|
output.n = output.n + 1
|
|
output[output.n] = lines[i]
|
|
else
|
|
-- This is just for making the code a bit easier to read
|
|
local line = lines[i]
|
|
-- Get the rendered size of the entire line. (Won't work if there's line breaks in it.)
|
|
local totalx, totaly = aegisub.text_extents(styles[line.style], line.text_stripped)
|
|
-- Calculate where the first syllable should be positioned, if the line is to appear centered on screen
|
|
local curx, cury = (meta.res_x - totalx) / 2, meta.res_y / 2
|
|
-- And more preparations for per-syllable placement
|
|
local startx = curx
|
|
local tstart, tend = 0, 0
|
|
-- Now process each stllable
|
|
for j = 1, line.karaoke.n-1 do
|
|
-- A shortcut variable, and, most important: a copy of the original line
|
|
local syl, syllin = line.karaoke[j], copy_line(line)
|
|
-- Calculate the ending time of this syllable
|
|
tend = tstart + syl.duration*10
|
|
-- Get the rendered size of this syllable
|
|
local extx, exty, extd, extl = aegisub.text_extents(styles[line.style], syl.text_stripped)
|
|
-- Some debug stuff...
|
|
aegisub.output_debug(string.format("text_extents returned: %d, %d, %d, %d", extx, exty, extd, extl));
|
|
-- Replace the text of the copy of the line with this syllable, moving around
|
|
syllin.text = string.format("{\\an4\\move(%d,%d,%d,%d,%d,%d)\\kf%d\\kf%d}%s", curx, cury, curx, cury-exty, tstart, tend, tstart/10, syl.duration, syl.text)
|
|
-- Add the line to the output
|
|
output.n = output.n + 1
|
|
output[output.n] = syllin
|
|
-- And prepare for next iteration
|
|
curx = curx + extx
|
|
tstart = tend
|
|
end
|
|
-- More debug stuff
|
|
aegisub.output_debug(string.format("after syllable loop: totalx=%d curx-startx=%d", totalx, curx-startx))
|
|
end
|
|
end
|
|
-- And remember to return something :)
|
|
return output
|
|
end
|