diff --git a/src/main/org/insa/graphics/NodesInputPanel.java b/src/main/org/insa/graphics/NodesInputPanel.java index bd14815..54cd9f8 100644 --- a/src/main/org/insa/graphics/NodesInputPanel.java +++ b/src/main/org/insa/graphics/NodesInputPanel.java @@ -248,8 +248,8 @@ public class NodesInputPanel extends JPanel MarkerOverlay tracker = markerTrackers.getOrDefault(textField, null); if (curnode != null) { if (tracker == null) { - tracker = drawing.drawMarker(curnode.getPoint(), markerColor, markerColor, - AlphaMode.OPAQUE); + tracker = drawing.drawMarker(curnode.getPoint(), markerColor, Color.BLACK, + AlphaMode.TRANSPARENT); markerTrackers.put(textField, tracker); } else { @@ -414,7 +414,7 @@ public class NodesInputPanel extends JPanel MarkerOverlay tracker = markerTrackers.getOrDefault(input, null); if (tracker != null) { MarkerOverlay newMarker = this.drawing.drawMarker(tracker.getPoint(), - tracker.getColor(), tracker.getColor(), AlphaMode.OPAQUE); + tracker.getColor(), Color.BLACK, AlphaMode.TRANSPARENT); markerTrackers.put(input, newMarker); newMarker.setVisible(tracker.isVisible()); tracker.delete(); diff --git a/src/main/org/insa/graphics/drawing/overlays/MarkerUtils.java b/src/main/org/insa/graphics/drawing/overlays/MarkerUtils.java index 79846ff..1ec9704 100644 --- a/src/main/org/insa/graphics/drawing/overlays/MarkerUtils.java +++ b/src/main/org/insa/graphics/drawing/overlays/MarkerUtils.java @@ -29,14 +29,27 @@ public class MarkerUtils { // Color[] map = getColorMapping(color); int outerRGB = outer.getRGB() & 0x00ffffff; - int innerRGB = inner.getRGB() & 0x00ffffff; for (int i = 0; i < image.getHeight(); ++i) { for (int j = 0; j < image.getWidth(); ++j) { - if (i >= MIN_Y_CENTER && i < MAX_Y_CENTER && j >= MIN_X_CENTER - && j < MAX_X_CENTER) { - image.setRGB(j, i, innerRGB - | ((mode == AlphaMode.OPAQUE ? MAXIMUM_MAX_VALUE : mask[i][j]) << 24)); + + // If we are in the "inner" part of the marker... + if (i >= MIN_Y_CENTER && i < MAX_Y_CENTER && j >= MIN_X_CENTER && j < MAX_X_CENTER + && mask[i][j] != MAXIMUM_INNER_MASK_VALUE) { + // Don't ask... https://stackoverflow.com/a/29321264/2666289 + // Basically, this compute a "middle" color between outer and inner depending on + // the current mask value. + double t = 1 - (mask[i][j] - MINIMUM_INNER_MASK_VALUE) + / (double) (MAXIMUM_INNER_MASK_VALUE - MINIMUM_INNER_MASK_VALUE); + int r = (int) Math.sqrt((1 - t) * outer.getRed() * outer.getRed() + + t * inner.getRed() * inner.getRed()); + int g = (int) Math.sqrt((1 - t) * outer.getGreen() * outer.getGreen() + + t * inner.getGreen() * inner.getGreen()); + int b = (int) Math.sqrt((1 - t) * outer.getBlue() * outer.getBlue() + + t * inner.getBlue() * inner.getBlue()); + int a = mode == AlphaMode.OPAQUE ? MAXIMUM_INNER_MASK_VALUE : mask[i][j]; + image.setRGB(j, i, (a << 24) | (r << 16) | (g << 8) | b); } + // Otherwize, just fill with the outer color and set the alpha value properly. else { image.setRGB(j, i, outerRGB | (mask[i][j] << 24)); } @@ -53,7 +66,7 @@ public class MarkerUtils { // with a different color. private static final int MIN_X_CENTER = 40, MAX_X_CENTER = 101, MIN_Y_CENTER = 40, MAX_Y_CENTER = 100; - private static final int MAXIMUM_MAX_VALUE = 249; + private static final int MINIMUM_INNER_MASK_VALUE = 116, MAXIMUM_INNER_MASK_VALUE = 249; /** * @return Retrieve the mask from the mask file or from the cache.