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 @Override 067 public void evalParametric(AnimationTimeEval state, double curTime) 068 { 069 evalParametric(state, curTime, repeatCount, repeatDur == null ? Double.NaN : repeatDur.evalTime()); 070 } 071 072 @Override 073 public void loaderStartElement(SVGLoaderHelper helper, Attributes attrs, SVGElement parent) throws SAXException 074 { 075 //Load style string 076 super.loaderStartElement(helper, attrs, parent); 077 078 String repeatDurTime = attrs.getValue("repeatDur"); 079 080 try 081 { 082 if (repeatDurTime != null) 083 { 084 helper.animTimeParser.ReInit(new StringReader(repeatDurTime)); 085 this.repeatDur = helper.animTimeParser.Expr(); 086 this.repeatDur.setParentElement(this); 087 } 088 } 089 catch (Exception e) 090 { 091 throw new SAXException(e); 092 } 093 094 String strn = attrs.getValue("repeatCount"); 095 if (strn == null) 096 { 097 repeatCount = 1; 098 } 099 else if ("indefinite".equals(strn)) 100 { 101 repeatCount = Double.POSITIVE_INFINITY; 102 } 103 else 104 { 105 try { repeatCount = Double.parseDouble(strn); } 106 catch (Exception e) { repeatCount = Double.NaN; } 107 } 108 } 109 110 @Override 111 protected void rebuild(AnimTimeParser animTimeParser) throws SVGException 112 { 113 super.rebuild(animTimeParser); 114 115 StyleAttribute sty = new StyleAttribute(); 116 117 if (getPres(sty.setName("repeatDur"))) 118 { 119 String strn = sty.getStringValue(); 120 if (strn != null) 121 { 122 animTimeParser.ReInit(new StringReader(strn)); 123 try 124 { 125 this.repeatDur = animTimeParser.Expr(); 126 } 127 catch (ParseException ex) 128 { 129 Logger.getLogger(SVGConst.SVG_LOGGER).log(Level.WARNING, 130 "Could not parse '" + strn + "'", ex); 131 } 132 } 133 } 134 135 if (getPres(sty.setName("repeatCount"))) 136 { 137 String strn = sty.getStringValue(); 138 if (strn == null) 139 { 140 repeatCount = 1; 141 } 142 else if ("indefinite".equals(strn)) 143 { 144 repeatCount = Double.POSITIVE_INFINITY; 145 } 146 else 147 { 148 try { repeatCount = Double.parseDouble(strn); } 149 catch (Exception e) { repeatCount = Double.NaN; } 150 } 151 } 152 } 153 154 /** 155 * @return the repeatCount 156 */ 157 public double getRepeatCount() 158 { 159 return repeatCount; 160 } 161 162 /** 163 * @param repeatCount the repeatCount to set 164 */ 165 public void setRepeatCount(double repeatCount) 166 { 167 this.repeatCount = repeatCount; 168 } 169 170 /** 171 * @return the repeatDur 172 */ 173 public TimeBase getRepeatDur() 174 { 175 return repeatDur; 176 } 177 178 /** 179 * @param repeatDur the repeatDur to set 180 */ 181 public void setRepeatDur(TimeBase repeatDur) 182 { 183 this.repeatDur = repeatDur; 184 } 185}