337 lines · 12.2 KB · Java
RawDownload
/* * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.java2d; import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.GraphicsConfiguration;import java.awt.GraphicsDevice;import java.awt.GraphicsEnvironment;import java.awt.Insets;import java.awt.Rectangle;import java.awt.Toolkit;import java.awt.font.TextAttribute;import java.awt.image.BufferedImage;import java.awt.peer.ComponentPeer;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FilenameFilter;import java.io.InputStreamReader;import java.io.IOException;import java.text.AttributedCharacterIterator;import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator;import java.util.Locale;import java.util.Map;import java.util.NoSuchElementException;import java.util.Set;import java.util.StringTokenizer;import java.util.TreeMap;import java.util.Vector;import java.util.concurrent.ConcurrentHashMap;import sun.awt.AppContext;import sun.awt.DisplayChangedListener;import sun.awt.FontConfiguration;import sun.awt.SunDisplayChanger;import sun.font.CompositeFontDescriptor;import sun.font.Font2D;import sun.font.FontManager;import sun.font.FontManagerFactory;import sun.font.FontManagerForSGE;import sun.font.NativeFont; /** * This is an implementation of a GraphicsEnvironment object for the * default local GraphicsEnvironment. * * @see GraphicsDevice * @see GraphicsConfiguration */public abstract class SunGraphicsEnvironment extends GraphicsEnvironment    implements DisplayChangedListener {     public static boolean isOpenSolaris;    private static Font defaultFont;     public SunGraphicsEnvironment() {        java.security.AccessController.doPrivileged(                                    new java.security.PrivilegedAction() {            public Object run() {                    String version = System.getProperty("os.version", "0.0");                    try {                        float ver = Float.parseFloat(version);                        if (ver > 5.10f) {                            File f = new File("/etc/release");                            FileInputStream fis = new FileInputStream(f);                            InputStreamReader isr                                = new InputStreamReader(fis, "ISO-8859-1");                            BufferedReader br = new BufferedReader(isr);                            String line = br.readLine();                            if (line.indexOf("OpenSolaris") >= 0) {                                isOpenSolaris = true;                            } else {                                /* We are using isOpenSolaris as meaning                                 * we know the Solaris commercial fonts aren't                                 * present. "Solaris Next" (03/10) did not                                 * include these even though its was not                                 * OpenSolaris. Need to revisit how this is                                 * handled but for now as in 6ux, we'll use                                 * the test for a standard font resource as                                 * being an indicator as to whether we need                                 * to treat this as OpenSolaris from a font                                 * config perspective.                                 */                                String courierNew =                                    "/usr/openwin/lib/X11/fonts/TrueType/CourierNew.ttf";                                File courierFile = new File(courierNew);                                isOpenSolaris = !courierFile.exists();                            }                            fis.close();                        }                    } catch (Exception e) {                    }                 /* Establish the default font to be used by SG2D etc */                defaultFont = new Font(Font.DIALOG, Font.PLAIN, 12);                 return null;            }        });    }     protected GraphicsDevice[] screens;     /**     * Returns an array of all of the screen devices.     */    public synchronized GraphicsDevice[] getScreenDevices() {        GraphicsDevice[] ret = screens;        if (ret == null) {            int num = getNumScreens();            ret = new GraphicsDevice[num];            for (int i = 0; i < num; i++) {                ret[i] = makeScreenDevice(i);            }            screens = ret;        }        return ret;    }     /**     * Returns the number of screen devices of this graphics environment.     *     * @return the number of screen devices of this graphics environment     */    protected abstract int getNumScreens();     /**     * Create and return the screen device with the specified number. The     * device with number <code>0</code> will be the default device (returned     * by {@link #getDefaultScreenDevice()}.     *     * @param screennum the number of the screen to create     *     * @return the created screen device     */    protected abstract GraphicsDevice makeScreenDevice(int screennum);     /**     * Returns the default screen graphics device.     */    public GraphicsDevice getDefaultScreenDevice() {        return getScreenDevices()[0];    }     /**     * Returns a Graphics2D object for rendering into the     * given BufferedImage.     * @throws NullPointerException if BufferedImage argument is null     */    public Graphics2D createGraphics(BufferedImage img) {        if (img == null) {            throw new NullPointerException("BufferedImage cannot be null");        }        SurfaceData sd = SurfaceData.getPrimarySurfaceData(img);        return new SunGraphics2D(sd, Color.white, Color.black, defaultFont);    }     public static FontManagerForSGE getFontManagerForSGE() {        FontManager fm = FontManagerFactory.getInstance();        return (FontManagerForSGE) fm;    }     /* Modifies the behaviour of a subsequent call to preferLocaleFonts()     * to use Mincho instead of Gothic for dialoginput in JA locales     * on windows. Not needed on other platforms.     *     * DO NOT MOVE OR RENAME OR OTHERWISE ALTER THIS METHOD.     * ITS USED BY SOME NON-JRE INTERNAL CODE.     */    public static void useAlternateFontforJALocales() {        getFontManagerForSGE().useAlternateFontforJALocales();    }      /**     * Returns all fonts available in this environment.     */    public Font[] getAllFonts() {        FontManagerForSGE fm = getFontManagerForSGE();        Font[] installedFonts = fm.getAllInstalledFonts();        Font[] created = fm.getCreatedFonts();        if (created == null || created.length == 0) {            return installedFonts;        } else {            int newlen = installedFonts.length + created.length;            Font [] fonts = java.util.Arrays.copyOf(installedFonts, newlen);            System.arraycopy(created, 0, fonts,                             installedFonts.length, created.length);            return fonts;        }    }     public String[] getAvailableFontFamilyNames(Locale requestedLocale) {        FontManagerForSGE fm = getFontManagerForSGE();        String[] installed = fm.getInstalledFontFamilyNames(requestedLocale);        /* Use a new TreeMap as used in getInstalledFontFamilyNames         * and insert all the keys in lower case, so that the sort order         * is the same as the installed families. This preserves historical         * behaviour and inserts new families in the right place.         * It would have been marginally more efficient to directly obtain         * the tree map and just insert new entries, but not so much as         * to justify the extra internal interface.         */        TreeMap<String, String> map = fm.getCreatedFontFamilyNames();        if (map == null || map.size() == 0) {            return installed;        } else {            for (int i=0; i<installed.length; i++) {                map.put(installed[i].toLowerCase(requestedLocale),                        installed[i]);            }            String[] retval =  new String[map.size()];            Object [] keyNames = map.keySet().toArray();            for (int i=0; i < keyNames.length; i++) {                retval[i] = (String)map.get(keyNames[i]);            }            return retval;        }    }     public String[] getAvailableFontFamilyNames() {        return getAvailableFontFamilyNames(Locale.getDefault());    }     /**     * Return the bounds of a GraphicsDevice, less its screen insets.     * See also java.awt.GraphicsEnvironment.getUsableBounds();     */    public static Rectangle getUsableBounds(GraphicsDevice gd) {        GraphicsConfiguration gc = gd.getDefaultConfiguration();        Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc);        Rectangle usableBounds = gc.getBounds();         usableBounds.x += insets.left;        usableBounds.y += insets.top;        usableBounds.width -= (insets.left + insets.right);        usableBounds.height -= (insets.top + insets.bottom);         return usableBounds;    }     /**     * From the DisplayChangedListener interface; called     * when the display mode has been changed.     */    public void displayChanged() {        // notify screens in device array to do display update stuff        for (GraphicsDevice gd : getScreenDevices()) {            if (gd instanceof DisplayChangedListener) {                ((DisplayChangedListener) gd).displayChanged();            }        }         // notify SunDisplayChanger list (e.g. VolatileSurfaceManagers and        // SurfaceDataProxies) about the display change event        displayChanger.notifyListeners();    }     /**     * Part of the DisplayChangedListener interface:     * propagate this event to listeners     */    public void paletteChanged() {        displayChanger.notifyPaletteChanged();    }     /**     * Returns true when the display is local, false for remote displays.     *     * @return true when the display is local, false for remote displays     */    public abstract boolean isDisplayLocal();     /*     * ----DISPLAY CHANGE SUPPORT----     */     protected SunDisplayChanger displayChanger = new SunDisplayChanger();     /**     * Add a DisplayChangeListener to be notified when the display settings     * are changed.     */    public void addDisplayChangedListener(DisplayChangedListener client) {        displayChanger.add(client);    }     /**     * Remove a DisplayChangeListener from Win32GraphicsEnvironment     */    public void removeDisplayChangedListener(DisplayChangedListener client) {        displayChanger.remove(client);    }     /*     * ----END DISPLAY CHANGE SUPPORT----     */     /**     * Returns true if FlipBufferStrategy with COPIED buffer contents     * is preferred for this peer's GraphicsConfiguration over     * BlitBufferStrategy, false otherwise.     *     * The reason FlipBS could be preferred is that in some configurations     * an accelerated copy to the screen is supported (like Direct3D 9)     *     * @return true if flip strategy should be used, false otherwise     */    public boolean isFlipStrategyPreferred(ComponentPeer peer) {        return false;    }}