// License: GPL. For details, see LICENSE file. package cadastre_fr; import java.awt.Color; import java.awt.image.BufferedImage; import java.awt.image.ComponentColorModel; import java.awt.image.IndexColorModel; import org.openstreetmap.josm.Main; public class RasterImageModifier extends ImageModifier { private int cadastreBackground = -1; // white public static int cadastreBackgroundTransp = 16777215; // original white but transparent private boolean transparencyEnabled = false; public RasterImageModifier(BufferedImage bi) { bufferedImage = bi; transparencyEnabled = Main.pref.getBoolean("cadastrewms.backgroundTransparent"); if (transparencyEnabled) makeTransparent(); if (Main.pref.getBoolean("cadastrewms.invertGrey")) invertGrey(); } /** * 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 ((!transparencyEnabled && pixel != cadastreBackground) || (transparencyEnabled && pixel != cadastreBackgroundTransp)) { 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 = (0x00 << 32) + ((byte) (255 - r) << 16) + ((byte) (255 - r) << 8) + ((byte) (255 - r)); } return pixel; } private void makeTransparent() { if (bufferedImage.getColorModel() instanceof ComponentColorModel || bufferedImage.getColorModel() instanceof IndexColorModel) { int width = bufferedImage.getWidth(); int height = bufferedImage.getHeight(); BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); // converting grey scale colors to black/white is configurable (use less resources but is less readable) boolean simplifyColors = Main.pref.getBoolean("cadastrewms.raster2bitsColors", false); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int rgb = bufferedImage.getRGB(x, y); Color c = new Color(rgb); int r = c.getRed(); int g = c.getGreen(); int b = c.getBlue(); Color maskedColor; if (rgb == cadastreBackground) { maskedColor = simplifyColors ? new Color(0xff, 0xff, 0xff, 0x00) : new Color(r, g, b, 0x00); // transparent } else { maskedColor = simplifyColors ? new Color(0, 0, 0, 0xFF) : new Color(r, g, b, 0xFF); // opaque } bi.setRGB(x, y, maskedColor.getRGB()); } } bufferedImage = bi; } return; } /** * Temporary fix for Java6 which doesn't de-serialize correctly cached image on disk. * Recreate a new raster image based on what is loaded/serialized from disk cache. * @return new image */ public static BufferedImage fixRasterImage(BufferedImage img) { int width = img.getWidth(); int height = img.getHeight(); BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); int[] rgbArray = new int[width * height]; img.getRGB(0, 0, width, height, rgbArray, 0, width); bi.setRGB(0, 0, width, height, rgbArray, 0, width); return bi; } }