Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.symbology / org.gvsig.symbology.lib / org.gvsig.symbology.lib.impl / src / main / java / org / gvsig / symbology / fmap / mapcontext / rendering / legend / impl / DrawUtils.java @ 43510

History | View | Annotate | Download (7.46 KB)

1
package org.gvsig.symbology.fmap.mapcontext.rendering.legend.impl;
2

    
3
import java.awt.Graphics2D;
4
import java.awt.geom.AffineTransform;
5
import java.awt.geom.PathIterator;
6
import org.gvsig.fmap.dal.feature.Feature;
7
import org.gvsig.fmap.geom.Geometry;
8
import org.gvsig.fmap.geom.GeometryException;
9
import org.gvsig.fmap.geom.GeometryLocator;
10
import org.gvsig.fmap.geom.GeometryManager;
11
import org.gvsig.fmap.geom.aggregate.Aggregate;
12
import org.gvsig.fmap.geom.aggregate.MultiLine;
13
import org.gvsig.fmap.geom.aggregate.MultiPolygon;
14
import org.gvsig.fmap.geom.aggregate.MultiSurface;
15
import org.gvsig.fmap.geom.exception.CreateGeometryException;
16
import org.gvsig.fmap.geom.operation.GeometryOperationException;
17
import org.gvsig.fmap.geom.primitive.Curve;
18
import org.gvsig.fmap.geom.primitive.GeneralPathX;
19
import org.gvsig.fmap.geom.primitive.Surface;
20
import org.gvsig.fmap.geom.type.GeometryType;
21
import org.gvsig.fmap.mapcontext.ViewPort;
22
import org.gvsig.fmap.mapcontext.rendering.symbols.CartographicSupport;
23
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
24
import org.gvsig.tools.task.Cancellable;
25

    
26
public class DrawUtils {
27

    
28
    private static GeometryManager geometryManager = null;
29

    
30
    private static GeometryManager getGeometryManager() {
31
        if( geometryManager == null ) {
32
            geometryManager = GeometryLocator.getGeometryManager();
33
        }
34
        return geometryManager;
35
    }
36

    
37
    public static void drawInts(Graphics2D g, ViewPort viewPort, Cancellable cancel, double dpi, ISymbol symbol, Feature feature, Geometry geom) throws GeometryOperationException {
38

    
39
        try {
40
            if( geom instanceof Aggregate ) {
41
                for( Geometry prim : (Aggregate) geom ) {
42
                    drawInts(g, viewPort, cancel, dpi, symbol, feature, prim);
43
                }
44
                return;
45
            }
46

    
47
            double previousSize = ((CartographicSupport) symbol).toCartographicSize(viewPort, dpi, geom);
48
            // draw it as normally
49
            Geometry transformedGeometry;
50
            transformedGeometry = transformGeometry(geom.cloneGeometry(), viewPort.getAffineTransform());
51

    
52
            // the AffineTransform has to be null because the transformToInts method reprojects the geometry
53
            symbol.draw(g, null, transformedGeometry, feature, cancel);
54

    
55
            // restore previous size
56
            ((CartographicSupport) symbol).setCartographicSize(previousSize, geom);
57
        } catch (GeometryException e) {
58
            throw new GeometryOperationException(e);
59
        }
60
    }
61

    
62
    public static void drawInts(Graphics2D g, ViewPort viewPort, ISymbol symbol, Feature feature, Geometry geom) throws GeometryOperationException {
63

    
64
        try {
65
            if( geom instanceof Aggregate ) {
66
                for( Geometry prim : (Aggregate) geom ) {
67
                    drawInts(g, viewPort, symbol, feature, prim);
68
                }
69
                return;
70
            }
71
            Geometry transformedGeometry = transformGeometry(geom.cloneGeometry(), viewPort.getAffineTransform());
72
            symbol.draw(g, viewPort.getAffineTransform(), transformedGeometry, feature, null);
73

    
74
        } catch (GeometryException e) {
75
            throw new GeometryOperationException(e);
76
        }
77
    }
78

    
79
    /**
80
     * @param geom
81
     * @param affineTransform
82
     * @return
83
     * @throws GeometryException
84
     */
85
    private static Geometry transformGeometry(Geometry geom, AffineTransform affineTransform) throws GeometryException {
86
        if( geom.canBeTransformed(affineTransform) ) {
87
            geom.transform(affineTransform);
88
            return geom;
89
        }
90
        if( geom instanceof Curve || geom instanceof Curve ) {
91
            MultiLine lines = geom.toLines();
92
            lines.transform(affineTransform);
93
            return lines;
94
        }
95
        if( geom instanceof Surface || geom instanceof MultiSurface ) {
96
            MultiPolygon polygons = geom.toPolygons();
97
            polygons.transform(affineTransform);
98
            return polygons;
99
        }
100
        return null;
101
    }
102

    
103
    private static Geometry transformToInts(Geometry gp, AffineTransform at) throws CreateGeometryException {
104
        GeneralPathX newGp = new GeneralPathX();
105
        double[] theData = new double[6];
106
        double[] aux = new double[6];
107

    
108
        // newGp.reset();
109
        PathIterator theIterator;
110
        int theType;
111
        int numParts = 0;
112

    
113
        java.awt.geom.Point2D ptDst = new java.awt.geom.Point2D.Double();
114
        java.awt.geom.Point2D ptSrc = new java.awt.geom.Point2D.Double();
115
        boolean bFirst = true;
116
        int xInt, yInt, antX = -1, antY = -1;
117

    
118
        theIterator = gp.getPathIterator(null); //, flatness);
119
        int numSegmentsAdded = 0;
120
        while( !theIterator.isDone() ) {
121
            theType = theIterator.currentSegment(theData);
122

    
123
            switch( theType ) {
124
            case PathIterator.SEG_MOVETO:
125
                numParts++;
126
                ptSrc.setLocation(theData[0], theData[1]);
127
                at.transform(ptSrc, ptDst);
128
                antX = (int) ptDst.getX();
129
                antY = (int) ptDst.getY();
130
                newGp.moveTo(antX, antY);
131
                numSegmentsAdded++;
132
                bFirst = true;
133
                break;
134

    
135
            case PathIterator.SEG_LINETO:
136
                ptSrc.setLocation(theData[0], theData[1]);
137
                at.transform(ptSrc, ptDst);
138
                xInt = (int) ptDst.getX();
139
                yInt = (int) ptDst.getY();
140
                if( (bFirst) || ((xInt != antX) || (yInt != antY)) ) {
141
                    newGp.lineTo(xInt, yInt);
142
                    antX = xInt;
143
                    antY = yInt;
144
                    bFirst = false;
145
                    numSegmentsAdded++;
146
                }
147
                break;
148

    
149
            case PathIterator.SEG_QUADTO:
150
                at.transform(theData, 0, aux, 0, 2);
151
                newGp.quadTo(aux[0], aux[1], aux[2], aux[3]);
152
                numSegmentsAdded++;
153
                break;
154

    
155
            case PathIterator.SEG_CUBICTO:
156
                at.transform(theData, 0, aux, 0, 3);
157
                newGp.curveTo(aux[0], aux[1], aux[2], aux[3], aux[4], aux[5]);
158
                numSegmentsAdded++;
159
                break;
160

    
161
            case PathIterator.SEG_CLOSE:
162
                if( numSegmentsAdded < 3 ) {
163
                    newGp.lineTo(antX, antY);
164
                }
165
                newGp.closePath();
166

    
167
                break;
168
            } //end switch
169

    
170
            theIterator.next();
171
        } //end while loop
172

    
173
        Geometry geom = null;
174
        GeometryType geometryType = gp.getGeometryType();
175

    
176
        if( geometryType.isTypeOf(Geometry.TYPES.POINT) ) {
177
            geom = getGeometryManager().createPoint(ptDst.getX(), ptDst.getY(), Geometry.SUBTYPES.GEOM2D);
178
        } else if( geometryType.isTypeOf(Geometry.TYPES.MULTIPOINT) ) {
179
            geom = getGeometryManager().createMultiPoint(newGp, Geometry.SUBTYPES.GEOM2D);
180
        } else if( geometryType.isTypeOf(Geometry.TYPES.CURVE) ) {
181
            geom = getGeometryManager().createCurve(newGp, Geometry.SUBTYPES.GEOM2D);
182
        } else if( geometryType.isTypeOf(Geometry.TYPES.MULTICURVE) ) {
183
            geom = getGeometryManager().createMultiCurve(newGp, Geometry.SUBTYPES.GEOM2D);
184
        } else if( geometryType.isTypeOf(Geometry.TYPES.SURFACE) ) {
185
            geom = getGeometryManager().createSurface(newGp, Geometry.SUBTYPES.GEOM2D);
186
        } else if( geometryType.isTypeOf(Geometry.TYPES.MULTISURFACE) ) {
187
            geom = getGeometryManager().createMultiSurface(newGp, Geometry.SUBTYPES.GEOM2D);
188
        }
189
        return geom;
190
    }
191

    
192
}