summaryrefslogtreecommitdiff
path: root/libjava/classpath/java/awt
diff options
context:
space:
mode:
authorMatthias Klose <doko@gcc.gnu.org>2007-06-03 23:18:43 +0000
committerMatthias Klose <doko@gcc.gnu.org>2007-06-03 23:18:43 +0000
commite1bea0c0687c5f4551b3a6058ec37ce3705fa6cc (patch)
treea9c9e7d91c484d53fe154f9285fc57325572ce50 /libjava/classpath/java/awt
parentaf333b9a7f9e1cc1029bec56d48f2de63acdf686 (diff)
downloadgcc-e1bea0c0687c5f4551b3a6058ec37ce3705fa6cc.tar.gz
libjava/classpath/ChangeLog.gcj:
2007-05-31 Matthias Klose <doko@ubuntu.com> * javax/management/NotificationBroadcasterSupport.java (getNotificationInfo): Add cast. * native/jni/qt-peer/Makefile.am (AM_CXXFLAGS): Add libstdc++ include directories. * native/jni/qt-peer/Makefile.in: Regenerate. libjava/ChangeLog: 2007-06-03 Matthias Klose <doko@ubuntu.com> * java/io/natFileWin32.cc (setFilePermissions): New (stub only). _access: Handle EXEC query, stub only. 2007-06-03 Matthias Klose <doko@ubuntu.com> Merged from classpath: * gnu/java/nio/SelectorProviderImpl.java: Whitespace merge. * java/lang/System.java(inheritedChannel): New. * java/lang/Character.java: Remove stray`;'. * java/net/MulticastSocket.java: Merged. * java/text/DateFormatSymbols.java(getInstance): New, comment updates. * java/text/Collator.java(getInstance): Merged. * java/util/Calendar.java: New attributes ALL_STYLES, SHORT, LONG. getDisplayName, getDisplayNames: New. * java/util/logging/Logger.java: Merged. * Regenerate .class and .h files. 2007-06-03 Matthias Klose <doko@ubuntu.com> * java/io/File.java: Merge with classpath-0.95, new method setFilePermissions, new attribute EXEC. * java/io/natFilePosix.cc (setFilePermissions): New. _access: Handle EXEC query. * classpath/lib/java/io/File.class, java/io/File.h: Regenerate. 2007-06-03 Matthias Klose <doko@ubuntu.com> Imported GNU Classpath 0.95. * classpath/Makefile.in, classpath/native/jni/midi-dssi/Makefile.in, classpath/native/jni/classpath/Makefile.in, classpath/native/jni/Makefile.in, classpath/native/jni/gconf-peer/Makefile.in, classpath/native/jni/java-io/Makefile.in, classpath/native/jni/native-lib/Makefile.in, classpath/native/jni/java-util/Makefile.in, classpath/native/jni/midi-alsa/Makefile.in, classpath/native/jni/java-lang/Makefile.in, classpath/native/jni/java-nio/Makefile.in, classpath/native/jni/java-net/Makefile.in, classpath/native/jni/xmlj/Makefile.in, classpath/native/jni/qt-peer/Makefile.in, classpath/native/jni/gtk-peer/Makefile.in, classpath/native/Makefile.in, classpath/native/jawt/Makefile.in, classpath/native/fdlibm/Makefile.in, classpath/native/plugin/Makefile.in, classpath/resource/Makefile.in, classpath/scripts/Makefile.in, classpath/tools/Makefile.in, classpath/doc/Makefile.in, classpath/doc/api/Makefile.in, classpath/lib/Makefile.in, classpath/external/Makefile.in, classpath/external/jsr166/Makefile.in, classpath/external/sax/Makefile.in, classpath/external/w3c_dom/Makefile.in, classpath/external/relaxngDatatype/Makefile.in, classpath/include/Makefile.in, classpath/examples/Makefile.in: Regenerate. * classpath/config.guess, classpath/config.sub, classpath/ltmain.sh : Update. * classpath/configure, classpath/depcomp, classpath/missing, classpath/aclocal.m4, classpath/install-sh: Regenerate. * gnu/classpath/Configuration.java (CLASSPATH_VERSION): Now 0.95. * sources.am: Regenerate. * Makefile.in: Regenerate. * Update the .class files and generated CNI header files, add new .class and generated CNI header files. * Remove generated files for removed java source files: classpath/gnu/java/net/BASE64.java, classpath/gnu/java/security/util/Base64.java, classpath/gnu/java/awt/peer/gtk/GThreadMutex.java, classpath/gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java, classpath/gnu/java/awt/font/autofit/Scaler.java, classpath/gnu/classpath/jdwp/util/Value.java, classpath/gnu/javax/net/ssl/Base64.java. * Remove empty directories. * Makefile.am(nat_source_files): Add natVMOperatingSystemMXBeanImpl.cc. * java/lang/Class.java(setAccessible): Merge from classpath. * java/util/Locale.java: Remove. * gnu/java/lang/management/VMOperatingSystemMXBeanImpl.java, gnu/java/lang/management/natVMOperatingSystemMXBeanImpl.cc: New. * gcj/javaprims.h: Update class declarations. * scripts/classes.pl: Update usage. * HACKING: Mention to build all peers. From-SVN: r125302
Diffstat (limited to 'libjava/classpath/java/awt')
-rw-r--r--libjava/classpath/java/awt/AWTEvent.java12
-rw-r--r--libjava/classpath/java/awt/AWTKeyStroke.java6
-rw-r--r--libjava/classpath/java/awt/AlphaComposite.java6
-rw-r--r--libjava/classpath/java/awt/Canvas.java14
-rw-r--r--libjava/classpath/java/awt/CardLayout.java2
-rw-r--r--libjava/classpath/java/awt/Component.java60
-rw-r--r--libjava/classpath/java/awt/Desktop.java268
-rw-r--r--libjava/classpath/java/awt/EventDispatchThread.java3
-rw-r--r--libjava/classpath/java/awt/EventQueue.java6
-rw-r--r--libjava/classpath/java/awt/Frame.java85
-rw-r--r--libjava/classpath/java/awt/GraphicsConfiguration.java31
-rw-r--r--libjava/classpath/java/awt/RenderingHints.java10
-rw-r--r--libjava/classpath/java/awt/Toolkit.java24
-rw-r--r--libjava/classpath/java/awt/Window.java32
-rw-r--r--libjava/classpath/java/awt/datatransfer/SystemFlavorMap.java154
-rw-r--r--libjava/classpath/java/awt/geom/GeneralPath.java11
-rw-r--r--libjava/classpath/java/awt/image/BufferedImage.java327
-rw-r--r--libjava/classpath/java/awt/image/ComponentSampleModel.java448
-rw-r--r--libjava/classpath/java/awt/image/IndexColorModel.java17
-rw-r--r--libjava/classpath/java/awt/image/SinglePixelPackedSampleModel.java150
-rw-r--r--libjava/classpath/java/awt/peer/DesktopPeer.java64
-rw-r--r--libjava/classpath/java/awt/print/PrinterJob.java15
22 files changed, 1024 insertions, 721 deletions
diff --git a/libjava/classpath/java/awt/AWTEvent.java b/libjava/classpath/java/awt/AWTEvent.java
index 3f4027c2c05..102062cdfe6 100644
--- a/libjava/classpath/java/awt/AWTEvent.java
+++ b/libjava/classpath/java/awt/AWTEvent.java
@@ -262,9 +262,17 @@ public abstract class AWTEvent extends EventObject
*/
public String toString ()
{
+ String src;
+ if (source instanceof Component)
+ src = ((Component) source).getName();
+ else if (source instanceof MenuComponent)
+ src = ((MenuComponent) source).getName();
+ else if (source != null)
+ src = source.toString();
+ else
+ src = "null";
String string = getClass ().getName () + "[" + paramString () + "] on "
- + source;
-
+ + src;
return string;
}
diff --git a/libjava/classpath/java/awt/AWTKeyStroke.java b/libjava/classpath/java/awt/AWTKeyStroke.java
index 527e85873e0..e0b34e99238 100644
--- a/libjava/classpath/java/awt/AWTKeyStroke.java
+++ b/libjava/classpath/java/awt/AWTKeyStroke.java
@@ -1,5 +1,5 @@
/* AWTKeyStroke.java -- an immutable key stroke
- Copyright (C) 2002, 2004, 2005 Free Software Foundation
+ Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation
This file is part of GNU Classpath.
@@ -93,9 +93,9 @@ public class AWTKeyStroke implements Serializable
private static final int MAX_CACHE_SIZE = 2048;
/** Prune stale entries. */
- protected boolean removeEldestEntry(Map.Entry<AWTKeyStroke,AWTKeyStroke>
+ protected boolean removeEldestEntry(Entry<AWTKeyStroke,AWTKeyStroke>
eldest)
- { // XXX - FIXME Use Map.Entry, not just Entry as gcj 3.1 workaround.
+ {
return size() > MAX_CACHE_SIZE;
}
};
diff --git a/libjava/classpath/java/awt/AlphaComposite.java b/libjava/classpath/java/awt/AlphaComposite.java
index 92b9e09a60d..90df2e66d8c 100644
--- a/libjava/classpath/java/awt/AlphaComposite.java
+++ b/libjava/classpath/java/awt/AlphaComposite.java
@@ -1,5 +1,5 @@
/* AlphaComposite.java -- provides a context for performing alpha compositing
- Copyright (C) 2002, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -61,8 +61,8 @@ public final class AlphaComposite implements Composite
private static final int MAX_CACHE_SIZE = 2048;
/** Prune stale entries. */
- protected boolean removeEldestEntry(Map.Entry eldest)
- { // XXX - FIXME Use Map.Entry, not just Entry as gcj 3.1 workaround.
+ protected boolean removeEldestEntry(Entry eldest)
+ {
return size() > MAX_CACHE_SIZE;
}
};
diff --git a/libjava/classpath/java/awt/Canvas.java b/libjava/classpath/java/awt/Canvas.java
index 843fded44db..95db1f57e1a 100644
--- a/libjava/classpath/java/awt/Canvas.java
+++ b/libjava/classpath/java/awt/Canvas.java
@@ -75,11 +75,6 @@ public class Canvas
private static transient long next_canvas_number;
/**
- * The graphics configuration associated with the canvas.
- */
- transient GraphicsConfiguration graphicsConfiguration;
-
- /**
* The buffer strategy associated with this canvas.
*/
transient BufferStrategy bufferStrategy;
@@ -100,14 +95,7 @@ public class Canvas
*/
public Canvas(GraphicsConfiguration graphicsConfiguration)
{
- this.graphicsConfiguration = graphicsConfiguration;
- }
-
- GraphicsConfiguration getGraphicsConfigurationImpl()
- {
- if (graphicsConfiguration != null)
- return graphicsConfiguration;
- return super.getGraphicsConfigurationImpl();
+ this.graphicsConfig = graphicsConfiguration;
}
/**
diff --git a/libjava/classpath/java/awt/CardLayout.java b/libjava/classpath/java/awt/CardLayout.java
index 2e3feece8d2..35380d2370b 100644
--- a/libjava/classpath/java/awt/CardLayout.java
+++ b/libjava/classpath/java/awt/CardLayout.java
@@ -225,7 +225,7 @@ public class CardLayout implements LayoutManager2, Serializable
*/
public Dimension maximumLayoutSize (Container target)
{
- if (target == null)
+ if (target == null || target.ncomponents == 0)
return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
// The JCL says that this returns Integer.MAX_VALUE for both
// dimensions. But that just seems wrong to me.
diff --git a/libjava/classpath/java/awt/Component.java b/libjava/classpath/java/awt/Component.java
index b6eadabbb5c..f8bed17618e 100644
--- a/libjava/classpath/java/awt/Component.java
+++ b/libjava/classpath/java/awt/Component.java
@@ -726,7 +726,23 @@ public abstract class Component
*/
public GraphicsConfiguration getGraphicsConfiguration()
{
- return getGraphicsConfigurationImpl();
+ GraphicsConfiguration conf = null;
+ synchronized (getTreeLock())
+ {
+ if (graphicsConfig != null)
+ {
+ conf = graphicsConfig;
+ }
+ else
+ {
+ Component par = getParent();
+ if (par != null)
+ {
+ conf = parent.getGraphicsConfiguration();
+ }
+ }
+ }
+ return conf;
}
/**
@@ -823,7 +839,8 @@ public abstract class Component
*/
public boolean isShowing()
{
- return visible && peer != null && (parent == null || parent.isShowing());
+ Component par = parent;
+ return visible && peer != null && (par == null || par.isShowing());
}
/**
@@ -1179,19 +1196,12 @@ public abstract class Component
*/
public Font getFont()
{
- Font f;
- synchronized (getTreeLock())
- {
- f = getFontImpl();
- }
- return f;
+ return getFontImpl();
}
/**
* Implementation of getFont(). This is pulled out of getFont() to prevent
- * client programs from overriding this. This method is executed within
- * a tree lock, so we can assume that the hierarchy doesn't change in
- * between.
+ * client programs from overriding this.
*
* @return the font of this component
*/
@@ -1204,7 +1214,12 @@ public abstract class Component
if (p != null)
f = p.getFontImpl();
else
- f = new Font("Dialog", Font.PLAIN, 12);
+ {
+ // It is important to return null here and not some kind of default
+ // font, otherwise the Swing UI would not install its fonts because
+ // it keeps non-UIResource fonts.
+ f = null;
+ }
}
return f;
}
@@ -5435,27 +5450,6 @@ p * <li>the set of backward traversal keys
}
/**
- * Implementation method that allows classes such as Canvas and Window to
- * override the graphics configuration without violating the published API.
- *
- * @return the graphics configuration
- */
- GraphicsConfiguration getGraphicsConfigurationImpl()
- {
- if (peer != null)
- {
- GraphicsConfiguration config = peer.getGraphicsConfiguration();
- if (config != null)
- return config;
- }
-
- if (parent != null)
- return parent.getGraphicsConfiguration();
-
- return null;
- }
-
- /**
* Translate an AWT 1.1 event ({@link AWTEvent}) into an AWT 1.0
* event ({@link Event}).
*
diff --git a/libjava/classpath/java/awt/Desktop.java b/libjava/classpath/java/awt/Desktop.java
new file mode 100644
index 00000000000..8010464c00d
--- /dev/null
+++ b/libjava/classpath/java/awt/Desktop.java
@@ -0,0 +1,268 @@
+/* Desktop.java -- enable desktop integration between java programs and system
+ programs.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath 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, or (at your option)
+ any later version.
+
+ GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+package java.awt;
+
+import java.awt.peer.DesktopPeer;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+
+/**
+ * This class enables Java application to access system commands to perform
+ * desktop oriented operations, like writing and sending emails, or surfing
+ * webpages with the system browser or editing/printing files with a default
+ * editor. Methods are provided to handle these common operations, plus an
+ * <code>open</code> command selects a default registered application for the
+ * specified file type. For example, opening an odf file results in launching
+ * OpenOffice. If an operation is not supported, or the application fails to
+ * launch, an exception is generated.
+ *
+ * <strong>Implementation note: </strong>As this class is used to manage Desktop
+ * integration, we provide some extension to configure the behaviour of this
+ * class depending on the type of dektop that is detected.<br />
+ *
+ * First of all, we support 5 system properties that can be used to define
+ * the application to launch in any given case. These properties are:<br />
+ * <br />
+ * <code>gnu.java.awt.peer.Desktop.html.command</code><br />
+ * <code>gnu.java.awt.peer.Desktop.mail.command</code><br />
+ * <code>gnu.java.awt.peer.Desktop.edit.command</code><br />
+ * <code>gnu.java.awt.peer.Desktop.print.command</code><br />
+ * <code>gnu.java.awt.peer.Desktop.open.command</code><br />
+ * <br />
+ * <br />
+ * These can be specified from the command line and have priority on every
+ * other setting.<br />
+ * <br />
+ * The second method supported is defining a Java preference.<br />
+ * The main preference node is a <strong>user node</strong> relative to the
+ * class <code>gnu.java.awt.peer.ClasspathDesktopPeer</code>. This node
+ * contains a child for each supported operation. The key for each type is
+ * always <code>command</code>:
+ * <br /><br />
+ * <code>gnu.java.awt.peer.Desktop.html.command</code><br />
+ * <code>gnu.java.awt.peer.Desktop.mail.command</code><br />
+ * <code>gnu.java.awt.peer.Desktop.edit.command</code><br />
+ * <code>gnu.java.awt.peer.Desktop.print.command</code><br />
+ * <code>gnu.java.awt.peer.Desktop.open.command</code><br />
+ * <br />
+ * <br />
+ * The access to these keys is done with the Preference API or, if outside
+ * of the java scope, is done in a backend dependent way. For example,
+ * with the GConf backend, you can access these properties
+ * with (may not be accurate on your system):
+ * <br /><br />
+ * <code>
+ * gconftool-2 -g /apps/classpath/gnu/java/awt/peer/Desktop/html/command
+ * </code>
+ *
+ * @author Mario Torre <neugens@limasoftware.net>
+ * @since 1.6
+ */
+public class Desktop
+{
+ /**
+ * Represents an action type supported by a platform.
+ *
+ * To determine if a given action is supported by the platform,
+ * use the <code>Desktop.isSupported(java.awt.Desktop.Action)</code>
+ * method.
+ *
+ * @author Mario Torre <neugens@limasoftware.net>
+ */
+ public enum Action
+ {
+ BROWSE, EDIT, MAIL, OPEN, PRINT
+ }
+
+ private DesktopPeer peer;
+
+ private Desktop()
+ {
+ /* nothing to be done */
+ }
+
+ /**
+ * Returns an istance of the Desktop Class.
+ *
+ * If this implementation does not support Desktop, an
+ * UnsupportedOperationException will be thrown.
+ * Also, an HeadlessException will be generated if
+ * GraphicsEnvironment.isHeadless() returns true.
+ *
+ * @throws UnsupportedOperationException
+ * @throws HeadlessException
+ */
+ public static Desktop getDesktop() throws UnsupportedOperationException,
+ HeadlessException
+ {
+ if (GraphicsEnvironment.isHeadless())
+ throw new HeadlessException();
+
+ if (!Desktop.isDesktopSupported())
+ throw new UnsupportedOperationException();
+
+ Desktop desktop = new Desktop();
+ desktop.peer = Toolkit.getDefaultToolkit().createDesktopPeer(desktop);
+
+ return desktop;
+ }
+
+ /**
+ * Check if this implementation supports Desktop.
+ * If true, use getDesktop to get an instance of this class.
+ *
+ * This implementation will return false when GraphicsEnvironment.isHeadless
+ * returns true.
+ *
+ * @return true if this class is supported on the current platform;
+ * false otherwise
+ */
+ private static boolean isDesktopSupported()
+ {
+ if (GraphicsEnvironment.isHeadless())
+ return false;
+
+ return true;
+ }
+
+ /**
+ * Check if the given Action is supported by this implementation.
+ *
+ * @param action
+ * @return
+ */
+ public boolean isSupported(Desktop.Action action)
+ {
+ return peer.isSupported(action);
+ }
+
+ /**
+ * Launches the Desktop default browser to open the given <code>uri</code>.
+ *
+ * If a security manager exists and denies
+ * AWTPermission("showWindowWithoutWarningBanner"),a SecurityException will
+ * be generated.
+ *
+ * @param uri
+ * @throws IOException
+ */
+ public void browse(URI uri)
+ throws IOException
+ {
+ peer.browse(uri);
+ }
+
+ /**
+ * Launch the edit command to edit this file.
+ * File should already exist before the editing starts.
+ *
+ * If a security manager exists and
+ * SecurityManager.checkRead(java.lang.String) method denies read access to
+ * the file, or SecurityManager.checkPrintJobAccess() method denies the
+ * permission to print the file, a SecurityException will be generated.
+ *
+ * @param file
+ * @throws IOException
+ */
+ public void edit(File file)
+ throws IOException
+ {
+ peer.edit(file);
+ }
+
+ /**
+ * Launches the Desktop default mailer.
+ *
+ * If a security manager exists and denies
+ * AWTPermission("showWindowWithoutWarningBanner"), a SecurityException will
+ * be generated.
+ *
+ * @throws IOException
+ */
+ public void mail()
+ throws IOException
+ {
+ peer.mail();
+ }
+
+ /**
+ * Launches the Desktop default mailer, with the given mailtoURI
+ * as agrument. The <code>mailtoURI</code> must conform to the
+ * {@link http://www.ietf.org/rfc/rfc2368.txt The mailto URL scheme (RFC 2368)}
+ *
+ * If a security manager exists and denies
+ * AWTPermission("showWindowWithoutWarningBanner"), a SecurityException will
+ * be generated.
+ *
+ * @param mailtoURI
+ * @throws IOException
+ */
+ public void mail(URI mailtoURI)
+ throws IOException
+ {
+ peer.mail(mailtoURI);
+ }
+
+ /**
+ * Launches the Desktop default application to open the given File.
+ * If <code>file</code> is a directory, a file manager is launched.
+ *
+ * @param file
+ * @throws IOException
+ */
+ public void open(File file)
+ throws IOException
+ {
+ peer.open(file);
+ }
+
+ /**
+ * Launch the print program to print this file.
+ *
+ * @param file
+ * @throws IOException
+ */
+ public void print(File file)
+ throws IOException
+ {
+ peer.print(file);
+ }
+}
diff --git a/libjava/classpath/java/awt/EventDispatchThread.java b/libjava/classpath/java/awt/EventDispatchThread.java
index 074a84975ac..9f81a794415 100644
--- a/libjava/classpath/java/awt/EventDispatchThread.java
+++ b/libjava/classpath/java/awt/EventDispatchThread.java
@@ -73,6 +73,9 @@ class EventDispatchThread extends Thread
// Ignore and use default.
}
setPriority(priority);
+
+ // Make sure that an event dispatch thread is never a daemon thread.
+ setDaemon(false);
}
public void run()
diff --git a/libjava/classpath/java/awt/EventQueue.java b/libjava/classpath/java/awt/EventQueue.java
index 74dbd5fb67d..eb17449a00c 100644
--- a/libjava/classpath/java/awt/EventQueue.java
+++ b/libjava/classpath/java/awt/EventQueue.java
@@ -128,10 +128,8 @@ public class EventQueue
if (peekEvent() != null)
return false;
- Frame[] frames = Frame.getFrames();
- for (int i = 0; i < frames.length; ++i)
- if (frames[i].isDisplayable())
- return false;
+ if (Frame.hasDisplayableFrames())
+ return false;
return true;
}
diff --git a/libjava/classpath/java/awt/Frame.java b/libjava/classpath/java/awt/Frame.java
index d5cc7f53197..3cc8738c63f 100644
--- a/libjava/classpath/java/awt/Frame.java
+++ b/libjava/classpath/java/awt/Frame.java
@@ -40,9 +40,10 @@ exception statement from your version. */
package java.awt;
import java.awt.peer.FramePeer;
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.Vector;
import javax.accessibility.AccessibleContext;
@@ -484,44 +485,72 @@ public class Frame extends Window implements MenuContainer
return super.paramString () + ",title=" + title + resizable + state;
}
- private static ArrayList weakFrames = new ArrayList();
+ /**
+ * The list of active frames. GC'ed frames get removed in noteFrame().
+ */
+ private static ArrayList<WeakReference<Frame>> weakFrames =
+ new ArrayList<WeakReference<Frame>>();
+
+ /**
+ * The death queue for all frames.
+ */
+ private static ReferenceQueue weakFramesQueue =
+ new ReferenceQueue<Frame>();
private static void noteFrame(Frame f)
{
synchronized (weakFrames)
{
- weakFrames.add(new WeakReference(f));
+ // Remove GCed frames from the list.
+ Reference ref = weakFramesQueue.poll();
+ while (ref != null)
+ {
+ weakFrames.remove(ref);
+ ref = weakFramesQueue.poll();
+ }
+ // Add new frame.
+ weakFrames.add(new WeakReference<Frame>(f));
}
}
+ /**
+ * Returns <code>true</code> when there are any displayable frames,
+ * <code>false</code> otherwise.
+ *
+ * @return <code>true</code> when there are any displayable frames,
+ * <code>false</code> otherwise
+ */
+ static boolean hasDisplayableFrames()
+ {
+ synchronized (weakFrames)
+ {
+ for (WeakReference<Frame> r : Frame.weakFrames)
+ {
+ Frame f = (Frame) r.get();
+ if (f != null && f.isDisplayable())
+ return true;
+ }
+ }
+ return false;
+ }
+
public static Frame[] getFrames()
{
- int n = 0;
synchronized (weakFrames)
- {
- Iterator i = weakFrames.iterator();
- while (i.hasNext())
- {
- WeakReference wr = (WeakReference) i.next();
- if (wr.get() != null)
- ++n;
- }
- if (n == 0)
- return new Frame[0];
- else
- {
- Frame[] frames = new Frame[n];
- n = 0;
- i = weakFrames.iterator();
- while (i.hasNext())
- {
- WeakReference wr = (WeakReference) i.next();
- if (wr.get() != null)
- frames[n++] = (Frame) wr.get();
- }
- return frames;
- }
- }
+ {
+ ArrayList<Frame> existingFrames = new ArrayList<Frame>();
+ for (WeakReference<Frame> ref : weakFrames)
+ {
+ Frame f = ref.get();
+ if (f != null)
+ {
+ existingFrames.add(f);
+ }
+ }
+ Frame[] frames = new Frame[existingFrames.size()];
+ frames = existingFrames.toArray(frames);
+ return frames;
+ }
}
public void setState(int state)
diff --git a/libjava/classpath/java/awt/GraphicsConfiguration.java b/libjava/classpath/java/awt/GraphicsConfiguration.java
index 792b2cc1b2b..3cf8b65db8f 100644
--- a/libjava/classpath/java/awt/GraphicsConfiguration.java
+++ b/libjava/classpath/java/awt/GraphicsConfiguration.java
@@ -38,8 +38,6 @@ exception statement from your version. */
package java.awt;
-import gnu.classpath.NotImplementedException;
-
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
@@ -131,7 +129,8 @@ public abstract class GraphicsConfiguration
ImageCapabilities caps)
throws AWTException
{
- throw new AWTException("not implemented");
+ // Must be overridden by implementations to check caps.
+ return createCompatibleVolatileImage(w, h);
}
/**
@@ -150,6 +149,32 @@ public abstract class GraphicsConfiguration
int transparency);
/**
+ * Creates a volatile image with the specified capabilities and transparency.
+ * If the backend cannot meet the requested capabilities and transparency,
+ * an AWTException is thrown.
+ *
+ * @param width the width of the image
+ * @param height the height of the image
+ * @param caps the requested capabilities
+ * @param transparency the required transparency
+ *
+ * @return a volatile image with the specified capabilites and transparency
+ *
+ * @throws AWTException if the required capabilities and transparency cannot
+ * be met
+ *
+ * @since 1.5
+ */
+ public VolatileImage createCompatibleVolatileImage(int width, int height,
+ ImageCapabilities caps,
+ int transparency)
+ throws AWTException
+ {
+ // Must be overridden by implementations to check caps.
+ return createCompatibleVolatileImage(width, height, transparency);
+ }
+
+ /**
* Returns a buffered image optimized to this device, and with the specified
* transparency, so that blitting can be supported in the buffered image.
*
diff --git a/libjava/classpath/java/awt/RenderingHints.java b/libjava/classpath/java/awt/RenderingHints.java
index ce327e36947..e98a00c5bab 100644
--- a/libjava/classpath/java/awt/RenderingHints.java
+++ b/libjava/classpath/java/awt/RenderingHints.java
@@ -158,7 +158,7 @@ public class RenderingHints
}
} // class KeyImpl
- private HashMap hintMap = new HashMap();
+ private HashMap<Object,Object> hintMap = new HashMap<Object,Object>();
/**
* A key for the 'antialiasing' hint. Permitted values are:
@@ -711,9 +711,9 @@ public class RenderingHints
Iterator iterator = m.keySet().iterator();
while (iterator.hasNext())
{
- Key key = (Key) iterator.next();
- if (!key.isCompatibleValue(m.get(key)))
- throw new IllegalArgumentException();
+ Key key = (Key) iterator.next();
+ if (!key.isCompatibleValue(m.get(key)))
+ throw new IllegalArgumentException();
}
// map is OK, update
hintMap.putAll(m);
@@ -783,7 +783,7 @@ public class RenderingHints
try
{
RenderingHints copy = (RenderingHints) super.clone();
- copy.hintMap = (HashMap) hintMap.clone();
+ copy.hintMap = new HashMap<Object,Object>(hintMap);
return copy;
}
catch (CloneNotSupportedException e)
diff --git a/libjava/classpath/java/awt/Toolkit.java b/libjava/classpath/java/awt/Toolkit.java
index 69040722e72..305402e9541 100644
--- a/libjava/classpath/java/awt/Toolkit.java
+++ b/libjava/classpath/java/awt/Toolkit.java
@@ -1,5 +1,5 @@
/* Toolkit.java -- AWT Toolkit superclass
- Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -40,6 +40,7 @@ exception statement from your version. */
package java.awt;
import gnu.classpath.SystemProperties;
+import gnu.java.awt.AWTUtilities;
import gnu.java.awt.peer.GLightweightPeer;
import gnu.java.awt.peer.headless.HeadlessToolkit;
@@ -62,6 +63,7 @@ import java.awt.peer.CanvasPeer;
import java.awt.peer.CheckboxMenuItemPeer;
import java.awt.peer.CheckboxPeer;
import java.awt.peer.ChoicePeer;
+import java.awt.peer.DesktopPeer;
import java.awt.peer.DialogPeer;
import java.awt.peer.FileDialogPeer;
import java.awt.peer.FontPeer;
@@ -148,6 +150,15 @@ public abstract class Toolkit
}
/**
+ *
+ * @param target
+ * @return
+ * @throws HeadlessException
+ */
+ protected abstract DesktopPeer createDesktopPeer(Desktop target)
+ throws HeadlessException;
+
+ /**
* Creates a peer object for the specified <code>Button</code>.
*
* @param target The <code>Button</code> to create the peer for.
@@ -802,12 +813,11 @@ public abstract class Toolkit
*/
public boolean getLockingKeyState(int keyCode)
{
- if (keyCode != KeyEvent.VK_CAPS_LOCK
- && keyCode != KeyEvent.VK_NUM_LOCK
- && keyCode != KeyEvent.VK_SCROLL_LOCK)
- throw new IllegalArgumentException();
-
- throw new UnsupportedOperationException();
+ if (AWTUtilities.isValidKey(keyCode))
+ throw new UnsupportedOperationException
+ ("cannot get locking state of key code " + keyCode);
+
+ throw new IllegalArgumentException("invalid key code " + keyCode);
}
/**
diff --git a/libjava/classpath/java/awt/Window.java b/libjava/classpath/java/awt/Window.java
index 41dff5577e0..2a59375ced9 100644
--- a/libjava/classpath/java/awt/Window.java
+++ b/libjava/classpath/java/awt/Window.java
@@ -87,7 +87,6 @@ public class Window extends Container implements Accessible
private transient WindowListener windowListener;
private transient WindowFocusListener windowFocusListener;
private transient WindowStateListener windowStateListener;
- private transient GraphicsConfiguration graphicsConfiguration;
private transient boolean shown;
@@ -132,13 +131,13 @@ public class Window extends Container implements Accessible
setLayout(new BorderLayout());
GraphicsEnvironment g = GraphicsEnvironment.getLocalGraphicsEnvironment();
- graphicsConfiguration = g.getDefaultScreenDevice().getDefaultConfiguration();
+ graphicsConfig = g.getDefaultScreenDevice().getDefaultConfiguration();
}
Window(GraphicsConfiguration gc)
{
this();
- graphicsConfiguration = gc;
+ graphicsConfig = gc;
}
/**
@@ -204,19 +203,11 @@ public class Window extends Container implements Accessible
throw new IllegalArgumentException ("gc must be from a screen device");
if (gc == null)
- graphicsConfiguration = GraphicsEnvironment.getLocalGraphicsEnvironment()
- .getDefaultScreenDevice()
- .getDefaultConfiguration();
+ graphicsConfig = GraphicsEnvironment.getLocalGraphicsEnvironment()
+ .getDefaultScreenDevice()
+ .getDefaultConfiguration();
else
- graphicsConfiguration = gc;
- }
-
- GraphicsConfiguration getGraphicsConfigurationImpl()
- {
- if (graphicsConfiguration != null)
- return graphicsConfiguration;
-
- return super.getGraphicsConfigurationImpl();
+ graphicsConfig = gc;
}
/**
@@ -1073,9 +1064,14 @@ public class Window extends Container implements Accessible
*/
public GraphicsConfiguration getGraphicsConfiguration()
{
- if (graphicsConfiguration != null) return graphicsConfiguration;
- if (peer != null) return peer.getGraphicsConfiguration();
- return null;
+ GraphicsConfiguration conf = graphicsConfig;
+ if (conf == null)
+ {
+ conf = GraphicsEnvironment.getLocalGraphicsEnvironment()
+ .getDefaultScreenDevice().getDefaultConfiguration();
+ graphicsConfig = conf;
+ }
+ return conf;
}
protected void processWindowFocusEvent(WindowEvent event)
diff --git a/libjava/classpath/java/awt/datatransfer/SystemFlavorMap.java b/libjava/classpath/java/awt/datatransfer/SystemFlavorMap.java
index e163fe067e2..7f296b5941a 100644
--- a/libjava/classpath/java/awt/datatransfer/SystemFlavorMap.java
+++ b/libjava/classpath/java/awt/datatransfer/SystemFlavorMap.java
@@ -38,12 +38,21 @@ exception statement from your version. */
package java.awt.datatransfer;
-import gnu.classpath.NotImplementedException;
-
+import java.awt.Toolkit;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
import java.util.WeakHashMap;
/**
@@ -72,19 +81,102 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable
* This map maps native <code>String</code>s to lists of
* <code>DataFlavor</code>s
*/
- private HashMap nativeToFlavorMap = new HashMap();
+ private HashMap<String,List<DataFlavor>> nativeToFlavorMap =
+ new HashMap<String,List<DataFlavor>>();
/**
* This map maps <code>DataFlavor</code>s to lists of native
* <code>String</code>s
*/
- private HashMap flavorToNativeMap = new HashMap();
+ private HashMap<DataFlavor, List<String>> flavorToNativeMap =
+ new HashMap<DataFlavor, List<String>>();
/**
* Private constructor.
*/
private SystemFlavorMap ()
{
+ AccessController.doPrivileged
+ (new PrivilegedAction<Object>()
+ {
+ public Object run()
+ {
+ try
+ {
+ // Load installed flavormap.properties first.
+ String sep = File.separator;
+ File propsFile =
+ new File(System.getProperty("gnu.classpath.home.url")
+ + sep + "accessibility.properties");
+ InputStream in = new FileInputStream(propsFile);
+ Properties props = new Properties();
+ props.load(in);
+ in.close();
+
+ String augmented = Toolkit.getProperty("AWT.DnD.flavorMapFileURL",
+ null);
+ if (augmented != null)
+ {
+ URL url = new URL(augmented);
+ in = url.openStream();
+ props.load(in);
+ }
+ setupMapping(props);
+ }
+ catch (IOException ex)
+ {
+ // Can't do anything about it.
+ }
+ return null;
+ }
+ });
+ }
+
+ /**
+ * Sets up the mapping from native to mime types and vice versa as specified
+ * in the flavormap.properties file.
+ *
+ * This is package private to avoid an accessor method.
+ *
+ * @param props the properties file
+ */
+ void setupMapping(Properties props)
+ {
+ Enumeration propNames = props.propertyNames();
+ while (propNames.hasMoreElements())
+ {
+ try
+ {
+ String nat = (String) propNames.nextElement();
+ String mime = (String) props.getProperty(nat);
+ // Check valid mime type.
+ MimeType type = new MimeType(mime);
+ DataFlavor flav = new DataFlavor(mime);
+
+ List<DataFlavor> flavs = nativeToFlavorMap.get(nat);
+ if (flavs == null)
+ {
+ flavs = new ArrayList<DataFlavor>();
+ nativeToFlavorMap.put(nat, flavs);
+ }
+ List<String> nats = flavorToNativeMap.get(flav);
+ if (nats == null)
+ {
+ nats = new ArrayList<String>();
+ flavorToNativeMap.put(flav, nats);
+ }
+ flavs.add(flav);
+ nats.add(nat);
+ }
+ catch (ClassNotFoundException ex)
+ {
+ // Skip.
+ }
+ catch (MimeTypeParseException ex)
+ {
+ // Skip.
+ }
+ }
}
/**
@@ -263,16 +355,52 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable
* specified native and a DataFlavor whose MIME type is a decoded
* version of the native.
*/
- public List<DataFlavor> getFlavorsForNative (String nat)
- throws NotImplementedException
+ public List<DataFlavor> getFlavorsForNative(String nat)
{
- throw new Error ("Not implemented");
+ List<DataFlavor> ret = new ArrayList<DataFlavor>();
+ if (nat == null)
+ {
+ Collection<List<DataFlavor>> all = nativeToFlavorMap.values();
+ for (List<DataFlavor> list : all)
+ {
+ for (DataFlavor flav : list)
+ {
+ if (! ret.contains(flav))
+ ret.add(flav);
+ }
+ }
+ }
+ else
+ {
+ List<DataFlavor> list = nativeToFlavorMap.get(nat);
+ if (list != null)
+ ret.addAll(list);
+ }
+ return ret;
}
public List<String> getNativesForFlavor (DataFlavor flav)
- throws NotImplementedException
{
- throw new Error ("Not implemented");
+ List<String> ret = new ArrayList<String>();
+ if (flav == null)
+ {
+ Collection<List<String>> all = flavorToNativeMap.values();
+ for (List<String> list : all)
+ {
+ for (String nat : list)
+ {
+ if (! ret.contains(nat))
+ ret.add(nat);
+ }
+ }
+ }
+ else
+ {
+ List<String> list = flavorToNativeMap.get(flav);
+ if (list != null)
+ ret.addAll(list);
+ }
+ return ret;
}
/**
@@ -298,10 +426,10 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable
{
if ((nativeStr == null) || (flavor == null))
throw new NullPointerException();
- List flavors = (List) nativeToFlavorMap.get(nativeStr);
+ List<DataFlavor> flavors = nativeToFlavorMap.get(nativeStr);
if (flavors == null)
{
- flavors = new ArrayList();
+ flavors = new ArrayList<DataFlavor>();
nativeToFlavorMap.put(nativeStr, flavors);
}
else
@@ -336,10 +464,10 @@ public final class SystemFlavorMap implements FlavorMap, FlavorTable
{
if ((nativeStr == null) || (flavor == null))
throw new NullPointerException();
- List natives = (List) flavorToNativeMap.get(flavor);
+ List<String> natives = flavorToNativeMap.get(flavor);
if (natives == null)
{
- natives = new ArrayList();
+ natives = new ArrayList<String>();
flavorToNativeMap.put(flavor, natives);
}
else
diff --git a/libjava/classpath/java/awt/geom/GeneralPath.java b/libjava/classpath/java/awt/geom/GeneralPath.java
index 1e9ede5ee67..fa27d1908c7 100644
--- a/libjava/classpath/java/awt/geom/GeneralPath.java
+++ b/libjava/classpath/java/awt/geom/GeneralPath.java
@@ -79,22 +79,17 @@ import java.awt.Shape;
*/
public final class GeneralPath implements Shape, Cloneable
{
- // WORKAROUND for gcj 4.0.x (x < 3)
- // fully qualify PathIterator constants.
-
/** Same constant as {@link PathIterator#WIND_EVEN_ODD}. */
- public static final int WIND_EVEN_ODD
- = java.awt.geom.PathIterator.WIND_EVEN_ODD;
+ public static final int WIND_EVEN_ODD = PathIterator.WIND_EVEN_ODD;
/** Same constant as {@link PathIterator#WIND_NON_ZERO}. */
- public static final int WIND_NON_ZERO
- = java.awt.geom.PathIterator.WIND_NON_ZERO;
+ public static final int WIND_NON_ZERO = PathIterator.WIND_NON_ZERO;
/** Initial size if not specified. */
private static final int INIT_SIZE = 10;
/** A big number, but not so big it can't survive a few float operations */
- private static final double BIG_VALUE = java.lang.Double.MAX_VALUE / 10.0;
+ private static final double BIG_VALUE = Double.MAX_VALUE / 10.0;
/** The winding rule.
* This is package-private to avoid an accessor method.
diff --git a/libjava/classpath/java/awt/image/BufferedImage.java b/libjava/classpath/java/awt/image/BufferedImage.java
index ef3141d0ead..c9879461ce2 100644
--- a/libjava/classpath/java/awt/image/BufferedImage.java
+++ b/libjava/classpath/java/awt/image/BufferedImage.java
@@ -39,7 +39,9 @@ exception statement from your version. */
package java.awt.image;
import gnu.java.awt.Buffers;
+import gnu.java.awt.ClasspathGraphicsEnvironment;
import gnu.java.awt.ComponentDataBlitOp;
+import gnu.java.awt.peer.gtk.CairoSurface;
import java.awt.Graphics;
import java.awt.Graphics2D;
@@ -83,7 +85,7 @@ public class BufferedImage extends Image
/**
* Vector of TileObservers (or null)
*/
- Vector tileObservers;
+ Vector<TileObserver> tileObservers;
/**
* The image's WritableRaster
@@ -143,39 +145,39 @@ public class BufferedImage extends Image
{
SampleModel sm = null;
ColorModel cm = null;
- boolean premultiplied = (type == BufferedImage.TYPE_INT_ARGB_PRE ||
- type == BufferedImage.TYPE_4BYTE_ABGR_PRE);
+ boolean premultiplied = (type == BufferedImage.TYPE_INT_ARGB_PRE
+ || type == BufferedImage.TYPE_4BYTE_ABGR_PRE);
switch( type )
{
case BufferedImage.TYPE_INT_RGB:
- sm = new SinglePixelPackedSampleModel( DataBuffer.TYPE_INT,
- width, height,
- new int[]{ 0x00FF0000,
- 0x0000FF00,
- 0x000000FF } ) ;
- cm = new DirectColorModel( 24, 0xff0000, 0xff00, 0xff );
- break;
+ sm = new SinglePixelPackedSampleModel( DataBuffer.TYPE_INT,
+ width, height,
+ new int[]{ 0x00FF0000,
+ 0x0000FF00,
+ 0x000000FF } ) ;
+ cm = new DirectColorModel( 24, 0xff0000, 0xff00, 0xff );
+ break;
case BufferedImage.TYPE_3BYTE_BGR:
- sm = new PixelInterleavedSampleModel( DataBuffer.TYPE_BYTE,
- width, height,
- 3, width * 3,
- new int[]{ 2, 1, 0 } );
- cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
- false, false,
- BufferedImage.OPAQUE,
- DataBuffer.TYPE_BYTE);
+ sm = new PixelInterleavedSampleModel( DataBuffer.TYPE_BYTE,
+ width, height,
+ 3, width * 3,
+ new int[]{ 2, 1, 0 } );
+ cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
+ false, false,
+ BufferedImage.OPAQUE,
+ DataBuffer.TYPE_BYTE);
break;
case BufferedImage.TYPE_INT_ARGB:
case BufferedImage.TYPE_INT_ARGB_PRE:
- sm = new SinglePixelPackedSampleModel( DataBuffer.TYPE_INT,
- width, height,
- new int[]{ 0x00FF0000,
- 0x0000FF00,
- 0x000000FF,
- 0xFF000000 } );
+ sm = new SinglePixelPackedSampleModel( DataBuffer.TYPE_INT,
+ width, height,
+ new int[]{ 0x00FF0000,
+ 0x0000FF00,
+ 0x000000FF,
+ 0xFF000000 } );
if (premultiplied)
cm = new DirectColorModel( ColorSpace.getInstance(ColorSpace.CS_sRGB),
32, 0xff0000, 0xff00, 0xff, 0xff000000,
@@ -183,7 +185,8 @@ public class BufferedImage extends Image
Buffers.smallestAppropriateTransferType(32));
else
cm = new DirectColorModel( 32, 0xff0000, 0xff00, 0xff, 0xff000000 );
- break;
+
+ break;
case BufferedImage.TYPE_4BYTE_ABGR:
case BufferedImage.TYPE_4BYTE_ABGR_PRE:
@@ -195,57 +198,58 @@ public class BufferedImage extends Image
true, premultiplied,
BufferedImage.TRANSLUCENT,
DataBuffer.TYPE_BYTE);
- break;
+ break;
case BufferedImage.TYPE_INT_BGR:
- sm = new SinglePixelPackedSampleModel( DataBuffer.TYPE_INT,
- width, height,
- new int[]{ 0x000000FF,
- 0x0000FF00,
- 0x00FF0000 } ) ;
- cm = new DirectColorModel( 24, 0xff, 0xff00, 0xff0000 );
+ sm = new SinglePixelPackedSampleModel( DataBuffer.TYPE_INT,
+ width, height,
+ new int[]{ 0x000000FF,
+ 0x0000FF00,
+ 0x00FF0000 } ) ;
+ cm = new DirectColorModel( 24, 0xff, 0xff00, 0xff0000 );
break;
case BufferedImage.TYPE_USHORT_565_RGB:
- sm = new SinglePixelPackedSampleModel( DataBuffer.TYPE_USHORT,
- width, height,
- new int[]{ 0xF800,
- 0x7E0,
- 0x1F } ) ;
- cm = new DirectColorModel( 16, 0xF800, 0x7E0, 0x1F );
- break;
+ sm = new SinglePixelPackedSampleModel( DataBuffer.TYPE_USHORT,
+ width, height,
+ new int[]{ 0xF800,
+ 0x7E0,
+ 0x1F } ) ;
+ cm = new DirectColorModel( 16, 0xF800, 0x7E0, 0x1F );
+ break;
+
case BufferedImage.TYPE_USHORT_555_RGB:
- sm = new SinglePixelPackedSampleModel( DataBuffer.TYPE_USHORT,
- width, height,
- new int[]{ 0x7C00,
- 0x3E0,
- 0x1F } ) ;
- cm = new DirectColorModel( 15, 0x7C00, 0x3E0, 0x1F );
- break;
+ sm = new SinglePixelPackedSampleModel( DataBuffer.TYPE_USHORT,
+ width, height,
+ new int[]{ 0x7C00,
+ 0x3E0,
+ 0x1F } ) ;
+ cm = new DirectColorModel( 15, 0x7C00, 0x3E0, 0x1F );
+ break;
case BufferedImage.TYPE_BYTE_INDEXED:
- cm = createDefaultIndexedColorModel( false );
+ cm = createDefaultIndexedColorModel( false );
case BufferedImage.TYPE_BYTE_GRAY:
- sm = new PixelInterleavedSampleModel( DataBuffer.TYPE_BYTE,
- width, height,
- 1, width, new int[]{ 0 } );
- break;
+ sm = new PixelInterleavedSampleModel( DataBuffer.TYPE_BYTE,
+ width, height,
+ 1, width, new int[]{ 0 } );
+ break;
case BufferedImage.TYPE_USHORT_GRAY:
- sm = new PixelInterleavedSampleModel( DataBuffer.TYPE_USHORT,
- width, height,
- 1, width, new int[]{ 0 } );
- break;
+ sm = new PixelInterleavedSampleModel( DataBuffer.TYPE_USHORT,
+ width, height,
+ 1, width, new int[]{ 0 } );
+ break;
case BufferedImage.TYPE_BYTE_BINARY:
- cm = createDefaultIndexedColorModel( true );
- sm = new MultiPixelPackedSampleModel(DataBuffer.TYPE_BYTE,
- width, height, 1);
- break;
+ cm = createDefaultIndexedColorModel( true );
+ sm = new MultiPixelPackedSampleModel(DataBuffer.TYPE_BYTE,
+ width, height, 1);
+ break;
default:
- sm = null;
+ sm = null;
}
if( sm == null )
@@ -253,33 +257,41 @@ public class BufferedImage extends Image
if( cm == null ) // only for the grayscale types
{
- int buftype;
- int[] bits = new int[1];
- if( type == BufferedImage.TYPE_BYTE_GRAY )
- {
- buftype = DataBuffer.TYPE_BYTE;
- bits[0] = 8;
- }
- else
- {
- buftype = DataBuffer.TYPE_USHORT;
- bits[0] = 16;
- }
- ColorSpace graySpace = ColorSpace.getInstance( ColorSpace.CS_GRAY );
-
- cm = new ComponentColorModel( graySpace, bits, false, false,
- Transparency.OPAQUE, buftype );
+ int buftype;
+ int[] bits = new int[1];
+ if( type == BufferedImage.TYPE_BYTE_GRAY )
+ {
+ buftype = DataBuffer.TYPE_BYTE;
+ bits[0] = 8;
+ }
+ else
+ {
+ buftype = DataBuffer.TYPE_USHORT;
+ bits[0] = 16;
+ }
+ ColorSpace graySpace = ColorSpace.getInstance( ColorSpace.CS_GRAY );
+
+ cm = new ComponentColorModel( graySpace, bits, false, false,
+ Transparency.OPAQUE, buftype );
}
- init( cm,
- Raster.createWritableRaster(sm, new Point( 0, 0 ) ),
- premultiplied,
- null, // no properties
- type );
+ WritableRaster rst = null;
+
+ // Attempt to create an accelerated backend for this image
+ GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ if (env instanceof ClasspathGraphicsEnvironment)
+ rst = ((ClasspathGraphicsEnvironment)env).createRaster(cm, sm);
+
+ // Default to a standard Java raster & databuffer if needed
+ if (rst == null)
+ rst = Raster.createWritableRaster(sm, new Point( 0, 0 ) );
+
+ init(cm, rst, premultiplied,
+ null, // no properties
+ type );
}
- public BufferedImage(int w, int h, int type,
- IndexColorModel indexcolormodel)
+ public BufferedImage(int w, int h, int type, IndexColorModel indexcolormodel)
{
if ((type != TYPE_BYTE_BINARY) && (type != TYPE_BYTE_INDEXED))
throw new IllegalArgumentException("Type must be TYPE_BYTE_BINARY or TYPE_BYTE_INDEXED");
@@ -289,27 +301,21 @@ public class BufferedImage extends Image
throw new IllegalArgumentException("Byte type cannot have a larger than 256-color palette.");
init( indexcolormodel,
- indexcolormodel.createCompatibleWritableRaster(w, h),
- indexcolormodel.isAlphaPremultiplied(),
- null, // no properties
- type );
+ indexcolormodel.createCompatibleWritableRaster(w, h),
+ indexcolormodel.isAlphaPremultiplied(),
+ null, // no properties
+ type );
}
- public BufferedImage(ColorModel colormodel,
- WritableRaster writableraster,
- boolean premultiplied,
- Hashtable<?,?> properties)
+ public BufferedImage(ColorModel colormodel, WritableRaster writableraster,
+ boolean premultiplied, Hashtable<?,?> properties)
{
- init(colormodel, writableraster, premultiplied, properties,
- TYPE_CUSTOM);
+ init(colormodel, writableraster, premultiplied, properties, TYPE_CUSTOM);
}
- private void init(ColorModel cm,
- WritableRaster writableraster,
- boolean premultiplied,
- Hashtable properties,
- int type)
+ private void init(ColorModel cm, WritableRaster writableraster,
+ boolean premultiplied, Hashtable properties, int type)
{
raster = writableraster;
colorModel = cm;
@@ -329,29 +335,32 @@ public class BufferedImage extends Image
{
if( binary )
{
- byte[] t = new byte[]{ 0, (byte)255 };
- return new IndexColorModel( 1, 2, t, t, t );
+ byte[] t = new byte[]{ 0, (byte)255 };
+ return new IndexColorModel( 1, 2, t, t, t );
}
byte[] r = new byte[256];
byte[] g = new byte[256];
byte[] b = new byte[256];
+
int index = 0;
for( int i = 0; i < 6; i++ )
for( int j = 0; j < 6; j++ )
- for( int k = 0; k < 6; k++ )
- {
- r[ index ] = (byte)(i * 51);
- g[ index ] = (byte)(j * 51);
- b[ index ] = (byte)(k * 51);
- index++;
- }
+ for( int k = 0; k < 6; k++ )
+ {
+ r[ index ] = (byte)(i * 51);
+ g[ index ] = (byte)(j * 51);
+ b[ index ] = (byte)(k * 51);
+ index++;
+ }
+
while( index < 256 )
{
- r[ index ] = g[ index ] = b[ index ] =
- (byte)(18 + (index - 216) * 6);
- index++;
+ r[ index ] = g[ index ] = b[ index ] =
+ (byte)(18 + (index - 216) * 6);
+ index++;
}
+
return new IndexColorModel( 8, 256, r, g, b );
}
@@ -375,12 +384,13 @@ public class BufferedImage extends Image
// create a src child that has the right bounds...
WritableRaster src =
raster.createWritableChild(x, y, w, h, x, y,
- null // same bands
- );
+ null); // same bands
+
if (src.getSampleModel () instanceof ComponentSampleModel
&& dest.getSampleModel () instanceof ComponentSampleModel)
// Refer to ComponentDataBlitOp for optimized data blitting:
ComponentDataBlitOp.INSTANCE.filter(src, dest);
+
else
{
// slower path
@@ -397,7 +407,8 @@ public class BufferedImage extends Image
return env.createGraphics (this);
}
- public void flush() {
+ public void flush()
+ {
}
public WritableRaster getAlphaRaster()
@@ -512,26 +523,24 @@ public class BufferedImage extends Image
public int getRGB(int x, int y)
{
- Object rgbElem = raster.getDataElements(x, y,
- null // create as needed
- );
+ Object rgbElem = raster.getDataElements(x, y, null);
return colorModel.getRGB(rgbElem);
}
- public int[] getRGB(int startX, int startY, int w, int h,
- int[] rgbArray,
- int offset, int scanlineStride)
+ public int[] getRGB(int startX, int startY, int w, int h, int[] rgbArray,
+ int offset, int scanlineStride)
{
if (rgbArray == null)
- {
- /*
- 000000000000000000
- 00000[#######----- [ = start
- -----########----- ] = end
- -----#######]00000
- 000000000000000000 */
- int size = (h-1)*scanlineStride + w;
- rgbArray = new int[size];
+ {
+ /*
+ 000000000000000000
+ 00000[#######----- [ = start
+ -----########----- ] = end
+ -----#######]00000
+ 000000000000000000
+ */
+ int size = (h-1)*scanlineStride + w;
+ rgbArray = new int[size];
}
int endX = startX + w;
@@ -547,15 +556,15 @@ public class BufferedImage extends Image
Object rgbElem = null;
for (int y=startY; y<endY; y++)
{
- int xoffset = offset;
- for (int x=startX; x<endX; x++)
- {
- int rgb;
- rgbElem = raster.getDataElements(x, y, rgbElem);
- rgb = colorModel.getRGB(rgbElem);
- rgbArray[xoffset++] = rgb;
- }
- offset += scanlineStride;
+ int xoffset = offset;
+ for (int x=startX; x<endX; x++)
+ {
+ int rgb;
+ rgbElem = raster.getDataElements(x, y, rgbElem);
+ rgb = colorModel.getRGB(rgbElem);
+ rgbArray[xoffset++] = rgb;
+ }
+ offset += scanlineStride;
}
return rgbArray;
}
@@ -572,14 +581,14 @@ public class BufferedImage extends Image
public ImageProducer getSource()
{
- return new ImageProducer() {
-
- Vector consumers = new Vector();
+ return new ImageProducer()
+ {
+ Vector<ImageConsumer> consumers = new Vector<ImageConsumer>();
public void addConsumer(ImageConsumer ic)
{
- if(!consumers.contains(ic))
- consumers.add(ic);
+ if(!consumers.contains(ic))
+ consumers.add(ic);
}
public boolean isConsumer(ImageConsumer ic)
@@ -589,7 +598,7 @@ public class BufferedImage extends Image
public void removeConsumer(ImageConsumer ic)
{
- consumers.remove(ic);
+ consumers.remove(ic);
}
public void startProduction(ImageConsumer ic)
@@ -610,9 +619,9 @@ public class BufferedImage extends Image
consumers.add(ic);
- for(int i=0;i<consumers.size();i++)
+ for(int i = 0; i < consumers.size(); i++)
{
- ImageConsumer c = (ImageConsumer) consumers.elementAt(i);
+ ImageConsumer c = consumers.elementAt(i);
c.setHints(ImageConsumer.SINGLEPASS);
c.setDimensions(getWidth(), getHeight());
c.setPixels(x, y, width, height, model, pixels, offset, stride);
@@ -638,10 +647,8 @@ public class BufferedImage extends Image
WritableRaster subRaster =
getRaster().createWritableChild(x, y, w, h, 0, 0, null);
- return new BufferedImage(getColorModel(),
- subRaster,
- isPremultiplied,
- properties);
+ return new BufferedImage(getColorModel(), subRaster, isPremultiplied,
+ properties);
}
public Raster getTile(int tileX, int tileY)
@@ -730,9 +737,7 @@ public class BufferedImage extends Image
// create a dest child that has the right bounds...
WritableRaster dest =
- raster.createWritableChild(x, y, w, h, x, y,
- null // same bands
- );
+ raster.createWritableChild(x, y, w, h, x, y, null);
if (src.getSampleModel () instanceof ComponentSampleModel
&& dest.getSampleModel () instanceof ComponentSampleModel)
@@ -762,14 +767,14 @@ public class BufferedImage extends Image
Object rgbElem = null;
for (int y=startY; y<endY; y++)
{
- int xoffset = offset;
- for (int x=startX; x<endX; x++)
- {
- int argb = argbArray[xoffset++];
- rgbElem = colorModel.getDataElements(argb, rgbElem);
- raster.setDataElements(x, y, rgbElem);
- }
- offset += scanlineStride;
+ int xoffset = offset;
+ for (int x=startX; x<endX; x++)
+ {
+ int argb = argbArray[xoffset++];
+ rgbElem = colorModel.getDataElements(argb, rgbElem);
+ raster.setDataElements(x, y, rgbElem);
+ }
+ offset += scanlineStride;
}
}
@@ -800,7 +805,7 @@ public class BufferedImage extends Image
public void addTileObserver (TileObserver to)
{
if (tileObservers == null)
- tileObservers = new Vector ();
+ tileObservers = new Vector<TileObserver>();
tileObservers.add (to);
}
diff --git a/libjava/classpath/java/awt/image/ComponentSampleModel.java b/libjava/classpath/java/awt/image/ComponentSampleModel.java
index bccabbbcadb..73e7fb4d3d0 100644
--- a/libjava/classpath/java/awt/image/ComponentSampleModel.java
+++ b/libjava/classpath/java/awt/image/ComponentSampleModel.java
@@ -36,12 +36,8 @@ exception statement from your version. */
package java.awt.image;
-import gnu.java.awt.Buffers;
-
import java.util.Arrays;
-/* FIXME: This class does not yet support data type TYPE_SHORT */
-
/**
* ComponentSampleModel supports a flexible organization of pixel samples in
* memory, permitting pixel samples to be interleaved by band, by scanline,
@@ -88,9 +84,7 @@ public class ComponentSampleModel extends SampleModel
* corresponding sample for the next pixel in the same row.
*/
protected int pixelStride;
-
- private boolean tightPixelPacking = false;
-
+
/**
* Creates a new sample model that assumes that all bands are stored in a
* single bank of the {@link DataBuffer}.
@@ -203,22 +197,6 @@ public class ComponentSampleModel extends SampleModel
this.scanlineStride = scanlineStride;
this.pixelStride = pixelStride;
- // See if we can use some speedups
-
- /* FIXME: May these checks should be reserved for the
- PixelInterleavedSampleModel? */
-
- if (pixelStride == numBands)
- {
- tightPixelPacking = true;
- for (int b = 0; b < numBands; b++) {
- if ((bandOffsets[b] != b) || (bankIndices[b] != 0))
- {
- tightPixelPacking = false;
- break;
- }
- }
- }
}
/**
@@ -275,8 +253,30 @@ public class ComponentSampleModel extends SampleModel
highestOffset = Math.max(highestOffset, bandOffsets[b]);
int size = pixelStride * (width - 1) + scanlineStride * (height - 1)
+ highestOffset + 1;
-
- return Buffers.createBuffer(getDataType(), size, numBanks);
+
+ DataBuffer buffer = null;
+ switch (getTransferType())
+ {
+ case DataBuffer.TYPE_BYTE:
+ buffer = new DataBufferByte(size, numBanks);
+ break;
+ case DataBuffer.TYPE_SHORT:
+ buffer = new DataBufferShort(size, numBanks);
+ break;
+ case DataBuffer.TYPE_USHORT:
+ buffer = new DataBufferUShort(size, numBanks);
+ break;
+ case DataBuffer.TYPE_INT:
+ buffer = new DataBufferInt(size, numBanks);
+ break;
+ case DataBuffer.TYPE_FLOAT:
+ buffer = new DataBufferFloat(size, numBanks);
+ break;
+ case DataBuffer.TYPE_DOUBLE:
+ buffer = new DataBufferDouble(size, numBanks);
+ break;
+ }
+ return buffer;
}
/**
@@ -424,239 +424,80 @@ public class ComponentSampleModel extends SampleModel
*/
public Object getDataElements(int x, int y, Object obj, DataBuffer data)
{
- int xyOffset = pixelStride * x + scanlineStride * y;
-
- int[] totalBandDataOffsets = new int[numBands];
-
- /* Notice that band and bank offsets are different. Band offsets
- are managed by the sample model, and bank offsets are managed
- by the data buffer. Both must be accounted for. */
-
- /* FIXME: For single pixels, it is probably easier to simple
- call getElem instead of calculating the bank offset ourself.
-
- On the other hand, then we need to push the value through
- the int type returned by the getElem method. */
-
- int[] bankOffsets = data.getOffsets();
-
- for (int b = 0; b < numBands; b++)
+ int type = getTransferType();
+ int numDataEls = getNumDataElements();
+ int offset = y * scanlineStride + x * pixelStride;
+ switch (type)
{
- totalBandDataOffsets[b] = bandOffsets[b] + bankOffsets[bankIndices[b]]
- + xyOffset;
- }
-
- try
- {
- switch (getTransferType())
+ case DataBuffer.TYPE_BYTE:
+ byte[] bData;
+ if (obj == null)
+ bData = new byte[numDataEls];
+ else
+ bData = (byte[]) obj;
+ for (int i = 0; i < numDataEls; i++)
{
- case DataBuffer.TYPE_BYTE:
- DataBufferByte inByte = (DataBufferByte) data;
- byte[] outByte = (byte[]) obj;
- if (outByte == null)
- outByte = new byte[numBands];
-
- for (int b = 0; b < numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outByte[b] = inByte.getData(bankIndices[b])[dOffset];
- }
- return outByte;
-
- case DataBuffer.TYPE_USHORT:
- DataBufferUShort inUShort = (DataBufferUShort) data;
- short[] outUShort = (short[]) obj;
- if (outUShort == null)
- outUShort = new short[numBands];
-
- for (int b = 0; b < numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outUShort[b] = inUShort.getData(bankIndices[b])[dOffset];
- }
- return outUShort;
-
- case DataBuffer.TYPE_SHORT:
- DataBufferShort inShort = (DataBufferShort) data;
- short[] outShort = (short[]) obj;
- if (outShort == null)
- outShort = new short[numBands];
-
- for (int b = 0; b < numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outShort[b] = inShort.getData(bankIndices[b])[dOffset];
- }
- return outShort;
-
- case DataBuffer.TYPE_INT:
- DataBufferInt inInt = (DataBufferInt) data;
- int[] outInt = (int[]) obj;
- if (outInt == null)
- outInt = new int[numBands];
-
- for (int b = 0; b < numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outInt[b] = inInt.getData(bankIndices[b])[dOffset];
- }
- return outInt;
-
- case DataBuffer.TYPE_FLOAT:
- DataBufferFloat inFloat = (DataBufferFloat) data;
- float[] outFloat = (float[]) obj;
- if (outFloat == null)
- outFloat = new float[numBands];
-
- for (int b = 0; b < numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outFloat[b] = inFloat.getData(bankIndices[b])[dOffset];
- }
- return outFloat;
-
- case DataBuffer.TYPE_DOUBLE:
- DataBufferDouble inDouble = (DataBufferDouble) data;
- double[] outDouble = (double[]) obj;
- if (outDouble == null)
- outDouble = new double[numBands];
-
- for (int b = 0; b < numBands; b++)
- {
- int dOffset = totalBandDataOffsets[b];
- outDouble[b] = inDouble.getData(bankIndices[b])[dOffset];
- }
- return outDouble;
-
- default:
- throw new IllegalStateException("unknown transfer type "
- + getTransferType());
+ bData[i] = (byte) data.getElem(bankIndices[i],
+ offset + bandOffsets[i]);
}
- }
- catch (ArrayIndexOutOfBoundsException aioobe)
- {
- String msg = "While reading data elements, " +
- "x=" + x + ", y=" + y +", " + ", xyOffset=" + xyOffset +
- ", data.getSize()=" + data.getSize() + ": " + aioobe;
- throw new ArrayIndexOutOfBoundsException(msg);
- }
- }
-
- /**
- * Returns the samples for the pixels in the region defined by
- * <code>(x, y, w, h)</code> in a primitive array (the array type is
- * determined by the data type for this model). The <code>obj</code>
- * argument provides an option to supply an existing array to hold the
- * result, if this is <code>null</code> a new array will be allocated.
- *
- * @param x the x-coordinate.
- * @param y the y-coordinate.
- * @param w the width.
- * @param h the height.
- * @param obj a primitive array that, if not <code>null</code>, will be
- * used to store and return the sample values.
- * @param data the data buffer (<code>null</code> not permitted).
- *
- * @return An array of sample values for the specified pixels.
- *
- * @see #setDataElements(int, int, int, int, Object, DataBuffer)
- */
- public Object getDataElements(int x, int y, int w, int h, Object obj,
- DataBuffer data)
- {
- if (!tightPixelPacking)
- {
- return super.getDataElements(x, y, w, h, obj, data);
- }
-
- // using get speedup
-
- // We can copy whole rows
- int rowSize = w * numBands;
- int dataSize = rowSize * h;
-
- DataBuffer transferBuffer = Buffers.createBuffer(getTransferType(), obj,
- dataSize);
- obj = Buffers.getData(transferBuffer);
-
- int inOffset = pixelStride * x + scanlineStride * y + data.getOffset();
- // Assumes only one band is used
-
- /* We don't add band offsets since we assume that bands have
- offsets 0, 1, 2, ... */
-
- // See if we can copy everything in one go
- if (scanlineStride == rowSize)
- {
- // Collapse scan lines:
- rowSize *= h;
- // We ignore scanlineStride since it won't be of any use
- h = 1;
- }
-
- int outOffset = 0;
- Object inArray = Buffers.getData(data);
- for (int yd = 0; yd < h; yd++)
- {
- System.arraycopy(inArray, inOffset, obj, outOffset, rowSize);
- inOffset += scanlineStride;
- outOffset += rowSize;
+ obj = bData;
+ break;
+ case DataBuffer.TYPE_SHORT:
+ case DataBuffer.TYPE_USHORT:
+ short[] sData;
+ if (obj == null)
+ sData = new short[numDataEls];
+ else
+ sData = (short[]) obj;
+ for (int i = 0; i < numDataEls; i++)
+ {
+ sData[i] = (short) data.getElem(bankIndices[i],
+ offset + bandOffsets[i]);
+ }
+ obj = sData;
+ break;
+ case DataBuffer.TYPE_INT:
+ int[] iData;
+ if (obj == null)
+ iData = new int[numDataEls];
+ else
+ iData = (int[]) obj;
+ for (int i = 0; i < numDataEls; i++)
+ {
+ iData[i] = data.getElem(bankIndices[i], offset + bandOffsets[i]);
+ }
+ obj = iData;
+ break;
+ case DataBuffer.TYPE_FLOAT:
+ float[] fData;
+ if (obj == null)
+ fData = new float[numDataEls];
+ else
+ fData = (float[]) obj;
+ for (int i = 0; i < numDataEls; i++)
+ {
+ fData[i] = data.getElemFloat(bankIndices[i],
+ offset + bandOffsets[i]);
+ }
+ obj = fData;
+ break;
+ case DataBuffer.TYPE_DOUBLE:
+ double[] dData;
+ if (obj == null)
+ dData = new double[numDataEls];
+ else
+ dData = (double[]) obj;
+ for (int i = 0; i < numDataEls; i++)
+ {
+ dData[i] = data.getElemDouble(bankIndices[i],
+ offset + bandOffsets[i]);
+ }
+ obj = dData;
+ break;
}
return obj;
}
- /**
- * Sets the samples for the pixels in the region defined by
- * <code>(x, y, w, h)</code> from a supplied primitive array (the array type
- * must be consistent with the data type for this model).
- *
- * @param x the x-coordinate.
- * @param y the y-coordinate.
- * @param w the width.
- * @param h the height.
- * @param obj a primitive array containing the sample values.
- * @param data the data buffer (<code>null</code> not permitted).
- *
- * @see #getDataElements(int, int, int, int, Object, DataBuffer)
- */
- public void setDataElements(int x, int y, int w, int h,
- Object obj, DataBuffer data)
- {
- if (!tightPixelPacking)
- {
- super.setDataElements(x, y, w, h, obj, data);
- return;
- }
-
- // using set speedup, we can copy whole rows
- int rowSize = w * numBands;
- int dataSize = rowSize * h;
-
- DataBuffer transferBuffer
- = Buffers.createBufferFromData(getTransferType(), obj, dataSize);
-
- int[] bankOffsets = data.getOffsets();
-
- int outOffset = pixelStride * x + scanlineStride * y + bankOffsets[0];
- // same assumptions as in get...
-
- // See if we can copy everything in one go
- if (scanlineStride == rowSize)
- {
- // Collapse scan lines:
- rowSize *= h;
- h = 1;
- }
-
- int inOffset = 0;
- Object outArray = Buffers.getData(data);
- for (int yd = 0; yd < h; yd++)
- {
- System.arraycopy(obj, inOffset, outArray, outOffset, rowSize);
- outOffset += scanlineStride;
- inOffset += rowSize;
- }
- }
/**
* Returns all the samples for the pixel at location <code>(x, y)</code>
@@ -764,78 +605,51 @@ public class ComponentSampleModel extends SampleModel
*/
public void setDataElements(int x, int y, Object obj, DataBuffer data)
{
- int offset = pixelStride * x + scanlineStride * y;
- int[] totalBandDataOffsets = new int[numBands];
- int[] bankOffsets = data.getOffsets();
- for (int b = 0; b < numBands; b++)
- totalBandDataOffsets[b] = bandOffsets[b] + bankOffsets[bankIndices[b]]
- + offset;
-
- switch (getTransferType())
+ int type = getTransferType();
+ int numDataEls = getNumDataElements();
+ int offset = y * scanlineStride + x * pixelStride;
+ switch (type)
{
case DataBuffer.TYPE_BYTE:
- {
- DataBufferByte out = (DataBufferByte) data;
- byte[] in = (byte[]) obj;
-
- for (int b = 0; b < numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
- case DataBuffer.TYPE_USHORT:
- {
- DataBufferUShort out = (DataBufferUShort) data;
- short[] in = (short[]) obj;
-
- for (int b = 0; b < numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
+ byte[] bData = (byte[]) obj;
+ for (int i = 0; i < numDataEls; i++)
+ {
+ data.setElem(bankIndices[i], offset + bandOffsets[i],
+ ((int) bData[i]) & 0xFF);
+ }
+ break;
case DataBuffer.TYPE_SHORT:
- {
- DataBufferShort out = (DataBufferShort) data;
- short[] in = (short[]) obj;
-
- for (int b = 0; b < numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
+ case DataBuffer.TYPE_USHORT:
+ short[] sData = (short[]) obj;
+ for (int i = 0; i < numDataEls; i++)
+ {
+ data.setElem(bankIndices[i], offset + bandOffsets[i],
+ ((int) sData[i]) & 0xFFFF);
+ }
+ break;
case DataBuffer.TYPE_INT:
- {
- DataBufferInt out = (DataBufferInt) data;
- int[] in = (int[]) obj;
-
- for (int b = 0; b < numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
+ int[] iData = (int[]) obj;
+ for (int i = 0; i < numDataEls; i++)
+ {
+ data.setElem(bankIndices[i], offset + bandOffsets[i], iData[i]);
+ }
+ break;
case DataBuffer.TYPE_FLOAT:
- {
- DataBufferFloat out = (DataBufferFloat) data;
- float[] in = (float[]) obj;
-
- for (int b = 0; b < numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
+ float[] fData = (float[]) obj;
+ for (int i = 0; i < numDataEls; i++)
+ {
+ data.setElemFloat(bankIndices[i], offset + bandOffsets[i],
+ fData[i]);
+ }
+ break;
case DataBuffer.TYPE_DOUBLE:
- {
- DataBufferDouble out = (DataBufferDouble) data;
- double[] in = (double[]) obj;
-
- for (int b = 0; b < numBands; b++)
- out.getData(bankIndices[b])[totalBandDataOffsets[b]] = in[b];
-
- return;
- }
- default:
- throw new UnsupportedOperationException("transfer type not " +
- "implemented");
+ double[] dData = (double[]) obj;
+ for (int i = 0; i < numDataEls; i++)
+ {
+ data.setElemDouble(bankIndices[i], offset + bandOffsets[i],
+ dData[i]);
+ }
+ break;
}
}
diff --git a/libjava/classpath/java/awt/image/IndexColorModel.java b/libjava/classpath/java/awt/image/IndexColorModel.java
index 46879cc98c9..d8a27d51ff1 100644
--- a/libjava/classpath/java/awt/image/IndexColorModel.java
+++ b/libjava/classpath/java/awt/image/IndexColorModel.java
@@ -134,7 +134,7 @@ public class IndexColorModel extends ColorModel
if (size < 1)
throw new IllegalArgumentException("size < 1");
map_size = size;
- rgb = new int[size];
+ rgb = createColorMap(bits, size);
for (int i = 0; i < size; i++)
{
rgb[i] = (0xff000000
@@ -187,7 +187,7 @@ public class IndexColorModel extends ColorModel
map_size = size;
opaque = (alphas == null);
- rgb = new int[size];
+ rgb = createColorMap(bits, size);
if (alphas == null)
{
for (int i = 0; i < size; i++)
@@ -275,7 +275,7 @@ public class IndexColorModel extends ColorModel
map_size = size;
opaque = !hasAlpha;
- rgb = new int[size];
+ rgb = createColorMap(bits, size);
if (hasAlpha)
{
int alpha;
@@ -360,7 +360,7 @@ public class IndexColorModel extends ColorModel
throw new IllegalArgumentException("size < 1");
map_size = size;
opaque = !hasAlpha;
- rgb = new int[size];
+ rgb = createColorMap(bits, size);
if (!hasAlpha)
for (int i = 0; i < size; i++)
rgb[i] = cmap[i + start] | 0xff000000;
@@ -419,7 +419,7 @@ public class IndexColorModel extends ColorModel
this.trans = -1;
this.validBits = validBits;
- rgb = new int[size];
+ rgb = createColorMap(bits, size);
if (!hasAlpha)
for (int i = 0; i < size; i++)
rgb[i] = cmap[i + start] | 0xff000000;
@@ -726,4 +726,11 @@ public class IndexColorModel extends ColorModel
}
}
}
+
+ private int[] createColorMap(int bits, int size)
+ {
+ // According to a Mauve test, the RI allocates at least 256 entries here.
+ int realSize = Math.max(256, Math.max(1 << bits, size));
+ return new int[realSize];
+ }
}
diff --git a/libjava/classpath/java/awt/image/SinglePixelPackedSampleModel.java b/libjava/classpath/java/awt/image/SinglePixelPackedSampleModel.java
index 9ed948c54f3..1b0ac3f7904 100644
--- a/libjava/classpath/java/awt/image/SinglePixelPackedSampleModel.java
+++ b/libjava/classpath/java/awt/image/SinglePixelPackedSampleModel.java
@@ -39,7 +39,6 @@ package java.awt.image;
import java.util.Arrays;
import gnu.java.awt.BitMaskExtent;
-import gnu.java.awt.Buffers;
/**
* A <code>SampleModel</code> used when all samples are stored in a single
@@ -151,14 +150,25 @@ public class SinglePixelPackedSampleModel extends SampleModel
*/
public DataBuffer createDataBuffer()
{
- int size;
-
// We can save (scanlineStride - width) pixels at the very end of
// the buffer. The Sun reference implementation (J2SE 1.3.1 and
// 1.4.1_01) seems to do this; tested with Mauve test code.
- size = scanlineStride * (height - 1) + width;
+ int size = scanlineStride * (height - 1) + width;
- return Buffers.createBuffer(getDataType(), size);
+ DataBuffer buffer = null;
+ switch (getTransferType())
+ {
+ case DataBuffer.TYPE_BYTE:
+ buffer = new DataBufferByte(size);
+ break;
+ case DataBuffer.TYPE_USHORT:
+ buffer = new DataBufferUShort(size);
+ break;
+ case DataBuffer.TYPE_INT:
+ buffer = new DataBufferInt(size);
+ break;
+ }
+ return buffer;
}
/**
@@ -253,73 +263,39 @@ public class SinglePixelPackedSampleModel extends SampleModel
public Object getDataElements(int x, int y, Object obj,
DataBuffer data)
{
- int offset = scanlineStride*y + x + data.getOffset();
-
- return Buffers.getData(data, offset, obj,
- 0, // destination offset,
- 1 // length
- );
- }
-
- /**
- * This is a more efficient implementation of the default implementation in
- * the super class.
- * @param x The x-coordinate of the pixel rectangle to store in
- * <code>obj</code>.
- * @param y The y-coordinate of the pixel rectangle to store in
- * <code>obj</code>.
- * @param w The width of the pixel rectangle to store in <code>obj</code>.
- * @param h The height of the pixel rectangle to store in <code>obj</code>.
- * @param obj The primitive array to store the pixels into or null to force
- * creation.
- * @param data The DataBuffer that is the source of the pixel data.
- * @return The primitive array containing the pixel data.
- * @see java.awt.image.SampleModel#getDataElements(int, int, int, int,
- * java.lang.Object, java.awt.image.DataBuffer)
- */
- public Object getDataElements(int x, int y, int w, int h, Object obj,
- DataBuffer data)
- {
- int size = w*h;
- int dataSize = size;
- Object pixelData = null;
- switch (getTransferType())
- {
+ int type = getTransferType();
+ Object ret = null;
+ switch (type)
+ {
case DataBuffer.TYPE_BYTE:
- pixelData = ((DataBufferByte) data).getData();
- if (obj == null) obj = new byte[dataSize];
+ {
+ byte[] in = (byte[]) obj;
+ if (in == null)
+ in = new byte[1];
+ in[0] = (byte) data.getElem(x + y * scanlineStride);
+ ret = in;
+ }
break;
- case DataBuffer.TYPE_USHORT:
- pixelData = ((DataBufferUShort) data).getData();
- if (obj == null) obj = new short[dataSize];
- break;
- case DataBuffer.TYPE_INT:
- pixelData = ((DataBufferInt) data).getData();
- if (obj == null) obj = new int[dataSize];
- break;
- default:
- // Seems like the only sensible thing to do.
- throw new ClassCastException();
- }
- if(x == 0 && scanlineStride == w)
- {
- // The full width need to be copied therefore we can copy in one shot.
- System.arraycopy(pixelData, scanlineStride*y + data.getOffset(), obj,
- 0, size);
- }
- else
- {
- // Since we do not need the full width we need to copy line by line.
- int outOffset = 0;
- int dataOffset = scanlineStride*y + x + data.getOffset();
- for (int yy = y; yy<(y+h); yy++)
+ case DataBuffer.TYPE_USHORT:
+ {
+ short[] in = (short[]) obj;
+ if (in == null)
+ in = new short[1];
+ in[0] = (short) data.getElem(x + y * scanlineStride);
+ ret = in;
+ }
+ break;
+ case DataBuffer.TYPE_INT:
{
- System.arraycopy(pixelData, dataOffset, obj, outOffset, w);
- dataOffset += scanlineStride;
- outOffset += w;
+ int[] in = (int[]) obj;
+ if (in == null)
+ in = new int[1];
+ in[0] = data.getElem(x + y * scanlineStride);
+ ret = in;
}
+ break;
}
- return obj;
+ return ret;
}
/**
@@ -414,30 +390,29 @@ public class SinglePixelPackedSampleModel extends SampleModel
public void setDataElements(int x, int y, Object obj, DataBuffer data)
{
-
int transferType = getTransferType();
- switch (transferType)
- {
- case DataBuffer.TYPE_BYTE:
- {
- byte[] in = (byte[]) obj;
- data.setElem(y * scanlineStride + x, ((int) in[0]) & 0xff);
- break;
- }
- case DataBuffer.TYPE_USHORT:
- {
- short[] in = (short[]) obj;
+ switch (transferType)
+ {
+ case DataBuffer.TYPE_BYTE:
+ {
+ byte[] in = (byte[]) obj;
+ data.setElem(y * scanlineStride + x, ((int) in[0]) & 0xff);
+ }
+ break;
+ case DataBuffer.TYPE_USHORT:
+ {
+ short[] in = (short[]) obj;
data.setElem(y * scanlineStride + x, ((int) in[0]) & 0xffff);
- break;
- }
- case DataBuffer.TYPE_INT:
- {
- int[] in = (int[]) obj;
+ }
+ break;
+ case DataBuffer.TYPE_INT:
+ {
+ int[] in = (int[]) obj;
data.setElem(y * scanlineStride + x, in[0]);
break;
- }
- }
- }
+ }
+ }
+ }
/**
* Sets the samples for the pixel at (x, y) in the specified data buffer to
@@ -479,7 +454,6 @@ public class SinglePixelPackedSampleModel extends SampleModel
DataBuffer data)
{
int inOffset = 0;
- int[] pixel = new int[numBands];
for (int yy=y; yy<(y+h); yy++)
{
int offset = scanlineStride*yy + x;
diff --git a/libjava/classpath/java/awt/peer/DesktopPeer.java b/libjava/classpath/java/awt/peer/DesktopPeer.java
new file mode 100644
index 00000000000..355d293b311
--- /dev/null
+++ b/libjava/classpath/java/awt/peer/DesktopPeer.java
@@ -0,0 +1,64 @@
+/* DesktopPeer.java -- Interface to enable access to common applications
+ Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath 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, or (at your option)
+ any later version.
+
+ GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+package java.awt.peer;
+
+import java.awt.Desktop.Action;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+
+/**
+ * @author Mario Torre <neugens@limasoftware.net>
+ *
+ */
+public interface DesktopPeer
+{
+ public void browse(URI url) throws IOException;
+
+ public void edit(File file) throws IOException;
+
+ public boolean isSupported(Action action);
+
+ public void mail(URI mailtoURL) throws IOException;
+
+ public void mail() throws IOException;
+
+ public void open(File file) throws IOException;
+
+ public void print(File file) throws IOException;
+}
diff --git a/libjava/classpath/java/awt/print/PrinterJob.java b/libjava/classpath/java/awt/print/PrinterJob.java
index 8afada1675e..3715dd235ec 100644
--- a/libjava/classpath/java/awt/print/PrinterJob.java
+++ b/libjava/classpath/java/awt/print/PrinterJob.java
@@ -264,15 +264,12 @@ public abstract class PrinterJob
* @return Array of stream print services, could be empty.
* @since 1.4
*/
- // FIXME:
- // Enable when StreamPrintServiceFactory has lookupStreamServiceFactories
-// public static StreamPrintServiceFactory[] lookupStreamPrintServices(String mimeType)
-// {
-// return StreamPrintServiceFactory.lookupStreamServiceFactories(
-// new DocFlavor("application/x-java-jvm-local-objectref",
-// "java.awt.print.Pageable"),
-// mimeType);
-// }
+ public static StreamPrintServiceFactory[]
+ lookupStreamPrintServices(String mimeType)
+ {
+ return StreamPrintServiceFactory.lookupStreamPrintServiceFactories(
+ DocFlavor.SERVICE_FORMATTED.PAGEABLE, mimeType);
+ }
/**
* Return the printer for this job. If print services aren't supported by