/* Copyright (C) 2007 Christian Schneider * * This file is part of Nomad. * * Nomad is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Nomad 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 for more details. * * You should have received a copy of the GNU General Public License * along with Nomad; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package net.sf.nmedit.jtheme.clavia.nordmodular.misc; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.HeadlessException; import java.awt.Image; import java.awt.RenderingHints; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Collection; import java.util.List; import net.sf.nmedit.jtheme.clavia.nordmodular.JTNMPatch; import net.sf.nmedit.jtheme.component.JTModuleContainer; import net.sf.nmedit.jtheme.util.PatchImageExporter; public class NMPatchImageExporter extends PatchImageExporter { private Color background = new Color(0, true); private Color titleBG = new Color(0xFFE678); private JTNMPatch patch; public NMPatchImageExporter(JTNMPatch patch) { this.patch = patch; } @Override public Image export() { JTModuleContainer mcPoly = patch.getPolyVoiceArea(); JTModuleContainer mcCommon = patch.getCommonVoiceArea(); List<JTModuleContainer> renderList = new ArrayList<JTModuleContainer>(2); List<String> titles = new ArrayList<String>(); if (addToRenderList(renderList, mcPoly)) { titles.add("Poly Voicearea"); } if (addToRenderList(renderList, mcCommon)) { titles.add("Common Voicearea"); } Image[] parts = renderModuleContainer(renderList.toArray(new JTModuleContainer[renderList.size()])); int w = 1; int h = 1; for (int i=0;i<parts.length;i++) { Image img = parts[i]; w = Math.max(img.getWidth(null), w); h += img.getHeight(null)+20; } BufferedImage bi = new BufferedImage(w, h, isTransparent() ? BufferedImage.TYPE_INT_ARGB: BufferedImage.TYPE_INT_RGB); Graphics2D g = bi.createGraphics(); try { g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); g.setFont(createFont("sansserif", 20-4)); FontMetrics fm = g.getFontMetrics(); if (!isTransparent()) { g.setColor(background); g.fillRect(0, 0, w, h); } g.setColor(Color.BLACK); int y = 0; for (int i=0;i<parts.length;i++) { renderTitle(g, 2, y, w, fm, titles.get(i)); y += 20; Image img = parts[i]; g.drawImage(img, 0, y, null); y += img.getHeight(null); } } finally { g.dispose(); } return bi; } private void renderTitle(Graphics2D g, int x, int top, int w, FontMetrics fm, String string) { g.setColor(titleBG); g.setPaint(new GradientPaint(0, 0, titleBG, w, 0, new Color(titleBG.getRGB()&0xFfFfFf, true))); g.fillRect(0, top, w, 20); g.setColor(Color.BLACK); g.drawString(string, x, top+2+fm.getAscent()-fm.getDescent()); } private boolean addToRenderList(Collection<JTModuleContainer> list, JTModuleContainer m) { if (m.getModuleContainer() != null && m.getModuleContainer().getModuleCount() > 0 && m.getComponentCount()>0) { list.add(m); return true; } return false; } private static int pixelsToPoint(int pixels, int dpi) { return (int) Math.floor((pixels * 72.0) / dpi); } private static Font createFont(String fontname, int heightInPixel) { int fontsize; try { int dpi = Toolkit.getDefaultToolkit().getScreenResolution(); fontsize = pixelsToPoint(heightInPixel, dpi); } catch (HeadlessException e) { return null; } return fontsize>0 ? new Font(fontname, Font.PLAIN, fontsize) : null; } }