Statistics
| Revision:

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
}