/*
* Copyright (C) 2015-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
BouncingSvgParticle = Utilities.createSubclass(BouncingParticle,
function(stage, shape)
{
BouncingParticle.call(this, stage);
this._shape = shape;
}, {
_applyClipping: function(stage)
{
if (stage.clip != "star")
return;
stage.ensureClipStarIsCreated();
this.element.setAttribute("clip-path", "url(#star-clip)");
},
_move: function()
{
var transform = "translate(" + this.position.x + ", " + this.position.y + ")";
if (this._shape != "circle")
transform += this.rotater.rotate(this.size.center);
this.element.setAttribute("transform", transform);
},
animate: function(timeDelta)
{
BouncingParticle.prototype.animate.call(this, timeDelta);
this._move();
}
});
BouncingSvgParticlesStage = Utilities.createSubclass(BouncingParticlesStage,
function()
{
BouncingParticlesStage.call(this);
}, {
_createDefs: function()
{
return Utilities.createSVGElement("defs", {}, {}, this.element);
},
_ensureDefsIsCreated: function()
{
return this.element.querySelector("defs") || this._createDefs();
},
_createClipStar: function()
{
var attrs = { id: "star-clip", clipPathUnits: "objectBoundingBox" };
var clipPath = Utilities.createSVGElement("clipPath", attrs, {}, this._ensureDefsIsCreated());
attrs = { d: "M.50,0L.38,.38L0,.38L.30,.60L.18,1L.50,.75L.82,1L.70,.60L1,.38L.62,.38z" };
Utilities.createSVGElement("path", attrs, {}, clipPath);
return clipPath;
},
ensureClipStarIsCreated: function()
{
return this.element.querySelector("#star-clip") || this._createClipStar();
},
particleWillBeRemoved: function(particle)
{
particle.element.remove();
}
});