# HG changeset patch # User Peter Hofer # Date 1311588730 -7200 # Node ID be914c1e065acabd58211ba12051a0ce6a110ba3 # Parent cfcd3c52cb08667ae1e27ab96f6c1b7f46e22f1d IdealGraphVisualizer: since the Graal gradient color filter and unconnected slot filter are generally applicable, make them "standard filters" and add helper functions to use them from JavaScript diff -r cfcd3c52cb08 -r be914c1e065a src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/GradientColorFilter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/GradientColorFilter.java Mon Jul 25 12:12:10 2011 +0200 @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import java.awt.Color; +import java.awt.LinearGradientPaint; +import java.awt.PaintContext; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.image.Raster; +import java.util.List; + +/** + * Filter that colors nodes using a customizable color gradient, based on how + * a numeric property is located in a specified interval. + * + * @author Peter Hofer + */ +public class GradientColorFilter extends AbstractFilter { + + public static final String LINEAR = "LINEAR"; + public static final String LOGARITHMIC = "LOGARITHMIC"; + + private String propertyName = "probability"; + private float minValue = 0; + private float maxValue = 500; + private float[] fractions = {0, 0.5f, 1}; + private Color[] colors = {Color.BLUE, Color.YELLOW, Color.RED}; + private int shadeCount = 8; + private String mode = LINEAR; + + public String getName() { + return "Gradient Color Filter"; + } + + public void apply(Diagram d) { + boolean logarithmic = mode.equalsIgnoreCase(LOGARITHMIC); + if (!logarithmic && !mode.equalsIgnoreCase(LINEAR)) { + throw new RuntimeException("Unknown mode: " + mode); + } + + Rectangle bounds = new Rectangle(shadeCount, 1); + LinearGradientPaint lgp = new LinearGradientPaint(bounds.x, bounds.y, bounds.width, bounds.y, fractions, colors); + PaintContext context = lgp.createContext(null, bounds, bounds.getBounds2D(), AffineTransform.getTranslateInstance(0, 0), new RenderingHints(null)); + Raster raster = context.getRaster(bounds.x, bounds.y, bounds.width, bounds.height); + int[] rgb = raster.getPixels(bounds.x, bounds.y, bounds.width, bounds.height, (int[]) null); + Color[] shades = new Color[rgb.length / 3]; + for (int i = 0; i < shades.length; ++i) { + shades[i] = new Color(rgb[i * 3], rgb[i * 3 + 1], rgb[i * 3 + 2]); + } + + List
figures = d.getFigures(); + for (Figure f : figures) { + String property = f.getProperties().get(propertyName); + if (property != null) { + try { + float value = Float.parseFloat(property); + + Color nodeColor; + if (value <= minValue) { + nodeColor = colors[0]; + } else if (value >= maxValue) { + nodeColor = colors[colors.length - 1]; + } else { + double normalized = value - minValue; + double interval = maxValue - minValue; + int index; + // Use Math.ceil() to make values above zero distinguishable from zero + if (logarithmic) { + index = (int) Math.ceil(shades.length * Math.log(1 + normalized) / Math.log(1 + interval)); + } else { + index = (int) Math.ceil(shades.length * normalized / interval); + } + nodeColor = shades[index]; + } + f.setColor(nodeColor); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + public String getPropertyName() { + return propertyName; + } + + public void setPropertyName(String propertyName) { + this.propertyName = propertyName; + } + + public float getMinValue() { + return minValue; + } + + public void setMinValue(float minValue) { + this.minValue = minValue; + } + + public float getMaxValue() { + return maxValue; + } + + public void setMaxValue(float maxValue) { + this.maxValue = maxValue; + } + + public float[] getFractions() { + return fractions; + } + + public void setFractions(float[] fractions) { + this.fractions = fractions; + } + + public Color[] getColors() { + return colors; + } + + public void setColors(Color[] colors) { + this.colors = colors; + } + + public int getShadeCount() { + return shadeCount; + } + + public void setShadeCount(int shadeCount) { + this.shadeCount = shadeCount; + } + + public String getMode() { + return mode; + } + + public void setMode(String mode) { + this.mode = mode; + } +} diff -r cfcd3c52cb08 -r be914c1e065a src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/UnconnectedSlotFilter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/UnconnectedSlotFilter.java Mon Jul 25 12:12:10 2011 +0200 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +package com.sun.hotspot.igv.filter; + +import com.sun.hotspot.igv.graph.Diagram; +import com.sun.hotspot.igv.graph.Figure; +import com.sun.hotspot.igv.graph.InputSlot; +import com.sun.hotspot.igv.graph.OutputSlot; +import com.sun.hotspot.igv.graph.Slot; +import java.util.ArrayList; +import java.util.List; + +/** + * Filter that hides slots with no connections. + */ +public class UnconnectedSlotFilter extends AbstractFilter { + + private final boolean removeInputs; + private final boolean removeOutputs; + + public UnconnectedSlotFilter(boolean inputs, boolean outputs) { + this.removeInputs = inputs; + this.removeOutputs = outputs; + } + + public String getName() { + return "Unconnected Slot Filter"; + } + + public void apply(Diagram d) { + if (!removeInputs && !removeOutputs) { + return; + } + + List
figures = d.getFigures(); + for (Figure f : figures) { + List remove = new ArrayList(); + if (removeInputs) { + for (InputSlot is : f.getInputSlots()) { + if (is.getConnections().isEmpty()) { + remove.add(is); + } + } + } + if (removeOutputs) { + for (OutputSlot os : f.getOutputSlots()) { + if (os.getConnections().isEmpty()) { + remove.add(os); + } + } + } + for (Slot s : remove) { + f.removeSlot(s); + } + } + } +} diff -r cfcd3c52cb08 -r be914c1e065a src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js --- a/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js Thu Jul 21 14:58:08 2011 +0200 +++ b/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js Mon Jul 25 12:12:10 2011 +0200 @@ -65,6 +65,40 @@ f.apply(graph); } +function removeUnconnectedSlots(inputs, outputs) { + var f = new UnconnectedSlotFilter(inputs, outputs); + f.apply(graph); +} + +function colorizeGradient(property, min, max) { + var f = new GradientColorFilter(); + f.setPropertyName(property); + f.setMinValue(min); + f.setMaxValue(max); + f.apply(graph); +} + +function colorizeGradientWithMode(property, min, max, mode) { + var f = new GradientColorFilter(); + f.setPropertyName(property); + f.setMinValue(min); + f.setMaxValue(max); + f.setMode(mode); + f.apply(graph); +} + +function colorizeGradientCustom(property, min, max, mode, colors, fractions, nshades) { + var f = new GradientColorFilter(); + f.setPropertyName(property); + f.setMinValue(min); + f.setMaxValue(max); + f.setMode(mode); + f.setColors(colors); + f.setFractions(fractions); + f.setShadeCount(nshades); + f.apply(graph); +} + var black = Color.black; var blue = Color.blue; var cyan = Color.cyan; diff -r cfcd3c52cb08 -r be914c1e065a src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/GraalGradientColorFilter.java --- a/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/GraalGradientColorFilter.java Thu Jul 21 14:58:08 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ -package com.sun.hotspot.igv.graal.filters; - -import com.sun.hotspot.igv.graph.Diagram; -import com.sun.hotspot.igv.graph.Figure; -import java.awt.Color; -import java.awt.LinearGradientPaint; -import java.awt.PaintContext; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; -import java.awt.image.Raster; -import java.util.List; - -/** - * Filter that colors nodes using a customizable color gradient, based on how - * a numeric property is located in a specified interval. - * - * @author Peter Hofer - */ -public class GraalGradientColorFilter { - - public enum Mode { - LINEAR, - LOGARITHMIC - }; - - private String propertyName = "probability"; - private float minValue = 0; - private float maxValue = 500; - private float[] fractions = {0, 0.5f, 1}; - private Color[] colors = {Color.BLUE, Color.YELLOW, Color.RED}; - private int shadeCount = 8; - private Mode mode = Mode.LOGARITHMIC; - - public void apply(Diagram d) { - Rectangle bounds = new Rectangle(shadeCount, 1); - LinearGradientPaint lgp = new LinearGradientPaint(bounds.x, bounds.y, bounds.width, bounds.y, fractions, colors); - PaintContext context = lgp.createContext(null, bounds, bounds.getBounds2D(), AffineTransform.getTranslateInstance(0, 0), new RenderingHints(null)); - Raster raster = context.getRaster(bounds.x, bounds.y, bounds.width, bounds.height); - int[] rgb = raster.getPixels(bounds.x, bounds.y, bounds.width, bounds.height, (int[]) null); - Color[] shades = new Color[rgb.length / 3]; - for (int i = 0; i < shades.length; ++i) { - shades[i] = new Color(rgb[i * 3], rgb[i * 3 + 1], rgb[i * 3 + 2]); - } - - List
figures = d.getFigures(); - for (Figure f : figures) { - String property = f.getProperties().get(propertyName); - if (property != null) { - try { - float value = Float.parseFloat(property); - - Color nodeColor; - if (value <= minValue) { - nodeColor = colors[0]; - } else if (value >= maxValue) { - nodeColor = colors[colors.length - 1]; - } else { - double normalized = value - minValue; - double interval = maxValue - minValue; - int index; - // Use Math.ceil() to make values above zero distinguishable from zero - if (mode == Mode.LOGARITHMIC) { - index = (int) Math.ceil(shades.length * Math.log(1 + normalized) / Math.log(1 + interval)); - } else if (mode == Mode.LINEAR) { - index = (int) Math.ceil(shades.length * normalized / interval); - } else { - throw new RuntimeException("Unknown mode"); - } - nodeColor = shades[index]; - } - f.setColor(nodeColor); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - - public String getPropertyName() { - return propertyName; - } - - public void setPropertyName(String propertyName) { - this.propertyName = propertyName; - } - - public float getMinValue() { - return minValue; - } - - public void setMinValue(float minValue) { - this.minValue = minValue; - } - - public float getMaxValue() { - return maxValue; - } - - public void setMaxValue(float maxValue) { - this.maxValue = maxValue; - } - - public float[] getFractions() { - return fractions; - } - - public void setFractions(float[] fractions) { - this.fractions = fractions; - } - - public Color[] getColors() { - return colors; - } - - public void setColors(Color[] colors) { - this.colors = colors; - } - - public int getShadeCount() { - return shadeCount; - } - - public void setShadeCount(int steps) { - this.shadeCount = steps; - } - - public Mode getMode() { - return mode; - } - - public void setMode(Mode mode) { - this.mode = mode; - } -} diff -r cfcd3c52cb08 -r be914c1e065a src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/GraalSlotFilter.java --- a/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/GraalSlotFilter.java Thu Jul 21 14:58:08 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ -package com.sun.hotspot.igv.graal.filters; - -import com.sun.hotspot.igv.filter.AbstractFilter; -import com.sun.hotspot.igv.graph.Diagram; -import com.sun.hotspot.igv.graph.Figure; -import com.sun.hotspot.igv.graph.InputSlot; -import com.sun.hotspot.igv.graph.OutputSlot; -import com.sun.hotspot.igv.graph.Slot; -import java.util.ArrayList; -import java.util.List; - -/** - * Filter that hides slots with no connections. - */ -public class GraalSlotFilter extends AbstractFilter { - - public GraalSlotFilter() { - } - - public String getName() { - return "Graal Slot Filter"; - } - - public void apply(Diagram d) { - List
figures = d.getFigures(); - for (Figure f : figures) { - List remove = new ArrayList(); - for (InputSlot is : f.getInputSlots()) { - if (is.getConnections().isEmpty()) { - remove.add(is); - } - } - for (OutputSlot os : f.getOutputSlots()) { - if (os.getConnections().isEmpty()) { - remove.add(os); - } - } - for (Slot s : remove) { - f.removeSlot(s); - } - } - } -} diff -r cfcd3c52cb08 -r be914c1e065a src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/probability.filter --- a/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/probability.filter Thu Jul 21 14:58:08 2011 +0200 +++ b/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/probability.filter Mon Jul 25 12:12:10 2011 +0200 @@ -1,9 +1,3 @@ -var pf = new com.sun.hotspot.igv.graal.filters.GraalGradientColorFilter(); -pf.setMode(com.sun.hotspot.igv.graal.filters.GraalGradientColorFilter.Mode.LOGARITHMIC); -pf.setPropertyName("probability"); -pf.setMinValue(0); -pf.setMaxValue(500); -pf.setColors([blue, yellow, red]); -pf.setFractions([0, 0.5, 1]); -pf.setShadeCount(8); -pf.apply(graph); +colorizeGradientWithMode("probability", 0, 500, "logarithmic"); + +// more parameters: colorizeGradientCustom("probability", 0, 500, "logarithmic", [blue, yellow, red], [0, 0.5, 1], 16); diff -r cfcd3c52cb08 -r be914c1e065a src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/slots.filter --- a/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/slots.filter Thu Jul 21 14:58:08 2011 +0200 +++ b/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/slots.filter Mon Jul 25 12:12:10 2011 +0200 @@ -1,2 +1,1 @@ -var f = new com.sun.hotspot.igv.graal.filters.GraalSlotFilter(); -f.apply(graph); +removeUnconnectedSlots(true, true);