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)