Mercurial > MadButterfly
comparison pyink/tween.py @ 1225:a05c8deb6523
Add opacity support to implement fadein/fadeout effect
author | wycc |
---|---|
date | Thu, 06 Jan 2011 22:06:00 +0800 |
parents | 25e1579ed3d1 |
children | 983442b2698c |
comparison
equal
deleted
inserted
replaced
1221:33aa2d63e240 | 1225:a05c8deb6523 |
---|---|
1 # -*- indent-tabs-mode: t; tab-width: 8; python-indent: 4; -*- | 1 # -*- indent-tabs-mode: t; tab-width: 8; python-indent: 4; -*- |
2 # vim: sw=4:ts=8:sts=4 | 2 # vim: sw=4:ts=8:sts=4 |
3 import traceback | 3 import traceback |
4 import math | 4 import math |
5 | |
6 def parse_opacity(obj): | |
7 style = obj.getAttribute("style") | |
8 arr = style.split(';') | |
9 for a in arr: | |
10 f = a.split(':') | |
11 if f[0] == 'opacity': | |
12 return float(f[1]) | |
13 return 1 | |
14 | |
15 def change_opacity(obj,opacity): | |
16 style = obj.getAttribute("style") | |
17 arr = style.split(';') | |
18 s='' | |
19 for a in arr: | |
20 f = a.split(':') | |
21 f[0] = f[0].replace(' ','') | |
22 if f[0] == 'opacity': | |
23 if s != '': | |
24 s = s + ('; opacity:%g' % opacity) | |
25 else: | |
26 s = 'opacity:%g' % opacity | |
27 elif f[0] != '': | |
28 if s == '': | |
29 s = a | |
30 else: | |
31 s = s +';'+ a | |
32 obj.setAttribute("style",s) | |
33 | |
5 | 34 |
6 class TweenObject: | 35 class TweenObject: |
7 TWEEN_TYPE_NORMAL = 0 | 36 TWEEN_TYPE_NORMAL = 0 |
8 #TWEEN_TYPE_RELOCATE = 1 | 37 #TWEEN_TYPE_RELOCATE = 1 |
9 TWEEN_TYPE_SCALE = 1 | 38 TWEEN_TYPE_SCALE = 1 |
117 """ | 146 """ |
118 Return the transform matrix of an object | 147 Return the transform matrix of an object |
119 """ | 148 """ |
120 try: | 149 try: |
121 t = obj.getAttribute("transform") | 150 t = obj.getAttribute("transform") |
122 print t | |
123 if t[0:9] == 'translate': | 151 if t[0:9] == 'translate': |
124 print "translate" | |
125 fields = t[10:].split(',') | 152 fields = t[10:].split(',') |
126 x = float(fields[0]) | 153 x = float(fields[0]) |
127 fields = fields[1].split(')') | 154 fields = fields[1].split(')') |
128 y = float(fields[0]) | 155 y = float(fields[0]) |
129 return [1,0,0,1,x,y] | 156 return [1,0,0,1,x,y] |
130 elif t[0:6] == 'matrix': | 157 elif t[0:6] == 'matrix': |
131 print "matrix" | |
132 fields=t[7:].split(')') | 158 fields=t[7:].split(')') |
133 fields = fields[0].split(',') | 159 fields = fields[0].split(',') |
134 return [float(fields[0]),float(fields[1]),float(fields[2]),float(fields[3]),float(fields[4]),float(fields[5])] | 160 return [float(fields[0]),float(fields[1]),float(fields[2]),float(fields[3]),float(fields[4]),float(fields[5])] |
135 except: | 161 except: |
136 #traceback.print_exc() | 162 #traceback.print_exc() |
186 """ | 212 """ |
187 if typ == self.TWEEN_TYPE_SCALE: | 213 if typ == self.TWEEN_TYPE_SCALE: |
188 self.updateTweenObjectScale(obj,s,d,p,newobj) | 214 self.updateTweenObjectScale(obj,s,d,p,newobj) |
189 pass | 215 pass |
190 elif typ == self.TWEEN_TYPE_NORMAL: | 216 elif typ == self.TWEEN_TYPE_NORMAL: |
191 print "newobj=",newobj | |
192 if newobj == None: | 217 if newobj == None: |
193 newobj = s.duplicate(self.document) | 218 newobj = s.duplicate(self.document) |
194 newobj.setAttribute("ref", s.getAttribute("id")) | 219 newobj.setAttribute("ref", s.getAttribute("id")) |
195 obj.appendChild(newobj) | 220 obj.appendChild(newobj) |
196 pass | 221 pass |
228 item = self.nodeToItem[d.getAttribute("id")] | 253 item = self.nodeToItem[d.getAttribute("id")] |
229 (dx,dy) = item.getCenter() | 254 (dx,dy) = item.getCenter() |
230 except: | 255 except: |
231 dx = 0 | 256 dx = 0 |
232 dy = 0 | 257 dy = 0 |
258 try: | |
259 start_opacity = parse_opacity(s) | |
260 except: | |
261 start_opacity = 1 | |
262 | |
263 try: | |
264 end_opacity =parse_opacity( d) | |
265 except: | |
266 end_opacity = 1 | |
267 | |
233 | 268 |
269 cur_opacity = start_opacity*(1-p)+end_opacity*p | |
270 change_opacity(newobj,cur_opacity) | |
234 sm = self.parseTransform(s) | 271 sm = self.parseTransform(s) |
235 ss = self.decomposition(sm) | 272 ss = self.decomposition(sm) |
236 dm = self.parseTransform(d) | 273 dm = self.parseTransform(d) |
237 dd = self.decomposition(dm) | 274 dd = self.decomposition(dm) |
238 sx = (ss[0]*(1-p)+dd[0]*p)/ss[0] | 275 sx = (ss[0]*(1-p)+dd[0]*p)/ss[0] |
262 dw = 1 | 299 dw = 1 |
263 try: | 300 try: |
264 dh = float(d.getAttribute("height")) | 301 dh = float(d.getAttribute("height")) |
265 except: | 302 except: |
266 dh = 1 | 303 dh = 1 |
304 try: | |
305 start_opacity = parse_opacity(s) | |
306 except: | |
307 start_opacity = 1 | |
308 | |
309 try: | |
310 end_opacity =parse_opacity( d) | |
311 except: | |
312 end_opacity = 1 | |
313 cur_opacity = start_opacity*(1-p)+end_opacity*p | |
314 change_opacity(newobj,cur_opacity) | |
315 | |
267 try: | 316 try: |
268 item = self.nodeToItem[s.getAttribute("id")] | 317 item = self.nodeToItem[s.getAttribute("id")] |
269 (ox,oy) = item.getCenter() | 318 (ox,oy) = item.getCenter() |
270 except: | 319 except: |
271 ox = 0 | 320 ox = 0 |
283 ss = [1,1,0,0,0] | 332 ss = [1,1,0,0,0] |
284 pass | 333 pass |
285 try: | 334 try: |
286 dm = self.parseTransform(d) | 335 dm = self.parseTransform(d) |
287 dd = self.decomposition(dm) | 336 dd = self.decomposition(dm) |
288 print "dd=",dd | |
289 except: | 337 except: |
290 dd = [1,1,0,0,0] | 338 dd = [1,1,0,0,0] |
291 dd[0] = dd[0]*dw/sw | 339 dd[0] = dd[0]*dw/sw |
292 dd[1] = dd[1]*dh/sh | 340 dd[1] = dd[1]*dh/sh |
293 print "ss[0]=",ss[0],"dd[0]=",dd[0] | |
294 sx = (ss[0]*(1-p)+dd[0]*p)/ss[0] | 341 sx = (ss[0]*(1-p)+dd[0]*p)/ss[0] |
295 sy = (ss[1]*(1-p)+dd[1]*p)/ss[1] | 342 sy = (ss[1]*(1-p)+dd[1]*p)/ss[1] |
296 print "sx=",sx,"sy=",sy | |
297 a = ss[2]*(1-p)+dd[2]*p-ss[2] | 343 a = ss[2]*(1-p)+dd[2]*p-ss[2] |
298 tx = ox*(1-p)+dx*p | 344 tx = ox*(1-p)+dx*p |
299 ty = oy*(1-p)+dy*p | 345 ty = oy*(1-p)+dy*p |
300 m = [math.cos(a),math.sin(a),-math.sin(a),math.cos(a),0,0] | 346 m = [math.cos(a),math.sin(a),-math.sin(a),math.cos(a),0,0] |
301 m = self.mulA([sx,0,0,sy,0,0],m) | 347 m = self.mulA([sx,0,0,sy,0,0],m) |