/* * 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.AWTError; 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(); if (num == 0) { throw new AWTError("no screen devices"); } 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 0 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 map = fm.getCreatedFontFamilyNames(); if (map == null || map.size() == 0) { return installed; } else { for (int i=0; i