source: osm/applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/VectorImageModifier.java@ 18544

Last change on this file since 18544 was 18544, checked in by pieren, 15 years ago

Add licence in headers for GPL compliance.

File size: 4.1 KB
Line 
1// License: GPL. v2 and later. Copyright 2008-2009 by Pieren <pieren3@gmail.com> and others
2package cadastre_fr;
3
4import java.awt.Color;
5import java.awt.image.BufferedImage;
6import java.awt.image.ColorModel;
7import java.awt.image.IndexColorModel;
8import java.awt.image.WritableRaster;
9import org.openstreetmap.josm.Main;
10import org.openstreetmap.josm.tools.ColorHelper;
11
12public class VectorImageModifier extends ImageModifier {
13
14 private int cadastreBackground = -1; // white
15
16 public static int cadastreBackgroundTransp = 1; // original white but transparent
17
18 private boolean withBackground = false;
19
20 private int backgroundPixel = 0;
21
22 private int backgroundSampleX, backgroundSampleY;
23
24 public VectorImageModifier(BufferedImage bi) {
25 bufferedImage = bi;
26 if (Main.pref.getBoolean("cadastrewms.backgroundTransparent"))
27 makeTransparent();
28 else if (Main.pref.getBoolean("cadastrewms.alterColors"))
29 replaceBackground();
30 if (Main.pref.getBoolean("cadastrewms.invertGrey"))
31 invertGrey();
32 }
33
34 /**
35 * Replace the background color by the josm color.background color.
36 */
37 private void replaceBackground() {
38 int w = bufferedImage.getWidth();
39 int h = bufferedImage.getHeight();
40 int josmBackgroundColor = ColorHelper.html2color(Main.pref.get("color.background", "#000000")).getRGB();
41 for (int x = 0; x < w; x++) {
42 for (int y = 0; y < h; y++) {
43 int pixel = bufferedImage.getRGB(x, y);
44 if (pixel == cadastreBackground) {
45 bufferedImage.setRGB(x, y, josmBackgroundColor);
46 if (!withBackground)
47 withBackground = true;
48 backgroundSampleX = x;
49 backgroundSampleY = y;
50 }
51 }
52 }
53 }
54
55 /**
56 * Invert black/white/grey pixels (to change original black characters to white).
57 */
58 private void invertGrey() {
59 int w = bufferedImage.getWidth();
60 int h = bufferedImage.getHeight();
61 for (int x = 0; x < w; x++) {
62 for (int y = 0; y < h; y++) {
63 int pixel = bufferedImage.getRGB(x, y);
64 if (pixel != cadastreBackground) {
65 bufferedImage.setRGB(x, y, reverseIfGrey(pixel));
66 }
67 }
68 }
69 }
70
71 /**
72 * Reverse the grey value if the pixel is grey (light grey becomes dark grey)
73 * Used for texts.
74 * @param pixel
75 * @return
76 */
77 private int reverseIfGrey(int pixel) {
78 Color col = new Color(pixel);
79 int r = col.getRed();
80 int g = col.getGreen();
81 int b = col.getBlue();
82 if ((b == r) && (b == g)) {
83 pixel = (0x00 << 32) + ((byte) (255 - r) << 16) + ((byte) (255 - r) << 8) + ((byte) (255 - r));
84 }
85 return pixel;
86 }
87
88 private void makeTransparent() {
89 ColorModel colorModel = bufferedImage.getColorModel();
90 if (bufferedImage.getColorModel() instanceof IndexColorModel) {
91 // vector image (IndexColorModel)
92 IndexColorModel icm = (IndexColorModel) colorModel;
93 WritableRaster raster = bufferedImage.getRaster();
94 // pixel is offset in ICM's palette
95 if (withBackground)
96 backgroundPixel = raster.getSample(backgroundSampleX, backgroundSampleY, 0);
97 else
98 backgroundPixel = 1; // default Cadastre background sample
99 int size = icm.getMapSize();
100 byte[] reds = new byte[size];
101 byte[] greens = new byte[size];
102 byte[] blues = new byte[size];
103 icm.getReds(reds);
104 icm.getGreens(greens);
105 icm.getBlues(blues);
106 IndexColorModel icm2 = new IndexColorModel(colorModel.getPixelSize(), size, reds, greens, blues,
107 backgroundPixel);
108 bufferedImage = new BufferedImage(icm2, raster, bufferedImage.isAlphaPremultiplied(), null);
109 }
110 return;
111 }
112}
Note: See TracBrowser for help on using the repository browser.