Improve markers rendering.
This commit is contained in:
		
							parent
							
								
									2f1fa81a58
								
							
						
					
					
						commit
						55dfcbd0fe
					
				
					 3 changed files with 53 additions and 88 deletions
				
			
		
							
								
								
									
										
											BIN
										
									
								
								res/marker_mask.bin
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								res/marker_mask.bin
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -91,19 +91,20 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
| 
 | 
 | ||||||
|     private class BasicMarkerOverlay extends BasicOverlay implements MarkerOverlay { |     private class BasicMarkerOverlay extends BasicOverlay implements MarkerOverlay { | ||||||
| 
 | 
 | ||||||
|         // Default marker width |  | ||||||
|         private static final int DEFAULT_MARKER_WIDTH = 20; |  | ||||||
| 
 |  | ||||||
|         // Point of the marker. |         // Point of the marker. | ||||||
|         private Point point; |         private Point point; | ||||||
| 
 | 
 | ||||||
|         // Color of the marker. |         // Color of the marker. | ||||||
|         private final Color color; |         private final Color color; | ||||||
| 
 | 
 | ||||||
|  |         // Image to draw | ||||||
|  |         private final BufferedImage image; | ||||||
|  | 
 | ||||||
|         public BasicMarkerOverlay(Point point, Color color) { |         public BasicMarkerOverlay(Point point, Color color) { | ||||||
|             super(); |             super(); | ||||||
|             this.point = point; |             this.point = point; | ||||||
|             this.color = color; |             this.color = color; | ||||||
|  |             this.image = MarkerUtils.getMarkerForColor(color); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|  | @ -128,12 +129,8 @@ public class BasicDrawing extends JPanel implements Drawing { | ||||||
|             int px = BasicDrawing.this.projx(getPoint().getLongitude()); |             int px = BasicDrawing.this.projx(getPoint().getLongitude()); | ||||||
|             int py = BasicDrawing.this.projy(getPoint().getLatitude()); |             int py = BasicDrawing.this.projy(getPoint().getLatitude()); | ||||||
| 
 | 
 | ||||||
|             BufferedImage img = MarkerUtils.getMarkerForColor(color); |             graphics.drawImage(this.image, px - this.image.getWidth() / 2, py - this.image.getHeight(), | ||||||
|             Graphics2D gr = img.createGraphics(); |                     BasicDrawing.this); | ||||||
|             double scale = DEFAULT_MARKER_WIDTH / (double) img.getHeight(); |  | ||||||
|             gr.scale(scale, scale); |  | ||||||
| 
 |  | ||||||
|             graphics.drawImage(img, px - img.getWidth() / 2, py - img.getHeight(), BasicDrawing.this); |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  | @ -1,19 +1,15 @@ | ||||||
| package org.insa.graphics.drawing.overlays; | package org.insa.graphics.drawing.overlays; | ||||||
| 
 | 
 | ||||||
| import java.awt.Color; | import java.awt.Color; | ||||||
|  | import java.awt.Graphics2D; | ||||||
|  | import java.awt.Image; | ||||||
| import java.awt.image.BufferedImage; | import java.awt.image.BufferedImage; | ||||||
|  | import java.io.DataInputStream; | ||||||
|  | import java.io.FileInputStream; | ||||||
| 
 | 
 | ||||||
| public class MarkerUtils { | public class MarkerUtils { | ||||||
| 
 | 
 | ||||||
|     /** |     private static final String MARKER_MASK_FILE = "res/marker_mask.bin"; | ||||||
|      * Return a color mapping with the given color as the main color. |  | ||||||
|      *  |  | ||||||
|      * @param color |  | ||||||
|      * @return |  | ||||||
|      */ |  | ||||||
|     protected static Color[] getColorMapping(Color color) { |  | ||||||
|         return new Color[] { new Color(0, 0, 0, 0), color, Color.BLACK }; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Create a Bitmap representing a marker of the given color. |      * Create a Bitmap representing a marker of the given color. | ||||||
|  | @ -23,83 +19,55 @@ public class MarkerUtils { | ||||||
|      */ |      */ | ||||||
|     public static BufferedImage getMarkerForColor(Color color) { |     public static BufferedImage getMarkerForColor(Color color) { | ||||||
|         // create image |         // create image | ||||||
|         BufferedImage image = new BufferedImage(MARKER_MASK[0].length, MARKER_MASK.length, |         int[][] mask = readMarkerMask(); | ||||||
|                 BufferedImage.TYPE_4BYTE_ABGR); |         BufferedImage image = new BufferedImage(mask[0].length, mask.length, BufferedImage.TYPE_4BYTE_ABGR); | ||||||
| 
 | 
 | ||||||
|         Color[] map = getColorMapping(color); |         // Color[] map = getColorMapping(color); | ||||||
|  |         int rgb = color.getRGB() & 0x00ffffff; | ||||||
|         for (int i = 0; i < image.getHeight(); ++i) { |         for (int i = 0; i < image.getHeight(); ++i) { | ||||||
|             for (int j = 0; j < image.getWidth(); ++j) { |             for (int j = 0; j < image.getWidth(); ++j) { | ||||||
|                 image.setRGB(j, i, map[MARKER_MASK[i][j]].getRGB()); |                 // image.setRGB(j, i, map[MARKER_MASK[i][j]].getRGB()); | ||||||
|  |                 image.setRGB(j, i, rgb | (mask[i][j] << 24)); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         BufferedImage scaleImage = new BufferedImage(28, 48, BufferedImage.TYPE_4BYTE_ABGR); | ||||||
|  |         Graphics2D graphics = scaleImage.createGraphics(); | ||||||
|  |         graphics.drawImage(image.getScaledInstance(28, 48, Image.SCALE_SMOOTH), 0, 0, null); | ||||||
|  |         graphics.dispose(); | ||||||
|  | 
 | ||||||
|         // Create Bitmap and return it. |         // Create Bitmap and return it. | ||||||
|         return image; |         return scaleImage; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Mask cache | ||||||
|  |     private static int[][] MASK_CACHE = null; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @return Retrieve the mask from the mask file or from the cache. | ||||||
|  |      */ | ||||||
|  |     private static int[][] readMarkerMask() { | ||||||
|  |         if (MASK_CACHE == null) { | ||||||
|  |             try { | ||||||
|  |                 DataInputStream dis = new DataInputStream(new FileInputStream(MARKER_MASK_FILE)); | ||||||
|  | 
 | ||||||
|  |                 int nrows = dis.readInt(); | ||||||
|  |                 int ncols = dis.readInt(); | ||||||
|  | 
 | ||||||
|  |                 MASK_CACHE = new int[nrows][ncols]; | ||||||
|  |                 for (int i = 0; i < nrows; ++i) { | ||||||
|  |                     for (int j = 0; j < ncols; ++j) { | ||||||
|  |                         MASK_CACHE[i][j] = dis.readUnsignedByte(); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 dis.close(); | ||||||
|  |             } | ||||||
|  |             catch (Exception e) { | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |                 MASK_CACHE = null; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return MASK_CACHE; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Mask |  | ||||||
|     private static byte[][] MARKER_MASK = new byte[][] { |  | ||||||
|         // @formatter:off |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0}, |  | ||||||
| 		{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0}, |  | ||||||
| 		{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0}, |  | ||||||
| 		{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0}, |  | ||||||
| 		{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, |  | ||||||
| 		{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, |  | ||||||
| 		{0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, |  | ||||||
| 		{1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1}, |  | ||||||
| 		{1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1}, |  | ||||||
| 		{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}, |  | ||||||
| 		{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}, |  | ||||||
| 		{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}, |  | ||||||
| 		{1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1}, |  | ||||||
| 		{1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1}, |  | ||||||
| 		{0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, |  | ||||||
| 		{0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, |  | ||||||
| 		{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, |  | ||||||
| 		{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0}, |  | ||||||
| 		{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0}, |  | ||||||
| 		{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0}, |  | ||||||
| 		{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0}, |  | ||||||
| 		{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, |  | ||||||
| 		{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} |  | ||||||
| 	};	 |  | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue