001 /*
002 * Copyright 2007 - 2009 JEuclid, http://jeuclid.sf.net
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 /* $Id: MathRenderer.java,v d5b416878097 2009/08/28 07:30:22 max $ */
018
019 package net.sourceforge.jeuclid.swt;
020
021 import java.awt.image.BufferedImage;
022 import java.awt.image.DataBuffer;
023 import java.awt.image.DataBufferByte;
024 import java.awt.image.Raster;
025 import java.io.IOException;
026
027 import net.sourceforge.jeuclid.LayoutContext;
028 import net.sourceforge.jeuclid.converter.Converter;
029
030 import org.apache.commons.logging.Log;
031 import org.apache.commons.logging.LogFactory;
032 import org.eclipse.swt.graphics.ImageData;
033 import org.eclipse.swt.graphics.PaletteData;
034 import org.w3c.dom.Node;
035
036 /**
037 * Renders MathML to SWT ImageData.
038 *
039 * @version $Revision: d5b416878097 $
040 */
041 public final class MathRenderer {
042
043 private static final int COLOR_ENTRIES = 3;
044
045 private static final int BITS_PER_PIXEL = MathRenderer.COLOR_ENTRIES * 8;
046
047 private static final PaletteData PALETTE_BGR = new PaletteData(0xff,
048 0xff00, 0xff0000);
049
050 private static final class SingletonHolder {
051 private static final MathRenderer INSTANCE = new MathRenderer();
052
053 private SingletonHolder() {
054 }
055 }
056
057 /**
058 * Logger for this class
059 */
060 private static final Log LOGGER = LogFactory.getLog(MathRenderer.class);
061
062 private final Converter converter = Converter.getInstance();
063
064 /**
065 * Default constructor.
066 */
067 private MathRenderer() {
068 // Empty on purpose.
069 }
070
071 /**
072 * Retrieve an instance of the converter singleton class.
073 *
074 * @return a Converter object.
075 */
076 public static MathRenderer getInstance() {
077 return MathRenderer.SingletonHolder.INSTANCE;
078 }
079
080 /**
081 * Renders MathML into ImageData.
082 *
083 * @param document
084 * The MathML Document to render
085 * @param layoutContext
086 * LayoutContext to use
087 * @return an ImageData instance or null if an error occurred.
088 */
089 public ImageData render(final Node document,
090 final LayoutContext layoutContext) {
091 ImageData renderedFormula;
092 if (document == null) {
093 renderedFormula = null;
094 } else {
095 try {
096 final BufferedImage bi = this.converter.render(document,
097 layoutContext, BufferedImage.TYPE_3BYTE_BGR);
098 final Raster r = bi.getRaster();
099 final DataBuffer b = r.getDataBuffer();
100 final DataBufferByte db = (DataBufferByte) b;
101 final byte[] data = db.getData();
102 final int w = bi.getWidth();
103 renderedFormula = new ImageData(w, bi.getHeight(),
104 MathRenderer.BITS_PER_PIXEL, MathRenderer.PALETTE_BGR,
105 MathRenderer.COLOR_ENTRIES * w, data);
106 } catch (IOException io) {
107 MathRenderer.LOGGER.warn(io.getMessage(), io);
108 renderedFormula = null;
109 }
110 }
111 return renderedFormula;
112 }
113
114 }