Aegisub/OverLua/docs/test4.lua

65 lines
2.1 KiB
Lua
Raw Normal View History

function render_frame(f, t)
-- Some data
local basex, basey = 100, 100
local thetext = overlua_datastring or "OverLua R0xx0rz?"
-- Create a new blank surface to draw on
local surf = cairo.image_surface_create(f.width, f.height, "argb32")
-- And a context to go with it. Drawing happens through the context.
local c = surf.create_context()
-- The source video is 16:9 anamorphic, so create a scaling matrix
local scaling = cairo.matrix_create()
scaling.init_scale(f.width/853, f.height/480)
-- And set it for the surface
c.set_matrix(scaling)
-- Create a surface of the video frame...
local fs = f.create_cairo_surface()
-- .. and blur it a bit
raster.gaussian_blur(fs, 2)
-- Then create a pattern from it, that can be used for filling shapes with
local fspattern = cairo.pattern_create_for_surface(fs)
-- Also apply the scaling matrix to the pattern
fspattern.set_matrix(scaling)
-- Prepare a few things
c.select_font_face("Gill Sans Std UltraBold", "", "bold")
c.set_font_size(42)
c.set_line_width(4)
c.set_line_join("round")
-- First stroke the text a bit above and to the left of main
c.move_to(basex-2, basey-2)
c.set_source_rgba(0.8, 0.8, 1, 0.8)
c.text_path(thetext)
c.stroke()
-- Then a bit below and to the right, so it overlaps the first stroking a bit
c.move_to(basex+2, basey+2)
c.set_source_rgba(0.4, 0.4, 0.5, 0.8)
c.text_path(thetext)
c.stroke()
-- And blur them both together, also softening the border
raster.gaussian_blur(surf, 3)
-- Now prepare the main text fill and the real location
c.move_to(basex, basey)
c.text_path(thetext)
-- First a thing black outline
c.set_source_rgba(0, 0, 0, 1)
c.set_line_width(2)
c.stroke_preserve() -- _preserve version to keep the outline
-- Then use the blurred video frame as fill source
c.set_source(fspattern)
c.fill_preserve()
-- And create a very dark and rather transparent colour
-- Filling this on top of the first fill will create a darkening/reddening effect
c.set_source_rgba(0.2, 0, 0, 0.3)
c.fill()
-- Finally draw the surface onto the video
f.overlay_cairo_surface(surf, 0, 0)
end