gvsig-raster / org.gvsig.raster.ermapper / trunk / org.gvsig.raster.ermapper / org.gvsig.raster.ermapper.jni / src / main / java / com / ermapper / ecw / JNCSRenderer.java @ 2449
History | View | Annotate | Download (14.3 KB)
1 |
// Decompiled by Jad v1.5.8f. Copyright 2001 Pavel Kouznetsov.
|
---|---|
2 |
// Jad home page: http://www.kpdus.com/jad.html
|
3 |
// Decompiler options: packimports(3)
|
4 |
// Source File Name: JNCSRenderer.java
|
5 |
|
6 |
package com.ermapper.ecw; |
7 |
|
8 |
import com.ermapper.util.JNCSDatasetPoint; |
9 |
import com.ermapper.util.JNCSWorldPoint; |
10 |
import java.awt.*; |
11 |
import java.awt.image.*; |
12 |
import java.io.PrintStream; |
13 |
import java.util.StringTokenizer; |
14 |
|
15 |
// Referenced classes of package com.ermapper.ecw:
|
16 |
// JNCSFile, JNCSException, JNCSFileOpenFailedException, JNCSFileNotOpenException,
|
17 |
// JNCSInvalidSetViewException, JNCSProgressiveUpdate
|
18 |
|
19 |
public class JNCSRenderer extends JNCSFile |
20 |
{ |
21 |
|
22 |
public JNCSRenderer()
|
23 |
throws JNCSException
|
24 |
{ |
25 |
pRGBArray = null;
|
26 |
outputDeviceCoords = new double[4]; |
27 |
ecwImage = null;
|
28 |
prevImageSizeX = -1;
|
29 |
prevImageSizeY = -1;
|
30 |
bHaveValidSetView = false;
|
31 |
transparencyValue = 1.0F;
|
32 |
alphaComposite = null;
|
33 |
memImSource = null;
|
34 |
} |
35 |
|
36 |
public JNCSRenderer(String s, boolean flag) |
37 |
throws JNCSFileOpenFailedException, JNCSException
|
38 |
{ |
39 |
pRGBArray = null;
|
40 |
outputDeviceCoords = new double[4]; |
41 |
ecwImage = null;
|
42 |
prevImageSizeX = -1;
|
43 |
prevImageSizeY = -1;
|
44 |
bHaveValidSetView = false;
|
45 |
transparencyValue = 1.0F;
|
46 |
alphaComposite = null;
|
47 |
memImSource = null;
|
48 |
open(s, flag); |
49 |
} |
50 |
|
51 |
public void setTransparency(float f) |
52 |
{ |
53 |
transparencyValue = f; |
54 |
if(bHave1_2VM)
|
55 |
alphaComposite = AlphaComposite.getInstance(3, transparencyValue); |
56 |
} |
57 |
|
58 |
public int setView(int i, int ai[], int j, int k, int l, int i1, int j1, |
59 |
int k1)
|
60 |
throws JNCSFileNotOpenException, JNCSInvalidSetViewException
|
61 |
{ |
62 |
int l1 = j;
|
63 |
int i2 = k;
|
64 |
int j2 = l;
|
65 |
int k2 = i1;
|
66 |
if(j < 0) |
67 |
l1 = 0;
|
68 |
if(k < 0) |
69 |
i2 = 0;
|
70 |
if(l > super.width - 1) |
71 |
j2 = super.width - 1; |
72 |
if(i1 > super.height - 1) |
73 |
k2 = super.height - 1; |
74 |
int l2 = (int)Math.round(((double)(l1 - j) / (double)(l - j)) * (double)j1); |
75 |
int i3 = (int)Math.round(((double)(i2 - k) / (double)(i1 - k)) * (double)k1); |
76 |
int j3 = (int)Math.round(((double)(j2 - j) / (double)(l - j)) * (double)j1); |
77 |
int k3 = (int)Math.round(((double)(k2 - k) / (double)(i1 - k)) * (double)k1); |
78 |
super.setView(i, ai, l1, i2, j2, k2, j3 - l2, k3 - i3);
|
79 |
bHaveValidSetView = true;
|
80 |
if(!super.progressive) |
81 |
{ |
82 |
dRendererSetViewDatasetTLX = l1; |
83 |
dRendererSetViewDatasetTLY = l1; |
84 |
dRendererSetViewDatasetBRX = j2; |
85 |
dRendererSetViewDatasetBRY = k2; |
86 |
dRendererSetViewWidth = j3 - l2; |
87 |
dRendererSetViewHeight = k3 - i3; |
88 |
} |
89 |
return 0; |
90 |
} |
91 |
|
92 |
public int setView(int i, int ai[], double d, double d1, double d2, double d3, int j, int k) |
93 |
throws JNCSFileNotOpenException, JNCSInvalidSetViewException
|
94 |
{ |
95 |
JNCSDatasetPoint jncsdatasetpoint = convertWorldToDataset(d, d1); |
96 |
JNCSDatasetPoint jncsdatasetpoint1 = convertWorldToDataset(d2, d3); |
97 |
double d4 = d;
|
98 |
double d5 = d1;
|
99 |
double d6 = d2;
|
100 |
double d7 = d3;
|
101 |
jncsdatasetpoint.x = (int)Math.floor((d4 - super.originX) / super.cellIncrementX); |
102 |
jncsdatasetpoint.y = (int)Math.floor((d5 - super.originY) / super.cellIncrementY); |
103 |
jncsdatasetpoint1.x = (int)Math.ceil((d6 - super.originX) / super.cellIncrementX); |
104 |
jncsdatasetpoint1.y = (int)Math.ceil((d7 - super.originY) / super.cellIncrementY); |
105 |
JNCSWorldPoint jncsworldpoint = convertDatasetToWorld(jncsdatasetpoint.x, jncsdatasetpoint.y); |
106 |
JNCSWorldPoint jncsworldpoint1 = convertDatasetToWorld(jncsdatasetpoint1.x, jncsdatasetpoint1.y); |
107 |
d4 = jncsworldpoint.x; |
108 |
d5 = jncsworldpoint.y; |
109 |
d6 = jncsworldpoint1.x; |
110 |
d7 = jncsworldpoint1.y; |
111 |
if(jncsdatasetpoint.x < 0) |
112 |
d4 = super.originX;
|
113 |
if(jncsdatasetpoint.y < 0) |
114 |
d5 = super.originY;
|
115 |
if(jncsdatasetpoint1.x > super.width - 1) |
116 |
d6 = super.originX + (double)(super.width - 1) * super.cellIncrementX; |
117 |
if(jncsdatasetpoint1.y > super.height - 1) |
118 |
d7 = super.originY + (double)(super.height - 1) * super.cellIncrementY; |
119 |
if(jncsdatasetpoint.x < 0 && jncsdatasetpoint1.x < 0 || jncsdatasetpoint.x > super.width - 1 && jncsdatasetpoint1.x > super.width - 1) |
120 |
{ |
121 |
bHaveValidSetView = false;
|
122 |
return 1; |
123 |
} |
124 |
if(jncsdatasetpoint.y < 0 && jncsdatasetpoint1.y < 0 || jncsdatasetpoint.y > super.height - 1 && jncsdatasetpoint1.y > super.height - 1) |
125 |
{ |
126 |
bHaveValidSetView = false;
|
127 |
return 1; |
128 |
} |
129 |
int l = (int)Math.round(((d4 - d) / (d2 - d)) * (double)j); |
130 |
int i1 = (int)Math.round(((d5 - d1) / (d3 - d1)) * (double)k); |
131 |
int j1 = (int)Math.round(((d6 - d) / (d2 - d)) * (double)j); |
132 |
int k1 = (int)Math.round(((d7 - d1) / (d3 - d1)) * (double)k); |
133 |
if(j1 - l > jncsdatasetpoint1.x - jncsdatasetpoint.x)
|
134 |
{ |
135 |
j1 = jncsdatasetpoint1.x; |
136 |
l = jncsdatasetpoint.x; |
137 |
} |
138 |
if(k1 - i1 > jncsdatasetpoint1.y - jncsdatasetpoint.y)
|
139 |
{ |
140 |
k1 = jncsdatasetpoint1.y; |
141 |
i1 = jncsdatasetpoint.y; |
142 |
} |
143 |
if(j1 - l < 1 || k1 - i1 < 1) |
144 |
{ |
145 |
bHaveValidSetView = false;
|
146 |
return 1; |
147 |
} |
148 |
super.setView(i, ai, d4, d5, d6, d7, j1 - l, k1 - i1);
|
149 |
bHaveValidSetView = true;
|
150 |
if(!super.progressive) |
151 |
{ |
152 |
dRendererSetViewWorldTLX = d4; |
153 |
dRendererSetViewWorldTLY = d5; |
154 |
dRendererSetViewWorldBRX = d6; |
155 |
dRendererSetViewWorldBRY = d7; |
156 |
dRendererSetViewWidth = j1 - l; |
157 |
dRendererSetViewHeight = k1 - i1; |
158 |
} |
159 |
return 0; |
160 |
} |
161 |
|
162 |
public void refreshUpdate(int i, int j, double d, double d1, double d2, double d3) |
163 |
{ |
164 |
ecwReadImage(i, j, d, d1, d2, d3); |
165 |
if(super.progImageClient != null) |
166 |
super.progImageClient.refreshUpdate(i, j, d, d1, d2, d3);
|
167 |
} |
168 |
|
169 |
public void refreshUpdate(int i, int j, int k, int l, double d, int i1) |
170 |
{ |
171 |
ecwReadImage(i, j, k, l, d, i1); |
172 |
if(super.progImageClient != null) |
173 |
super.progImageClient.refreshUpdate(i, j, k, l, d, i1);
|
174 |
} |
175 |
|
176 |
private boolean ecwReadImage(int i, int j, double d, double d1, double d2, double d3) |
177 |
{ |
178 |
Image image = null; |
179 |
boolean flag = false; |
180 |
if(prevImageSizeX != i || prevImageSizeY != j)
|
181 |
{ |
182 |
pRGBArray = new int[i * j]; |
183 |
prevImageSizeX = i; |
184 |
prevImageSizeY = j; |
185 |
flag = true;
|
186 |
} |
187 |
try
|
188 |
{ |
189 |
readImageRGBA(pRGBArray, i, j); |
190 |
if(flag)
|
191 |
{ |
192 |
memImSource = null;
|
193 |
memImSource = new MemoryImageSource(i, j, ecwColorModel, pRGBArray, 0, i); |
194 |
} else
|
195 |
{ |
196 |
memImSource.newPixels(pRGBArray, ecwColorModel, 0, i);
|
197 |
} |
198 |
} |
199 |
catch(JNCSException jncsexception)
|
200 |
{ |
201 |
System.out.print(String.valueOf(String.valueOf((new StringBuffer("readImageRGBA failed :")).append(jncsexception.toString()).append("\n")))); |
202 |
bHaveValidSetView = false;
|
203 |
boolean flag1 = false; |
204 |
return flag1;
|
205 |
} |
206 |
image = Toolkit.getDefaultToolkit().createImage(memImSource);
|
207 |
if(ecwImage == null) |
208 |
{ |
209 |
ecwImage = image; |
210 |
dRendererWorldTLX = d; |
211 |
dRendererWorldTLY = d1; |
212 |
dRendererWorldBRX = d2; |
213 |
dRendererWorldBRY = d3; |
214 |
} else
|
215 |
{ |
216 |
synchronized(ecwImage)
|
217 |
{ |
218 |
ecwImage = image; |
219 |
dRendererWorldTLX = d; |
220 |
dRendererWorldTLY = d1; |
221 |
dRendererWorldBRX = d2; |
222 |
dRendererWorldBRY = d3; |
223 |
} |
224 |
} |
225 |
bHaveValidSetView = false;
|
226 |
return true; |
227 |
} |
228 |
|
229 |
public void drawImage(Graphics g, int i, int j, int k, int l, double d, |
230 |
double d1, double d2, double d3, ImageObserver imageobserver) |
231 |
{ |
232 |
if(!super.progressive && bHaveValidSetView) |
233 |
ecwReadImage(dRendererSetViewWidth, dRendererSetViewHeight, dRendererSetViewWorldTLX, dRendererSetViewWorldTLY, dRendererSetViewWorldBRX, dRendererSetViewWorldBRY); |
234 |
if(super.progressive && ecwImage == null) |
235 |
return;
|
236 |
synchronized(ecwImage)
|
237 |
{ |
238 |
if(bHave1_2VM)
|
239 |
if((double)transparencyValue == 1.0D); |
240 |
calculateDeviceCoords(i, j, i + k, j + l, d, d1, d2, d3, outputDeviceCoords); |
241 |
int i1 = (int)Math.round(outputDeviceCoords[2] - outputDeviceCoords[0]); |
242 |
int j1 = (int)Math.round(outputDeviceCoords[3] - outputDeviceCoords[1]); |
243 |
int k1 = ecwImage.getWidth(imageobserver);
|
244 |
int l1 = ecwImage.getHeight(imageobserver);
|
245 |
if(i1 != k1 || j1 != l1)
|
246 |
{ |
247 |
if(i1 > k1 && j1 > l1)
|
248 |
{ |
249 |
double d4 = outputDeviceCoords[0] >= (double)i ? outputDeviceCoords[0] : i; |
250 |
double d5 = outputDeviceCoords[1] >= (double)j ? outputDeviceCoords[1] : j; |
251 |
double d6 = outputDeviceCoords[2] <= (double)(i + k) ? outputDeviceCoords[2] : i + k; |
252 |
double d7 = outputDeviceCoords[3] <= (double)(j + l) ? outputDeviceCoords[3] : j + l; |
253 |
double ad[] = calculateImageCoords(outputDeviceCoords[0], outputDeviceCoords[1], outputDeviceCoords[2], outputDeviceCoords[3], k1, l1, d4, d5, d6, d7); |
254 |
ad[0] = Math.floor(ad[0]); |
255 |
ad[1] = Math.floor(ad[1]); |
256 |
ad[2] = Math.ceil(ad[2]); |
257 |
ad[3] = Math.ceil(ad[3]); |
258 |
double d8 = dRendererWorldTLX + ((dRendererWorldBRX - dRendererWorldTLX) / (double)k1) * ad[0]; |
259 |
double d9 = dRendererWorldTLY + ((dRendererWorldBRY - dRendererWorldTLY) / (double)l1) * ad[1]; |
260 |
double d10 = dRendererWorldTLX + ((dRendererWorldBRX - dRendererWorldTLX) / (double)k1) * ad[2]; |
261 |
double d11 = dRendererWorldTLY + ((dRendererWorldBRY - dRendererWorldTLY) / (double)l1) * ad[3]; |
262 |
double d12 = ((outputDeviceCoords[2] - outputDeviceCoords[0]) * (d8 - dRendererWorldTLX)) / (dRendererWorldBRX - dRendererWorldTLX) + outputDeviceCoords[0]; |
263 |
double d13 = ((outputDeviceCoords[3] - outputDeviceCoords[1]) * (d9 - dRendererWorldTLY)) / (dRendererWorldBRY - dRendererWorldTLY) + outputDeviceCoords[1]; |
264 |
double d14 = ((outputDeviceCoords[2] - outputDeviceCoords[0]) * (d10 - dRendererWorldTLX)) / (dRendererWorldBRX - dRendererWorldTLX) + outputDeviceCoords[0]; |
265 |
double d15 = ((outputDeviceCoords[3] - outputDeviceCoords[1]) * (d11 - dRendererWorldTLY)) / (dRendererWorldBRY - dRendererWorldTLY) + outputDeviceCoords[1]; |
266 |
g.drawImage(ecwImage, (int)Math.round(d12), (int)Math.round(d13), (int)Math.round(d14), (int)Math.round(d15), (int)Math.floor(ad[0]), (int)Math.floor(ad[1]), (int)Math.ceil(ad[2]), (int)Math.ceil(ad[3]), imageobserver); |
267 |
} else
|
268 |
{ |
269 |
g.drawImage(ecwImage, (int)Math.round(outputDeviceCoords[0]), (int)Math.round(outputDeviceCoords[1]), (int)Math.round(outputDeviceCoords[2]), (int)Math.round(outputDeviceCoords[3]), 0, 0, k1, l1, imageobserver); |
270 |
} |
271 |
} else
|
272 |
{ |
273 |
g.drawImage(ecwImage, (int)Math.round(outputDeviceCoords[0]), (int)Math.round(outputDeviceCoords[1]), imageobserver); |
274 |
} |
275 |
if(bHave1_2VM)
|
276 |
if((double)transparencyValue == 1.0D); |
277 |
} |
278 |
} |
279 |
|
280 |
private static final double[] calculateImageCoords(double d, double d1, double d2, double d3, |
281 |
double d4, double d5, double d6, double d7, double d8, double d9) |
282 |
{ |
283 |
double ad[] = new double[4]; |
284 |
double d10 = ((d8 - d6) * d4) / (d2 - d);
|
285 |
double d11 = ((d9 - d7) * d5) / (d3 - d1);
|
286 |
ad[0] = ((d6 - d) * d10) / (d8 - d6);
|
287 |
ad[1] = ((d7 - d1) * d11) / (d9 - d7);
|
288 |
ad[2] = ad[0] + d10; |
289 |
ad[3] = ad[1] + d11; |
290 |
return ad;
|
291 |
} |
292 |
|
293 |
private final void calculateDeviceCoords(int i, int j, int k, int l, double d, double d1, double d2, double d3, double ad[]) |
294 |
{ |
295 |
ad[0] = ((dRendererWorldTLX - d) / (d2 - d)) * (double)(k - i); |
296 |
ad[1] = ((dRendererWorldTLY - d1) / (d3 - d1)) * (double)(l - j); |
297 |
ad[2] = ((dRendererWorldBRX - d) / (d2 - d)) * (double)(k - i); |
298 |
ad[3] = ((dRendererWorldBRY - d1) / (d3 - d1)) * (double)(l - j); |
299 |
} |
300 |
|
301 |
private final void convertImageToWorld(int i, int j, double d, double d1, double ad[]) |
302 |
{ |
303 |
ad[0] = dRendererWorldTLX + ((dRendererWorldBRX - dRendererWorldTLX) / (double)i) * d; |
304 |
ad[1] = dRendererWorldTLY + ((dRendererWorldBRY - dRendererWorldTLY) / (double)j) * d1; |
305 |
} |
306 |
|
307 |
private double dRendererSetViewWorldTLX; |
308 |
private double dRendererSetViewWorldTLY; |
309 |
private double dRendererSetViewWorldBRX; |
310 |
private double dRendererSetViewWorldBRY; |
311 |
private int dRendererSetViewDatasetTLX; |
312 |
private int dRendererSetViewDatasetTLY; |
313 |
private int dRendererSetViewDatasetBRX; |
314 |
private int dRendererSetViewDatasetBRY; |
315 |
private int dRendererSetViewWidth; |
316 |
private int dRendererSetViewHeight; |
317 |
private int pRGBArray[]; |
318 |
private double outputDeviceCoords[]; |
319 |
private double dRendererWorldTLX; |
320 |
private double dRendererWorldTLY; |
321 |
private double dRendererWorldBRX; |
322 |
private double dRendererWorldBRY; |
323 |
private Image ecwImage; |
324 |
private int prevImageSizeX; |
325 |
private int prevImageSizeY; |
326 |
private boolean bHaveValidSetView; |
327 |
private float transparencyValue; |
328 |
private AlphaComposite alphaComposite; |
329 |
private static boolean bHave1_2VM = false; |
330 |
private MemoryImageSource memImSource; |
331 |
private static DirectColorModel ecwColorModel = null; |
332 |
private static final boolean bOptimizeImageStretch = true; |
333 |
|
334 |
static
|
335 |
{ |
336 |
String s = System.getProperty("java.version"); |
337 |
StringTokenizer stringtokenizer = new StringTokenizer(s, "."); |
338 |
int i = Integer.parseInt(stringtokenizer.nextToken()); |
339 |
int j = Integer.parseInt(stringtokenizer.nextToken()); |
340 |
if(i >= 1 && j >= 2) |
341 |
bHave1_2VM = true;
|
342 |
ecwColorModel = new DirectColorModel(32, 0xff0000, 65280, 255); |
343 |
} |
344 |
} |