]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.maps/src/org/simantics/maps/sg/MapAttributionNode.java
Optimization of district scene graph node rendering
[simantics/district.git] / org.simantics.district.maps / src / org / simantics / maps / sg / MapAttributionNode.java
1 package org.simantics.maps.sg;
2
3 import java.awt.Color;
4 import java.awt.Composite;
5 import java.awt.FontMetrics;
6 import java.awt.Graphics2D;
7 import java.awt.geom.AffineTransform;
8 import java.awt.geom.Rectangle2D;
9
10 public class MapAttributionNode extends MapInfoNode {
11
12     private static final long serialVersionUID = 7994492218791569147L;
13
14     @Override
15     public void render(Graphics2D g2d) {
16         if (!enabled)
17             return;
18
19         AffineTransform ot = g2d.getTransform();
20         g2d.setTransform(new AffineTransform());
21
22         Rectangle2D controlBounds = g2d.getClipBounds();
23         if (controlBounds == null)
24             return; // FIXME
25
26         g2d.setFont(MapInfoConstants.getInfoFont());
27
28         FontMetrics fm = g2d.getFontMetrics();
29         Rectangle2D r = fm.getStringBounds(MapInfoConstants.ATTRIBUTION, g2d);
30
31         double yOffsetFromBottom = getMapInfoNextY(g2d);
32         double frameMaxX = controlBounds.getMaxX();
33         double frameMaxY = controlBounds.getMaxY() - yOffsetFromBottom;
34         int frameWidth = (int) Math.ceil(r.getWidth()) + MapInfoConstants.TEXT_HORIZONTAL_MARGIN * 2;
35         int frameHeight = (int) Math.ceil(r.getHeight()) + MapInfoConstants.TEXT_VERTICAL_MARGIN * 2;
36
37         Composite oc = g2d.getComposite();
38         g2d.setComposite(MapInfoConstants.INFO_COMPOSITE);
39         g2d.setStroke(MapInfoConstants.INFO_STROKE);
40
41         g2d.setColor(MapInfoConstants.TEXT_BG_COLOR);
42         rect.setFrameFromDiagonal(frameMaxX - frameWidth, frameMaxY - frameHeight, frameMaxX, frameMaxY);
43         g2d.fill(rect);
44
45         g2d.setColor(Color.BLACK);
46         g2d.drawString(MapInfoConstants.ATTRIBUTION,
47                 (int) rect.getMinX() + MapInfoConstants.TEXT_HORIZONTAL_MARGIN,
48                 (int) frameMaxY - fm.getMaxDescent() - MapInfoConstants.TEXT_VERTICAL_MARGIN);
49
50         g2d.setComposite(oc);
51         g2d.setTransform(ot);
52
53         setMapInfoNextY(g2d, yOffsetFromBottom + rect.getHeight() + MapInfoConstants.INFO_ROW_SPACING);
54     }
55
56 }