// License: GPL. For details, see LICENSE file. package cadastre_fr; import java.awt.Color; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.tools.ColorHelper; public class VectorImageModifier extends ImageModifier { private int cadastreBackground = -1; // white public static int cadastreBackgroundTransp = 1; // original white but transparent private int backgroundPixel = 0; public VectorImageModifier() { super(); } public VectorImageModifier(BufferedImage bi, boolean monocolor) { bufferedImage = bi; if (Main.pref.getBoolean("cadastrewms.backgroundTransparent")) makeTransparent(); else if (Main.pref.getBoolean("cadastrewms.alterColors")) replaceBackground(); if (Main.pref.getBoolean("cadastrewms.invertGrey")) invertGrey(); if (monocolor) bufferedImage = convert8(convert4(bufferedImage)); } /** * Replace the background color by the josm color.background color. */ private void replaceBackground() { int w = bufferedImage.getWidth(); int h = bufferedImage.getHeight(); int josmBackgroundColor = ColorHelper.html2color(Main.pref.get("color.background", "#000000")).getRGB(); for (int x = 0; x < w; x++) { for (int y = 0; y < h; y++) { int pixel = bufferedImage.getRGB(x, y); if (pixel == cadastreBackground) { bufferedImage.setRGB(x, y, josmBackgroundColor); } } } // The cadastre has now a new background (for invertGrey()) cadastreBackground = josmBackgroundColor; } /** * Invert black/white/grey pixels (to change original black characters to white). */ private void invertGrey() { int w = bufferedImage.getWidth(); int h = bufferedImage.getHeight(); for (int x = 0; x < w; x++) { for (int y = 0; y < h; y++) { int pixel = bufferedImage.getRGB(x, y); if (pixel != cadastreBackground) { bufferedImage.setRGB(x, y, reverseIfGrey(pixel)); } } } } /** * Reverse the grey value if the pixel is grey (light grey becomes dark grey) * Used for texts. */ private int reverseIfGrey(int pixel) { Color col = new Color(pixel); int r = col.getRed(); int g = col.getGreen(); int b = col.getBlue(); if ((b == r) && (b == g)) { pixel = ((byte) col.getAlpha() << 24) + ((byte) (255 - r) << 16) + ((byte) (255 - r) << 8) + ((byte) (255 - r)); } // Maybe we should try to find a better formula to avoid discontinuity when text is drawn on a colored item // (building, ...). One could use the conversion to and from HSB to only change the brightness not the color. // Note: the color palette does not have the inverse colors so it may be very weird! return pixel; } private void makeTransparent() { ColorModel colorModel = bufferedImage.getColorModel(); if (bufferedImage.getColorModel() instanceof IndexColorModel) { // vector image (IndexColorModel) IndexColorModel icm = (IndexColorModel) colorModel; WritableRaster raster = bufferedImage.getRaster(); // pixel is offset in ICM's palette backgroundPixel = 1; // default Cadastre background sample int size = icm.getMapSize(); byte[] reds = new byte[size]; byte[] greens = new byte[size]; byte[] blues = new byte[size]; icm.getReds(reds); icm.getGreens(greens); icm.getBlues(blues); // The cadastre background has now an alpha to 0 (for invertGrey()) cadastreBackground = 0x00ffffff; IndexColorModel icm2 = new IndexColorModel(colorModel.getPixelSize(), size, reds, greens, blues, backgroundPixel); bufferedImage = new BufferedImage(icm2, raster, bufferedImage.isAlphaPremultiplied(), null); } return; } }