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 February 20, 2004, 10:00 PM 035 */ 036package com.kitfox.svg; 037 038import com.kitfox.svg.xml.StyleAttribute; 039 040/** 041 * Implements an embedded font. 042 * 043 * SVG specification: http://www.w3.org/TR/SVG/fonts.html 044 * 045 * @author Mark McKay 046 * @author <a href="mailto:mark@kitfox.com">Mark McKay</a> 047 */ 048public class FontFace extends SVGElement 049{ 050 051 public static final String TAG_NAME = "fontface"; 052 String fontFamily; 053 /** 054 * Em size of coordinate system font is defined in 055 */ 056 private int unitsPerEm = 1000; 057 private int ascent = -1; 058 private int descent = -1; 059 private int accentHeight = -1; 060 private int underlinePosition = -1; 061 private int underlineThickness = -1; 062 private int strikethroughPosition = -1; 063 private int strikethroughThickness = -1; 064 private int overlinePosition = -1; 065 private int overlineThickness = -1; 066 067 /** 068 * Creates a new instance of Font 069 */ 070 public FontFace() 071 { 072 } 073 074 @Override 075 public String getTagName() 076 { 077 return TAG_NAME; 078 } 079 080 @Override 081 protected void build() throws SVGException 082 { 083 super.build(); 084 085 StyleAttribute sty = new StyleAttribute(); 086 087 if (getPres(sty.setName("font-family"))) 088 { 089 fontFamily = sty.getStringValue(); 090 } 091 092 if (getPres(sty.setName("units-per-em"))) 093 { 094 unitsPerEm = sty.getIntValue(); 095 } 096 if (getPres(sty.setName("ascent"))) 097 { 098 ascent = sty.getIntValue(); 099 } 100 if (getPres(sty.setName("descent"))) 101 { 102 descent = sty.getIntValue(); 103 } 104 if (getPres(sty.setName("accent-height"))) 105 { 106 accentHeight = sty.getIntValue(); 107 } 108 109 if (getPres(sty.setName("underline-position"))) 110 { 111 underlinePosition = sty.getIntValue(); 112 } 113 if (getPres(sty.setName("underline-thickness"))) 114 { 115 underlineThickness = sty.getIntValue(); 116 } 117 if (getPres(sty.setName("strikethrough-position"))) 118 { 119 strikethroughPosition = sty.getIntValue(); 120 } 121 if (getPres(sty.setName("strikethrough-thickenss"))) 122 { 123 strikethroughThickness = sty.getIntValue(); 124 } 125 if (getPres(sty.setName("overline-position"))) 126 { 127 overlinePosition = sty.getIntValue(); 128 } 129 if (getPres(sty.setName("overline-thickness"))) 130 { 131 overlineThickness = sty.getIntValue(); 132 } 133 } 134 135 public String getFontFamily() 136 { 137 return fontFamily; 138 } 139 140 public int getUnitsPerEm() 141 { 142 return unitsPerEm; 143 } 144 145 public int getAscent() 146 { 147 if (ascent == -1) 148 { 149 ascent = unitsPerEm - ((Font) parent).getVertOriginY(); 150 } 151 return ascent; 152 } 153 154 public int getDescent() 155 { 156 if (descent == -1) 157 { 158 descent = ((Font) parent).getVertOriginY(); 159 } 160 return descent; 161 } 162 163 public int getAccentHeight() 164 { 165 if (accentHeight == -1) 166 { 167 accentHeight = getAscent(); 168 } 169 return accentHeight; 170 } 171 172 public int getUnderlinePosition() 173 { 174 if (underlinePosition == -1) 175 { 176 underlinePosition = unitsPerEm * 5 / 6; 177 } 178 return underlinePosition; 179 } 180 181 public int getUnderlineThickness() 182 { 183 if (underlineThickness == -1) 184 { 185 underlineThickness = unitsPerEm / 20; 186 } 187 return underlineThickness; 188 } 189 190 public int getStrikethroughPosition() 191 { 192 if (strikethroughPosition == -1) 193 { 194 strikethroughPosition = unitsPerEm * 3 / 6; 195 } 196 return strikethroughPosition; 197 } 198 199 public int getStrikethroughThickness() 200 { 201 if (strikethroughThickness == -1) 202 { 203 strikethroughThickness = unitsPerEm / 20; 204 } 205 return strikethroughThickness; 206 } 207 208 public int getOverlinePosition() 209 { 210 if (overlinePosition == -1) 211 { 212 overlinePosition = unitsPerEm * 5 / 6; 213 } 214 return overlinePosition; 215 } 216 217 public int getOverlineThickness() 218 { 219 if (overlineThickness == -1) 220 { 221 overlineThickness = unitsPerEm / 20; 222 } 223 return overlineThickness; 224 } 225 226 /** 227 * Updates all attributes in this diagram associated with a time event. Ie, 228 * all attributes with track information. 229 * 230 * @return - true if this node has changed state as a result of the time 231 * update 232 */ 233 @Override 234 public boolean updateTime(double curTime) 235 { 236 //Fonts can't change 237 return false; 238 } 239 240 /** 241 * @param unitsPerEm the unitsPerEm to set 242 */ 243 public void setUnitsPerEm(int unitsPerEm) 244 { 245 this.unitsPerEm = unitsPerEm; 246 } 247 248 /** 249 * @param ascent the ascent to set 250 */ 251 public void setAscent(int ascent) 252 { 253 this.ascent = ascent; 254 } 255 256 /** 257 * @param descent the descent to set 258 */ 259 public void setDescent(int descent) 260 { 261 this.descent = descent; 262 } 263 264 /** 265 * @param accentHeight the accentHeight to set 266 */ 267 public void setAccentHeight(int accentHeight) 268 { 269 this.accentHeight = accentHeight; 270 } 271 272 /** 273 * @param underlinePosition the underlinePosition to set 274 */ 275 public void setUnderlinePosition(int underlinePosition) 276 { 277 this.underlinePosition = underlinePosition; 278 } 279 280 /** 281 * @param underlineThickness the underlineThickness to set 282 */ 283 public void setUnderlineThickness(int underlineThickness) 284 { 285 this.underlineThickness = underlineThickness; 286 } 287 288 /** 289 * @param strikethroughPosition the strikethroughPosition to set 290 */ 291 public void setStrikethroughPosition(int strikethroughPosition) 292 { 293 this.strikethroughPosition = strikethroughPosition; 294 } 295 296 /** 297 * @param strikethroughThickness the strikethroughThickness to set 298 */ 299 public void setStrikethroughThickness(int strikethroughThickness) 300 { 301 this.strikethroughThickness = strikethroughThickness; 302 } 303 304 /** 305 * @param overlinePosition the overlinePosition to set 306 */ 307 public void setOverlinePosition(int overlinePosition) 308 { 309 this.overlinePosition = overlinePosition; 310 } 311 312 /** 313 * @param overlineThickness the overlineThickness to set 314 */ 315 public void setOverlineThickness(int overlineThickness) 316 { 317 this.overlineThickness = overlineThickness; 318 } 319}