| <?xml version="1.0" standalone="no"?> |
| <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" |
| "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> |
| |
| <!-- |
| |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| |
| --> |
| <!-- ========================================================================= --> |
| <!-- A star field --> |
| <!-- --> |
| <!-- @author shillion@ilog.fr --> |
| <!-- @version $Id$ --> |
| <!-- ========================================================================= --> |
| |
| <svg xmlns="http://www.w3.org/2000/svg" |
| xmlns:xlink="http://www.w3.org/1999/xlink" |
| width="450" height="500" viewBox="0 0 450 500"> |
| <title>Starfield</title> |
| |
| <defs> |
| |
| <!-- ######################################################################### --> |
| <style type="text/css"> |
| <![CDATA[ |
| .title { |
| font-size: 52; |
| font-style: italic; |
| font-weight: bolder |
| } |
| /* Colors */ |
| #background { |
| fill: #080014 |
| } |
| .fps-label, .fps-unit, .help, .title { |
| fill: #ddf |
| } |
| .button-back, .gauge-back { |
| fill: #edf |
| } |
| .button-fore, .gauge-fore { |
| fill: #769 |
| } |
| .panel-back { |
| fill: #347; |
| fill-opacity:0.3 |
| } |
| .star { |
| fill: white /*url(#star-fill)*/ |
| } |
| .stop-c1 { |
| stop-color: white |
| } |
| .stop-c2 { |
| stop-color: #ffc |
| } |
| .stop-c3 { |
| stop-color: #aa8 |
| } |
| /* <text/> default property values */ |
| text { |
| font-size: 9; |
| text-anchor: middle |
| } |
| /* The property values for a <text/> preceded by another <text/> */ |
| text + text { |
| text-anchor: start |
| } |
| ]]> |
| </style> |
| |
| <!-- ######################################################################### --> |
| <radialGradient id="star-fill" gradientUnits="userSpaceOnUse" |
| cx="0" cy="0" fx="-5" fy="-5" r="30"> |
| <stop class="stop-c1" offset="0%"/> |
| <stop class="stop-c2" offset="20%"/> |
| <stop class="stop-c3" offset="100%"/> |
| </radialGradient> |
| |
| <!-- ######################################################################### --> |
| <g id="plus-button"> |
| <circle class="button-back" cx="10" cy="10" r="10"/> |
| <rect class="button-fore" x="8" y="4" width="4" height="12"/> |
| <rect class="button-fore" x="4" y="8" width="12" height="4"/> |
| </g> |
| |
| <!-- ######################################################################### --> |
| <g id="minus-button"> |
| <circle class="button-back" cx="10" cy="10" r="10"/> |
| <rect class="button-fore" x="4" y="8" width="12" height="4"/> |
| </g> |
| |
| <!-- ######################################################################### --> |
| <g id="gauge"> |
| <rect class="gauge-back" x="0" y="0" width="150" height="20"/> |
| </g> |
| |
| |
| <!-- ######################################################################### --> |
| <script type="text/ecmascript"> |
| <![CDATA[ |
| // |
| // Global declarations |
| // |
| var starIncrement = 5 |
| var numberOfStars = starIncrement |
| var unitCount = 1 |
| var units = document.getElementById("units") |
| var stars = new Array() |
| var controlPanelMoving = false; |
| var showControlPanel = false |
| var helpText1 = "Click on the title to show the control panel" |
| var helpText2 = "Click on the title to hide the control panel" |
| var startDate; |
| var nframe; |
| |
| // |
| // Decreases the number of stars. If numberOfStars is at his min value, |
| // do nothing. |
| // |
| function decreaseNumberOfStars(evt) { |
| if (numberOfStars == 0) { |
| return |
| } |
| |
| for (var i = 0; i < starIncrement; i++) { |
| stars[--numberOfStars].freeze(); |
| } |
| updateText("number-label", numberOfStars) |
| |
| unitCount-- |
| units.setAttributeNS(null, "width", unitCount * 10) |
| } |
| |
| // |
| // Increases the number of stars. If numberOfStars is at his max value, |
| // do nothing. |
| // |
| function increaseNumberOfStars(evt) { |
| if (numberOfStars == starIncrement * 15) { |
| return |
| } |
| |
| for (var i = 0; i < starIncrement; i++) { |
| stars[numberOfStars++].activate(); |
| } |
| updateText("number-label", numberOfStars) |
| |
| unitCount++ |
| units.setAttributeNS(null, "width", unitCount * 10) |
| |
| } |
| |
| // |
| // Updates a text element content. |
| // |
| function updateText(id, lbl) { |
| var elt = document.getElementById(id) |
| var grp = elt.parentNode; |
| var newelt = elt.cloneNode(true) |
| |
| if (newelt.firstChild == null) { |
| newelt.appendChild(document.createTextNode(lbl)) |
| } else { |
| newelt.replaceChild(document.createTextNode(lbl), newelt.firstChild) |
| } |
| grp.replaceChild(newelt, elt) |
| } |
| |
| var itv; |
| |
| // |
| // Starts the animation loops. |
| // |
| function initAnimations(evt) { |
| for (var i = 0; i < starIncrement * 15; i++) { |
| stars[i] = new Star() |
| } |
| |
| for (var i = 0; i < starIncrement; i++) { |
| stars[i].activate() |
| } |
| updateText("help", helpText1) |
| |
| itv = setInterval("animateStars()", 10) |
| |
| startDate = new Date() |
| nframe = 0 |
| } |
| |
| // |
| // Animates the stars. |
| // |
| function animateStars() { |
| for (var i = 0; i < starIncrement * 10; i++) { |
| stars[i].update() |
| } |
| if (nframe < 10) { |
| nframe++ |
| } else { |
| var d = new Date() |
| var dt = d - startDate |
| var val = Math.round(10000 / dt) |
| |
| updateText("fps1", val); |
| updateText("fps2", val); |
| // System.err.println("FPS: " + val); |
| startDate = d |
| nframe = 0 |
| } |
| } |
| |
| var controlPanelDy; |
| var controlPanelSgn; |
| |
| // |
| // Shows/hides the control panel. |
| // |
| function animateControlPanel(evt) { |
| if (!controlPanelMoving) { |
| controlPanelMoving = true; |
| showControlPanel = !showControlPanel |
| if (showControlPanel) { |
| updateText("help", helpText2) |
| controlPanelDy = 20 |
| controlPanelSgn = 1 |
| setTimeout("controlPanelAnimation()", 50) |
| } else { |
| updateText("help", helpText1) |
| controlPanelDy = 0 |
| controlPanelSgn = -1 |
| setTimeout("controlPanelAnimation()", 50) |
| } |
| } |
| } |
| |
| // |
| // Animates the control panel. |
| // |
| function controlPanelAnimation() { |
| var elt = document.getElementById("control-panel"); |
| |
| elt.setAttributeNS(null, "transform", "translate(0 " + ((controlPanelDy - 100) * controlPanelSgn) + ")"); |
| |
| if (controlPanelDy < 200) { |
| controlPanelDy += 20 |
| setTimeout("controlPanelAnimation()", 50) |
| } else { |
| controlPanelMoving = false; |
| } |
| } |
| |
| // |
| // The star object. |
| // |
| function Star() { |
| this.element = document.createElementNS("http://www.w3.org/2000/svg", |
| "circle") |
| // |
| // This method activates the star. |
| // |
| this.activate = function() { |
| this.isActive = true |
| this.dx = (Math.random() - 0.5) * 100 + 1 |
| this.dy = (Math.random() - 0.5) * 100 + 1 |
| this.dr = Math.random() / 5 |
| } |
| |
| // |
| // This method freezes the star. |
| // |
| this.freeze = function() { |
| this.x = 225 |
| this.y = 225 |
| this.r = 0.01 |
| |
| this.isActive = false |
| this.updateElement() |
| } |
| |
| // |
| // This method updates the star size and position, if |
| // the star has been activated. |
| // |
| this.update = function() { |
| if (this.isActive) { |
| this.x += this.dx |
| this.y += this.dy |
| this.r += this.dr |
| |
| this.dx += (this.dx > 0) ? 1 : -1 |
| this.dy += (this.dy > 0) ? 1 : -1 |
| this.dr += 0.04 |
| |
| if ((this.x < -20 || this.x > 470) || |
| (this.y < -20 || this.y > 470) || |
| this.r > 30) { |
| this.freeze() |
| this.activate() |
| return |
| } |
| |
| this.updateElement() |
| } |
| } |
| this.updateElement = function() { |
| this.element.setAttributeNS(null, "transform", |
| "translate("+this.x+" "+this.y+")") |
| this.element.setAttributeNS(null, "r", this.r) |
| } |
| |
| // Start as inactive... |
| this.element.setAttributeNS(null, "class", "star") |
| this.freeze() |
| var stars = document.getElementById("stars") |
| stars.insertBefore(this.element, stars.firstChild) |
| } |
| ]]> |
| </script> |
| |
| </defs> |
| |
| <!-- ######################################################################### --> |
| <!-- ######################################################################### --> |
| <g id="body" onload="initAnimations(evt)"> |
| <rect id="background" x="0" y="0" width="100%" height="100%"/> |
| |
| <g id="stars"><!-- Used to store the stars --></g> |
| |
| <!-- The control panel --> |
| <g id="control-panel" style="opacity: 0.7" transform="translate(0, -100)"> |
| |
| <text class="help" id="help" x="50%" y="170"/> <!-- set by script --> |
| |
| <rect class="panel-back" x="0" y="-190" width="100%" height="70%"/> |
| |
| <!-- The title --> |
| <text class="title" x="50%" y="150" onclick="animateControlPanel(evt)"> |
| Starfield |
| </text> |
| |
| <!-- The controls --> |
| <use xlink:href="#minus-button" transform="translate(90 20)" |
| onclick="decreaseNumberOfStars(evt)"/> |
| |
| <use xlink:href="#gauge" transform="translate(150 20)"/> |
| |
| <rect id="units" class="gauge-fore" x="150" y="20" width="10" height="20"/> |
| |
| <text id="number-label" x="195" y="33">5</text> |
| <text x="205" y="33">Stars at a time</text> |
| |
| <use xlink:href="#plus-button" transform="translate(340 20)" |
| onclick="increaseNumberOfStars(evt)"/> |
| |
| <!-- The frame rate labels --> |
| <text class="fps-label" id="fps1" x="20" y="-80"/> <!-- set by script --> |
| <text class="fps-unit" x="30" y="-80">Frames per second</text> |
| |
| <rect class="panel-back" x="0" y="560" width="100%" height="70%"/> |
| |
| <text class="fps-label" id="fps2" x="20" y="583">0</text> |
| <text class="fps-unit" x="30" y="583">Frames per second</text> |
| </g> |
| </g> |
| <!-- ============================================================= --> |
| <!-- Batik sample mark --> |
| <!-- ============================================================= --> |
| <use xlink:href="batikLogo.svg#Batik_Tag_Box" /> |
| </svg> |