Statistics
| Revision:

root / org.gvsig.legend.urbanhorizontalsignage / trunk / org.gvsig.legend.urbanhorizontalsignage / org.gvsig.legend.urbanhorizontalsignage.lib / org.gvsig.legend.urbanhorizontalsignage.lib.impl / src / main / java / org / gvsig / legend / urbanverticalsignage / lib / impl / ImageMarkerSymbol.java @ 5143

History | View | Annotate | Download (4.51 KB)

1
package org.gvsig.legend.urbanverticalsignage.lib.impl;
2

    
3
import java.awt.Graphics2D;
4
import java.awt.Rectangle;
5
import java.awt.geom.AffineTransform;
6
import java.awt.geom.Point2D;
7
import java.awt.image.BufferedImage;
8
import org.gvsig.fmap.dal.feature.Feature;
9
import org.gvsig.fmap.geom.Geometry;
10
import org.gvsig.fmap.geom.primitive.Point;
11
import org.gvsig.fmap.mapcontext.MapContext;
12
import org.gvsig.fmap.mapcontext.rendering.symbols.ISymbol;
13
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.impl.CartographicSupportToolkit;
14
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.IMarkerSymbol;
15
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.marker.impl.AbstractMarkerSymbol;
16
import org.gvsig.tools.task.Cancellable;
17

    
18
/**
19
 *
20
 * @author gvSIG Team
21
 */
22
@SuppressWarnings("UseSpecificCatch")
23
public class ImageMarkerSymbol extends AbstractMarkerSymbol implements  IMarkerSymbol {
24

    
25
    private ImageMarkerSymbol selectionSym;
26
    private boolean selected;
27
    private BufferedImage image;
28
    private BufferedImage imagesel;
29
    
30
    void setImage(BufferedImage img) {
31
        this.image = img;
32
    }
33
    
34
    void setImageSel(BufferedImage img) {
35
        this.imagesel = img;
36
    }
37
    
38
    @Override
39
    public void draw(Graphics2D g, AffineTransform affineTransform, Geometry geom, Feature f, Cancellable cancel) {
40
        Point p;
41
        try {
42
            p = geom.centroid();
43
        } catch (Exception ex) {
44
            return;
45
        }
46
        if (affineTransform != null) {
47
            p.transform(affineTransform);
48
        }
49
        double x, y;
50
        int size = (int) Math.round(getEfectiveSize(f));
51
        double halfSize = getEfectiveSize(f) / 2;
52
        x = p.getX() - halfSize;
53
        y = p.getY() - halfSize;
54
        Point2D theOffset = this.getEfectiveOffset(f);
55
        int xOffset = (int) theOffset.getX();
56
        int yOffset = (int) theOffset.getY();
57

    
58
        if (size > 0) {
59
            if( isDrawLineToOffset() ) {
60
                g.setColor(this.getEfectiveLineToOffsetColor(f));
61
                g.drawLine((int)p.getX(), (int)p.getY(), (int)p.getX() + xOffset, (int)p.getY() + yOffset);
62
            }
63
            Rectangle rect = new Rectangle(size, size);
64
            g.translate(x + xOffset, y + yOffset);
65
            double auxRotation = getEfectiveRotationInRadians(f);
66
            g.rotate(auxRotation, halfSize, halfSize);
67
            
68
            this.drawInsideRectangle(g, rect, true);
69
            
70
            g.rotate(-auxRotation, halfSize, halfSize);
71
            g.translate(-(x + xOffset), -(y + yOffset));
72
            
73
        }
74
    }
75

    
76
    private void drawInsideRectangle(Graphics2D g, Rectangle r, boolean keepAspectRatio) {
77
        BufferedImage theImage = (!selected) ? this.image : this.imagesel;
78
        if (theImage != null) {
79

    
80
            double xOffset = 0;
81
            double yOffset = 0;
82
            @SuppressWarnings("UnusedAssignment")
83
            double xScale = 1;
84
            @SuppressWarnings("UnusedAssignment")
85
            double yScale = 1;
86
            if (keepAspectRatio) {
87
                double scale;
88
                if (theImage.getWidth() > theImage.getHeight()) {
89
                    scale = r.getWidth() / theImage.getWidth();
90
                    yOffset = 0.5 * (r.getHeight() - theImage.getHeight() * scale);
91
                } else {
92
                    scale = r.getHeight() / theImage.getHeight();
93
                    xOffset = 0.5 * (r.getWidth() - theImage.getWidth() * scale);
94
                }
95
                xScale = yScale = scale;
96

    
97
            } else {
98
                xScale = r.getWidth() / theImage.getWidth();
99
                yScale = r.getHeight() / theImage.getHeight();
100
                yOffset = theImage.getHeight() * 0.5 * yScale;
101

    
102
            }
103

    
104
            AffineTransform at = AffineTransform.getTranslateInstance(xOffset, yOffset);
105
            at.concatenate(AffineTransform.getScaleInstance(xScale, yScale));
106
            g.drawRenderedImage(theImage, at);
107
        }
108
    }
109
    
110
    @Override
111
    public ISymbol getSymbolForSelection() {
112
        if (selectionSym == null) {
113
            try {
114
                selectionSym = (ImageMarkerSymbol) this.clone();
115
            } catch (CloneNotSupportedException e) {
116
//                LOG.warn("Error creating the selection symbol for the symbol "+ this, e);
117
            }
118
            selectionSym.selected = true;
119
            selectionSym.selectionSym = selectionSym; // avoid too much lazy creations
120
        } else {
121
            selectionSym.setColor(MapContext.getSelectionColor());
122
        }
123
        return selectionSym;
124
    }
125
    
126
}