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 { | ||||
| 
 | ||||
|         // Default marker width | ||||
|         private static final int DEFAULT_MARKER_WIDTH = 20; | ||||
| 
 | ||||
|         // Point of the marker. | ||||
|         private Point point; | ||||
| 
 | ||||
|         // Color of the marker. | ||||
|         private final Color color; | ||||
| 
 | ||||
|         // Image to draw | ||||
|         private final BufferedImage image; | ||||
| 
 | ||||
|         public BasicMarkerOverlay(Point point, Color color) { | ||||
|             super(); | ||||
|             this.point = point; | ||||
|             this.color = color; | ||||
|             this.image = MarkerUtils.getMarkerForColor(color); | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|  | @ -128,12 +129,8 @@ public class BasicDrawing extends JPanel implements Drawing { | |||
|             int px = BasicDrawing.this.projx(getPoint().getLongitude()); | ||||
|             int py = BasicDrawing.this.projy(getPoint().getLatitude()); | ||||
| 
 | ||||
|             BufferedImage img = MarkerUtils.getMarkerForColor(color); | ||||
|             Graphics2D gr = img.createGraphics(); | ||||
|             double scale = DEFAULT_MARKER_WIDTH / (double) img.getHeight(); | ||||
|             gr.scale(scale, scale); | ||||
| 
 | ||||
|             graphics.drawImage(img, px - img.getWidth() / 2, py - img.getHeight(), BasicDrawing.this); | ||||
|             graphics.drawImage(this.image, px - this.image.getWidth() / 2, py - this.image.getHeight(), | ||||
|                     BasicDrawing.this); | ||||
|         } | ||||
| 
 | ||||
|     }; | ||||
|  |  | |||
|  | @ -1,19 +1,15 @@ | |||
| package org.insa.graphics.drawing.overlays; | ||||
| 
 | ||||
| import java.awt.Color; | ||||
| import java.awt.Graphics2D; | ||||
| import java.awt.Image; | ||||
| import java.awt.image.BufferedImage; | ||||
| import java.io.DataInputStream; | ||||
| import java.io.FileInputStream; | ||||
| 
 | ||||
| public class MarkerUtils { | ||||
| 
 | ||||
|     /** | ||||
|      * 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 }; | ||||
|     } | ||||
|     private static final String MARKER_MASK_FILE = "res/marker_mask.bin"; | ||||
| 
 | ||||
|     /** | ||||
|      * Create a Bitmap representing a marker of the given color. | ||||
|  | @ -23,83 +19,55 @@ public class MarkerUtils { | |||
|      */ | ||||
|     public static BufferedImage getMarkerForColor(Color color) { | ||||
|         // create image | ||||
|         BufferedImage image = new BufferedImage(MARKER_MASK[0].length, MARKER_MASK.length, | ||||
|                 BufferedImage.TYPE_4BYTE_ABGR); | ||||
|         int[][] mask = readMarkerMask(); | ||||
|         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 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. | ||||
|         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