Improve overlay management for BasicDrawing.
This commit is contained in:
		
							parent
							
								
									481e30e80c
								
							
						
					
					
						commit
						9acdc998b3
					
				
					 3 changed files with 72 additions and 31 deletions
				
			
		|  | @ -11,6 +11,7 @@ import java.awt.event.MouseListener; | ||||||
| import java.awt.geom.NoninvertibleTransformException; | import java.awt.geom.NoninvertibleTransformException; | ||||||
| import java.awt.geom.Point2D; | import java.awt.geom.Point2D; | ||||||
| import java.awt.image.BufferedImage; | import java.awt.image.BufferedImage; | ||||||
|  | import java.util.ArrayList; | ||||||
| import java.util.IdentityHashMap; | import java.util.IdentityHashMap; | ||||||
| import java.util.Iterator; | import java.util.Iterator; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | @ -23,6 +24,7 @@ import org.insa.graph.Graph; | ||||||
| import org.insa.graph.Node; | import org.insa.graph.Node; | ||||||
| import org.insa.graph.Path; | import org.insa.graph.Path; | ||||||
| import org.insa.graph.Point; | import org.insa.graph.Point; | ||||||
|  | import org.insa.graphics.drawing.utils.MarkerUtils; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Cette implementation de la classe Dessin produit vraiment un affichage (au |  * Cette implementation de la classe Dessin produit vraiment un affichage (au | ||||||
|  | @ -41,12 +43,12 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
|         // Point of the marker. |         // Point of the marker. | ||||||
|         private Point point; |         private Point point; | ||||||
| 
 | 
 | ||||||
|         // Color of the "marker". |         // Image of the marker | ||||||
|         private Color color; |         protected BufferedImage image; | ||||||
| 
 | 
 | ||||||
|         public BasicMarkerTracker(Point point, Color color) { |         public BasicMarkerTracker(Point point, BufferedImage image) { | ||||||
|             this.point = point; |             this.point = point; | ||||||
|             this.color = color; |             this.image = image; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|  | @ -56,11 +58,14 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public void moveTo(Point point) { |         public void moveTo(Point point) { | ||||||
|             BasicDrawing.this.drawMarker(point, color); |             this.point = point; | ||||||
|  |             BasicDrawing.this.repaint(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         public void delete() { |         public void delete() { | ||||||
|  |             BasicDrawing.this.markers.remove(this); | ||||||
|  |             BasicDrawing.this.repaint(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|     }; |     }; | ||||||
|  | @ -74,18 +79,24 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
|     // Default marker width |     // Default marker width | ||||||
|     private static final int DEFAULT_MARKER_WIDTH = 10; |     private static final int DEFAULT_MARKER_WIDTH = 10; | ||||||
| 
 | 
 | ||||||
|     // |  | ||||||
|     private final Graphics2D gr; |  | ||||||
| 
 |  | ||||||
|     private double long1, long2, lat1, lat2; |     private double long1, long2, lat1, lat2; | ||||||
| 
 | 
 | ||||||
|     // Width and height of the image |     // Width and height of the image | ||||||
|     private final int width, height; |     private final int width, height; | ||||||
| 
 | 
 | ||||||
|     // |  | ||||||
|     private Image image; |  | ||||||
|     private ZoomAndPanListener zoomAndPanListener; |     private ZoomAndPanListener zoomAndPanListener; | ||||||
| 
 | 
 | ||||||
|  |     // | ||||||
|  |     private Image graphImage; | ||||||
|  |     private final Graphics2D graphGraphics; | ||||||
|  | 
 | ||||||
|  |     // Image for path / points | ||||||
|  |     private Image overlayImage; | ||||||
|  |     private Graphics2D overlayGraphics; | ||||||
|  | 
 | ||||||
|  |     // List of image for markers | ||||||
|  |     private List<BasicMarkerTracker> markers = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|     // Mapping DrawingClickListener -> MouseEventListener |     // Mapping DrawingClickListener -> MouseEventListener | ||||||
|     private Map<DrawingClickListener, MouseListener> listenerMapping = new IdentityHashMap<>(); |     private Map<DrawingClickListener, MouseListener> listenerMapping = new IdentityHashMap<>(); | ||||||
| 
 | 
 | ||||||
|  | @ -104,11 +115,16 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
|         this.height = 1600; |         this.height = 1600; | ||||||
| 
 | 
 | ||||||
|         BufferedImage img = new BufferedImage(this.width, this.height, BufferedImage.TYPE_3BYTE_BGR); |         BufferedImage img = new BufferedImage(this.width, this.height, BufferedImage.TYPE_3BYTE_BGR); | ||||||
|  |         this.graphImage = img; | ||||||
|  |         this.graphGraphics = img.createGraphics(); | ||||||
|  |         this.graphGraphics.setBackground(Color.WHITE); | ||||||
| 
 | 
 | ||||||
|         this.image = img; |         img = new BufferedImage(this.width, this.height, BufferedImage.TYPE_4BYTE_ABGR); | ||||||
|         this.gr = img.createGraphics(); |         this.overlayImage = img; | ||||||
|  |         this.overlayGraphics = img.createGraphics(); | ||||||
|  |         this.overlayGraphics.setBackground(new Color(0, 0, 0, 0)); | ||||||
| 
 | 
 | ||||||
|         this.zoomAndPanListener.setCoordTransform(this.gr.getTransform()); |         this.zoomAndPanListener.setCoordTransform(this.graphGraphics.getTransform()); | ||||||
| 
 | 
 | ||||||
|         this.long1 = -180; |         this.long1 = -180; | ||||||
|         this.long2 = 180; |         this.long2 = 180; | ||||||
|  | @ -125,7 +141,20 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
|         Graphics2D g = (Graphics2D) g1; |         Graphics2D g = (Graphics2D) g1; | ||||||
|         g.clearRect(0, 0, getWidth(), getHeight()); |         g.clearRect(0, 0, getWidth(), getHeight()); | ||||||
|         g.setTransform(zoomAndPanListener.getCoordTransform()); |         g.setTransform(zoomAndPanListener.getCoordTransform()); | ||||||
|         g.drawImage(image, 0, 0, this); | 
 | ||||||
|  |         // Draw graph | ||||||
|  |         g.drawImage(graphImage, 0, 0, this); | ||||||
|  | 
 | ||||||
|  |         // Draw overlays (path, etc.) | ||||||
|  |         g.drawImage(overlayImage, 0, 0, this); | ||||||
|  | 
 | ||||||
|  |         // Draw markers | ||||||
|  |         for (BasicMarkerTracker mtracker: markers) { | ||||||
|  |             BufferedImage img = mtracker.image; | ||||||
|  |             int px = this.projx(mtracker.getPoint().getLongitude()); | ||||||
|  |             int py = this.projy(mtracker.getPoint().getLatitude()); | ||||||
|  |             g.drawImage(img, px - img.getWidth() / 2, py - img.getHeight(), this); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     protected void setBB(double long1, double long2, double lat1, double lat2) { |     protected void setBB(double long1, double long2, double lat1, double lat2) { | ||||||
|  | @ -206,17 +235,18 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     protected void setWidth(int width) { |     protected void setWidth(int width) { | ||||||
|         this.gr.setStroke(new BasicStroke(width)); |         this.overlayGraphics.setStroke(new BasicStroke(width)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     protected void setColor(Color col) { |     protected void setColor(Color col) { | ||||||
|         this.gr.setColor(col); |         this.overlayGraphics.setColor(col); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public void clear() { |     public void clear() { | ||||||
|         this.gr.setColor(Color.WHITE); |         this.graphGraphics.clearRect(0, 0, this.width, this.height); | ||||||
|         this.gr.fillRect(0, 0, this.width, this.height); |         this.overlayGraphics.clearRect(0, 0, this.width, this.height); | ||||||
|  |         this.markers.clear(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|  | @ -226,7 +256,7 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
|         int y1 = this.projy(from.getLatitude()); |         int y1 = this.projy(from.getLatitude()); | ||||||
|         int y2 = this.projy(to.getLatitude()); |         int y2 = this.projy(to.getLatitude()); | ||||||
| 
 | 
 | ||||||
|         gr.drawLine(x1, y1, x2, y2); |         overlayGraphics.drawLine(x1, y1, x2, y2); | ||||||
|         this.repaint(); |         this.repaint(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -245,14 +275,24 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public MarkerTracker drawMarker(Point point) { |     public MarkerTracker drawMarker(Point point) { | ||||||
|         drawPoint(point, DEFAULT_MARKER_WIDTH, this.gr.getColor()); |         return drawMarker(point, this.overlayGraphics.getColor()); | ||||||
|         return new BasicMarkerTracker(point, this.gr.getColor()); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public MarkerTracker drawMarker(Point point, Color color) { |     public MarkerTracker drawMarker(Point point, Color color) { | ||||||
|         setColor(color); |         /* | ||||||
|         return drawMarker(point); |          * BufferedImage img = new BufferedImage(DEFAULT_MARKER_WIDTH, | ||||||
|  |          * DEFAULT_MARKER_WIDTH, BufferedImage.TYPE_4BYTE_ABGR); Graphics2D gr = | ||||||
|  |          * img.createGraphics(); gr.setColor(color); gr.fillOval(0, 0, | ||||||
|  |          * DEFAULT_MARKER_WIDTH, DEFAULT_MARKER_WIDTH); | ||||||
|  |          */ | ||||||
|  |         BufferedImage img = MarkerUtils.getMarkerForColor(color); | ||||||
|  |         Graphics2D gr = img.createGraphics(); | ||||||
|  |         gr.scale(0.3, 0.3); | ||||||
|  |         BasicMarkerTracker marker = new BasicMarkerTracker(point, img); | ||||||
|  |         this.markers.add(marker); | ||||||
|  |         this.repaint(); | ||||||
|  |         return marker; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|  | @ -261,7 +301,7 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
|         setColor(color); |         setColor(color); | ||||||
|         int x = this.projx(point.getLongitude()) - DEFAULT_MARKER_WIDTH / 2; |         int x = this.projx(point.getLongitude()) - DEFAULT_MARKER_WIDTH / 2; | ||||||
|         int y = this.projy(point.getLatitude()) - DEFAULT_MARKER_WIDTH / 2; |         int y = this.projy(point.getLatitude()) - DEFAULT_MARKER_WIDTH / 2; | ||||||
|         gr.fillOval(x, y, DEFAULT_MARKER_WIDTH, DEFAULT_MARKER_WIDTH); |         overlayGraphics.fillOval(x, y, DEFAULT_MARKER_WIDTH, DEFAULT_MARKER_WIDTH); | ||||||
|         this.repaint(); |         this.repaint(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -321,12 +361,15 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
|     @Override |     @Override | ||||||
|     public void drawGraph(Graph graph, GraphPalette palette) { |     public void drawGraph(Graph graph, GraphPalette palette) { | ||||||
|         clear(); |         clear(); | ||||||
|  |         Graphics2D oldOverlayGraphics = this.overlayGraphics; | ||||||
|  |         this.overlayGraphics = this.graphGraphics; | ||||||
|         initialize(graph); |         initialize(graph); | ||||||
|         for (Node node: graph.getNodes()) { |         for (Node node: graph.getNodes()) { | ||||||
|             for (Arc arc: node.getSuccessors()) { |             for (Arc arc: node.getSuccessors()) { | ||||||
|                 drawArc(arc, palette); |                 drawArc(arc, palette); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |         this.overlayGraphics = oldOverlayGraphics; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|  | @ -366,7 +409,7 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
|     private void putText(Point point, String txt) { |     private void putText(Point point, String txt) { | ||||||
|         int x = this.projx(point.getLongitude()); |         int x = this.projx(point.getLongitude()); | ||||||
|         int y = this.projy(point.getLatitude()); |         int y = this.projy(point.getLatitude()); | ||||||
|         gr.drawString(txt, x, y); |         graphGraphics.drawString(txt, x, y); | ||||||
|         this.repaint(); |         this.repaint(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -22,6 +22,7 @@ import org.mapsforge.core.model.BoundingBox; | ||||||
| import org.mapsforge.core.model.LatLong; | import org.mapsforge.core.model.LatLong; | ||||||
| import org.mapsforge.core.model.MapPosition; | import org.mapsforge.core.model.MapPosition; | ||||||
| import org.mapsforge.core.util.LatLongUtils; | import org.mapsforge.core.util.LatLongUtils; | ||||||
|  | import org.mapsforge.map.awt.graphics.AwtBitmap; | ||||||
| import org.mapsforge.map.awt.graphics.AwtGraphicFactory; | import org.mapsforge.map.awt.graphics.AwtGraphicFactory; | ||||||
| import org.mapsforge.map.awt.util.AwtUtil; | import org.mapsforge.map.awt.util.AwtUtil; | ||||||
| import org.mapsforge.map.awt.view.MapView; | import org.mapsforge.map.awt.view.MapView; | ||||||
|  | @ -196,7 +197,7 @@ public class MapViewDrawing extends MapView implements Drawing { | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public MarkerTracker drawMarker(Point point, Color color) { |     public MarkerTracker drawMarker(Point point, Color color) { | ||||||
|         Bitmap bitmap = MarkerUtils.getMarkerForColor(color); |         Bitmap bitmap = new AwtBitmap(MarkerUtils.getMarkerForColor(color)); | ||||||
|         Marker marker = new Marker(convertPoint(point), bitmap, 0, -bitmap.getHeight() / 2); |         Marker marker = new Marker(convertPoint(point), bitmap, 0, -bitmap.getHeight() / 2); | ||||||
|         getLayerManager().getLayers().add(marker); |         getLayerManager().getLayers().add(marker); | ||||||
|         return new MapViewMarkerTracker(marker); |         return new MapViewMarkerTracker(marker); | ||||||
|  |  | ||||||
|  | @ -3,9 +3,6 @@ package org.insa.graphics.drawing.utils; | ||||||
| import java.awt.Color; | import java.awt.Color; | ||||||
| import java.awt.image.BufferedImage; | import java.awt.image.BufferedImage; | ||||||
| 
 | 
 | ||||||
| import org.mapsforge.core.graphics.Bitmap; |  | ||||||
| import org.mapsforge.map.awt.graphics.AwtBitmap; |  | ||||||
| 
 |  | ||||||
| public class MarkerUtils { | public class MarkerUtils { | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -24,7 +21,7 @@ public class MarkerUtils { | ||||||
|      * @param color |      * @param color | ||||||
|      * @return |      * @return | ||||||
|      */ |      */ | ||||||
|     public static Bitmap getMarkerForColor(Color color) { |     public static BufferedImage getMarkerForColor(Color color) { | ||||||
|         // create image |         // create image | ||||||
|         BufferedImage image = new BufferedImage(MARKER_MASK[0].length, MARKER_MASK.length, BufferedImage.TYPE_INT_ARGB); |         BufferedImage image = new BufferedImage(MARKER_MASK[0].length, MARKER_MASK.length, BufferedImage.TYPE_INT_ARGB); | ||||||
| 
 | 
 | ||||||
|  | @ -36,7 +33,7 @@ public class MarkerUtils { | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // Create Bitmap and return it. |         // Create Bitmap and return it. | ||||||
|         return new AwtBitmap(image); |         return image; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Mask |     // Mask | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue