1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.diagram.symbollibrary;
\r
14 import java.awt.Color;
\r
15 import java.awt.Graphics2D;
\r
16 import java.awt.Point;
\r
17 import java.awt.RenderingHints;
\r
18 import java.awt.geom.AffineTransform;
\r
19 import java.awt.geom.Rectangle2D;
\r
20 import java.awt.image.BufferedImage;
\r
22 import org.eclipse.swt.graphics.ImageData;
\r
23 import org.simantics.db.ReadGraph;
\r
24 import org.simantics.db.Resource;
\r
25 import org.simantics.db.exception.DatabaseException;
\r
26 import org.simantics.diagram.query.DiagramRequests;
\r
27 import org.simantics.diagram.stubs.DiagramResource;
\r
28 import org.simantics.diagram.stubs.G2DResource;
\r
29 import org.simantics.g2d.diagram.DiagramClass;
\r
30 import org.simantics.g2d.diagram.DiagramHints;
\r
31 import org.simantics.g2d.diagram.IDiagram;
\r
32 import org.simantics.g2d.diagram.impl.Diagram;
\r
33 import org.simantics.g2d.element.ElementClass;
\r
34 import org.simantics.g2d.element.handler.StaticSymbol;
\r
35 import org.simantics.g2d.image.DefaultImages;
\r
36 import org.simantics.g2d.image.Image;
\r
37 import org.simantics.scenegraph.g2d.G2DSceneGraph;
\r
38 import org.simantics.structural.stubs.StructuralResource2;
\r
39 import org.simantics.utils.ui.gfx.ImageUtils;
\r
42 * @author Hannu Niemistö
\r
44 public class IconRenderingUtil {
\r
46 public static BufferedImage renderBufferedImage(ReadGraph graph, Resource symbolResource, int size) throws DatabaseException {
\r
47 // Ensure these resources are available as services.
\r
48 G2DResource.getInstance(graph);
\r
49 StructuralResource2.getInstance(graph);
\r
50 DiagramResource.getInstance(graph);
\r
52 IDiagram diagram = Diagram.spawnNew(DiagramClass.DEFAULT);
\r
54 diagram.setHint(DiagramHints.KEY_ELEMENT_RASTER_TARGET_SIZE, new Point(size,size));
\r
56 graph.syncRequest( DiagramRequests.getElementClass(symbolResource, diagram) );
\r
57 StaticSymbol ss = ec.getSingleItem(StaticSymbol.class);
\r
58 Image source = ss == null ? DefaultImages.UNKNOWN2.get() : ss.getImage();
\r
59 G2DSceneGraph sceneGraph = new G2DSceneGraph();
\r
60 source.init(sceneGraph);
\r
62 BufferedImage targetImage = new BufferedImage(size, size,
\r
63 java.awt.image.BufferedImage.TYPE_INT_ARGB);
\r
64 Graphics2D g2d = (Graphics2D)targetImage.getGraphics();
\r
65 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
\r
66 g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
\r
67 g2d.setBackground(Color.WHITE);
\r
68 g2d.clearRect(0, 0, size, size);
\r
69 Rectangle2D bounds = source.getBounds();
\r
70 double maxB = Math.max(bounds.getWidth(), bounds.getHeight());
\r
71 double scale = size/maxB;
\r
72 g2d.setTransform(new AffineTransform(
\r
73 scale, 0.0, 0.0, scale, -bounds.getMinX()*scale, -bounds.getMinY()*scale
\r
75 sceneGraph.render(g2d);
\r
80 public static ImageData renderIcon(ReadGraph graph, Resource symbolResource, int size) throws DatabaseException {
\r
82 BufferedImage img = renderBufferedImage(graph, symbolResource, size);
\r
85 return ImageUtils.convertToSWT(img);
\r
86 } catch (Exception e) {
\r
87 // FIXME: this is here because rendering a symbol may crash in
\r
88 // totally unexpected ways if the symbol contains unrenderable content.
\r