source: josm/trunk/src/com/kitfox/svg/RenderableElement.java@ 10746

Last change on this file since 10746 was 8084, checked in by bastiK, 10 years ago

add svn:eol-style=native for svgsalamander

  • Property svn:eol-style set to native
File size: 5.6 KB
Line 
1/*
2 * SVG Salamander
3 * Copyright (c) 2004, Mark McKay
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or
7 * without modification, are permitted provided that the following
8 * conditions are met:
9 *
10 * - Redistributions of source code must retain the above
11 * copyright notice, this list of conditions and the following
12 * disclaimer.
13 * - Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials
16 * provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
29 * OF THE POSSIBILITY OF SUCH DAMAGE.
30 *
31 * Mark McKay can be contacted at mark@kitfox.com. Salamander and other
32 * projects can be found at http://www.kitfox.com
33 *
34 * Created on January 26, 2004, 9:00 AM
35 */
36package com.kitfox.svg;
37
38import com.kitfox.svg.xml.StyleAttribute;
39import java.awt.Graphics2D;
40import java.awt.Shape;
41import java.awt.geom.AffineTransform;
42import java.awt.geom.Area;
43import java.awt.geom.Point2D;
44import java.awt.geom.Rectangle2D;
45import java.net.URI;
46import java.util.List;
47
48/**
49 * Maintains bounding box for this element
50 *
51 * @author Mark McKay
52 * @author <a href="mailto:mark@kitfox.com">Mark McKay</a>
53 */
54abstract public class RenderableElement extends TransformableElement
55{
56 AffineTransform cachedXform = null;
57
58 Shape cachedClip = null;
59 public static final int VECTOR_EFFECT_NONE = 0;
60 public static final int VECTOR_EFFECT_NON_SCALING_STROKE = 1;
61 int vectorEffect;
62
63 /**
64 * Creates a new instance of BoundedElement
65 */
66 public RenderableElement()
67 {
68 }
69
70 public RenderableElement(String id, SVGElement parent)
71 {
72 super(id, parent);
73 }
74
75 protected void build() throws SVGException
76 {
77 super.build();
78
79 StyleAttribute sty = new StyleAttribute();
80
81 if (getPres(sty.setName("vector-effect")))
82 {
83 if ("non-scaling-stroke".equals(sty.getStringValue()))
84 {
85 vectorEffect = VECTOR_EFFECT_NON_SCALING_STROKE;
86 } else
87 {
88 vectorEffect = VECTOR_EFFECT_NONE;
89 }
90 } else
91 {
92 vectorEffect = VECTOR_EFFECT_NONE;
93 }
94 }
95
96 abstract public void render(Graphics2D g) throws SVGException;
97
98 abstract void pick(Point2D point, boolean boundingBox, List retVec) throws SVGException;
99
100 abstract void pick(Rectangle2D pickArea, AffineTransform ltw, boolean boundingBox, List retVec) throws SVGException;
101
102 abstract public Rectangle2D getBoundingBox() throws SVGException;
103 /*
104 public void loaderStartElement(SVGLoaderHelper helper, Attributes attrs, SVGElement parent)
105 {
106 super.loaderStartElement(helper, attrs, parent);
107 }
108 */
109
110 /**
111 * Pushes transform stack, transforms to local coordinates and sets up
112 * clipping mask.
113 */
114 protected void beginLayer(Graphics2D g) throws SVGException
115 {
116 if (xform != null)
117 {
118 cachedXform = g.getTransform();
119 g.transform(xform);
120 }
121
122 StyleAttribute styleAttrib = new StyleAttribute();
123
124 //Get clipping path
125// StyleAttribute styleAttrib = getStyle("clip-path", false);
126 Shape clipPath = null;
127 int clipPathUnits = ClipPath.CP_USER_SPACE_ON_USE;
128 if (getStyle(styleAttrib.setName("clip-path"), false)
129 && !"none".equals(styleAttrib.getStringValue()))
130 {
131 URI uri = styleAttrib.getURIValue(getXMLBase());
132 if (uri != null)
133 {
134 ClipPath ele = (ClipPath) diagram.getUniverse().getElement(uri);
135 clipPath = ele.getClipPathShape();
136 clipPathUnits = ele.getClipPathUnits();
137 }
138 }
139
140 //Return if we're out of clipping range
141 if (clipPath != null)
142 {
143 if (clipPathUnits == ClipPath.CP_OBJECT_BOUNDING_BOX && (this instanceof ShapeElement))
144 {
145 Rectangle2D rect = ((ShapeElement) this).getBoundingBox();
146 AffineTransform at = new AffineTransform();
147 at.scale(rect.getWidth(), rect.getHeight());
148 clipPath = at.createTransformedShape(clipPath);
149 }
150
151 cachedClip = g.getClip();
152 if (cachedClip == null)
153 {
154 g.setClip(clipPath);
155 } else
156 {
157 Area newClip = new Area(cachedClip);
158 newClip.intersect(new Area(clipPath));
159 g.setClip(newClip);
160 }
161 }
162 }
163
164 /**
165 * Restores transform and clipping values to the way they were before this
166 * layer was drawn.
167 */
168 protected void finishLayer(Graphics2D g)
169 {
170 if (cachedClip != null)
171 {
172 g.setClip(cachedClip);
173 }
174
175 if (cachedXform != null)
176 {
177 g.setTransform(cachedXform);
178 }
179 }
180}
Note: See TracBrowser for help on using the repository browser.