Package org.jnode.awt

Source Code of org.jnode.awt.JNodeGraphicsEnvironment

/*
* $Id$
*
* Copyright (C) 2003-2014 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.awt;

import gnu.classpath.SystemProperties;
import gnu.java.security.action.GetPropertyAction;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.security.AccessController;
import java.util.Collection;
import java.util.HashSet;
import java.util.Locale;
import javax.naming.NamingException;
import org.apache.log4j.Logger;
import org.jnode.awt.font.FontManager;
import org.jnode.awt.image.JNodeBufferedImageGraphics2D;
import org.jnode.driver.Device;
import org.jnode.driver.DeviceUtils;
import org.jnode.driver.video.FrameBufferAPI;
import org.jnode.naming.InitialNaming;

/**
* JNode implementation of GraphicsEnvironment.
*
* @author Ewout Prangsma (epr@users.sourceforge.net)
*/
public class JNodeGraphicsEnvironment extends GraphicsEnvironment {

    /**
     * My logger
     */
    private static final Logger log = Logger.getLogger(JNodeGraphicsEnvironment.class);
    private JNodeFrameBufferDevice[] devices;
    private GraphicsDevice defaultDevice;

    /**
     * @param image the target image
     * @return The graphics
     * @see java.awt.GraphicsEnvironment#createGraphics(java.awt.image.BufferedImage)
     */
    public Graphics2D createGraphics(BufferedImage image) {
        return SystemProperties.getProperty("gnu.javax.swing.noGraphics2D") == null ?
            new JNodeBufferedImageGraphics2D(image) : GraphicsFactory.getInstance().createGraphics(image);

        /*
        ..future transition to SunGraphics2D based buffered image graphics
        SurfaceData sd = SurfaceData.getPrimarySurfaceData(image);
        SunGraphics2D g = new SunGraphics2D(sd, Color.WHITE, Color.BLACK, null);
        g.drawLine(0,0,0,0);
        g.textpipe = new DefaultTextPipe();
        return g;
        */
    }

    /**
     * @return All fonts
     * @see java.awt.GraphicsEnvironment#getAllFonts()
     */
    public Font[] getAllFonts() {
        final FontManager fm = getFontManager();
        if (fm != null) {
            return fm.getAllFonts();
        } else {
            return new Font[0];
        }
    }

    /**
     * @return All font family names
     * @see java.awt.GraphicsEnvironment#getAvailableFontFamilyNames()
     */
    public String[] getAvailableFontFamilyNames() {
        final Font[] fonts = getAllFonts();
        final HashSet<String> names = new HashSet<String>();
        for (Font f : fonts) {
            names.add(f.getFamily());
        }
        return (String[]) names.toArray(new String[names.size()]);
    }

    /**
     * @param l
     * @return All font family names
     * @see java.awt.GraphicsEnvironment#getAvailableFontFamilyNames(java.util.Locale)
     */
    public String[] getAvailableFontFamilyNames(Locale l) {
        final Font[] fonts = getAllFonts();
        final HashSet<String> names = new HashSet<String>();
        for (Font f : fonts) {
            names.add(f.getFamily(l));
        }
        return (String[]) names.toArray(new String[names.size()]);
    }

    /**
     * @return The default screen device
     * @see java.awt.GraphicsEnvironment#getDefaultScreenDevice()
     */
    public GraphicsDevice getDefaultScreenDevice() {
        verifyCache();
        final String devId = (String) AccessController.doPrivileged(new GetPropertyAction("jnode.awt.device"));
        boolean reload = (defaultDevice == null);
        if ((devId != null) && (defaultDevice != null)) {
            if (!devId.equals(defaultDevice.getIDstring())) {
                reload = true;
            }
        }

        if (reload) {
            final GraphicsDevice[] devs = getScreenDevices();
            if (devId != null) {
                for (int i = 0; (defaultDevice == null) && (i < devs.length); i++) {
                    if (devs[i].getIDstring().equals(devId)) {
                        defaultDevice = devs[i];
                        log.debug("Using ScreenDevice " + defaultDevice.getIDstring());
                    }
                }
            }
            if ((defaultDevice == null) && (devs.length > 0)) {
                defaultDevice = devs[0];
            }
        }
        return defaultDevice;
    }

    /**
     * @param device
     * @see java.awt.GraphicsEnvironment#getDefaultScreenDevice()
     */
    public void setDefaultScreenDevice(GraphicsDevice device) {
        defaultDevice = device;
    }

    /**
     * @return All screen devices
     * @see java.awt.GraphicsEnvironment#getScreenDevices()
     */
    public GraphicsDevice[] getScreenDevices() {
        verifyCache();
        if (devices == null) {
            final Collection<Device> devs = DeviceUtils.getDevicesByAPI(FrameBufferAPI.class);
            devices = new JNodeFrameBufferDevice[devs.size()];
            int idx = 0;
            for (Device dev : devs) {
                devices[idx++] = new JNodeFrameBufferDevice(dev);
            }
        }
        return devices;
    }

    /**
     * Gets the font manager, or null if not found.
     *
     * @return The font manager
     */
    private FontManager getFontManager() {
        try {
            return InitialNaming.lookup(FontManager.NAME);
        } catch (NamingException ex) {
            return null;
        }
    }

    private final void verifyCache() {
        if (devices != null) {
            for (int i = 0; i < devices.length; i++) {
                if (!devices[i].isActive()) {
                    // Reload the devices array
                    log.debug("Flushing AWT device cache");
                    devices = null;
                    defaultDevice = null;
                    return;
                }
            }
        }
    }
}
TOP

Related Classes of org.jnode.awt.JNodeGraphicsEnvironment

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.