001/* 002 * SVG Salamander 003 * Copyright (c) 2004, Mark McKay 004 * All rights reserved. 005 * 006 * Redistribution and use in source and binary forms, with or 007 * without modification, are permitted provided that the following 008 * conditions are met: 009 * 010 * - Redistributions of source code must retain the above 011 * copyright notice, this list of conditions and the following 012 * disclaimer. 013 * - Redistributions in binary form must reproduce the above 014 * copyright notice, this list of conditions and the following 015 * disclaimer in the documentation and/or other materials 016 * provided with the distribution. 017 * 018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 019 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 020 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 021 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 022 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 023 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 025 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 026 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 027 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 028 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 029 * OF THE POSSIBILITY OF SUCH DAMAGE. 030 * 031 * Mark McKay can be contacted at mark@kitfox.com. Salamander and other 032 * projects can be found at http://www.kitfox.com 033 * 034 * Created on August 15, 2004, 2:51 AM 035 */ 036 037package com.kitfox.svg.animation; 038 039import com.kitfox.svg.SVGConst; 040import com.kitfox.svg.SVGElement; 041import com.kitfox.svg.SVGException; 042import com.kitfox.svg.SVGLoaderHelper; 043import com.kitfox.svg.animation.parser.AnimTimeParser; 044import com.kitfox.svg.animation.parser.ParseException; 045import com.kitfox.svg.xml.StyleAttribute; 046import java.io.StringReader; 047import java.util.logging.Level; 048import java.util.logging.Logger; 049import org.xml.sax.Attributes; 050import org.xml.sax.SAXException; 051 052/** 053 * @author Mark McKay 054 * @author <a href="mailto:mark@kitfox.com">Mark McKay</a> 055 */ 056abstract public class AnimateBase extends AnimationElement 057{ 058 private double repeatCount = Double.NaN; 059 private TimeBase repeatDur; 060 061 /** Creates a new instance of Animate */ 062 public AnimateBase() 063 { 064 } 065 066 public void evalParametric(AnimationTimeEval state, double curTime) 067 { 068 evalParametric(state, curTime, repeatCount, repeatDur == null ? Double.NaN : repeatDur.evalTime()); 069 } 070 071 public void loaderStartElement(SVGLoaderHelper helper, Attributes attrs, SVGElement parent) throws SAXException 072 { 073 //Load style string 074 super.loaderStartElement(helper, attrs, parent); 075 076 String repeatDurTime = attrs.getValue("repeatDur"); 077 078 try 079 { 080 if (repeatDurTime != null) 081 { 082 helper.animTimeParser.ReInit(new StringReader(repeatDurTime)); 083 this.repeatDur = helper.animTimeParser.Expr(); 084 this.repeatDur.setParentElement(this); 085 } 086 } 087 catch (Exception e) 088 { 089 throw new SAXException(e); 090 } 091 092 String strn = attrs.getValue("repeatCount"); 093 if (strn == null) 094 { 095 repeatCount = 1; 096 } 097 else if ("indefinite".equals(strn)) 098 { 099 repeatCount = Double.POSITIVE_INFINITY; 100 } 101 else 102 { 103 try { repeatCount = Double.parseDouble(strn); } 104 catch (Exception e) { repeatCount = Double.NaN; } 105 } 106 } 107 108 protected void rebuild(AnimTimeParser animTimeParser) throws SVGException 109 { 110 super.rebuild(animTimeParser); 111 112 StyleAttribute sty = new StyleAttribute(); 113 114 if (getPres(sty.setName("repeatDur"))) 115 { 116 String strn = sty.getStringValue(); 117 if (strn != null) 118 { 119 animTimeParser.ReInit(new StringReader(strn)); 120 try 121 { 122 this.repeatDur = animTimeParser.Expr(); 123 } 124 catch (ParseException ex) 125 { 126 Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, 127 "Could not parse '" + strn + "'", ex); 128 } 129 } 130 } 131 132 if (getPres(sty.setName("repeatCount"))) 133 { 134 String strn = sty.getStringValue(); 135 if (strn == null) 136 { 137 repeatCount = 1; 138 } 139 else if ("indefinite".equals(strn)) 140 { 141 repeatCount = Double.POSITIVE_INFINITY; 142 } 143 else 144 { 145 try { repeatCount = Double.parseDouble(strn); } 146 catch (Exception e) { repeatCount = Double.NaN; } 147 } 148 } 149 } 150 151 /** 152 * @return the repeatCount 153 */ 154 public double getRepeatCount() 155 { 156 return repeatCount; 157 } 158 159 /** 160 * @param repeatCount the repeatCount to set 161 */ 162 public void setRepeatCount(double repeatCount) 163 { 164 this.repeatCount = repeatCount; 165 } 166 167 /** 168 * @return the repeatDur 169 */ 170 public TimeBase getRepeatDur() 171 { 172 return repeatDur; 173 } 174 175 /** 176 * @param repeatDur the repeatDur to set 177 */ 178 public void setRepeatDur(TimeBase repeatDur) 179 { 180 this.repeatDur = repeatDur; 181 } 182}