List of usage examples for java.awt Graphics2D setColor
public abstract void setColor(Color c);
From source file:com.igormaznitsa.mindmap.swing.panel.MindMapPanel.java
private static void drawErrorText(final Graphics2D gfx, final Dimension fullSize, final String error) { final Font font = new Font(Font.DIALOG, Font.BOLD, 24); final FontMetrics metrics = gfx.getFontMetrics(font); final Rectangle2D textBounds = metrics.getStringBounds(error, gfx); gfx.setFont(font);/* w ww .j a v a 2 s. c om*/ gfx.setColor(Color.DARK_GRAY); gfx.fillRect(0, 0, fullSize.width, fullSize.height); final int x = (int) (fullSize.width - textBounds.getWidth()) / 2; final int y = (int) (fullSize.height - textBounds.getHeight()) / 2; gfx.setColor(Color.BLACK); gfx.drawString(error, x + 5, y + 5); gfx.setColor(Color.RED.brighter()); gfx.drawString(error, x, y); }
From source file:business.ImageManager.java
private void doDrawPathOrdemArmy(Graphics2D big, Point ori, Point dest, Color color) { //setup para os rastros big.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); big.setComposite(alcom);//from w ww .j av a 2 s. c om big.setStroke(new BasicStroke(3f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 1f, new float[] { 3f, 5f, 7f, 5f, 11f, 5f, 15f, 5f, 21f, 5f, 27f, 5f, 33f, 5f }, 0f)); big.setColor(color); //draw path Path2D.Double path = new Path2D.Double(); path.moveTo(ori.getX(), ori.getY()); path.curveTo(dest.getX() + 10, dest.getY() - 10, dest.getX() - 10, dest.getY() + 10, dest.getX(), dest.getY()); //draw on graph big.draw(path); }
From source file:de.tor.tribes.ui.algo.TimeFrameVisualizer.java
/**Render default view if there is no timeframe yet*/ private void renderNoInfoView(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setPaint(new TexturePaint(STROKED, new Rectangle(0, 0, 3, 3))); g2d.fillRect(0, 0, getWidth(), getHeight()); Font f = g2d.getFont().deriveFont(Font.BOLD, 14.0f); g2d.setFont(f);/*from w ww . jav a 2 s . co m*/ Rectangle2D bounds = g2d.getFontMetrics().getStringBounds("Kein Zeitfenster aktiv", g); int dx = 10; if (getWidth() > bounds.getWidth()) { dx = (int) Math.rint((getWidth() - bounds.getWidth()) / 2); } int dy = 10; if (getHeight() > bounds.getHeight()) { dy = (int) Math.rint((getHeight() - bounds.getHeight()) / 2); } g2d.setColor(Color.black); g2d.drawString("Kein Zeitfenster aktiv", dx, dy); }
From source file:coolmap.canvas.datarenderer.renderer.impl.NumberToBoxPlot.java
private void updateLegend() { int width = DEFAULT_LEGEND_WIDTH; int height = DEFAULT_LEGENT_HEIGHT; legend = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice() .getDefaultConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); Graphics2D g = (Graphics2D) legend.createGraphics(); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setPaint(UI.colorBlack2);//from w w w.j a v a 2 s .c o m g.fillRoundRect(0, 0, width, height - 12, 5, 5); g.setColor(barColorBelow); int boxNum = 10; g.setStroke(UI.stroke1_5); double value; for (int i = 0; i < boxNum; i++) { value = _minValue + (_maxValue - _minValue) / boxNum * i; if (value > disectBound) { g.setColor(barColorNormal); } int h = (height - 12) / boxNum * i; g.drawLine(i * width / boxNum, height - 12 - h, (i + 1) * width / boxNum, height - 12 - h); } g.setColor(Color.BLACK); g.setFont(UI.fontMono.deriveFont(10f)); DecimalFormat format = new DecimalFormat("#.##"); g.drawString(format.format(_minValue), 2, 23); g.setColor(Color.BLACK); String maxString = format.format(_maxValue); int swidth = g.getFontMetrics().stringWidth(maxString); g.drawString(maxString, width - 2 - swidth, 23); g.dispose(); }
From source file:org.messic.server.facade.controllers.pages.CaptchaController.java
@ApiMethod(path = "/captcha", verb = ApiVerb.GET, description = "Get a captcha", produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE }) @ApiErrors(apierrors = { @ApiError(code = UnknownMessicRESTException.VALUE, description = "Unknown error") }) @RequestMapping(value = "", method = RequestMethod.GET) @ResponseStatus(HttpStatus.OK)/*from w w w .ja v a2 s.c o m*/ @ResponseBody @ApiResponseObject public Captcha getCaptcha() throws UnknownMessicRESTException { try { UUID idOne = UUID.randomUUID(); // create the image with the text BufferedImage bi = service.getImageChallengeForID(idOne.toString()); BufferedImage bi2 = Util.ImagedeepCopy(bi); Graphics2D g2d = (Graphics2D) bi.getGraphics(); float alpha = 0.25f; int type = AlphaComposite.SRC_OVER; AlphaComposite composite = AlphaComposite.getInstance(type, alpha); g2d.setComposite(composite); final int Min = 5; final int Max = 30; int random1 = Min + (int) (Math.random() * ((Max - Min) + 1)); int random2 = Min + (int) (Math.random() * ((Max - Min) + 1)); g2d.drawImage(bi2, random1, random2, null); alpha = 0.80f; type = AlphaComposite.SRC_OVER; composite = AlphaComposite.getInstance(type, alpha); g2d.setComposite(composite); int MinX = 0; int MaxX = bi.getWidth(); int MinY = 0; int MaxY = bi.getHeight(); g2d.setColor(Color.black); for (int i = 0; i < random2; i++) { int random3 = MinX + (int) (Math.random() * ((MaxX - MinX) + 1)); int random4 = MinX + (int) (Math.random() * ((MaxX - MinX) + 1)); int random5 = MinY + (int) (Math.random() * ((MaxY - MinY) + 1)); int random6 = MinY + (int) (Math.random() * ((MaxY - MinY) + 1)); g2d.drawLine(random3, random5, random4, random6); } Captcha result = new Captcha(); result.id = idOne.toString(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bi, "jpg", baos); byte[] resultb64 = Base64.encode(baos.toByteArray()); result.captchaImage = new String(resultb64); return result; } catch (Exception e) { throw new UnknownMessicRESTException(e); } }
From source file:juicebox.mapcolorui.HeatmapRenderer.java
/** * Render a dense matrix. Used for Pearsons correlation. The bitmap is drawn at 1 data point * per pixel, scaling happens elsewhere. * * @param rm Matrix to render//from w ww. j a va2 s . com * @param originX origin in pixels * @param originY origin in pixels * @param colorScale color scale to apply * @param g graphics to render matrix into */ private void renderMatrix(BasicMatrix rm, int originX, int originY, int width, int height, ColorScale colorScale, Graphics2D g) { int endX = Math.min(originX + width, rm.getColumnDimension()); int endY = Math.min(originY + height, rm.getRowDimension()); for (int row = originY; row < endY; row++) { for (int col = originX; col < endX; col++) { float score = rm.getEntry(row, col); Color color; if (Float.isNaN(score)) { color = Color.gray; } else { color = score == 0 ? Color.black : colorScale.getColor(score); } int px = col - originX; int py = row - originY; g.setColor(color); //noinspection SuspiciousNameCombination g.fillRect(px, py, HiCGlobals.BIN_PIXEL_WIDTH, HiCGlobals.BIN_PIXEL_WIDTH); // Assuming same chromosome if (col != row) { px = row - originX; py = col - originY; g.fillRect(px, py, HiCGlobals.BIN_PIXEL_WIDTH, HiCGlobals.BIN_PIXEL_WIDTH); } } } }
From source file:com.rapidminer.gui.plotter.charts.WeightBasedSymbolAxis.java
/** * Draws the grid bands for the axis when it is at the top or bottom of the plot. * /* w ww . ja v a 2 s. co m*/ * @param g2 * the graphics device. * @param plotArea * the area within which the chart should be drawn. * @param dataArea * the area within which the plot should be drawn (a subset of the drawArea). * @param firstGridBandIsDark * True: the first grid band takes the color of <CODE>gridBandPaint<CODE>. * False: the second grid band takes the * color of <CODE>gridBandPaint<CODE>. * @param ticks * the ticks. */ @Override protected void drawGridBandsHorizontal(Graphics2D g2, Rectangle2D plotArea, Rectangle2D dataArea, boolean firstGridBandIsDark, List ticks) { double yy = dataArea.getY(); double xx1, xx2; // gets the outline stroke width of the plot double outlineStrokeWidth; if (getPlot().getOutlineStroke() != null) { outlineStrokeWidth = ((BasicStroke) getPlot().getOutlineStroke()).getLineWidth(); } else { outlineStrokeWidth = 1d; } Iterator iterator = ticks.iterator(); ValueTick tick; Rectangle2D band; while (iterator.hasNext()) { tick = (ValueTick) iterator.next(); int weightIndex = (int) tick.getValue(); xx1 = valueToJava2D(tick.getValue() - 0.5d, dataArea, RectangleEdge.BOTTOM); xx2 = valueToJava2D(tick.getValue() + 0.5d, dataArea, RectangleEdge.BOTTOM); g2.setColor(PlotterAdapter.getWeightColor(this.weights[weightIndex], this.maxWeight)); band = new Rectangle2D.Double(xx1, yy + outlineStrokeWidth, xx2 - xx1, dataArea.getMaxY() - yy - outlineStrokeWidth); g2.fill(band); } g2.setPaintMode(); }
From source file:at.tuwien.ifs.somtoolbox.visualization.thematicmap.SOMRegion.java
public void fillRegion(Graphics2D g, boolean chessboard) { if (!resolved) { fillcolor = getColor(mainClass.classIndex); Color c = repairColor(fillcolor); g.setColor(c); if (segments.isEmpty()) { return; }// www. j a va 2s .c o m g.fillPolygon(this); } else { if (chessboard) { if (polygons == null) { // calculate polygons polygons = new ArrayList<Polygon>(); Rectangle2D rect = getBounds2D(); double w = rect.getWidth(); double h = rect.getHeight(); if (h > 200 || w > 200) { Logger.getLogger("at.tuwien.ifs.somtoolbox").info("ERROR: h>200 || w>200"); return; } int x = (int) rect.getX(); int y = (int) rect.getY(); int xSteps = (int) (w / (int) Grid.SIZE); int ySteps = (int) (h / (int) Grid.SIZE); // int n = classes.size(); for (int i = 0; i < xSteps; i++) { for (int j = 0; j < ySteps; j++) { Polygon p = new Polygon(); p.addPoint((int) (x + i * Grid.SIZE), (int) (y + j * Grid.SIZE)); p.addPoint((int) (x + i * Grid.SIZE + Grid.SIZE), (int) (y + j * Grid.SIZE)); p.addPoint((int) (x + i * Grid.SIZE + Grid.SIZE), (int) (y + Grid.SIZE + j * Grid.SIZE)); p.addPoint((int) (x + i * Grid.SIZE), (int) (y + Grid.SIZE + j * Grid.SIZE)); if (!this.contains(p.getBounds())) { continue; } SOMClass clss = indexGenerator.getNextIndex(); g.setColor(getColor(clss.classIndex)); g.fillPolygon(p); polygons.add(p); } } } else { // use pre-calculated polygons for (int i = 0; i < polygons.size(); i++) { SOMClass clss = indexGenerator.getNextIndex(); g.setColor(getColor(clss.classIndex)); Polygon p = polygons.get(i); g.fillPolygon(p); } } } else { for (int i = 0; i < grids.size(); i++) { Grid grid = grids.get(i); if (grid.clss == null) { continue; } g.setColor(getColor(grid.clss.classIndex)); g.fillRect((int) grid.topLeft.coord(0), (int) grid.topLeft.coord(1), (int) Grid.SIZE, (int) Grid.SIZE); } } } }
From source file:org.apache.fop.render.pcl.PCLRenderer.java
/** * Paints the text decoration marks.//from w ww.java 2 s. com * @param g2d Graphics2D instance to paint to * @param fm Current typeface * @param fontsize Current font size * @param inline inline area to paint the marks for * @param baseline position of the baseline * @param startx start IPD */ private static void renderTextDecoration(Graphics2D g2d, FontMetrics fm, int fontsize, InlineArea inline, int baseline, int startx) { boolean hasTextDeco = inline.hasUnderline() || inline.hasOverline() || inline.hasLineThrough(); if (hasTextDeco) { float descender = fm.getDescender(fontsize) / 1000f; float capHeight = fm.getCapHeight(fontsize) / 1000f; float lineWidth = (descender / -4f) / 1000f; float endx = (startx + inline.getIPD()) / 1000f; if (inline.hasUnderline()) { Color ct = (Color) inline.getTrait(Trait.UNDERLINE_COLOR); g2d.setColor(ct); float y = baseline - descender / 2f; g2d.setStroke(new BasicStroke(lineWidth)); g2d.draw(new Line2D.Float(startx / 1000f, y / 1000f, endx, y / 1000f)); } if (inline.hasOverline()) { Color ct = (Color) inline.getTrait(Trait.OVERLINE_COLOR); g2d.setColor(ct); float y = (float) (baseline - (1.1 * capHeight)); g2d.setStroke(new BasicStroke(lineWidth)); g2d.draw(new Line2D.Float(startx / 1000f, y / 1000f, endx, y / 1000f)); } if (inline.hasLineThrough()) { Color ct = (Color) inline.getTrait(Trait.LINETHROUGH_COLOR); g2d.setColor(ct); float y = (float) (baseline - (0.45 * capHeight)); g2d.setStroke(new BasicStroke(lineWidth)); g2d.draw(new Line2D.Float(startx / 1000f, y / 1000f, endx, y / 1000f)); } } }
From source file:au.org.ala.layers.web.UserDataService.java
@RequestMapping(value = WS_USERDATA_WMS, method = RequestMethod.GET) public void getPointsMap( @RequestParam(value = "CQL_FILTER", required = false, defaultValue = "") String cql_filter, @RequestParam(value = "ENV", required = false, defaultValue = "") String env, @RequestParam(value = "BBOX", required = false, defaultValue = "") String bboxString, @RequestParam(value = "WIDTH", required = false, defaultValue = "") String widthString, @RequestParam(value = "HEIGHT", required = false, defaultValue = "") String heightString, HttpServletRequest request, HttpServletResponse response) { RecordsLookup.setUserDataDao(userDataDao); response.setHeader("Cache-Control", "max-age=86400"); //age == 1 day response.setContentType("image/png"); //only png images generated int width = 256, height = 256; try {/* w ww.ja v a2s. c o m*/ width = Integer.parseInt(widthString); height = Integer.parseInt(heightString); } catch (Exception e) { logger.error("error parsing to int: " + widthString + " or " + heightString, e); } try { env = URLDecoder.decode(env, "UTF-8"); } catch (UnsupportedEncodingException e) { logger.error("error decoding env from UTF-8: " + env, e); } int red = 0, green = 0, blue = 0, alpha = 0; String name = "circle"; int size = 4; boolean uncertainty = false; String highlight = null; String colourMode = null; for (String s : env.split(";")) { String[] pair = s.split(":"); if (pair[0].equals("color")) { while (pair[1].length() < 6) { pair[1] = "0" + pair[1]; } red = Integer.parseInt(pair[1].substring(0, 2), 16); green = Integer.parseInt(pair[1].substring(2, 4), 16); blue = Integer.parseInt(pair[1].substring(4), 16); } else if (pair[0].equals("name")) { name = pair[1]; } else if (pair[0].equals("size")) { size = Integer.parseInt(pair[1]); } else if (pair[0].equals("opacity")) { alpha = (int) (255 * Double.parseDouble(pair[1])); // } else if (pair[0].equals("uncertainty")) { // uncertainty = true; } else if (pair[0].equals("sel")) { try { highlight = URLDecoder.decode(s.substring(4), "UTF-8").replace("%3B", ";"); } catch (Exception e) { } } else if (pair[0].equals("colormode")) { colourMode = pair[1]; } } double[] bbox = new double[4]; int i; i = 0; for (String s : bboxString.split(",")) { try { bbox[i] = Double.parseDouble(s); i++; } catch (Exception e) { logger.error("error converting bounding box value to double: " + s, e); } } try { //adjust bbox extents with half pixel width/height double pixelWidth = (bbox[2] - bbox[0]) / width; double pixelHeight = (bbox[3] - bbox[1]) / height; bbox[0] += pixelWidth / 2; bbox[2] -= pixelWidth / 2; bbox[1] += pixelHeight / 2; bbox[3] -= pixelHeight / 2; //offset for points bounding box by size double xoffset = (bbox[2] - bbox[0]) / (double) width * (size + (highlight != null ? HIGHLIGHT_RADIUS * 2 + size * 0.2 : 0) + 5); double yoffset = (bbox[3] - bbox[1]) / (double) height * (size + (highlight != null ? HIGHLIGHT_RADIUS * 2 + size * 0.2 : 0) + 5); //check offset for points bb by maximum uncertainty (?? 30k ??) if (uncertainty) { double xuoffset = 30000; double yuoffset = 30000; if (xoffset < xuoffset) { xoffset = xuoffset; } if (yoffset < yuoffset) { yoffset = yuoffset; } } //adjust offset for pixel height/width xoffset += pixelWidth; yoffset += pixelHeight; double[][] bb = { { SpatialUtils.convertMetersToLng(bbox[0] - xoffset), SpatialUtils.convertMetersToLat(bbox[1] - yoffset) }, { SpatialUtils.convertMetersToLng(bbox[2] + xoffset), SpatialUtils.convertMetersToLat(bbox[3] + yoffset) } }; double[] pbbox = new double[4]; //pixel bounding box pbbox[0] = SpatialUtils.convertLngToPixel(SpatialUtils.convertMetersToLng(bbox[0])); pbbox[1] = SpatialUtils.convertLatToPixel(SpatialUtils.convertMetersToLat(bbox[1])); pbbox[2] = SpatialUtils.convertLngToPixel(SpatialUtils.convertMetersToLng(bbox[2])); pbbox[3] = SpatialUtils.convertLatToPixel(SpatialUtils.convertMetersToLat(bbox[3])); String lsid = null; int p1 = 0; int p2 = cql_filter.indexOf('&', p1 + 1); if (p2 < 0) { p2 = cql_filter.indexOf(';', p1 + 1); } if (p2 < 0) { p2 = cql_filter.length(); } if (p1 >= 0) { lsid = cql_filter.substring(0, p2); } double[] points = null; ArrayList<QueryField> listHighlight = null; QueryField colours = null; double[] pointsBB = null; Facet facet = null; String[] facetFields = null; if (highlight != null && !(colourMode != null && colourMode.equals("grid"))) { facet = Facet.parseFacet(highlight); facetFields = facet.getFields(); listHighlight = new ArrayList<QueryField>(); } int[] idx = null; if (lsid != null) { Object[] data = (Object[]) RecordsLookup.getData(lsid); points = (double[]) data[1]; pointsBB = (double[]) data[4]; idx = (int[]) data[5]; if (points == null || points.length == 0 || pointsBB[0] > bb[1][0] || pointsBB[2] < bb[0][0] || pointsBB[1] > bb[1][1] || pointsBB[3] < bb[0][1]) { setImageBlank(response); return; } ArrayList<QueryField> fields = (ArrayList<QueryField>) data[2]; for (int j = 0; j < fields.size(); j++) { if (facet != null) { for (int k = 0; k < facetFields.length; k++) { if (facetFields[k].equals(fields.get(j).getName())) { listHighlight.add(fields.get(j)); } } } if (colourMode != null) { if (fields.get(j).getName().equals(colourMode)) { synchronized (fields.get(j)) { //need to resize 'colours' facet to the correct length and store as new QueryField for (int k = 0; k < fields.size(); k++) { if (fields.get(k).getName().equals(colourMode + " resized")) { colours = fields.get(k); } } if (colours == null) { colours = fields.get(j); //does it need to be rebuilt to the correct length? int count = colours.getIntData() != null ? colours.getIntData().length : colours.getLongData() != null ? colours.getLongData().length : colours.getFloatData() != null ? colours.getFloatData().length : colours.getDoubleData() != null ? colours.getDoubleData().length : 0; if (count != points.length / 2) { QueryField qf = new QueryField(); qf.setDisplayName(colours.getDisplayName()); qf.setName(colours.getName() + " resized"); for (int k = 0; k < idx.length; k++) { qf.add(colours.getAsString(idx[k])); } qf.store(); fields.add(qf); colours = qf; } } } } } } } /* TODO: make this a copy instead of create */ BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = (Graphics2D) img.getGraphics(); g.setColor(new Color(0, 0, 0, 0)); g.fillRect(0, 0, width, height); g.setColor(new Color(red, green, blue, alpha)); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int x, y; int pointWidth = size * 2 + 1; double width_mult = (width / (pbbox[2] - pbbox[0])); double height_mult = (height / (pbbox[1] - pbbox[3])); if (colourMode != null && colourMode.equals("grid")) { int divs = 16; double grid_width_mult = (width / (pbbox[2] - pbbox[0])) / (256 / divs); double grid_height_mult = (height / (pbbox[1] - pbbox[3])) / (256 / divs); int[][] gridCounts = new int[divs][divs]; for (i = 0; i < points.length; i += 2) { x = (int) ((SpatialUtils.convertLngToPixel(points[i]) - pbbox[0]) * grid_width_mult); y = (int) ((SpatialUtils.convertLatToPixel(points[i + 1]) - pbbox[3]) * grid_height_mult); if (x >= 0 && x < divs && y >= 0 && y < divs) { gridCounts[x][y]++; } } int xstep = 256 / divs; int ystep = 256 / divs; for (x = 0; x < divs; x++) { for (y = 0; y < divs; y++) { int v = gridCounts[x][y]; if (v > 0) { if (v > 500) { v = 500; } int colour = Legend.getLinearColour(v, 0, 500, 0xFFFFFF00, 0xFFFF0000); g.setColor(new Color(colour)); g.fillRect(x * xstep, y * ystep, xstep, ystep); } } } } else { //circle type if (name.equals("circle")) { if (colours == null) { for (i = 0; i < points.length; i += 2) { if (points[i] >= bb[0][0] && points[i] <= bb[1][0] && points[i + 1] >= bb[0][1] && points[i + 1] <= bb[1][1]) { x = (int) ((SpatialUtils.convertLngToPixel(points[i]) - pbbox[0]) * width_mult); y = (int) ((SpatialUtils.convertLatToPixel(points[i + 1]) - pbbox[3]) * height_mult); g.fillOval(x - size, y - size, pointWidth, pointWidth); } } } else { int prevColour = -1; //!= colours[0] g.setColor(new Color(prevColour)); for (i = 0; i < points.length; i += 2) { if (points[i] >= bb[0][0] && points[i] <= bb[1][0] && points[i + 1] >= bb[0][1] && points[i + 1] <= bb[1][1]) { //colours is made the correct length, see above int thisColour = colours.getColour(i / 2); if (thisColour != prevColour) { g.setColor(new Color(thisColour)); prevColour = thisColour; } x = (int) ((SpatialUtils.convertLngToPixel(points[i]) - pbbox[0]) * width_mult); y = (int) ((SpatialUtils.convertLatToPixel(points[i + 1]) - pbbox[3]) * height_mult); g.fillOval(x - size, y - size, pointWidth, pointWidth); } } } } if (highlight != null && facet != null) { g.setStroke(new BasicStroke(2)); g.setColor(new Color(255, 0, 0, 255)); int sz = size + HIGHLIGHT_RADIUS; int w = sz * 2 + 1; for (i = 0; i < points.length; i += 2) { if (points[i] >= bb[0][0] && points[i] <= bb[1][0] && points[i + 1] >= bb[0][1] && points[i + 1] <= bb[1][1]) { if (facet.isValid(listHighlight, idx[i / 2])) { x = (int) ((SpatialUtils.convertLngToPixel(points[i]) - pbbox[0]) * width_mult); y = (int) ((SpatialUtils.convertLatToPixel(points[i + 1]) - pbbox[3]) * height_mult); g.drawOval(x - sz, y - sz, w, w); } } } } } g.dispose(); try { OutputStream os = response.getOutputStream(); ImageIO.write(img, "png", os); os.flush(); os.close(); } catch (IOException e) { logger.error("error in outputting wms/reflect image as png", e); } } catch (Exception e) { logger.error("error generating wms/reflect tile", e); } //logger.debug("[wms tile: " + (System.currentTimeMillis() - start) + "ms]"); }