]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/symbollibrary/IconRenderingUtil.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / symbollibrary / IconRenderingUtil.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2011 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.symbollibrary;\r
13 \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
21 \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
40 \r
41 /**\r
42  * @author Hannu Niemistö\r
43  */\r
44 public class IconRenderingUtil {\r
45 \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
51 \r
52         IDiagram diagram = Diagram.spawnNew(DiagramClass.DEFAULT);\r
53 \r
54         diagram.setHint(DiagramHints.KEY_ELEMENT_RASTER_TARGET_SIZE, new Point(size,size));\r
55         ElementClass ec = \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
61 \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
74                 ));\r
75         sceneGraph.render(g2d);\r
76 \r
77         return targetImage;\r
78     }\r
79 \r
80     public static ImageData renderIcon(ReadGraph graph, Resource symbolResource, int size) throws DatabaseException {\r
81         try {\r
82             BufferedImage img = renderBufferedImage(graph, symbolResource, size);\r
83             if (img == null)\r
84                 return null;\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
89             return null;\r
90         }\r
91     }\r
92 \r
93 }\r