1if not modules then modules = { } end modules ['grph-swf'] = {
2 version = 1.001,
3 comment = "companion to grph-inc.mkiv",
4 author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5 copyright = "PRAGMA ADE / ConTeXt Development Team",
6 license = "see context related readme files"
7}
8
9
10
11local sub, format, match, byte = string.sub, string.format, string.match, string.byte
12local concat = table.concat
13local floor = math.floor
14local tonumber = tonumber
15
16local readstring = io.readstring
17local readnumber = io.readnumber
18local tobitstring = number.tobitstring
19local todimen = number.todimen
20local nodeinjections = backends.nodeinjections
21local figures = figures
22local context = context
23
24local function getheader(name)
25 local f = io.open(name,"rb")
26 if not f then
27 return
28 end
29 local signature = readstring(f,3)
30 local version = readnumber(f,1)
31 local filelength = readnumber(f,-4)
32 local compressed = sub(signature,1,1) == "C"
33 local buffer
34 if compressed then
35 buffer = zlib.decompress(f:read('*a'))
36 else
37 buffer = f:read(20)
38 end
39 f:close()
40
41 buffer = { match(buffer,"(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)") }
42 for i=1,9 do
43 buffer[i] = tobitstring(byte(buffer[i]),8,8)
44 end
45 local framebits = concat(buffer,"",1,9)
46 local n = tonumber(sub(framebits,1,5),2)
47 local frame = { }
48 local xmin = tonumber(sub(framebits,6, 5 + n),2)
49 local xmax = tonumber(sub(framebits,6 + 1*n,5 + 2*n),2)
50 local ymin = tonumber(sub(framebits,6 + 2*n,5 + 3*n),2)
51 local ymax = tonumber(sub(framebits,6 + 3*n,5 + 4*n),2)
52 return {
53 filename = name,
54 version = version,
55 filelength = filelength,
56 framerate = tonumber(byte(buffer[10]) * 256 + byte(buffer[11])),
57 framecount = tonumber(byte(buffer[12]) * 256 + byte(buffer[13])),
58
59 compressed = compressed,
60 width = floor((xmax - xmin) / 20),
61 height = floor((ymax - ymin) / 20),
62 rectangle = {
63 xmin = xmin,
64 xmax = xmax,
65 ymin = ymin,
66 ymax = ymax,
67 }
68 }
69end
70
71function figures.checkers.swf(data)
72 local dr, du, ds = data.request, data.used, data.status
73 local foundname = du.fullname
74 local header = getheader(foundname)
75 local width, height = figures.applyratio(dr.width,dr.height,header.width,header.height)
76 dr.width, dr.height = width, height
77 du.width, du.height, du.foundname = width, height, foundname
78 context.startfoundexternalfigure(todimen(width),todimen(height))
79 nodeinjections.insertswf {
80 foundname = foundname,
81 width = width,
82 height = height,
83
84 display = dr.display,
85 controls = dr.controls,
86
87 resources = dr.resources,
88 arguments = dr.arguments,
89 }
90 context.stopfoundexternalfigure()
91 return data
92end
93
94figures.includers.swf = figures.includers.nongeneric
95
96figures.registersuffix("swf","swf")
97 |