1if not modules then modules = { } end modules ['grph-trf'] = {
2 version = 1.001,
3 comment = "companion to grph-trf.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 sind, cosd, tand, abs = math.sind, math.cosd, math.tand, math.abs
12
13local texsetdimen = tex.setdimen
14
15local function analyzerotate(rotation,width,height,depth,total,notfit,obeydepth)
16
17
18
19 local sin = sind(rotation)
20 local cos = cosd(rotation)
21 local abssin = abs(sin)
22 local abscos = abs(cos)
23 local xsize = 0
24 local ysize = 0
25 local xposition = 0
26 local yposition = 0
27 local xoffset = 0
28 local yoffset = 0
29 local newwidth = width
30 local newheight = height
31 local newdepth = depth
32
33 if sin > 0 then
34 if cos > 0 then
35 xsize = cos * width + sin * total
36 ysize = sin * width + cos * total
37 yposition = cos * total
38 if notfit then
39 xoffset = - sin * height
40 newwidth = sin * depth + cos * width
41 else
42 newwidth = xsize + xposition - xoffset
43 end
44 if obeydepth then
45 yoffset = cos * depth
46 end
47 newheight = ysize - yoffset
48 newdepth = yoffset
49
50 else
51 xsize = abscos * width + sin * total
52 ysize = sin * width + abscos * total
53 xposition = abscos * width
54 if notfit then
55 xoffset = - xsize + sin * depth
56 end
57 if obeydepth then
58 yoffset = abscos * height
59 newwidth = abssin * total + abscos * width + xoffset
60 else
61 newwidth = xsize
62 end
63 newheight = ysize - yoffset
64 newdepth = yoffset
65
66 end
67 else
68 if cos < 0 then
69 xsize = abscos * width + abssin * total
70 ysize = abssin * width + abscos * total
71 xposition = xsize
72 yposition = abssin * width
73 if notfit then
74 xoffset = - xsize + abssin * height
75 end
76 if obeydepth then
77 yoffset = ysize + cos * depth
78 end
79 newwidth = notfit and (abssin * height) or xsize
80 newheight = ysize - yoffset
81 newdepth = yoffset
82
83 else
84 xsize = cos * width + abssin * total
85 ysize = abssin * width + cos * total
86 xposition = abssin * total
87 yposition = cos * total
88 if notfit then
89 xoffset = - abssin * depth
90 newwidth = xsize + xoffset
91 else
92 newwidth = xsize
93 end
94 if obeydepth then
95 yoffset = cos * depth
96 end
97 newheight = ysize - yoffset + sin * width
98 newdepth = yoffset - sin * width
99
100 end
101 end
102 texsetdimen("d_grph_rotate_x_size", xsize)
103 texsetdimen("d_grph_rotate_y_size", ysize)
104 texsetdimen("d_grph_rotate_x_position", xposition)
105 texsetdimen("d_grph_rotate_y_position", yposition)
106 texsetdimen("d_grph_rotate_x_offset", xoffset)
107 texsetdimen("d_grph_rotate_y_offset", yoffset)
108 texsetdimen("d_grph_rotate_new_width", newwidth)
109 texsetdimen("d_grph_rotate_new_height", newheight)
110 texsetdimen("d_grph_rotate_new_depth", newdepth)
111end
112
113interfaces.implement {
114 name = "analyzerotate",
115 actions = analyzerotate,
116 arguments = {
117
118 "number",
119 "dimension",
120 "dimension",
121 "dimension",
122 "dimension",
123 "conditional",
124 "conditional",
125 },
126}
127 |