ブラウザでSVGを表示するSIEの開発 (SIE - to display SVG on legacy browsers)
| リビジョン | 73f7b14af89ffd55be08d45060c01547b62eeb71 (tree) |
|---|---|
| 日時 | 2015-10-24 22:58:05 |
| 作者 | dhrname <dhrname@user...> |
| コミッター | dhrname |
Modify the setFrame method and the setTimeTable for a repeatEvent
| @@ -1257,11 +1257,12 @@ base("$frame").up("$svgEvent").mix( { | ||
| 1257 | 1257 | /*活動継続時間と単純持続時間が異なるとき、repeatイベントを設定 |
| 1258 | 1258 | * ただし、repeatイベントはendイベントが発生する前に起きるものと仮定*/ |
| 1259 | 1259 | first.next = { |
| 1260 | - frame: begin+simpleDur, | |
| 1260 | + firstFrame: begin + simpleDur, | |
| 1261 | + frame: begin + simpleDur, | |
| 1261 | 1262 | eventType: "repeat", |
| 1262 | 1263 | target: target, |
| 1263 | - /*リピートの制限回数*/ | |
| 1264 | - limit: Math.floor(activeTime / simpleDur), | |
| 1264 | + /*リピートの制限時間*/ | |
| 1265 | + limit: begin + activeTime, | |
| 1265 | 1266 | /*リピートの回数 (n >= 1)*/ |
| 1266 | 1267 | count: 1, |
| 1267 | 1268 | simpleDuration: simpleDur, |
| @@ -1292,12 +1293,23 @@ base("$frame").up("$svgEvent").mix( { | ||
| 1292 | 1293 | if (frame <= num) { |
| 1293 | 1294 | /*IE11ではSVGEventsやDOMEventsを使うと問題が起きるため、MouseEventsで代用する*/ |
| 1294 | 1295 | var evt = target.ownerDocument.createEvent("MouseEvents"); |
| 1295 | - if ( (obj.eventType === "repeat") && (obj.count < obj.limit) ) { | |
| 1296 | + if (obj.eventType === "repeat") { | |
| 1296 | 1297 | /*リピートイベントが、リピート制限内である場合 |
| 1297 | 1298 | *numの段階で、何回リピートしたかを求める*/ |
| 1298 | - obj.count += floor( (num - frame) / obj.simpleDuration); | |
| 1299 | + obj.count = floor( (num - obj.firstFrame) / obj.simpleDuration) + 1; | |
| 1300 | + /*simpleDurationを足すことによって、リピートイベントが | |
| 1301 | + * 単純継続時間内に何度も繰り返されることを防ぐ*/ | |
| 1302 | + frame += obj.simpleDuration; | |
| 1303 | + obj.frame = frame; | |
| 1299 | 1304 | detail = obj.count; |
| 1300 | - cobj = obj; | |
| 1305 | + if (frame >= obj.limit) { | |
| 1306 | + cobj.next = obj.next; | |
| 1307 | + if (this.first === obj) { | |
| 1308 | + cobj = this.first = obj.next; | |
| 1309 | + } | |
| 1310 | + } else { | |
| 1311 | + cobj = obj; | |
| 1312 | + } | |
| 1301 | 1313 | } else { |
| 1302 | 1314 | /*ポインタの連結を変更することで、リストからobj を除去*/ |
| 1303 | 1315 | cobj.next = obj.next; |
| @@ -4339,9 +4339,10 @@ describe("SMIL Animation Spec", function() { | ||
| 4339 | 4339 | eventType: "begin", |
| 4340 | 4340 | target: ele, |
| 4341 | 4341 | |
| 4342 | - next: { frame: 10, | |
| 4342 | + next: { firstFrame: 10, | |
| 4343 | + frame: 10, | |
| 4343 | 4344 | eventType: "repeat", |
| 4344 | - limit: 1, | |
| 4345 | + limit: 12, | |
| 4345 | 4346 | count: 1, |
| 4346 | 4347 | simpleDuration: 9, |
| 4347 | 4348 | target: ele, |
| @@ -4375,9 +4376,10 @@ describe("SMIL Animation Spec", function() { | ||
| 4375 | 4376 | eventType: "begin", |
| 4376 | 4377 | target: ele, |
| 4377 | 4378 | |
| 4378 | - next: { frame: 5, | |
| 4379 | + next: {firstFrame:5, | |
| 4380 | + frame: 5, | |
| 4379 | 4381 | eventType: "repeat", |
| 4380 | - limit: 2, | |
| 4382 | + limit: 11, | |
| 4381 | 4383 | count: 1, |
| 4382 | 4384 | simpleDuration: 4, |
| 4383 | 4385 | target: ele, |
| @@ -4397,11 +4399,11 @@ describe("SMIL Animation Spec", function() { | ||
| 4397 | 4399 | expect(frame.first).toEqual(a); |
| 4398 | 4400 | frame.setFrame(5); |
| 4399 | 4401 | a.count = 1; |
| 4402 | + a.frame = 9; | |
| 4400 | 4403 | expect(frame.first).toEqual(a); |
| 4401 | 4404 | |
| 4402 | 4405 | ele.addEventListener("repeatEvent", function(evt) { |
| 4403 | 4406 | expect(evt.target).toBe(ele); |
| 4404 | - expect(evt.detail).toBe(2); | |
| 4405 | 4407 | } ); |
| 4406 | 4408 | frame.timelines = []; |
| 4407 | 4409 | frame.first = null; |
| @@ -4414,7 +4416,7 @@ describe("SMIL Animation Spec", function() { | ||
| 4414 | 4416 | }) ); |
| 4415 | 4417 | frame.setFrame(9); |
| 4416 | 4418 | a.count = 2; |
| 4417 | - a.limit = 3; | |
| 4419 | + a.limit = 16; | |
| 4418 | 4420 | a.next.frame = 16; |
| 4419 | 4421 | expect(frame.first).toEqual(a); |
| 4420 | 4422 | } ); |