/[schmitzm]/branches/2.4.x/src/skrueger/geotools/RenderingExecutor.java
ViewVC logotype

Contents of /branches/2.4.x/src/skrueger/geotools/RenderingExecutor.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1145 - (show annotations)
Sun Oct 17 23:56:07 2010 UTC (14 years, 4 months ago) by alfonx
Original Path: trunk/src/skrueger/geotools/RenderingExecutor.java
File size: 5119 byte(s)
AtlasStyler now allows to configure textclasses per language... still a bit experimental
1 package skrueger.geotools;
2
3 import java.awt.Graphics2D;
4 import java.awt.Rectangle;
5 import java.awt.geom.AffineTransform;
6
7 import org.apache.log4j.Logger;
8 import org.geotools.filter.function.EnvFunction;
9 import org.geotools.geometry.jts.ReferencedEnvelope;
10 import org.geotools.renderer.GTRenderer;
11 import org.geotools.renderer.RenderListener;
12 import org.opengis.feature.simple.SimpleFeature;
13
14 import schmitzm.geotools.gui.XMapPane;
15
16 /**
17 * This class is used by {@link XMapPane} to start and stop the rendering a
18 * {@link Thread} for rendering.
19 */
20 public class RenderingExecutor {
21 private final static Logger LOGGER = Logger
22 .getLogger(RenderingExecutor.class);
23 /**
24 * Instance to a {@link RenderThread} doing any work. It's volatile so the
25 * correct value will always be visible to any {@link Thread}
26 **/
27 private volatile RenderThread renderThread;
28
29 private final XMapPane mapPane;
30
31 public RenderingExecutor(XMapPane mapPane) {
32 this.mapPane = mapPane;
33 }
34
35 /**
36 * Submit a new rendering task. If no rendering task is presently running
37 * this new job will be accepted; otherwise it will be rejected and it
38 * returns <code>false</code>.
39 *
40 * @param envelope
41 * the map area (world coordinates) to be rendered.
42 * @param graphics
43 * the graphics object to draw on.
44 * @param paintArea
45 * size of the area to paint the world into.
46 * @param worldToScreen
47 * the {@link AffineTransform} from world coordinates to screen
48 * coordinates.
49 * @param renderer
50 * the {@link GTRenderer} to use.
51 *
52 * @return true if the rendering task was accepted; false if it was rejected
53 */
54 public synchronized boolean submit(ReferencedEnvelope envelope,
55 Rectangle paintArea, Graphics2D graphics, final GTRenderer renderer) {
56 if (renderThread == null || !renderThread.isAlive()) {
57 // System.out.println("is vacant... starting thread!");
58 renderThread = null;
59
60 renderThread = new RenderThread(paintArea, graphics, renderer,
61 envelope);
62 renderThread.start();
63
64 return true;
65 } else {
66 renderThread.getRenderer().stopRendering();
67 return false;
68 }
69 }
70
71 /**
72 * For every new rendering job submitted and accepted, an instance of this
73 * {@link Thread} will be started.
74 *
75 */
76 class RenderThread extends Thread {
77
78 private final GTRenderer renderer;
79
80 public RenderThread(final Rectangle paintArea,
81 final Graphics2D graphics, GTRenderer renderer,
82 ReferencedEnvelope mapEnv) {
83 super(new RenderRun(paintArea, graphics, renderer, mapEnv));
84 this.renderer = renderer;
85
86 setName("Render" + getName());
87
88 }
89
90 public GTRenderer getRenderer() {
91 return renderer;
92 }
93
94 }
95
96 /**
97 * This {@link Runnable} will actually start the rendering
98 */
99 class RenderRun implements Runnable, RenderListener {
100 private final Rectangle paintArea;
101 private final Graphics2D graphics;
102 private final GTRenderer renderer;
103 private final ReferencedEnvelope mapEnv;
104
105 public RenderRun(Rectangle paintArea, Graphics2D graphics,
106 GTRenderer renderer, ReferencedEnvelope mapEnv) {
107 this.paintArea = paintArea;
108 this.graphics = graphics;
109 this.renderer = renderer;
110 this.mapEnv = mapEnv;
111 }
112
113 @Override
114 public void run() {
115 long startT = System.currentTimeMillis();
116 try {
117 renderer.addRenderListener(this);
118 // LOGGER.debug("start rendering...");
119
120 // Clear the graphics context
121 graphics.setBackground(mapPane.getMapBackgroundColor());
122 graphics.clearRect(paintArea.x, paintArea.y, paintArea.width,
123 paintArea.height);
124
125 // TODO It should be enough to set only the Local Value, but it isn't
126 EnvFunction.setGlobalValue(XMapPane.ENV_LANG,
127 mapPane.getRenderLanguage());
128 EnvFunction.setLocalValue(XMapPane.ENV_LANG,
129 mapPane.getRenderLanguage());
130
131 // LOGGER.debug("Renderer language set to "
132 // + mapPane.getRenderLanguage());
133
134 renderer.paint(graphics, paintArea, mapEnv);
135
136 // Kill the reference to this Thread so #isRunning will say
137 // false directly
138 renderThread = null;
139 mapPane.onRenderingCompleted(System.currentTimeMillis()
140 - startT);
141 } catch (Exception e) {
142 mapPane.onRenderingFailed(e);
143 } finally {
144 renderer.removeRenderListener(this);
145 }
146 }
147
148 @Override
149 public void errorOccurred(Exception e) {
150 mapPane.onRenderingFailed(e);
151 }
152
153 @Override
154 public void featureRenderer(SimpleFeature feature) {
155 }
156
157 }
158
159 /**
160 * Ask to stop the rendering. May be called often.
161 */
162 public void cancelTask() {
163 if (renderThread != null)
164 synchronized (renderThread) {
165 if (renderThread.isAlive()) {
166 if (renderThread.getRenderer() != null)
167 renderThread.getRenderer().stopRendering();
168 }
169 }
170 }
171
172 /**
173 * @return <code>true</code> if the {@link Thread} is busy rendering.
174 */
175 public boolean isRunning() {
176 return (renderThread != null && renderThread.isAlive());
177 }
178
179 /**
180 * Will stop rendering and remove the reference to the {@link Thread}.
181 */
182 public void dispose() {
183 if (renderThread != null) {
184 renderThread.renderer.stopRendering();
185 renderThread = null;
186 }
187 }
188
189 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26