aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariInputMethodDescriptor.java102
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariTables.java255
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethod.java436
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethodImpl.java475
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/java.awt.im.spi.InputMethodDescriptor1
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames.properties6
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_de.properties5
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_es.properties5
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_fr.properties5
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_it.properties5
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ja.properties5
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ko.properties5
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_sv.properties5
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_CN.properties5
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_TW.properties5
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethod.java437
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodDescriptor.java99
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodImpl.java235
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiRules.java348
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/thaiim/java.awt.im.spi.InputMethodDescriptor1
-rw-r--r--src/share/classes/com/sun/inputmethods/internal/thaiim/resources/DisplayNames.properties6
-rw-r--r--src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java14
-rw-r--r--src/share/classes/com/sun/jndi/dns/DnsClient.java4
-rw-r--r--src/share/classes/java/awt/Font.java4
-rw-r--r--src/share/classes/java/beans/DefaultPersistenceDelegate.java19
-rw-r--r--src/share/classes/java/beans/MetaData.java98
-rw-r--r--src/share/classes/java/beans/XMLEncoder.java25
-rw-r--r--src/share/classes/java/lang/AbstractStringBuilder.java2
-rw-r--r--src/share/classes/java/lang/Character.java1283
-rw-r--r--src/share/classes/java/lang/CharacterName.java106
-rw-r--r--src/share/classes/java/net/URI.java2
-rw-r--r--src/share/classes/java/util/jar/JarVerifier.java2
-rw-r--r--src/share/classes/java/util/regex/Pattern.java101
-rw-r--r--src/share/classes/java/util/zip/GZIPInputStream.java87
-rw-r--r--src/share/classes/java/util/zip/GZIPOutputStream.java90
-rw-r--r--src/share/classes/java/util/zip/ZipException.java6
-rw-r--r--src/share/classes/java/util/zip/package.html15
-rw-r--r--src/share/classes/javax/naming/event/EventDirContext.java2
-rw-r--r--src/share/classes/javax/naming/ldap/Control.java2
-rw-r--r--src/share/classes/javax/naming/ldap/ControlFactory.java2
-rw-r--r--src/share/classes/javax/naming/ldap/ExtendedRequest.java2
-rw-r--r--src/share/classes/javax/naming/ldap/ExtendedResponse.java2
-rw-r--r--src/share/classes/javax/naming/ldap/UnsolicitedNotification.java2
-rw-r--r--src/share/classes/javax/naming/ldap/UnsolicitedNotificationListener.java2
-rw-r--r--src/share/classes/javax/print/DocFlavor.java2
-rw-r--r--src/share/classes/javax/swing/DefaultDesktopManager.java17
-rw-r--r--src/share/classes/javax/swing/JTable.java18
-rw-r--r--src/share/classes/javax/swing/border/MatteBorder.java67
-rw-r--r--src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java8
-rw-r--r--src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java35
-rw-r--r--src/share/classes/javax/swing/plaf/basic/BasicTextUI.java16
-rw-r--r--src/share/classes/javax/swing/plaf/basic/BasicViewportUI.java2
-rw-r--r--src/share/classes/javax/swing/plaf/synth/SynthTableUI.java8
-rw-r--r--src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java23
-rw-r--r--src/share/classes/javax/swing/text/WrappedPlainView.java64
-rw-r--r--src/share/classes/javax/swing/text/html/parser/html32.bdtdbin16173 -> 0 bytes
-rw-r--r--src/share/classes/sun/font/GlyphDisposedListener.java32
-rw-r--r--src/share/classes/sun/font/StrikeCache.java89
-rw-r--r--src/share/classes/sun/font/SunFontManager.java8
-rw-r--r--src/share/classes/sun/java2d/pipe/BufferedPaints.java2
-rw-r--r--src/share/classes/sun/java2d/pipe/RenderBuffer.java5
-rw-r--r--src/share/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine5
-rw-r--r--src/share/classes/sun/jvmstat/monitor/AbstractMonitor.java3
-rw-r--r--src/share/classes/sun/jvmstat/monitor/Monitor.java3
-rw-r--r--src/share/classes/sun/jvmstat/monitor/Units.java128
-rw-r--r--src/share/classes/sun/jvmstat/monitor/Variability.java111
-rw-r--r--src/share/classes/sun/jvmstat/perfdata/monitor/PerfByteArrayMonitor.java2
-rw-r--r--src/share/classes/sun/jvmstat/perfdata/monitor/PerfIntegerMonitor.java2
-rw-r--r--src/share/classes/sun/jvmstat/perfdata/monitor/PerfLongMonitor.java2
-rw-r--r--src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringConstantMonitor.java1
-rw-r--r--src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringMonitor.java2
-rw-r--r--src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringVariableMonitor.java1
-rw-r--r--src/share/classes/sun/jvmstat/perfdata/monitor/v1_0/PerfDataBuffer.java2
-rw-r--r--src/share/classes/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBuffer.java2
-rw-r--r--src/share/classes/sun/nio/ch/CompletedFuture.java5
-rw-r--r--src/share/classes/sun/rmi/rmic/BatchEnvironment.java2
-rw-r--r--src/share/classes/sun/security/krb5/KrbAsReq.java7
-rw-r--r--src/share/classes/sun/security/krb5/internal/KerberosTime.java47
-rw-r--r--src/share/classes/sun/security/provider/X509Factory.java24
-rw-r--r--src/share/classes/sun/security/tools/JarSigner.java2
-rw-r--r--src/share/classes/sun/security/tools/policytool/PolicyTool.java (renamed from src/share/classes/sun/security/tools/PolicyTool.java)4
-rw-r--r--src/share/classes/sun/security/validator/PKIXValidator.java9
-rw-r--r--src/share/classes/sun/swing/SwingUtilities2.java52
-rw-r--r--src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java2
-rw-r--r--src/share/classes/sun/swing/table/DefaultTableCellHeaderRenderer.java7
-rw-r--r--src/share/classes/sun/tools/jar/Main.java12
-rw-r--r--src/share/classes/sun/tools/jstat/ExpressionResolver.java1
-rw-r--r--src/share/classes/sun/tools/jstat/JStatLogger.java2
-rw-r--r--src/share/classes/sun/tools/jstat/Jstat.java2
-rw-r--r--src/share/native/sun/font/AccelGlyphCache.c1
-rw-r--r--src/share/native/sun/font/fontscalerdefs.h13
-rw-r--r--src/share/native/sun/font/freetypeScaler.c3
-rw-r--r--src/share/native/sun/font/sunFont.c11
-rw-r--r--src/share/native/sun/java2d/opengl/OGLTextRenderer.c10
-rw-r--r--src/solaris/classes/sun/awt/X11GraphicsDevice.java31
-rw-r--r--src/solaris/classes/sun/awt/X11GraphicsEnvironment.java40
-rw-r--r--src/solaris/classes/sun/font/XRGlyphCache.java301
-rw-r--r--src/solaris/classes/sun/font/XRGlyphCacheEntry.java206
-rw-r--r--src/solaris/classes/sun/font/XRTextRenderer.java152
-rw-r--r--src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java6
-rw-r--r--src/solaris/classes/sun/java2d/jules/IdleTileCache.java109
-rw-r--r--src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java349
-rw-r--r--src/solaris/classes/sun/java2d/jules/JulesPathBuf.java271
-rw-r--r--src/solaris/classes/sun/java2d/jules/JulesRenderingEngine.java54
-rw-r--r--src/solaris/classes/sun/java2d/jules/JulesShapePipe.java102
-rw-r--r--src/solaris/classes/sun/java2d/jules/JulesTile.java67
-rw-r--r--src/solaris/classes/sun/java2d/jules/TileWorker.java146
-rw-r--r--src/solaris/classes/sun/java2d/jules/TrapezoidList.java110
-rw-r--r--src/solaris/classes/sun/java2d/x11/X11SurfaceData.java29
-rw-r--r--src/solaris/classes/sun/java2d/x11/XSurfaceData.java40
-rw-r--r--src/solaris/classes/sun/java2d/xr/DirtyRegion.java133
-rw-r--r--src/solaris/classes/sun/java2d/xr/GrowableByteArray.java127
-rw-r--r--src/solaris/classes/sun/java2d/xr/GrowableEltArray.java84
-rw-r--r--src/solaris/classes/sun/java2d/xr/GrowableIntArray.java114
-rw-r--r--src/solaris/classes/sun/java2d/xr/GrowablePointArray.java62
-rw-r--r--src/solaris/classes/sun/java2d/xr/GrowableRectArray.java79
-rw-r--r--src/solaris/classes/sun/java2d/xr/MaskTile.java166
-rw-r--r--src/solaris/classes/sun/java2d/xr/MaskTileManager.java327
-rw-r--r--src/solaris/classes/sun/java2d/xr/MutableInteger.java57
-rw-r--r--src/solaris/classes/sun/java2d/xr/XIDGenerator.java53
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRBackend.java117
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRBackendNative.java343
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRColor.java141
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRCompositeManager.java334
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRDrawImage.java67
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRGraphicsConfig.java61
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRMaskBlit.java94
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRMaskFill.java115
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRMaskImage.java129
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java400
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRPaints.java314
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRRenderer.java331
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRSurfaceData.java668
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRSurfaceDataProxy.java83
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRUtils.java261
-rw-r--r--src/solaris/classes/sun/java2d/xr/XRVolatileSurfaceManager.java94
-rw-r--r--src/solaris/classes/sun/java2d/xr/XcbRequestCounter.java59
-rw-r--r--src/solaris/native/sun/java2d/x11/X11SurfaceData.c189
-rw-r--r--src/solaris/native/sun/java2d/x11/X11SurfaceData.h6
-rw-r--r--src/solaris/native/sun/java2d/x11/XRBackendNative.c784
-rw-r--r--src/solaris/native/sun/java2d/x11/XRSurfaceData.c116
141 files changed, 10132 insertions, 2983 deletions
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariInputMethodDescriptor.java b/src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariInputMethodDescriptor.java
deleted file mode 100644
index 3e1c67001..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariInputMethodDescriptor.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2002, 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.
- */
-
-/*
- * (C) Copyright IBM Corp. 2000 - All Rights Reserved
- *
- * The original version of this source code and documentation is
- * copyrighted and owned by IBM. These materials are provided
- * under terms of a License Agreement between IBM and Sun.
- * This technology is protected by multiple US and International
- * patents. This notice and attribution to IBM may not be removed.
- *
- */
-
-package com.sun.inputmethods.internal.indicim;
-
-import java.awt.Image;
-import java.awt.im.spi.InputMethod;
-import java.awt.im.spi.InputMethodDescriptor;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class DevanagariInputMethodDescriptor implements InputMethodDescriptor {
-
- static final Locale HINDI = new Locale("hi", "IN");
-
- public DevanagariInputMethodDescriptor() {
- }
-
- /**
- * @see java.awt.im.spi.InputMethodDescriptor#getAvailableLocales
- */
- public Locale[] getAvailableLocales() {
- return new Locale[] { HINDI };
- }
-
- /**
- * @see java.awt.im.spi.InputMethodDescriptor#hasDynamicLocaleList
- */
- public boolean hasDynamicLocaleList() {
- return false;
- }
-
- /**
- * @see java.awt.im.spi.InputMethodDescriptor#getInputMethodDisplayName
- */
- public synchronized String getInputMethodDisplayName(Locale inputLocale, Locale displayLanguage) {
- try {
- ResourceBundle resources = ResourceBundle.getBundle("com.sun.inputmethods.internal.indicim.resources.DisplayNames", displayLanguage);
- return resources.getString("DisplayName.Devanagari");
- } catch (MissingResourceException mre) {
- return "Devanagari Input Method";
- }
- }
-
- /**
- * @see java.awt.im.spi.InputMethodDescriptor#getInputMethodIcon
- */
- public Image getInputMethodIcon(Locale inputLocale) {
- return null;
- }
-
- /**
- * @see java.awt.im.spi.InputMethodDescriptor#createInputMethod
- */
- public InputMethod createInputMethod() throws Exception {
- IndicInputMethodImpl impl = new IndicInputMethodImpl(
- DevanagariTables.keyboardMap,
- DevanagariTables.joinWithNukta,
- DevanagariTables.nuktaForm,
- DevanagariTables.substitutionTable);
-
- return new IndicInputMethod(HINDI, impl);
- }
-
- public String toString() {
- return getClass().getName();
- }
-}
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariTables.java b/src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariTables.java
deleted file mode 100644
index a1bd7dfd3..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariTables.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (c) 2002, 2003, 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.
- */
-
-/*
- * (C) Copyright IBM Corp. 2000 - All Rights Reserved
- *
- * The original version of this source code and documentation is
- * copyrighted and owned by IBM. These materials are provided
- * under terms of a License Agreement between IBM and Sun.
- * This technology is protected by multiple US and International
- * patents. This notice and attribution to IBM may not be removed.
- *
- */
-
-package com.sun.inputmethods.internal.indicim;
-
-class DevanagariTables {
-
- static final char[] keyboardMap = {
- /* 00 */ '\u0000',
- /* 01 */ '\u0001',
- /* 02 */ '\u0002',
- /* 03 */ '\u0003',
- /* 04 */ '\u0004',
- /* 05 */ '\u0005',
- /* 06 */ '\u0006',
- /* 07 */ '\u0007',
- /* 08 */ '\u0008',
- /* 09 */ '\u0009',
- /* 0A */ '\012',
- /* 0B */ '\u000B',
- /* 0C */ '\u000C',
- /* 0D */ '\015',
- /* 0E */ '\u000E',
- /* 0F */ '\u000F',
- /* 10 */ '\u0010',
- /* 11 */ '\u0011',
- /* 12 */ '\u0012',
- /* 13 */ '\u0013',
- /* 14 */ '\u0014',
- /* 15 */ '\u0015',
- /* 16 */ '\u0016',
- /* 17 */ '\u0017',
- /* 18 */ '\u0018',
- /* 19 */ '\u0019',
- /* 1A */ '\u001A',
- /* 1B */ '\u001B',
- /* 1C */ '\u001C',
- /* 1D */ '\u001D',
- /* 1E */ '\u001E',
- /* 1F */ '\u001F',
- /* 20 */ '\u0020',
- /* 21 */ '\u090D', // '!'
- /* 22 */ '\u0920', // '"'
- /* 23 */ '\uFF00', // '#'
- /* 24 */ '\uFF01', // '$'
- /* 25 */ '\uFF02', // '%'
- /* 26 */ '\uFF04', // '&'
- /* 27 */ '\u091F', // '''
- /* 28 */ '\u0028', // '('
- /* 29 */ '\u0029', // ')'
- /* 2A */ '\uFF05', // '*'
- /* 2B */ '\u090B', // '+'
- /* 2C */ '\u002C', // ','
- /* 2D */ '\u002D', // '-'
- /* 2E */ '\u002E', // '.'
- /* 2F */ '\u092F', // '/'
- /* 30 */ '\u0966', // '0'
- /* 31 */ '\u0967', // '1'
- /* 32 */ '\u0968', // '2'
- /* 33 */ '\u0969', // '3'
- /* 34 */ '\u096A', // '4'
- /* 35 */ '\u096B', // '5'
- /* 36 */ '\u096C', // '6'
- /* 37 */ '\u096D', // '7'
- /* 38 */ '\u096E', // '8'
- /* 39 */ '\u096F', // '9'
- /* 3A */ '\u091B', // ':'
- /* 3B */ '\u091A', // ';'
- /* 3C */ '\u0937', // '<'
- /* 3D */ '\u0943', // '='
- /* 3E */ '\u0964', // '>'
- /* 3F */ '\u095F', // '?'
- /* 40 */ '\u0945', // '@'
- /* 41 */ '\u0913', // 'A'
- /* 42 */ '\u0934', // 'B'
- /* 43 */ '\u0923', // 'C'
- /* 44 */ '\u0905', // 'D'
- /* 45 */ '\u0906', // 'E'
- /* 46 */ '\u0907', // 'F'
- /* 47 */ '\u0909', // 'G'
- /* 48 */ '\u092B', // 'H'
- /* 49 */ '\u0918', // 'I'
- /* 4A */ '\u0931', // 'J'
- /* 4B */ '\u0916', // 'K'
- /* 4C */ '\u0925', // 'L'
- /* 4D */ '\u0936', // 'M'
- /* 4E */ '\u0933', // 'N'
- /* 4F */ '\u0927', // 'O'
- /* 50 */ '\u091D', // 'P'
- /* 51 */ '\u0914', // 'Q'
- /* 52 */ '\u0908', // 'R'
- /* 53 */ '\u090F', // 'S'
- /* 54 */ '\u090A', // 'T'
- /* 55 */ '\u0919', // 'U'
- /* 56 */ '\u0929', // 'V'
- /* 57 */ '\u0910', // 'W'
- /* 58 */ '\u0901', // 'X'
- /* 59 */ '\u092D', // 'Y'
- /* 5A */ '\u090E', // 'Z'
- /* 5B */ '\u0921', // '['
- /* 5C */ '\u0949', // '\'
- /* 5D */ '\u093C', // ']'
- /* 5E */ '\uFF03', // '^'
- /* 5F */ '\u0903', // '_'
- /* 60 */ '\u094A', // '`'
- /* 61 */ '\u094B', // 'a'
- /* 62 */ '\u0935', // 'b'
- /* 63 */ '\u092E', // 'c'
- /* 64 */ '\u094D', // 'd'
- /* 65 */ '\u093E', // 'e'
- /* 66 */ '\u093F', // 'f'
- /* 67 */ '\u0941', // 'g'
- /* 68 */ '\u092A', // 'h'
- /* 69 */ '\u0917', // 'i'
- /* 6A */ '\u0930', // 'j'
- /* 6B */ '\u0915', // 'k'
- /* 6C */ '\u0924', // 'l'
- /* 6D */ '\u0938', // 'm'
- /* 6E */ '\u0932', // 'n'
- /* 6F */ '\u0926', // 'o'
- /* 70 */ '\u091C', // 'p'
- /* 71 */ '\u094C', // 'q'
- /* 72 */ '\u0940', // 'r'
- /* 73 */ '\u0947', // 's'
- /* 74 */ '\u0942', // 't'
- /* 75 */ '\u0939', // 'u'
- /* 76 */ '\u0928', // 'v'
- /* 77 */ '\u0948', // 'w'
- /* 78 */ '\u0902', // 'x'
- /* 79 */ '\u092C', // 'y'
- /* 7A */ '\u0946', // 'z'
- /* 7B */ '\u0922', // '{'
- /* 7C */ '\u0911', // '|'
- /* 7D */ '\u091E', // '}'
- /* 7E */ '\u0912', // '~'
- /* 7F */ '\u007F' //
-};
-
- // the character substitutions for the meta characters.
- static final char[] RA_SUB = {'\u094D', '\u0930'};
- static final char[] RA_SUP = {'\u0930', '\u094D'};
- static final char[] CONJ_JA_NYA = {'\u091C', '\u094D', '\u091E'};
- static final char[] CONJ_TA_RA = {'\u0924', '\u094D', '\u0930'};
- static final char[] CONJ_KA_SSA = {'\u0915', '\u094D', '\u0937'};
- static final char[] CONJ_SHA_RA = {'\u0936', '\u094D', '\u0930'};
-
- static final char[][] substitutionTable = {
- RA_SUB, RA_SUP, CONJ_JA_NYA, CONJ_TA_RA, CONJ_KA_SSA, CONJ_SHA_RA
- };
-
- // The following characters followed by Nukta should be replaced
- // by the corresponding character as defined in ISCII91
- static final char SIGN_CANDRABINDU = '\u0901';
- static final char LETTER_I = '\u0907';
- static final char LETTER_II = '\u0908';
- static final char LETTER_VOCALIC_R = '\u090B';
- static final char LETTER_KA = '\u0915';
- static final char LETTER_KHA = '\u0916';
- static final char LETTER_GA = '\u0917';
- static final char LETTER_JA = '\u091C';
- static final char LETTER_DDA = '\u0921';
- static final char LETTER_DDHA = '\u0922';
- static final char LETTER_PHA = '\u092B';
- static final char VOWEL_SIGN_I = '\u093F';
- static final char VOWEL_SIGN_II = '\u0940';
- static final char VOWEL_SIGN_VOCALIC_R = '\u0943';
- static final char DANDA = '\u0964';
-
- // The follwing characters replace the above characters followed by Nukta. These
- // are defined in one to one correspondence order.
- static final char SIGN_OM = '\u0950';
- static final char LETTER_VOCALIC_L = '\u090C';
- static final char LETTER_VOCALIC_LL = '\u0961';
- static final char LETTER_VOCALIC_RR = '\u0960';
- static final char LETTER_QA = '\u0958';
- static final char LETTER_KHHA = '\u0959';
- static final char LETTER_GHHA = '\u095A';
- static final char LETTER_ZA = '\u095B';
- static final char LETTER_DDDHA = '\u095C';
- static final char LETTER_RHA = '\u095D';
- static final char LETTER_FA = '\u095E';
- static final char VOWEL_SIGN_VOCALIC_L = '\u0962';
- static final char VOWEL_SIGN_VOCALIC_LL = '\u0963';
- static final char VOWEL_SIGN_VOCALIC_RR = '\u0944';
- static final char SIGN_AVAGRAHA = '\u093D';
-
- static final char[] joinWithNukta = {
- SIGN_CANDRABINDU,
- LETTER_I,
- LETTER_II,
- LETTER_VOCALIC_R ,
- LETTER_KA,
- LETTER_KHA,
- LETTER_GA,
- LETTER_JA,
- LETTER_DDA,
- LETTER_DDHA,
- LETTER_PHA,
- VOWEL_SIGN_I,
- VOWEL_SIGN_II,
- VOWEL_SIGN_VOCALIC_R,
- DANDA
- };
-
- static final char[] nuktaForm = {
- SIGN_OM,
- LETTER_VOCALIC_L,
- LETTER_VOCALIC_LL,
- LETTER_VOCALIC_RR,
- LETTER_QA,
- LETTER_KHHA,
- LETTER_GHHA,
- LETTER_ZA,
- LETTER_DDDHA,
- LETTER_RHA,
- LETTER_FA,
- VOWEL_SIGN_VOCALIC_L,
- VOWEL_SIGN_VOCALIC_LL,
- VOWEL_SIGN_VOCALIC_RR,
- SIGN_AVAGRAHA
- };
-}
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethod.java b/src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethod.java
deleted file mode 100644
index 60bd627a1..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethod.java
+++ /dev/null
@@ -1,436 +0,0 @@
-/*
- * Copyright (c) 2002, 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.
- */
-
-/*
- * (C) Copyright IBM Corp. 2000 - All Rights Reserved
- *
- * The original version of this source code and documentation is
- * copyrighted and owned by IBM. These materials are provided
- * under terms of a License Agreement between IBM and Sun.
- * This technology is protected by multiple US and International
- * patents. This notice and attribution to IBM may not be removed.
- *
- */
-
-package com.sun.inputmethods.internal.indicim;
-
-import java.awt.im.spi.InputMethod;
-import java.awt.im.spi.InputMethodContext;
-
-import java.awt.AWTEvent;
-import java.awt.Rectangle;
-
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseEvent;
-
-import java.lang.Character.Subset;
-
-import java.util.Locale;
-
-class IndicInputMethod implements InputMethod {
-
- private IndicInputMethodImpl impl;
- private Locale locale;
-
- IndicInputMethod(Locale theLocale, IndicInputMethodImpl theImplementation) {
- locale = theLocale;
- impl = theImplementation;
- }
-
- /**
- * Sets the input method context, which is used to dispatch input method
- * events to the client component and to request information from
- * the client component.
- * <p>
- * This method is called once immediately after instantiating this input
- * method.
- *
- * @param context the input method context for this input method
- * @exception NullPointerException if <code>context</code> is null
- */
- public void setInputMethodContext(InputMethodContext context) {
-
- impl.setInputMethodContext(context);
- }
-
- /**
- * Attempts to set the input locale. If the input method supports the
- * desired locale, it changes its behavior to support input for the locale
- * and returns true.
- * Otherwise, it returns false and does not change its behavior.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
- * <li>when switching to this input method through the user interface if the user
- * specified a locale or if the previously selected input method's
- * {@link java.awt.im.spi.InputMethod#getLocale getLocale} method
- * returns a non-null value.
- * </ul>
- *
- * @param locale locale to input
- * @return whether the specified locale is supported
- * @exception NullPointerException if <code>locale</code> is null
- */
- public boolean setLocale(Locale locale) {
-
- if (locale.getLanguage().equals(this.locale.getLanguage())) {
- //System.out.println("returning true for locale " + locale);
- return true;
- }
- else {
- //System.out.println("returning false for locale " + locale);
- return false;
- }
- }
-
- /**
- * Returns the current input locale. Might return null in exceptional cases.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#getLocale InputContext.getLocale} and
- * <li>when switching from this input method to a different one through the
- * user interface.
- * </ul>
- *
- * @return the current input locale, or null
- */
- public Locale getLocale() {
-
- return locale;
- }
-
- /**
- * Sets the subsets of the Unicode character set that this input method
- * is allowed to input. Null may be passed in to indicate that all
- * characters are allowed.
- * <p>
- * This method is called
- * <ul>
- * <li>immediately after instantiating this input method,
- * <li>when switching to this input method from a different one, and
- * <li>by {@link java.awt.im.InputContext#setCharacterSubsets InputContext.setCharacterSubsets}.
- * </ul>
- *
- * @param subsets the subsets of the Unicode character set from which
- * characters may be input
- */
- public void setCharacterSubsets(Subset[] subsets) {
- }
-
- /**
- * Enables or disables this input method for composition,
- * depending on the value of the parameter <code>enable</code>.
- * <p>
- * An input method that is enabled for composition interprets incoming
- * events for both composition and control purposes, while a
- * disabled input method does not interpret events for composition.
- * Note however that events are passed on to the input method regardless
- * whether it is enabled or not, and that an input method that is disabled
- * for composition may still interpret events for control purposes,
- * including to enable or disable itself for composition.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#setCompositionEnabled InputContext.setCompositionEnabled},
- * <li>when switching to this input method from a different one using the
- * user interface or
- * {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
- * if the previously selected input method's
- * {@link java.awt.im.spi.InputMethod#isCompositionEnabled isCompositionEnabled}
- * method returns without throwing an exception.
- * </ul>
- *
- * @param enable whether to enable the input method for composition
- * @throws UnsupportedOperationException if this input method does not
- * support the enabling/disabling operation
- * @see #isCompositionEnabled
- */
- public void setCompositionEnabled(boolean enable) {
-
- throw new UnsupportedOperationException();
- }
-
- /**
- * Determines whether this input method is enabled.
- * An input method that is enabled for composition interprets incoming
- * events for both composition and control purposes, while a
- * disabled input method does not interpret events for composition.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#isCompositionEnabled InputContext.isCompositionEnabled} and
- * <li>when switching from this input method to a different one using the
- * user interface or
- * {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
- * </ul>
- *
- * @return <code>true</code> if this input method is enabled for
- * composition; <code>false</code> otherwise.
- * @throws UnsupportedOperationException if this input method does not
- * support checking whether it is enabled for composition
- * @see #setCompositionEnabled
- */
- public boolean isCompositionEnabled() {
-
- return true;
- }
-
- /**
- * Starts the reconversion operation. The input method obtains the
- * text to be reconverted from the current client component using the
- * {@link java.awt.im.InputMethodRequests#getSelectedText InputMethodRequests.getSelectedText}
- * method. It can use other <code>InputMethodRequests</code>
- * methods to request additional information required for the
- * reconversion operation. The composed and committed text
- * produced by the operation is sent to the client component as a
- * sequence of <code>InputMethodEvent</code>s. If the given text
- * cannot be reconverted, the same text should be sent to the
- * client component as committed text.
- * <p>
- * This method is called by
- * {@link java.awt.im.InputContext#reconvert() InputContext.reconvert}.
- *
- * @throws UnsupportedOperationException if the input method does not
- * support the reconversion operation.
- */
- public void reconvert() {
-
- throw new UnsupportedOperationException("This input method does not reconvert.");
- }
-
- /**
- * Dispatches the event to the input method. If input method support is
- * enabled for the focussed component, incoming events of certain types
- * are dispatched to the current input method for this component before
- * they are dispatched to the component's methods or event listeners.
- * The input method decides whether it needs to handle the event. If it
- * does, it also calls the event's <code>consume</code> method; this
- * causes the event to not get dispatched to the component's event
- * processing methods or event listeners.
- * <p>
- * Events are dispatched if they are instances of InputEvent or its
- * subclasses.
- * This includes instances of the AWT classes KeyEvent and MouseEvent.
- * <p>
- * This method is called by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}.
- *
- * @param event the event being dispatched to the input method
- * @exception NullPointerException if <code>event</code> is null
- */
- public void dispatchEvent(AWTEvent event) {
-
- if (event instanceof KeyEvent) {
-
- KeyEvent keyEvent = (KeyEvent) event;
- if (event.getID() == KeyEvent.KEY_TYPED) {
- impl.handleKeyTyped(keyEvent);
- }
- //System.out.println("handled event " + event);
- }
- else {
- //System.out.println("did not handle event " + event);
- }
- }
-
- /**
- * Notifies this input method of changes in the client window
- * location or state. This method is called while this input
- * method is the current input method of its input context and
- * notifications for it are enabled (see {@link
- * InputMethodContext#enableClientWindowNotification
- * InputMethodContext.enableClientWindowNotification}). Calls
- * to this method are temporarily suspended if the input context's
- * {@link java.awt.im.InputContext#removeNotify removeNotify}
- * method is called, and resume when the input method is activated
- * for a new client component. It is called in the following
- * situations:
- * <ul>
- * <li>
- * when the window containing the current client component changes
- * in location, size, visibility, iconification state, or when the
- * window is closed.</li>
- * <li>
- * from <code> enableClientWindowNotification(inputMethod,
- * true)</code> if the current client component exists,</li>
- * <li>
- * when activating the input method for the first time after it
- * called
- * <code>enableClientWindowNotification(inputMethod,
- * true)</code> if during the call no current client component was
- * available,</li>
- * <li>
- * when activating the input method for a new client component
- * after the input context's removeNotify method has been
- * called.</li>
- * </ul>
- * @param bounds client window's {@link
- * java.awt.Component#getBounds bounds} on the screen; or null if
- * the client window is iconified or invisible
- */
- public void notifyClientWindowChange(Rectangle bounds) {
- }
-
- /**
- * Activates the input method for immediate input processing.
- * <p>
- * If an input method provides its own windows, it should make sure
- * at this point that all necessary windows are open and visible.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
- * when a client component receives a FOCUS_GAINED event,
- * <li>when switching to this input method from a different one using the
- * user interface or
- * {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
- * </ul>
- * The method is only called when the input method is inactive.
- * A newly instantiated input method is assumed to be inactive.
- */
- public void activate() {
- //System.out.println("activated");
- }
-
- /**
- * Deactivates the input method.
- * The isTemporary argument has the same meaning as in
- * {@link java.awt.event.FocusEvent#isTemporary FocusEvent.isTemporary}.
- * <p>
- * If an input method provides its own windows, only windows that relate
- * to the current composition (such as a lookup choice window) should be
- * closed at this point.
- * It is possible that the input method will be immediately activated again
- * for a different client component, and closing and reopening more
- * persistent windows (such as a control panel) would create unnecessary
- * screen flicker.
- * Before an instance of a different input method class is activated,
- * {@link #hideWindows} is called on the current input method.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
- * when a client component receives a FOCUS_LOST event,
- * <li>when switching from this input method to a different one using the
- * user interface or
- * {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
- * <li>before {@link #removeNotify removeNotify} if the current client component is
- * removed.
- * </ul>
- * The method is only called when the input method is active.
- *
- * @param isTemporary whether the focus change is temporary
- */
- public void deactivate(boolean isTemporary) {
- //System.out.println("deactivated");
- }
-
- /**
- * Closes or hides all windows opened by this input method instance or
- * its class.
- * <p>
- * This method is called
- * <ul>
- * <li>before calling {@link #activate activate} on an instance of a different input
- * method class,
- * <li>before calling {@link #dispose dispose} on this input method.
- * </ul>
- * The method is only called when the input method is inactive.
- */
- public void hideWindows() {
- }
-
- /**
- * Notifies the input method that a client component has been
- * removed from its containment hierarchy, or that input method
- * support has been disabled for the component.
- * <p>
- * This method is called by {@link java.awt.im.InputContext#removeNotify InputContext.removeNotify}.
- * <p>
- * The method is only called when the input method is inactive.
- */
- public void removeNotify() {
- }
-
- /**
- * Ends any input composition that may currently be going on in this
- * context. Depending on the platform and possibly user preferences,
- * this may commit or delete uncommitted text. Any changes to the text
- * are communicated to the active component using an input method event.
- *
- * <p>
- * A text editing component may call this in a variety of situations,
- * for example, when the user moves the insertion point within the text
- * (but outside the composed text), or when the component's text is
- * saved to a file or copied to the clipboard.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#endComposition InputContext.endComposition},
- * <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
- * when switching to a different client component
- * <li>when switching from this input method to a different one using the
- * user interface or
- * {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
- * </ul>
- */
- public void endComposition() {
-
- impl.endComposition();
- }
-
- /**
- * Disposes of the input method and releases the resources used by it.
- * In particular, the input method should dispose windows and close files that are no
- * longer needed.
- * <p>
- * This method is called by {@link java.awt.im.InputContext#dispose InputContext.dispose}.
- * <p>
- * The method is only called when the input method is inactive.
- * No method of this interface is called on this instance after dispose.
- */
- public void dispose() {
- }
-
- /**
- * Returns a control object from this input method, or null. A
- * control object provides methods that control the behavior of the
- * input method or obtain information from the input method. The type
- * of the object is an input method specific class. Clients have to
- * compare the result against known input method control object
- * classes and cast to the appropriate class to invoke the methods
- * provided.
- * <p>
- * This method is called by
- * {@link java.awt.im.InputContext#getInputMethodControlObject InputContext.getInputMethodControlObject}.
- *
- * @return a control object from this input method, or null
- */
- public Object getControlObject() {
-
- return null;
- }
-}
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethodImpl.java b/src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethodImpl.java
deleted file mode 100644
index 4da58d9af..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethodImpl.java
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Copyright (c) 2002, 2004, 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.
- */
-
-/*
- * (C) Copyright IBM Corp. 2000 - All Rights Reserved
- *
- * The original version of this source code and documentation is
- * copyrighted and owned by IBM. These materials are provided
- * under terms of a License Agreement between IBM and Sun.
- * This technology is protected by multiple US and International
- * patents. This notice and attribution to IBM may not be removed.
- *
- */
-
-package com.sun.inputmethods.internal.indicim;
-
-import java.awt.im.spi.InputMethodContext;
-
-import java.awt.event.KeyEvent;
-import java.awt.event.InputMethodEvent;
-import java.awt.font.TextAttribute;
-import java.awt.font.TextHitInfo;
-
-import java.text.AttributedCharacterIterator;
-
-import java.util.Hashtable;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-class IndicInputMethodImpl {
-
- protected char[] KBD_MAP;
-
- private static final char SUBSTITUTION_BASE = '\uff00';
-
- // Indexed by map value - SUBSTITUTION_BASE
- protected char[][] SUBSTITUTION_TABLE;
-
- // Invalid character.
- private static final char INVALID_CHAR = '\uffff';
-
- // Unmapped versions of some interesting characters.
- private static final char KEY_SIGN_VIRAMA = '\u0064'; // or just 'd'??
- private static final char KEY_SIGN_NUKTA = '\u005d'; // or just ']'??
-
- // Two succeeding viramas are replaced by one virama and one ZWNJ.
- // Viram followed by Nukta is replaced by one VIRAMA and one ZWJ
- private static final char ZWJ = '\u200d';
- private static final char ZWNJ = '\u200c';
-
- // Backspace
- private static final char BACKSPACE = '\u0008';
-
- // Sorted list of characters which can be followed by Nukta
- protected char[] JOIN_WITH_NUKTA;
-
- // Nukta form of the above characters
- protected char[] NUKTA_FORM;
-
- private int log2;
- private int power;
- private int extra;
-
- // cached TextHitInfo. Only one type of TextHitInfo is required.
- private static final TextHitInfo ZERO_TRAILING_HIT_INFO = TextHitInfo.trailing(0);
-
- /**
- * Returns the index of the given character in the JOIN_WITH_NUKTA array.
- * If character is not found, -1 is returned.
- */
- private int nuktaIndex(char ch) {
-
- if (JOIN_WITH_NUKTA == null) {
- return -1;
- }
-
- int probe = power;
- int index = 0;
-
- if (JOIN_WITH_NUKTA[extra] <= ch) {
- index = extra;
- }
-
- while (probe > (1 << 0)) {
- probe >>= 1;
-
- if (JOIN_WITH_NUKTA[index + probe] <= ch) {
- index += probe;
- }
- }
-
- if (JOIN_WITH_NUKTA[index] != ch) {
- index = -1;
- }
-
- return index;
- }
-
- /**
- * Returns the equivalent character for hindi locale.
- * @param originalChar The original character.
- */
- private char getMappedChar( char originalChar )
- {
- if (originalChar <= KBD_MAP.length) {
- return KBD_MAP[originalChar];
- }
-
- return originalChar;
- }//getMappedChar()
-
- // Array used to hold the text to be sent.
- // If the last character was not committed it is stored in text[0].
- // The variable totalChars give an indication of whether the last
- // character was committed or not. If at any time ( but not within a
- // a call to dispatchEvent ) totalChars is not equal to 0 ( it can
- // only be 1 otherwise ) the last character was not committed.
- private char [] text = new char[4];
-
- // this is always 0 before and after call to dispatchEvent. This character assumes
- // significance only within a call to dispatchEvent.
- private int committedChars = 0;// number of committed characters
-
- // the total valid characters in variable text currently.
- private int totalChars = 0;//number of total characters ( committed + composed )
-
- private boolean lastCharWasVirama = false;
-
- private InputMethodContext context;
-
- //
- // Finds the high bit by binary searching
- // through the bits in n.
- //
- private static byte highBit(int n)
- {
- if (n <= 0) {
- return -32;
- }
-
- byte bit = 0;
-
- if (n >= 1 << 16) {
- n >>= 16;
- bit += 16;
- }
-
- if (n >= 1 << 8) {
- n >>= 8;
- bit += 8;
- }
-
- if (n >= 1 << 4) {
- n >>= 4;
- bit += 4;
- }
-
- if (n >= 1 << 2) {
- n >>= 2;
- bit += 2;
- }
-
- if (n >= 1 << 1) {
- n >>= 1;
- bit += 1;
- }
-
- return bit;
- }
-
- IndicInputMethodImpl(char[] keyboardMap, char[] joinWithNukta, char[] nuktaForm,
- char[][] substitutionTable) {
- KBD_MAP = keyboardMap;
- JOIN_WITH_NUKTA = joinWithNukta;
- NUKTA_FORM = nuktaForm;
- SUBSTITUTION_TABLE = substitutionTable;
-
- if (JOIN_WITH_NUKTA != null) {
- int log2 = highBit(JOIN_WITH_NUKTA.length);
-
- power = 1 << log2;
- extra = JOIN_WITH_NUKTA.length - power;
- } else {
- power = extra = 0;
- }
-
- }
-
- void setInputMethodContext(InputMethodContext context) {
-
- this.context = context;
- }
-
- void handleKeyTyped(KeyEvent kevent) {
-
- char keyChar = kevent.getKeyChar();
- char currentChar = getMappedChar(keyChar);
-
- // The Explicit and Soft Halanta case.
- if ( lastCharWasVirama ) {
- switch (keyChar) {
- case KEY_SIGN_NUKTA:
- currentChar = ZWJ;
- break;
- case KEY_SIGN_VIRAMA:
- currentChar = ZWNJ;
- break;
- default:
- }//endSwitch
- }//endif
-
- if (currentChar == INVALID_CHAR) {
- kevent.consume();
- return;
- }
-
- if (currentChar == BACKSPACE) {
- lastCharWasVirama = false;
-
- if (totalChars > 0) {
- totalChars = committedChars = 0;
- } else {
- return;
- }
- }
- else if (keyChar == KEY_SIGN_NUKTA) {
- int nuktaIndex = nuktaIndex(text[0]);
-
- if (nuktaIndex != -1) {
- text[0] = NUKTA_FORM[nuktaIndex];
- } else {
- // the last character was committed, commit just Nukta.
- // Note : the lastChar must have been committed if it is not one of
- // the characters which combine with nukta.
- // the state must be totalChars = committedChars = 0;
- text[totalChars++] = currentChar;
- }
-
- committedChars += 1;
- }
- else {
- int nuktaIndex = nuktaIndex(currentChar);
-
- if (nuktaIndex != -1) {
- // Commit everything but currentChar
- text[totalChars++] = currentChar;
- committedChars = totalChars-1;
- } else {
- if (currentChar >= SUBSTITUTION_BASE) {
- char[] sub = SUBSTITUTION_TABLE[currentChar - SUBSTITUTION_BASE];
-
- System.arraycopy(sub, 0, text, totalChars, sub.length);
- totalChars += sub.length;
- } else {
- text[totalChars++] = currentChar;
- }
-
- committedChars = totalChars;
- }
- }
-
- ACIText aText = new ACIText( text, 0, totalChars, committedChars );
- int composedCharLength = totalChars - committedChars;
- TextHitInfo caret=null,visiblePosition=null;
- switch( composedCharLength ) {
- case 0:
- break;
- case 1:
- visiblePosition = caret = ZERO_TRAILING_HIT_INFO;
- break;
- default:
- assert false : "The code should not reach here. There is no case where there can be more than one character pending.";
- }
-
- context.dispatchInputMethodEvent(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED,
- aText,
- committedChars,
- caret,
- visiblePosition);
-
- if (totalChars == 0) {
- text[0] = INVALID_CHAR;
- } else {
- text[0] = text[totalChars - 1];// make text[0] hold the last character
- }
-
- lastCharWasVirama = keyChar == KEY_SIGN_VIRAMA && !lastCharWasVirama;
-
- totalChars -= committedChars;
- committedChars = 0;
- // state now text[0] = last character
- // totalChars = ( last character committed )? 0 : 1;
- // committedChars = 0;
-
- kevent.consume();// prevent client from getting this event.
- }//dispatchEvent()
-
- void endComposition() {
- if( totalChars != 0 ) {// if some character is not committed.
- ACIText aText = new ACIText( text, 0, totalChars, totalChars );
- context.dispatchInputMethodEvent( InputMethodEvent.INPUT_METHOD_TEXT_CHANGED,
- aText, totalChars, null, null );
- totalChars = committedChars = 0;
- text[0] = INVALID_CHAR;
- lastCharWasVirama = false;
- }//end if
- }//endComposition()
-
- // custom AttributedCharacterIterator -- much lightweight since currently there is no
- // attribute defined on the text being generated by the input method.
- private class ACIText implements AttributedCharacterIterator {
- private char [] text = null;
- private int committed = 0;
- private int index = 0;
-
- ACIText( char [] chArray, int offset, int length, int committed ) {
- this.text = new char[length];
- this.committed = committed;
- System.arraycopy( chArray, offset, text, 0, length );
- }//c'tor
-
- // CharacterIterator methods.
- public char first() {
- return _setIndex( 0 );
- }
-
- public char last() {
- if( text.length == 0 ) {
- return _setIndex( text.length );
- }
- return _setIndex( text.length - 1 );
- }
-
- public char current() {
- if( index == text.length )
- return DONE;
- return text[index];
- }
-
- public char next() {
- if( index == text.length ) {
- return DONE;
- }
- return _setIndex( index + 1 );
- }
-
- public char previous() {
- if( index == 0 )
- return DONE;
- return _setIndex( index - 1 );
- }
-
- public char setIndex(int position) {
- if( position < 0 || position > text.length ) {
- throw new IllegalArgumentException();
- }
- return _setIndex( position );
- }
-
- public int getBeginIndex() {
- return 0;
- }
-
- public int getEndIndex() {
- return text.length;
- }
-
- public int getIndex() {
- return index;
- }
-
- public Object clone() {
- try {
- ACIText clone = (ACIText) super.clone();
- return clone;
- } catch (CloneNotSupportedException e) {
- throw new InternalError();
- }
- }
-
-
- // AttributedCharacterIterator methods.
- public int getRunStart() {
- return index >= committed ? committed : 0;
- }
-
- public int getRunStart(AttributedCharacterIterator.Attribute attribute) {
- return (index >= committed &&
- attribute == TextAttribute.INPUT_METHOD_UNDERLINE) ? committed : 0;
- }
-
- public int getRunStart(Set<? extends Attribute> attributes) {
- return (index >= committed &&
- attributes.contains(TextAttribute.INPUT_METHOD_UNDERLINE)) ? committed : 0;
- }
-
- public int getRunLimit() {
- return index < committed ? committed : text.length;
- }
-
- public int getRunLimit(AttributedCharacterIterator.Attribute attribute) {
- return (index < committed &&
- attribute == TextAttribute.INPUT_METHOD_UNDERLINE) ? committed : text.length;
- }
-
- public int getRunLimit(Set<? extends Attribute> attributes) {
- return (index < committed &&
- attributes.contains(TextAttribute.INPUT_METHOD_UNDERLINE)) ? committed : text.length;
- }
-
- public Map getAttributes() {
- Hashtable result = new Hashtable();
- if (index >= committed && committed < text.length) {
- result.put(TextAttribute.INPUT_METHOD_UNDERLINE,
- TextAttribute.UNDERLINE_LOW_ONE_PIXEL);
- }
- return result;
- }
-
- public Object getAttribute(AttributedCharacterIterator.Attribute attribute) {
- if (index >= committed &&
- committed < text.length &&
- attribute == TextAttribute.INPUT_METHOD_UNDERLINE) {
-
- return TextAttribute.UNDERLINE_LOW_ONE_PIXEL;
- }
- return null;
- }
-
- public Set getAllAttributeKeys() {
- HashSet result = new HashSet();
- if (committed < text.length) {
- result.add(TextAttribute.INPUT_METHOD_UNDERLINE);
- }
- return result;
- }
-
- // private methods
-
- /**
- * This is always called with valid i ( 0 < i <= text.length )
- */
- private char _setIndex( int i ) {
- index = i;
- if( i == text.length ) {
- return DONE;
- }
- return text[i];
- }//_setIndex()
-
- }//end of inner class
-}
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/java.awt.im.spi.InputMethodDescriptor b/src/share/classes/com/sun/inputmethods/internal/indicim/java.awt.im.spi.InputMethodDescriptor
deleted file mode 100644
index f06b18187..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/java.awt.im.spi.InputMethodDescriptor
+++ /dev/null
@@ -1 +0,0 @@
-com.sun.inputmethods.internal.indicim.DevanagariInputMethodDescriptor
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames.properties b/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames.properties
deleted file mode 100644
index f0feb6395..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Default Input method display names for Indic input methods
-#
-
-DisplayName.Devanagari = Devanagari Input Method
-
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_de.properties b/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_de.properties
deleted file mode 100644
index c460ffeb9..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_de.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Default Input method display names for Indic input methods
-#
-
-DisplayName.Devanagari = Devanagari Input Method
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_es.properties b/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_es.properties
deleted file mode 100644
index c460ffeb9..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_es.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Default Input method display names for Indic input methods
-#
-
-DisplayName.Devanagari = Devanagari Input Method
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_fr.properties b/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_fr.properties
deleted file mode 100644
index c460ffeb9..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_fr.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Default Input method display names for Indic input methods
-#
-
-DisplayName.Devanagari = Devanagari Input Method
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_it.properties b/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_it.properties
deleted file mode 100644
index c460ffeb9..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_it.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Default Input method display names for Indic input methods
-#
-
-DisplayName.Devanagari = Devanagari Input Method
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ja.properties b/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ja.properties
deleted file mode 100644
index e668c6e5c..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ja.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Default Input method display names for Indic input methods
-#
-
-DisplayName.Devanagari = \u30c7\u30fc\u30f4\u30a1\u30ca\u30fc\u30ac\u30ea\u30fc\u30a4\u30f3\u30d7\u30c3\u30c8\u30e1\u30bd\u30c3\u30c9
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ko.properties b/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ko.properties
deleted file mode 100644
index 514b240ca..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ko.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Default Input method display names for Indic input methods
-#
-
-DisplayName.Devanagari = Devanagari \uc785\ub825 \uba54\uc18c\ub4dc
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_sv.properties b/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_sv.properties
deleted file mode 100644
index c460ffeb9..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_sv.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Default Input method display names for Indic input methods
-#
-
-DisplayName.Devanagari = Devanagari Input Method
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_CN.properties b/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_CN.properties
deleted file mode 100644
index 895fd8f8e..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_CN.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Default Input method display names for Indic input methods
-#
-
-DisplayName.Devanagari = Devanagari \u8f93\u5165\u6cd5
diff --git a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_TW.properties b/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_TW.properties
deleted file mode 100644
index 6b228d84c..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_TW.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# Default Input method display names for Indic input methods
-#
-
-DisplayName.Devanagari = Devanagari \u8f38\u5165\u6cd5
diff --git a/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethod.java b/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethod.java
deleted file mode 100644
index 40e6cc8ff..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethod.java
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- * Copyright (c) 2002, 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.
- */
-
-/*
- *
- * (C) Copyright IBM Corp. 2000 - All Rights Reserved
- *
- * The original version of this source code and documentation is
- * copyrighted and owned by IBM. These materials are provided
- * under terms of a License Agreement between IBM and Sun.
- * This technology is protected by multiple US and International
- * patents. This notice and attribution to IBM may not be removed.
- *
- */
-
-package com.sun.inputmethods.internal.thaiim;
-
-import java.awt.im.spi.InputMethod;
-import java.awt.im.spi.InputMethodContext;
-
-import java.awt.AWTEvent;
-import java.awt.Rectangle;
-
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseEvent;
-
-import java.lang.Character.Subset;
-
-import java.util.Locale;
-
-class ThaiInputMethod implements InputMethod {
-
- private ThaiInputMethodImpl impl;
- private Locale locale;
-
- ThaiInputMethod(Locale theLocale, ThaiInputMethodImpl theImplementation) {
- locale = theLocale;
- impl = theImplementation;
- }
-
- /**
- * Sets the input method context, which is used to dispatch input method
- * events to the client component and to request information from
- * the client component.
- * <p>
- * This method is called once immediately after instantiating this input
- * method.
- *
- * @param context the input method context for this input method
- * @exception NullPointerException if <code>context</code> is null
- */
- public void setInputMethodContext(InputMethodContext context) {
-
- impl.setInputMethodContext(context);
- }
-
- /**
- * Attempts to set the input locale. If the input method supports the
- * desired locale, it changes its behavior to support input for the locale
- * and returns true.
- * Otherwise, it returns false and does not change its behavior.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
- * <li>when switching to this input method through the user interface if the user
- * specified a locale or if the previously selected input method's
- * {@link java.awt.im.spi.InputMethod#getLocale getLocale} method
- * returns a non-null value.
- * </ul>
- *
- * @param locale locale to input
- * @return whether the specified locale is supported
- * @exception NullPointerException if <code>locale</code> is null
- */
- public boolean setLocale(Locale locale) {
-
- if (locale.getLanguage().equals(this.locale.getLanguage())) {
- //System.out.println("returning true for locale " + locale);
- return true;
- }
- else {
- //System.out.println("returning false for locale " + locale);
- return false;
- }
- }
-
- /**
- * Returns the current input locale. Might return null in exceptional cases.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#getLocale InputContext.getLocale} and
- * <li>when switching from this input method to a different one through the
- * user interface.
- * </ul>
- *
- * @return the current input locale, or null
- */
- public Locale getLocale() {
-
- return locale;
- }
-
- /**
- * Sets the subsets of the Unicode character set that this input method
- * is allowed to input. Null may be passed in to indicate that all
- * characters are allowed.
- * <p>
- * This method is called
- * <ul>
- * <li>immediately after instantiating this input method,
- * <li>when switching to this input method from a different one, and
- * <li>by {@link java.awt.im.InputContext#setCharacterSubsets InputContext.setCharacterSubsets}.
- * </ul>
- *
- * @param subsets the subsets of the Unicode character set from which
- * characters may be input
- */
- public void setCharacterSubsets(Subset[] subsets) {
- }
-
- /**
- * Enables or disables this input method for composition,
- * depending on the value of the parameter <code>enable</code>.
- * <p>
- * An input method that is enabled for composition interprets incoming
- * events for both composition and control purposes, while a
- * disabled input method does not interpret events for composition.
- * Note however that events are passed on to the input method regardless
- * whether it is enabled or not, and that an input method that is disabled
- * for composition may still interpret events for control purposes,
- * including to enable or disable itself for composition.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#setCompositionEnabled InputContext.setCompositionEnabled},
- * <li>when switching to this input method from a different one using the
- * user interface or
- * {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
- * if the previously selected input method's
- * {@link java.awt.im.spi.InputMethod#isCompositionEnabled isCompositionEnabled}
- * method returns without throwing an exception.
- * </ul>
- *
- * @param enable whether to enable the input method for composition
- * @throws UnsupportedOperationException if this input method does not
- * support the enabling/disabling operation
- * @see #isCompositionEnabled
- */
- public void setCompositionEnabled(boolean enable) {
-
- throw new UnsupportedOperationException();
- }
-
- /**
- * Determines whether this input method is enabled.
- * An input method that is enabled for composition interprets incoming
- * events for both composition and control purposes, while a
- * disabled input method does not interpret events for composition.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#isCompositionEnabled InputContext.isCompositionEnabled} and
- * <li>when switching from this input method to a different one using the
- * user interface or
- * {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
- * </ul>
- *
- * @return <code>true</code> if this input method is enabled for
- * composition; <code>false</code> otherwise.
- * @throws UnsupportedOperationException if this input method does not
- * support checking whether it is enabled for composition
- * @see #setCompositionEnabled
- */
- public boolean isCompositionEnabled() {
-
- return true;
- }
-
- /**
- * Starts the reconversion operation. The input method obtains the
- * text to be reconverted from the current client component using the
- * {@link java.awt.im.InputMethodRequests#getSelectedText InputMethodRequests.getSelectedText}
- * method. It can use other <code>InputMethodRequests</code>
- * methods to request additional information required for the
- * reconversion operation. The composed and committed text
- * produced by the operation is sent to the client component as a
- * sequence of <code>InputMethodEvent</code>s. If the given text
- * cannot be reconverted, the same text should be sent to the
- * client component as committed text.
- * <p>
- * This method is called by
- * {@link java.awt.im.InputContext#reconvert() InputContext.reconvert}.
- *
- * @throws UnsupportedOperationException if the input method does not
- * support the reconversion operation.
- */
- public void reconvert() {
-
- throw new UnsupportedOperationException("This input method does not reconvert.");
- }
-
- /**
- * Dispatches the event to the input method. If input method support is
- * enabled for the focussed component, incoming events of certain types
- * are dispatched to the current input method for this component before
- * they are dispatched to the component's methods or event listeners.
- * The input method decides whether it needs to handle the event. If it
- * does, it also calls the event's <code>consume</code> method; this
- * causes the event to not get dispatched to the component's event
- * processing methods or event listeners.
- * <p>
- * Events are dispatched if they are instances of InputEvent or its
- * subclasses.
- * This includes instances of the AWT classes KeyEvent and MouseEvent.
- * <p>
- * This method is called by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}.
- *
- * @param event the event being dispatched to the input method
- * @exception NullPointerException if <code>event</code> is null
- */
- public void dispatchEvent(AWTEvent event) {
-
- if (event instanceof KeyEvent) {
-
- KeyEvent keyEvent = (KeyEvent) event;
- if (event.getID() == KeyEvent.KEY_TYPED) {
- //System.out.println("handled event " + event);
- impl.handleKeyTyped(keyEvent);
- }
- }
- else {
- //System.out.println("did not handle event " + event);
- }
- }
-
- /**
- * Notifies this input method of changes in the client window
- * location or state. This method is called while this input
- * method is the current input method of its input context and
- * notifications for it are enabled (see {@link
- * InputMethodContext#enableClientWindowNotification
- * InputMethodContext.enableClientWindowNotification}). Calls
- * to this method are temporarily suspended if the input context's
- * {@link java.awt.im.InputContext#removeNotify removeNotify}
- * method is called, and resume when the input method is activated
- * for a new client component. It is called in the following
- * situations:
- * <ul>
- * <li>
- * when the window containing the current client component changes
- * in location, size, visibility, iconification state, or when the
- * window is closed.</li>
- * <li>
- * from <code> enableClientWindowNotification(inputMethod,
- * true)</code> if the current client component exists,</li>
- * <li>
- * when activating the input method for the first time after it
- * called
- * <code>enableClientWindowNotification(inputMethod,
- * true)</code> if during the call no current client component was
- * available,</li>
- * <li>
- * when activating the input method for a new client component
- * after the input context's removeNotify method has been
- * called.</li>
- * </ul>
- * @param bounds client window's {@link
- * java.awt.Component#getBounds bounds} on the screen; or null if
- * the client window is iconified or invisible
- */
- public void notifyClientWindowChange(Rectangle bounds) {
- }
-
- /**
- * Activates the input method for immediate input processing.
- * <p>
- * If an input method provides its own windows, it should make sure
- * at this point that all necessary windows are open and visible.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
- * when a client component receives a FOCUS_GAINED event,
- * <li>when switching to this input method from a different one using the
- * user interface or
- * {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
- * </ul>
- * The method is only called when the input method is inactive.
- * A newly instantiated input method is assumed to be inactive.
- */
- public void activate() {
- //System.out.println("activated");
- }
-
- /**
- * Deactivates the input method.
- * The isTemporary argument has the same meaning as in
- * {@link java.awt.event.FocusEvent#isTemporary FocusEvent.isTemporary}.
- * <p>
- * If an input method provides its own windows, only windows that relate
- * to the current composition (such as a lookup choice window) should be
- * closed at this point.
- * It is possible that the input method will be immediately activated again
- * for a different client component, and closing and reopening more
- * persistent windows (such as a control panel) would create unnecessary
- * screen flicker.
- * Before an instance of a different input method class is activated,
- * {@link #hideWindows} is called on the current input method.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
- * when a client component receives a FOCUS_LOST event,
- * <li>when switching from this input method to a different one using the
- * user interface or
- * {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod},
- * <li>before {@link #removeNotify removeNotify} if the current client component is
- * removed.
- * </ul>
- * The method is only called when the input method is active.
- *
- * @param isTemporary whether the focus change is temporary
- */
- public void deactivate(boolean isTemporary) {
- //System.out.println("deactivated");
- }
-
- /**
- * Closes or hides all windows opened by this input method instance or
- * its class.
- * <p>
- * This method is called
- * <ul>
- * <li>before calling {@link #activate activate} on an instance of a different input
- * method class,
- * <li>before calling {@link #dispose dispose} on this input method.
- * </ul>
- * The method is only called when the input method is inactive.
- */
- public void hideWindows() {
- }
-
- /**
- * Notifies the input method that a client component has been
- * removed from its containment hierarchy, or that input method
- * support has been disabled for the component.
- * <p>
- * This method is called by {@link java.awt.im.InputContext#removeNotify InputContext.removeNotify}.
- * <p>
- * The method is only called when the input method is inactive.
- */
- public void removeNotify() {
- }
-
- /**
- * Ends any input composition that may currently be going on in this
- * context. Depending on the platform and possibly user preferences,
- * this may commit or delete uncommitted text. Any changes to the text
- * are communicated to the active component using an input method event.
- *
- * <p>
- * A text editing component may call this in a variety of situations,
- * for example, when the user moves the insertion point within the text
- * (but outside the composed text), or when the component's text is
- * saved to a file or copied to the clipboard.
- * <p>
- * This method is called
- * <ul>
- * <li>by {@link java.awt.im.InputContext#endComposition InputContext.endComposition},
- * <li>by {@link java.awt.im.InputContext#dispatchEvent InputContext.dispatchEvent}
- * when switching to a different client component
- * <li>when switching from this input method to a different one using the
- * user interface or
- * {@link java.awt.im.InputContext#selectInputMethod InputContext.selectInputMethod}.
- * </ul>
- */
- public void endComposition() {
-
- impl.endComposition();
- }
-
- /**
- * Disposes of the input method and releases the resources used by it.
- * In particular, the input method should dispose windows and close files that are no
- * longer needed.
- * <p>
- * This method is called by {@link java.awt.im.InputContext#dispose InputContext.dispose}.
- * <p>
- * The method is only called when the input method is inactive.
- * No method of this interface is called on this instance after dispose.
- */
- public void dispose() {
- }
-
- /**
- * Returns a control object from this input method, or null. A
- * control object provides methods that control the behavior of the
- * input method or obtain information from the input method. The type
- * of the object is an input method specific class. Clients have to
- * compare the result against known input method control object
- * classes and cast to the appropriate class to invoke the methods
- * provided.
- * <p>
- * This method is called by
- * {@link java.awt.im.InputContext#getInputMethodControlObject InputContext.getInputMethodControlObject}.
- *
- * @return a control object from this input method, or null
- */
- public Object getControlObject() {
-
- return null;
- }
-}
diff --git a/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodDescriptor.java b/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodDescriptor.java
deleted file mode 100644
index 4d12a728d..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodDescriptor.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2002, 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.
- */
-
-/*
- *
- * (C) Copyright IBM Corp. 2000 - All Rights Reserved
- *
- * The original version of this source code and documentation is
- * copyrighted and owned by IBM. These materials are provided
- * under terms of a License Agreement between IBM and Sun.
- * This technology is protected by multiple US and International
- * patents. This notice and attribution to IBM may not be removed.
- *
- */
-
-package com.sun.inputmethods.internal.thaiim;
-
-import java.awt.Image;
-import java.awt.im.spi.InputMethod;
-import java.awt.im.spi.InputMethodDescriptor;
-import java.util.Locale;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class ThaiInputMethodDescriptor implements InputMethodDescriptor {
-
- static final Locale THAI = new Locale("th");
-
- public ThaiInputMethodDescriptor() {
- }
-
- /**
- * @see java.awt.im.spi.InputMethodDescriptor#getAvailableLocales
- */
- public Locale[] getAvailableLocales() {
- return new Locale[] { THAI };
- }
-
- /**
- * @see java.awt.im.spi.InputMethodDescriptor#hasDynamicLocaleList
- */
- public boolean hasDynamicLocaleList() {
- return false;
- }
-
- /**
- * @see java.awt.im.spi.InputMethodDescriptor#getInputMethodDisplayName
- */
- public synchronized String getInputMethodDisplayName(Locale inputLocale, Locale displayLanguage) {
- try {
- ResourceBundle resources = ResourceBundle.getBundle(
- "com.sun.inputmethods.internal.thaiim.resources.DisplayNames", displayLanguage);
- return resources.getString("DisplayName.Thai");
- } catch (MissingResourceException mre) {
- return "Thai Input Method";
- }
- }
-
- /**
- * @see java.awt.im.spi.InputMethodDescriptor#getInputMethodIcon
- */
- public Image getInputMethodIcon(Locale inputLocale) {
- return null;
- }
-
- /**
- * @see java.awt.im.spi.InputMethodDescriptor#createInputMethod
- */
- public InputMethod createInputMethod() throws Exception {
- ThaiInputMethodImpl impl = new ThaiInputMethodImpl();
- return new ThaiInputMethod(THAI, impl);
- }
-
- public String toString() {
- return getClass().getName();
- }
-}
diff --git a/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodImpl.java b/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodImpl.java
deleted file mode 100644
index 5cc66d97b..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodImpl.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Copyright (c) 2002, 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.
- */
-
-/*
- *
- * (C) Copyright IBM Corp. 2000 - All Rights Reserved
- *
- * The original version of this source code and documentation is
- * copyrighted and owned by IBM. These materials are provided
- * under terms of a License Agreement between IBM and Sun.
- * This technology is protected by multiple US and International
- * patents. This notice and attribution to IBM may not be removed.
- *
- */
-
-package com.sun.inputmethods.internal.thaiim;
-
-import java.awt.im.InputMethodRequests;
-import java.awt.im.spi.InputMethodContext;
-
-import java.awt.Toolkit;
-import java.awt.event.KeyEvent;
-import java.awt.event.InputMethodEvent;
-import java.awt.font.TextAttribute;
-import java.awt.font.TextHitInfo;
-
-import java.text.AttributedCharacterIterator;
-import java.text.AttributedString;
-
-class ThaiInputMethodImpl {
-
- private static final char[] keyboardMap = {
- /* 00 */ '\u0000',
- /* 01 */ '\u0001',
- /* 02 */ '\u0002',
- /* 03 */ '\u0003',
- /* 04 */ '\u0004',
- /* 05 */ '\u0005',
- /* 06 */ '\u0006',
- /* 07 */ '\u0007',
- /* 08 */ '\u0008',
- /* 09 */ '\u0009',
- /* 0A */ '\012',
- /* 0B */ '\u000B',
- /* 0C */ '\u000C',
- /* 0D */ '\015',
- /* 0E */ '\u000E',
- /* 0F */ '\u000F',
- /* 10 */ '\u0010',
- /* 11 */ '\u0011',
- /* 12 */ '\u0012',
- /* 13 */ '\u0013',
- /* 14 */ '\u0014',
- /* 15 */ '\u0015',
- /* 16 */ '\u0016',
- /* 17 */ '\u0017',
- /* 18 */ '\u0018',
- /* 19 */ '\u0019',
- /* 1A */ '\u001A',
- /* 1B */ '\u001B',
- /* 1C */ '\u001C',
- /* 1D */ '\u001D',
- /* 1E */ '\u001E',
- /* 1F */ '\u001F',
- /* 20 */ '\u0020',
- /* 21 */ '\u0e45', // '!'
- /* 22 */ '\u002e', // '"'
- /* 23 */ '\u0e52', // '#'
- /* 24 */ '\u0e53', // '$'
- /* 25 */ '\u0e54', // '%'
- /* 26 */ '\u0e4e', // '&'
- /* 27 */ '\u0e07', // '''
- /* 28 */ '\u0e56', // '('
- /* 29 */ '\u0e57', // ')'
- /* 2A */ '\u0e55', // '*'
- /* 2B */ '\u0e59', // '+'
- /* 2C */ '\u0e21', // ','
- /* 2D */ '\u0e02', // '-'
- /* 2E */ '\u0e43', // '.'
- /* 2F */ '\u0e1d', // '/'
- /* 30 */ '\u0e08', // '0'
- /* 31 */ '\u0e3f', // '1'
- /* 32 */ '\u002f', // '2'
- /* 33 */ '\u002d', // '3'
- /* 34 */ '\u0e20', // '4'
- /* 35 */ '\u0e16', // '5'
- /* 36 */ '\u0e38', // '6'
- /* 37 */ '\u0e36', // '7'
- /* 38 */ '\u0e04', // '8'
- /* 39 */ '\u0e15', // '9'
- /* 3A */ '\u0e0b', // ':'
- /* 3B */ '\u0e27', // ';'
- /* 3C */ '\u0e12', // '<'
- /* 3D */ '\u0e0a', // '='
- /* 3E */ '\u0e2c', // '>'
- /* 3F */ '\u0e26', // '?'
- /* 40 */ '\u0e51', // '@'
- /* 41 */ '\u0e24', // 'A'
- /* 42 */ '\u0e3a', // 'B'
- /* 43 */ '\u0e09', // 'C'
- /* 44 */ '\u0e0f', // 'D'
- /* 45 */ '\u0e0e', // 'E'
- /* 46 */ '\u0e42', // 'F'
- /* 47 */ '\u0e0c', // 'G'
- /* 48 */ '\u0e47', // 'H'
- /* 49 */ '\u0e13', // 'I'
- /* 4A */ '\u0e4b', // 'J'
- /* 4B */ '\u0e29', // 'K'
- /* 4C */ '\u0e28', // 'L'
- /* 4D */ '\u003f', // 'M'
- /* 4E */ '\u0e4c', // 'N'
- /* 4F */ '\u0e2f', // 'O'
- /* 50 */ '\u0e0d', // 'P'
- /* 51 */ '\u0e50', // 'Q'
- /* 52 */ '\u0e11', // 'R'
- /* 53 */ '\u0e06', // 'S'
- /* 54 */ '\u0e18', // 'T'
- /* 55 */ '\u0e4a', // 'U'
- /* 56 */ '\u0e2e', // 'V'
- /* 57 */ '\u0022', // 'W'
- /* 58 */ '\u0029', // 'X'
- /* 59 */ '\u0e4d', // 'Y'
- /* 5A */ '\u0028', // 'Z'
- /* 5B */ '\u0e1a', // '['
- /* 5C */ '\u0e05', // '\'
- /* 5D */ '\u0e25', // ']'
- /* 5E */ '\u0e39', // '^'
- /* 5F */ '\u0e58', // '_'
- /* 60 */ '\u0e4f', // '`'
- /* 61 */ '\u0e1f', // 'a'
- /* 62 */ '\u0e34', // 'b'
- /* 63 */ '\u0e41', // 'c'
- /* 64 */ '\u0e01', // 'd'
- /* 65 */ '\u0e33', // 'e'
- /* 66 */ '\u0e14', // 'f'
- /* 67 */ '\u0e40', // 'g'
- /* 68 */ '\u0e49', // 'h'
- /* 69 */ '\u0e23', // 'i'
- /* 6A */ '\u0e48', // 'j'
- /* 6B */ '\u0e32', // 'k'
- /* 6C */ '\u0e2a', // 'l'
- /* 6D */ '\u0e17', // 'm'
- /* 6E */ '\u0e37', // 'n'
- /* 6F */ '\u0e19', // 'o'
- /* 70 */ '\u0e22', // 'p'
- /* 71 */ '\u0e46', // 'q'
- /* 72 */ '\u0e1e', // 'r'
- /* 73 */ '\u0e2b', // 's'
- /* 74 */ '\u0e30', // 't'
- /* 75 */ '\u0e35', // 'u'
- /* 76 */ '\u0e2d', // 'v'
- /* 77 */ '\u0e44', // 'w'
- /* 78 */ '\u0e1b', // 'x'
- /* 79 */ '\u0e31', // 'y'
- /* 7A */ '\u0e1c', // 'z'
- /* 7B */ '\u0e10', // '{'
- /* 7C */ '\u0e03', // '|'
- /* 7D */ '\u002c', // '}'
- /* 7E */ '\u0e5b', // '~'
- /* 7F */ '\u007F' //
- };
-
- // cached TextHitInfo. Only one type of TextHitInfo is required.
- private static final TextHitInfo ZERO_TRAILING_HIT_INFO = TextHitInfo.trailing(0);
-
- private ThaiRules rules;
-
- /**
- * Returns the equivalent character for thai locale.
- * @param originalChar The original character.
- */
- private char getMappedChar( char originalChar )
- {
- if (originalChar <= keyboardMap.length) {
- return keyboardMap[originalChar];
- }
-
- return originalChar;
- }//getMappedChar()
-
- private InputMethodContext context;
-
- void setInputMethodContext(InputMethodContext context) {
- this.context = context;
- rules = new ThaiRules((InputMethodRequests)context);
- }
-
- void handleKeyTyped(KeyEvent kevent) {
- char keyChar = kevent.getKeyChar();
- char currentChar = getMappedChar(keyChar);
- if (!Character.UnicodeBlock.THAI.equals(Character.UnicodeBlock.of(currentChar))) {
- // don't care
- return;
- } else if (rules.isInputValid(currentChar)) {
- Character tmp = new Character(currentChar);
- String tmp2 = tmp.toString();
- context.dispatchInputMethodEvent(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED,
- (new AttributedString(tmp2)).getIterator(),
- 1,
- ZERO_TRAILING_HIT_INFO,
- ZERO_TRAILING_HIT_INFO);
- } else {
- // input sequence is not allowed
- Toolkit.getDefaultToolkit().beep();
- }
-
- kevent.consume();// prevent client from getting this event.
- return;
- }//dispatchEvent()
-
- void endComposition() {
- }//endComposition()
-}
diff --git a/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiRules.java b/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiRules.java
deleted file mode 100644
index 02e4b6ed4..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiRules.java
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * Copyright (c) 2002, 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 com.sun.inputmethods.internal.thaiim;
-
-import java.awt.im.InputMethodRequests;
-
-public class ThaiRules {
-
- public static final char BASE = 0x0e00;
-
- public static final byte NON = 0;
- public static final byte CONS = 1;
- public static final byte LV = 2;
- public static final byte FV1 = 3;
- public static final byte FV2 = 4;
- public static final byte FV3 = 5;
- public static final byte FV4 = 6;
- /* Note that FV4 is added. It is not in WTT.
- * We need it for SARA AM since it has a
- * weired characteristic to share the same
- * cell with whatever consonant preceeds it.
- */
- public static final byte BV1 = 7;
- public static final byte BV2 = 8;
- public static final byte BD = 9;
- public static final byte TONE = 10;
- public static final byte AD1 = 11;
- public static final byte AD2 = 12;
- public static final byte AD3 = 13;
- public static final byte AV1 = 14;
- public static final byte AV2 = 15;
- public static final byte AV3 = 16;
-
- /**
- * Constants for validity checking and auto correction
- */
- public static final byte STRICT = 0;
- public static final byte LOOSE = 1;
- public static final byte NOREPLACE = 2;
-
- public static final byte[] CHARTYPE = {
- /* 0e00 UNUSED */ NON,
- /* THAI CHARACTER KO KAI */ CONS,
- /* THAI CHARACTER KHO KHAI */ CONS,
- /* THAI CHARACTER KHO KHUAT */ CONS,
- /* THAI CHARACTER KHO KHWAI */ CONS,
- /* THAI CHARACTER KHO KHON */ CONS,
- /* THAI CHARACTER KHO RAKHANG */ CONS,
- /* THAI CHARACTER NGO NGU */ CONS,
- /* THAI CHARACTER CHO CHAN */ CONS,
- /* THAI CHARACTER CHO CHING */ CONS,
- /* THAI CHARACTER CHO CHANG */ CONS,
- /* THAI CHARACTER SO SO */ CONS,
- /* THAI CHARACTER CHO CHOE */ CONS,
- /* THAI CHARACTER YO YING */ CONS,
- /* THAI CHARACTER DO CHADA */ CONS,
- /* THAI CHARACTER TO PATAK */ CONS,
- /* THAI CHARACTER THO THAN */ CONS,
- /* THAI CHARACTER THO NANGMONTHO */ CONS,
- /* THAI CHARACTER THO PHUTHAO */ CONS,
- /* THAI CHARACTER NO NEN */ CONS,
- /* THAI CHARACTER DO DEK */ CONS,
- /* THAI CHARACTER TO TAO */ CONS,
- /* THAI CHARACTER THO THUNG */ CONS,
- /* THAI CHARACTER THO THAHAN */ CONS,
- /* THAI CHARACTER THO THONG */ CONS,
- /* THAI CHARACTER NO NU */ CONS,
- /* THAI CHARACTER BO BAIMAI */ CONS,
- /* THAI CHARACTER PO PLA */ CONS,
- /* THAI CHARACTER PHO PHUNG */ CONS,
- /* THAI CHARACTER FO FA */ CONS,
- /* THAI CHARACTER PHO PHAN */ CONS,
- /* THAI CHARACTER FO FAN */ CONS,
- /* THAI CHARACTER PHO SAMPHAO */ CONS,
- /* THAI CHARACTER MO MA */ CONS,
- /* THAI CHARACTER YO YAK */ CONS,
- /* THAI CHARACTER RO RUA */ CONS,
- /* THAI CHARACTER RU */ FV3,
- /* THAI CHARACTER LO LING */ CONS,
- /* THAI CHARACTER LU */ FV3,
- /* THAI CHARACTER WO WAEN */ CONS,
- /* THAI CHARACTER SO SALA */ CONS,
- /* THAI CHARACTER SO RUSI */ CONS,
- /* THAI CHARACTER SO SUA */ CONS,
- /* THAI CHARACTER HO HIP */ CONS,
- /* THAI CHARACTER LO CHULA */ CONS,
- /* THAI CHARACTER O ANG */ CONS,
- /* THAI CHARACTER HO NOKHUK */ CONS,
- /* THAI CHARACTER PAIYANNOI */ NON,
- /* THAI CHARACTER SARA A */ FV1,
- /* THAI CHARACTER MAI HAN-AKAT */ AV2,
- /* THAI CHARACTER SARA AA */ FV1,
- /* THAI CHARACTER SARA AM */ FV4,
- /* THAI CHARACTER SARA I */ AV1,
- /* THAI CHARACTER SARA II */ AV3,
- /* THAI CHARACTER SARA UE */ AV2,
- /* THAI CHARACTER SARA UEE */ AV3,
- /* THAI CHARACTER SARA U */ BV1,
- /* THAI CHARACTER SARA UU */ BV2,
- /* THAI CHARACTER PHINTHU */ BD,
- /* 0e3b UNUSED */ NON,
- /* 0e3c UNUSED */ NON,
- /* 0e3d UNUSED */ NON,
- /* 0e3e UNUSED */ NON,
- /* THAI CURRENCY SYMBOL BAHT */ NON,
- /* THAI CHARACTER SARA E */ LV,
- /* THAI CHARACTER SARA AE */ LV,
- /* THAI CHARACTER SARA O */ LV,
- /* THAI CHARACTER SARA AI MAIMUAN */ LV,
- /* THAI CHARACTER SARA AI MAIMALAI */ LV,
- /* THAI CHARACTER LAKKHANGYAO */ FV2,
- /* THAI CHARACTER MAIYAMOK */ NON,
- /* THAI CHARACTER MAITAIKHU */ AD2,
- /* THAI CHARACTER MAI EK */ TONE,
- /* THAI CHARACTER MAI THO */ TONE,
- /* THAI CHARACTER MAI TRI */ TONE,
- /* THAI CHARACTER MAI CHATTAWA */ TONE,
- /* THAI CHARACTER THANTHAKHAT */ AD1,
- /* THAI CHARACTER NIKHAHIT */ AD3,
- /* THAI CHARACTER YAMAKKAN */ AD3,
- /* THAI CHARACTER FONGMAN */ NON,
- /* THAI DIGIT ZERO */ NON,
- /* THAI DIGIT ONE */ NON,
- /* THAI DIGIT TWO */ NON,
- /* THAI DIGIT THREE */ NON,
- /* THAI DIGIT FOUR */ NON,
- /* THAI DIGIT FIVE */ NON,
- /* THAI DIGIT SIX */ NON,
- /* THAI DIGIT SEVEN */ NON,
- /* THAI DIGIT EIGHT */ NON,
- /* THAI DIGIT NINE */ NON,
- /* THAI CHARACTER ANGKHANKHU */ NON,
- /* THAI CHARACTER KHOMUT */ NON
- };
-
- private InputMethodRequests requests;
-
- ThaiRules(InputMethodRequests requests) {
- this.requests = requests;
- }
-
- public static byte getCharType(char c) {
- byte cType;
- int ci = ((int) c) - (int) BASE;
- if (ci < 0 || ci >= CHARTYPE.length)
- cType = NON;
- else
- cType = CHARTYPE[ci];
- return cType;
- }
-
- private static boolean isValid(char c1, char c2, int[] validityArray) {
- return ((validityArray[getCharType(c1)]
- & (1 << getCharType(c2))) != 0);
- }
-
- /**
- * VALIDITY is a bit matrix defining whether one
- * character is allowed to be typed in after the
- * previous one (array index). Determining the
- * validity is done by bit-anding the 2nd char
- * type's mask (obtained by 1 << chartype) with
- * the array element indexed by the first char
- * type. If the result is non-zero, the 2nd
- * character is allowed to follow the first.
- */
-
- /* Please note that the bits in the comment below
- * are displayed least significant bit first.
- * The actual value reflexs this representation
- * when the bits are swapped.
- */
-
- private static final int[] INPUTVALIDITY = {
- /* NON 1110 010 0 0000 0000 0 */ 0x00027,
- /* CONS 1111 111 1 1111 1111 1 */ 0x1ffff,
- /* LV 0100 000 0 0000 0000 0 */ 0x00002,
- /* FV1 1110 010 0 0000 0000 0 */ 0x00027,
- /* FV2 1110 010 0 0000 0000 0 */ 0x00027,
- /* FV3 1110 110 0 0000 0000 0 */ 0x00037,
- /* FV4 1110 010 0 0000 0000 0 */ 0x00027,
- /* BV1 1110 010 0 0011 0000 0 */ 0x00c27,
- /* BV2 1110 010 0 0010 0000 0 */ 0x00427,
- /* BD 1110 010 0 0000 0000 0 */ 0x00027,
- /* TONE 1111 011 0 0000 0000 0 */ 0x0006f,
- /* AD1 1110 010 0 0000 0000 0 */ 0x00027,
- /* AD2 1110 010 0 0000 0000 0 */ 0x00027,
- /* AD3 1110 010 0 0000 0000 0 */ 0x00027,
- /* AV1 1110 010 0 0011 0000 0 */ 0x00c27,
- /* AV2 1110 010 0 0010 0000 0 */ 0x00427,
- /* AV3 1110 010 0 0010 0100 0 */ 0x02427
- };
-
- private static final int[] COMPOSABLE = {
- /* NON 0000 000 0 0000 0000 0 */ 0x00000,
- /* CONS 0000 001 1 1111 1111 1 */ 0x1ffc0,
- /* LV 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV1 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV2 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV3 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV4 0000 000 0 0000 0000 0 */ 0x00000,
- /* BV1 0000 000 0 0011 0000 0 */ 0x00c00,
- /* BV2 0000 000 0 0010 0000 0 */ 0x00400,
- /* BD 0000 000 0 0000 0000 0 */ 0x00000,
- /* TONE 0000 001 0 0000 0000 0 */ 0x00040,
- /* AD1 0000 000 0 0000 0000 0 */ 0x00000,
- /* AD2 0000 000 0 0000 0000 0 */ 0x00000,
- /* AD3 0000 000 0 0000 0000 0 */ 0x00000,
- /* AV1 0000 000 0 0011 0000 0 */ 0x00c00,
- /* AV2 0000 000 0 0010 0000 0 */ 0x00400,
- /* AV3 0000 000 0 0010 0100 0 */ 0x02400
- };
-
- private static final int[] REPLACABLE = {
- /* NON 0000 000 0 0000 0000 0 */ 0x00000,
- /* CONS 0000 000 0 0000 0000 0 */ 0x00000,
- /* LV 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV1 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV2 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV3 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV4 0000 001 1 1001 1111 1 */ 0x1f9c0,
- /* BV1 0000 001 1 1100 1111 1 */ 0x1f3c0,
- /* BV2 0000 001 1 1101 1111 1 */ 0x1fbc0,
- /* BD 0000 001 1 1111 1111 1 */ 0x1ffc0,
- /* TONE 0000 000 0 0111 1100 0 */ 0x03e00,
- /* AD1 0000 001 0 1111 1101 1 */ 0x1bf40,
- /* AD2 0000 001 1 1111 1111 1 */ 0x1ffc0,
- /* AD3 0000 001 1 1111 1111 0 */ 0x0ffc0,
- /* AV1 0000 001 1 1100 1111 1 */ 0x1f3c0,
- /* AV2 0000 001 1 1101 1111 1 */ 0x1fbc0,
- /* AV3 0000 001 1 1101 1011 1 */ 0x1dbc0
- };
-
- private static final int[] SWAPPABLE = {
- /* NON 0000 000 0 0000 0000 0 */ 0x00000,
- /* CONS 0000 000 0 0000 0000 0 */ 0x00000,
- /* LV 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV1 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV2 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV3 0000 000 0 0000 0000 0 */ 0x00000,
- /* FV4 0000 000 0 0010 0000 0 */ 0x00400,
- /* BV1 0000 000 0 0000 0000 0 */ 0x00000,
- /* BV2 0000 000 0 0000 0000 0 */ 0x00000,
- /* BD 0000 000 0 0000 0000 0 */ 0x00000,
- /* TONE 0000 000 1 1000 0011 1 */ 0x1c180,
- /* AD1 0000 000 1 0000 0010 0 */ 0x04080,
- /* AD2 0000 000 0 0000 0000 0 */ 0x00000,
- /* AD3 0000 000 0 0000 0000 1 */ 0x10000,
- /* AV1 0000 000 0 0000 0000 0 */ 0x00000,
- /* AV2 0000 000 0 0000 0000 0 */ 0x00000,
- /* AV3 0000 000 0 0000 0000 0 */ 0x00000
- };
-
- public static boolean isInputValid(char c1, char c2) {
- return isValid(c1, c2, INPUTVALIDITY);
- }
-
- public static boolean isComposable(char c1, char c2) {
- return isValid(c1, c2, COMPOSABLE);
- }
-
- public static boolean isSwappable(char c1, char c2) {
- return isValid(c1, c2, SWAPPABLE);
- }
-
- public static boolean isReplacable(char c1, char c2) {
- return isValid(c1, c2, REPLACABLE);
- }
-
- public static boolean isForward(char c) {
- return (getCharType(c) < FV4);
- }
-
- public static boolean isDead(char c) {
- return (getCharType(c) > FV3);
- }
-
- public boolean isInputValid(char current) {
- int offset = requests.getInsertPositionOffset();
- if (offset == 0) {
- byte charType = getCharType(current);
- return ((charType < FV1) || (charType == FV3));
- }
- else {
- char prev = requests.getCommittedText(offset-1, offset, null).first();
-
- if(isForward(current)) {
- if (isInputValid(prev, current)) {
- if (getCharType(prev) == TONE &&
- getCharType(current) == FV1) {
- if (offset == 1) {
- return true;
- } else {
- char pprev =
- requests.getCommittedText(offset-2, offset-1, null).first();
- return isInputValid(pprev, current);
- }
- } else {
- return true;
- }
- } else if (prev == '\u0e32' && // SARA AA
- current == '\u0e30') { // SARA A
- return true;
- } else if (prev == '\u0e4d' && // NIKAHIT
- current == '\u0e32') { // SARA AA
- // Special compose to SARA AM
- return true;
- } else {
- return false;
- }
- } else {
- if(isInputValid(prev, current)) {
- if (getCharType(prev) == TONE &&
- getCharType(current) == FV4) {
- return (offset != 1);
- } else {
- return true;
- }
- } else {
- return false;
- }
- }
- }
- }
-}
diff --git a/src/share/classes/com/sun/inputmethods/internal/thaiim/java.awt.im.spi.InputMethodDescriptor b/src/share/classes/com/sun/inputmethods/internal/thaiim/java.awt.im.spi.InputMethodDescriptor
deleted file mode 100644
index 9f60bbe99..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/thaiim/java.awt.im.spi.InputMethodDescriptor
+++ /dev/null
@@ -1 +0,0 @@
-com.sun.inputmethods.internal.thaiim.ThaiInputMethodDescriptor
diff --git a/src/share/classes/com/sun/inputmethods/internal/thaiim/resources/DisplayNames.properties b/src/share/classes/com/sun/inputmethods/internal/thaiim/resources/DisplayNames.properties
deleted file mode 100644
index e4528a49a..000000000
--- a/src/share/classes/com/sun/inputmethods/internal/thaiim/resources/DisplayNames.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Default Input method display names for Thai input methods
-#
-
-DisplayName.Thai = Thai Input Method
-
diff --git a/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java b/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java
index 164f865ed..42914f6a1 100644
--- a/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java
+++ b/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java
@@ -35,6 +35,7 @@ import javax.swing.table.*;
import static com.sun.java.swing.plaf.windows.TMSchema.*;
import static com.sun.java.swing.plaf.windows.XPStyle.*;
import sun.swing.table.*;
+import sun.swing.SwingUtilities2;
public class WindowsTableHeaderUI extends BasicTableHeaderUI {
@@ -163,18 +164,13 @@ public class WindowsTableHeaderUI extends BasicTableHeaderUI {
return this;
}
- private int viewIndexForColumn(TableColumn aColumn) {
- if (aColumn != null) {
- return header.getTable().convertColumnIndexToView(
- aColumn.getModelIndex());
- }
- return -1;
- }
-
public void paint(Graphics g) {
Dimension size = getSize();
State state = State.NORMAL;
- if (column == viewIndexForColumn(header.getDraggedColumn())) {
+ TableColumn draggedColumn = header.getDraggedColumn();
+ if (draggedColumn != null &&
+ column == SwingUtilities2.convertColumnIndexToView(
+ header.getColumnModel(), draggedColumn.getModelIndex())) {
state = State.PRESSED;
} else if (isSelected || hasFocus || hasRollover) {
state = State.HOT;
diff --git a/src/share/classes/com/sun/jndi/dns/DnsClient.java b/src/share/classes/com/sun/jndi/dns/DnsClient.java
index 06d14f2ed..68dcee457 100644
--- a/src/share/classes/com/sun/jndi/dns/DnsClient.java
+++ b/src/share/classes/com/sun/jndi/dns/DnsClient.java
@@ -525,11 +525,11 @@ public class DnsClient {
}
byte[] pkt;
if ((pkt = (byte[]) resps.get(xid)) != null) {
+ checkResponseCode(new Header(pkt, pkt.length));
synchronized (queuesLock) {
resps.remove(xid);
reqs.remove(xid);
}
- checkResponseCode(new Header(pkt, pkt.length));
if (debug) {
dprint("FOUND (" + Thread.currentThread() +
@@ -562,12 +562,12 @@ public class DnsClient {
dprint("XID MATCH:" + xid);
}
+ checkResponseCode(hdr);
// remove the response for the xid if received by some other thread.
synchronized (queuesLock) {
resps.remove(xid);
reqs.remove(xid);
}
- checkResponseCode(hdr);
return true;
}
diff --git a/src/share/classes/java/awt/Font.java b/src/share/classes/java/awt/Font.java
index 44aac6da1..0657391e0 100644
--- a/src/share/classes/java/awt/Font.java
+++ b/src/share/classes/java/awt/Font.java
@@ -343,6 +343,10 @@ public class Font implements java.io.Serializable
* Identify a font resource of type TRUETYPE.
* Used to specify a TrueType font resource to the
* {@link #createFont} method.
+ * The TrueType format was extended to become the OpenType
+ * format, which adds support for fonts with Postscript outlines,
+ * this tag therefore references these fonts, as well as those
+ * with TrueType outlines.
* @since 1.3
*/
diff --git a/src/share/classes/java/beans/DefaultPersistenceDelegate.java b/src/share/classes/java/beans/DefaultPersistenceDelegate.java
index a02588f29..d5c24edcb 100644
--- a/src/share/classes/java/beans/DefaultPersistenceDelegate.java
+++ b/src/share/classes/java/beans/DefaultPersistenceDelegate.java
@@ -222,6 +222,25 @@ public class DefaultPersistenceDelegate extends PersistenceDelegate {
// Write out the properties of this instance.
private void initBean(Class type, Object oldInstance, Object newInstance, Encoder out) {
+ for (Field field : type.getFields()) {
+ int mod = field.getModifiers();
+ if (Modifier.isFinal(mod) || Modifier.isStatic(mod) || Modifier.isTransient(mod)) {
+ continue;
+ }
+ try {
+ Expression oldGetExp = new Expression(field, "get", new Object[] { oldInstance });
+ Expression newGetExp = new Expression(field, "get", new Object[] { newInstance });
+ Object oldValue = oldGetExp.getValue();
+ Object newValue = newGetExp.getValue();
+ out.writeExpression(oldGetExp);
+ if (!equals(newValue, out.get(oldValue))) {
+ out.writeStatement(new Statement(field, "set", new Object[] { oldInstance, oldValue }));
+ }
+ }
+ catch (Exception exception) {
+ out.getExceptionListener().exceptionThrown(exception);
+ }
+ }
BeanInfo info;
try {
info = Introspector.getBeanInfo(type);
diff --git a/src/share/classes/java/beans/MetaData.java b/src/share/classes/java/beans/MetaData.java
index 578402129..12c4f81ec 100644
--- a/src/share/classes/java/beans/MetaData.java
+++ b/src/share/classes/java/beans/MetaData.java
@@ -701,56 +701,6 @@ class java_beans_beancontext_BeanContextSupport_PersistenceDelegate extends java
// AWT
/**
- * The persistence delegate for {@link Dimension}.
- * It is impossible to use {@link DefaultPersistenceDelegate}
- * because all getters have return types that differ from parameter types
- * of the constructor {@link Dimension#Dimension(int, int)}.
- *
- * @author Sergey A. Malenkov
- */
-final class java_awt_Dimension_PersistenceDelegate extends PersistenceDelegate {
- protected boolean mutatesTo(Object oldInstance, Object newInstance) {
- return oldInstance.equals(newInstance);
- }
-
- protected Expression instantiate(Object oldInstance, Encoder out) {
- Dimension dimension = (Dimension) oldInstance;
- Object[] args = new Object[] {
- dimension.width,
- dimension.height,
- };
- return new Expression(dimension, dimension.getClass(), "new", args);
- }
-}
-
-/**
- * The persistence delegate for {@link GridBagConstraints}.
- * It is impossible to use {@link DefaultPersistenceDelegate}
- * because this class does not have any properties.
- *
- * @author Sergey A. Malenkov
- */
-final class java_awt_GridBagConstraints_PersistenceDelegate extends PersistenceDelegate {
- protected Expression instantiate(Object oldInstance, Encoder out) {
- GridBagConstraints gbc = (GridBagConstraints) oldInstance;
- Object[] args = new Object[] {
- gbc.gridx,
- gbc.gridy,
- gbc.gridwidth,
- gbc.gridheight,
- gbc.weightx,
- gbc.weighty,
- gbc.anchor,
- gbc.fill,
- gbc.insets,
- gbc.ipadx,
- gbc.ipady,
- };
- return new Expression(gbc, gbc.getClass(), "new", args);
- }
-}
-
-/**
* The persistence delegate for {@link Insets}.
* It is impossible to use {@link DefaultPersistenceDelegate}
* because this class does not have any properties.
@@ -775,54 +725,6 @@ final class java_awt_Insets_PersistenceDelegate extends PersistenceDelegate {
}
/**
- * The persistence delegate for {@link Point}.
- * It is impossible to use {@link DefaultPersistenceDelegate}
- * because all getters have return types that differ from parameter types
- * of the constructor {@link Point#Point(int, int)}.
- *
- * @author Sergey A. Malenkov
- */
-final class java_awt_Point_PersistenceDelegate extends PersistenceDelegate {
- protected boolean mutatesTo(Object oldInstance, Object newInstance) {
- return oldInstance.equals(newInstance);
- }
-
- protected Expression instantiate(Object oldInstance, Encoder out) {
- Point point = (Point) oldInstance;
- Object[] args = new Object[] {
- point.x,
- point.y,
- };
- return new Expression(point, point.getClass(), "new", args);
- }
-}
-
-/**
- * The persistence delegate for {@link Rectangle}.
- * It is impossible to use {@link DefaultPersistenceDelegate}
- * because all getters have return types that differ from parameter types
- * of the constructor {@link Rectangle#Rectangle(int, int, int, int)}.
- *
- * @author Sergey A. Malenkov
- */
-final class java_awt_Rectangle_PersistenceDelegate extends PersistenceDelegate {
- protected boolean mutatesTo(Object oldInstance, Object newInstance) {
- return oldInstance.equals(newInstance);
- }
-
- protected Expression instantiate(Object oldInstance, Encoder out) {
- Rectangle rectangle = (Rectangle) oldInstance;
- Object[] args = new Object[] {
- rectangle.x,
- rectangle.y,
- rectangle.width,
- rectangle.height,
- };
- return new Expression(rectangle, rectangle.getClass(), "new", args);
- }
-}
-
-/**
* The persistence delegate for {@link Font}.
* It is impossible to use {@link DefaultPersistenceDelegate}
* because size of the font can be float value.
diff --git a/src/share/classes/java/beans/XMLEncoder.java b/src/share/classes/java/beans/XMLEncoder.java
index 970b86e25..d4b37da58 100644
--- a/src/share/classes/java/beans/XMLEncoder.java
+++ b/src/share/classes/java/beans/XMLEncoder.java
@@ -407,7 +407,20 @@ public class XMLEncoder extends Encoder {
os.writeObject(this);
*/
mark(oldStm);
- statementList(oldStm.getTarget()).add(oldStm);
+ Object target = oldStm.getTarget();
+ if (target instanceof Field) {
+ String method = oldStm.getMethodName();
+ Object[] args = oldStm.getArguments();
+ if ((method == null) || (args == null)) {
+ }
+ else if (method.equals("get") && (args.length == 1)) {
+ target = args[0];
+ }
+ else if (method.equals("set") && (args.length == 2)) {
+ target = args[0];
+ }
+ }
+ statementList(target).add(oldStm);
}
catch (Exception e) {
getExceptionListener().exceptionThrown(new Exception("XMLEncoder: discarding statement " + oldStm, e));
@@ -703,7 +716,9 @@ public class XMLEncoder extends Encoder {
statements.add(exp);
}
outputValue(target, outer, false);
- outputValue(value, outer, isArgument);
+ if (expression) {
+ outputValue(value, outer, isArgument);
+ }
return;
}
if (expression && (d.refs > 1)) {
@@ -722,8 +737,10 @@ public class XMLEncoder extends Encoder {
}
else if ((!expression && methodName.startsWith("set") && args.length == 1) ||
(expression && methodName.startsWith("get") && args.length == 0)) {
- attributes = attributes + " property=" +
- quote(Introspector.decapitalize(methodName.substring(3)));
+ if (3 < methodName.length()) {
+ attributes = attributes + " property=" +
+ quote(Introspector.decapitalize(methodName.substring(3)));
+ }
}
else if (!methodName.equals("new") && !methodName.equals("newInstance")) {
attributes = attributes + " method=" + quote(methodName);
diff --git a/src/share/classes/java/lang/AbstractStringBuilder.java b/src/share/classes/java/lang/AbstractStringBuilder.java
index 156937c37..f83da439c 100644
--- a/src/share/classes/java/lang/AbstractStringBuilder.java
+++ b/src/share/classes/java/lang/AbstractStringBuilder.java
@@ -117,7 +117,7 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
* size check or synchronization.
*/
void expandCapacity(int minimumCapacity) {
- int newCapacity = value.length * 2;
+ int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
diff --git a/src/share/classes/java/lang/Character.java b/src/share/classes/java/lang/Character.java
index 48488825d..14fce5581 100644
--- a/src/share/classes/java/lang/Character.java
+++ b/src/share/classes/java/lang/Character.java
@@ -24,6 +24,7 @@
*/
package java.lang;
+import java.util.Arrays;
import java.util.Map;
import java.util.HashMap;
import java.util.Locale;
@@ -2547,6 +2548,1241 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
/**
+ * A family of character subsets representing the character scripts
+ * defined in the <a href="http://www.unicode.org/reports/tr24/">
+ * <i>Unicode Standard Annex #24: Script Names</i></a>. Every Unicode
+ * character is assigned to a single Unicode script, either a specific
+ * script, such as {@link Character.UnicodeScript#LATIN Latin}, or
+ * one of the following three special values,
+ * {@link Character.UnicodeScript#INHERITED Inherited},
+ * {@link Character.UnicodeScript#COMMON Common} or
+ * {@link Character.UnicodeScript#UNKNOWN Unknown}.
+ *
+ * @since 1.7
+ */
+ public static enum UnicodeScript {
+ /**
+ * Unicode script "Common".
+ */
+ COMMON,
+
+ /**
+ * Unicode script "Latin".
+ */
+ LATIN,
+
+ /**
+ * Unicode script "Greek".
+ */
+ GREEK,
+
+ /**
+ * Unicode script "Cyrillic".
+ */
+ CYRILLIC,
+
+ /**
+ * Unicode script "Armenian".
+ */
+ ARMENIAN,
+
+ /**
+ * Unicode script "Hebrew".
+ */
+ HEBREW,
+
+ /**
+ * Unicode script "Arabic".
+ */
+ ARABIC,
+
+ /**
+ * Unicode script "Syriac".
+ */
+ SYRIAC,
+
+ /**
+ * Unicode script "Thaana".
+ */
+ THAANA,
+
+ /**
+ * Unicode script "Devanagari".
+ */
+ DEVANAGARI,
+
+ /**
+ * Unicode script "Bengali".
+ */
+ BENGALI,
+
+ /**
+ * Unicode script "Gurmukhi".
+ */
+ GURMUKHI,
+
+ /**
+ * Unicode script "Gujarati".
+ */
+ GUJARATI,
+
+ /**
+ * Unicode script "Oriya".
+ */
+ ORIYA,
+
+ /**
+ * Unicode script "Tamil".
+ */
+ TAMIL,
+
+ /**
+ * Unicode script "Telugu".
+ */
+ TELUGU,
+
+ /**
+ * Unicode script "Kannada".
+ */
+ KANNADA,
+
+ /**
+ * Unicode script "Malayalam".
+ */
+ MALAYALAM,
+
+ /**
+ * Unicode script "Sinhala".
+ */
+ SINHALA,
+
+ /**
+ * Unicode script "Thai".
+ */
+ THAI,
+
+ /**
+ * Unicode script "Lao".
+ */
+ LAO,
+
+ /**
+ * Unicode script "Tibetan".
+ */
+ TIBETAN,
+
+ /**
+ * Unicode script "Myanmar".
+ */
+ MYANMAR,
+
+ /**
+ * Unicode script "Georgian".
+ */
+ GEORGIAN,
+
+ /**
+ * Unicode script "Hangul".
+ */
+ HANGUL,
+
+ /**
+ * Unicode script "Ethiopic".
+ */
+ ETHIOPIC,
+
+ /**
+ * Unicode script "Cherokee".
+ */
+ CHEROKEE,
+
+ /**
+ * Unicode script "Canadian_Aboriginal".
+ */
+ CANADIAN_ABORIGINAL,
+
+ /**
+ * Unicode script "Ogham".
+ */
+ OGHAM,
+
+ /**
+ * Unicode script "Runic".
+ */
+ RUNIC,
+
+ /**
+ * Unicode script "Khmer".
+ */
+ KHMER,
+
+ /**
+ * Unicode script "Mongolian".
+ */
+ MONGOLIAN,
+
+ /**
+ * Unicode script "Hiragana".
+ */
+ HIRAGANA,
+
+ /**
+ * Unicode script "Katakana".
+ */
+ KATAKANA,
+
+ /**
+ * Unicode script "Bopomofo".
+ */
+ BOPOMOFO,
+
+ /**
+ * Unicode script "Han".
+ */
+ HAN,
+
+ /**
+ * Unicode script "Yi".
+ */
+ YI,
+
+ /**
+ * Unicode script "Old_Italic".
+ */
+ OLD_ITALIC,
+
+ /**
+ * Unicode script "Gothic".
+ */
+ GOTHIC,
+
+ /**
+ * Unicode script "Deseret".
+ */
+ DESERET,
+
+ /**
+ * Unicode script "Inherited".
+ */
+ INHERITED,
+
+ /**
+ * Unicode script "Tagalog".
+ */
+ TAGALOG,
+
+ /**
+ * Unicode script "Hanunoo".
+ */
+ HANUNOO,
+
+ /**
+ * Unicode script "Buhid".
+ */
+ BUHID,
+
+ /**
+ * Unicode script "Tagbanwa".
+ */
+ TAGBANWA,
+
+ /**
+ * Unicode script "Limbu".
+ */
+ LIMBU,
+
+ /**
+ * Unicode script "Tai_Le".
+ */
+ TAI_LE,
+
+ /**
+ * Unicode script "Linear_B".
+ */
+ LINEAR_B,
+
+ /**
+ * Unicode script "Ugaritic".
+ */
+ UGARITIC,
+
+ /**
+ * Unicode script "Shavian".
+ */
+ SHAVIAN,
+
+ /**
+ * Unicode script "Osmanya".
+ */
+ OSMANYA,
+
+ /**
+ * Unicode script "Cypriot".
+ */
+ CYPRIOT,
+
+ /**
+ * Unicode script "Braille".
+ */
+ BRAILLE,
+
+ /**
+ * Unicode script "Buginese".
+ */
+ BUGINESE,
+
+ /**
+ * Unicode script "Coptic".
+ */
+ COPTIC,
+
+ /**
+ * Unicode script "New_Tai_Lue".
+ */
+ NEW_TAI_LUE,
+
+ /**
+ * Unicode script "Glagolitic".
+ */
+ GLAGOLITIC,
+
+ /**
+ * Unicode script "Tifinagh".
+ */
+ TIFINAGH,
+
+ /**
+ * Unicode script "Syloti_Nagri".
+ */
+ SYLOTI_NAGRI,
+
+ /**
+ * Unicode script "Old_Persian".
+ */
+ OLD_PERSIAN,
+
+ /**
+ * Unicode script "Kharoshthi".
+ */
+ KHAROSHTHI,
+
+ /**
+ * Unicode script "Balinese".
+ */
+ BALINESE,
+
+ /**
+ * Unicode script "Cuneiform".
+ */
+ CUNEIFORM,
+
+ /**
+ * Unicode script "Phoenician".
+ */
+ PHOENICIAN,
+
+ /**
+ * Unicode script "Phags_Pa".
+ */
+ PHAGS_PA,
+
+ /**
+ * Unicode script "Nko".
+ */
+ NKO,
+
+ /**
+ * Unicode script "Sundanese".
+ */
+ SUNDANESE,
+
+ /**
+ * Unicode script "Lepcha".
+ */
+ LEPCHA,
+
+ /**
+ * Unicode script "Ol_Chiki".
+ */
+ OL_CHIKI,
+
+ /**
+ * Unicode script "Vai".
+ */
+ VAI,
+
+ /**
+ * Unicode script "Saurashtra".
+ */
+ SAURASHTRA,
+
+ /**
+ * Unicode script "Kayah_Li".
+ */
+ KAYAH_LI,
+
+ /**
+ * Unicode script "Rejang".
+ */
+ REJANG,
+
+ /**
+ * Unicode script "Lycian".
+ */
+ LYCIAN,
+
+ /**
+ * Unicode script "Carian".
+ */
+ CARIAN,
+
+ /**
+ * Unicode script "Lydian".
+ */
+ LYDIAN,
+
+ /**
+ * Unicode script "Cham".
+ */
+ CHAM,
+
+ /**
+ * Unicode script "Tai_Tham".
+ */
+ TAI_THAM,
+
+ /**
+ * Unicode script "Tai_Viet".
+ */
+ TAI_VIET,
+
+ /**
+ * Unicode script "Avestan".
+ */
+ AVESTAN,
+
+ /**
+ * Unicode script "Egyptian_Hieroglyphs".
+ */
+ EGYPTIAN_HIEROGLYPHS,
+
+ /**
+ * Unicode script "Samaritan".
+ */
+ SAMARITAN,
+
+ /**
+ * Unicode script "Lisu".
+ */
+ LISU,
+
+ /**
+ * Unicode script "Bamum".
+ */
+ BAMUM,
+
+ /**
+ * Unicode script "Javanese".
+ */
+ JAVANESE,
+
+ /**
+ * Unicode script "Meetei_Mayek".
+ */
+ MEETEI_MAYEK,
+
+ /**
+ * Unicode script "Imperial_Aramaic".
+ */
+ IMPERIAL_ARAMAIC,
+
+ /**
+ * Unicode script "Old_South_Arabian".
+ */
+ OLD_SOUTH_ARABIAN,
+
+ /**
+ * Unicode script "Inscriptional_Parthian".
+ */
+ INSCRIPTIONAL_PARTHIAN,
+
+ /**
+ * Unicode script "Inscriptional_Pahlavi".
+ */
+ INSCRIPTIONAL_PAHLAVI,
+
+ /**
+ * Unicode script "Old_Turkic".
+ */
+ OLD_TURKIC,
+
+ /**
+ * Unicode script "Kaithi".
+ */
+ KAITHI,
+
+ /**
+ * Unicode script "Unknown".
+ */
+ UNKNOWN;
+
+ private static final int[] scriptStarts = {
+ 0x0000, // 0000..0040; COMMON
+ 0x0041, // 0041..005A; LATIN
+ 0x005B, // 005B..0060; COMMON
+ 0x0061, // 0061..007A; LATIN
+ 0x007B, // 007B..00A9; COMMON
+ 0x00AA, // 00AA..00AA; LATIN
+ 0x00AB, // 00AB..00B9; COMMON
+ 0x00BA, // 00BA..00BA; LATIN
+ 0x00BB, // 00BB..00BF; COMMON
+ 0x00C0, // 00C0..00D6; LATIN
+ 0x00D7, // 00D7..00D7; COMMON
+ 0x00D8, // 00D8..00F6; LATIN
+ 0x00F7, // 00F7..00F7; COMMON
+ 0x00F8, // 00F8..02B8; LATIN
+ 0x02B9, // 02B9..02DF; COMMON
+ 0x02E0, // 02E0..02E4; LATIN
+ 0x02E5, // 02E5..02FF; COMMON
+ 0x0300, // 0300..036F; INHERITED
+ 0x0370, // 0370..0373; GREEK
+ 0x0374, // 0374..0374; COMMON
+ 0x0375, // 0375..037D; GREEK
+ 0x037E, // 037E..0383; COMMON
+ 0x0384, // 0384..0384; GREEK
+ 0x0385, // 0385..0385; COMMON
+ 0x0386, // 0386..0386; GREEK
+ 0x0387, // 0387..0387; COMMON
+ 0x0388, // 0388..03E1; GREEK
+ 0x03E2, // 03E2..03EF; COPTIC
+ 0x03F0, // 03F0..03FF; GREEK
+ 0x0400, // 0400..0484; CYRILLIC
+ 0x0485, // 0485..0486; INHERITED
+ 0x0487, // 0487..0530; CYRILLIC
+ 0x0531, // 0531..0588; ARMENIAN
+ 0x0589, // 0589..0589; COMMON
+ 0x058A, // 058A..0590; ARMENIAN
+ 0x0591, // 0591..05FF; HEBREW
+ 0x0600, // 0600..0605; COMMON
+ 0x0606, // 0606..060B; ARABIC
+ 0x060C, // 060C..060C; COMMON
+ 0x060D, // 060D..061A; ARABIC
+ 0x061B, // 061B..061D; COMMON
+ 0x061E, // 061E..061E; ARABIC
+ 0x061F, // 061F..0620; COMMON
+ 0x0621, // 0621..063F; ARABIC
+ 0x0640, // 0640..0640; COMMON
+ 0x0641, // 0641..064A; ARABIC
+ 0x064B, // 064B..0655; INHERITED
+ 0x0656, // 0656..065F; ARABIC
+ 0x0660, // 0660..0669; COMMON
+ 0x066A, // 066A..066F; ARABIC
+ 0x0670, // 0670..0670; INHERITED
+ 0x0671, // 0671..06DC; ARABIC
+ 0x06DD, // 06DD..06DD; COMMON
+ 0x06DE, // 06DE..06FF; ARABIC
+ 0x0700, // 0700..074F; SYRIAC
+ 0x0750, // 0750..077F; ARABIC
+ 0x0780, // 0780..07BF; THAANA
+ 0x07C0, // 07C0..07FF; NKO
+ 0x0800, // 0800..08FF; SAMARITAN
+ 0x0900, // 0900..0950; DEVANAGARI
+ 0x0951, // 0951..0952; INHERITED
+ 0x0953, // 0953..0963; DEVANAGARI
+ 0x0964, // 0964..0965; COMMON
+ 0x0966, // 0966..096F; DEVANAGARI
+ 0x0970, // 0970..0970; COMMON
+ 0x0971, // 0971..0980; DEVANAGARI
+ 0x0981, // 0981..0A00; BENGALI
+ 0x0A01, // 0A01..0A80; GURMUKHI
+ 0x0A81, // 0A81..0B00; GUJARATI
+ 0x0B01, // 0B01..0B81; ORIYA
+ 0x0B82, // 0B82..0C00; TAMIL
+ 0x0C01, // 0C01..0C81; TELUGU
+ 0x0C82, // 0C82..0CF0; KANNADA
+ 0x0CF1, // 0CF1..0D01; COMMON
+ 0x0D02, // 0D02..0D81; MALAYALAM
+ 0x0D82, // 0D82..0E00; SINHALA
+ 0x0E01, // 0E01..0E3E; THAI
+ 0x0E3F, // 0E3F..0E3F; COMMON
+ 0x0E40, // 0E40..0E80; THAI
+ 0x0E81, // 0E81..0EFF; LAO
+ 0x0F00, // 0F00..0FD4; TIBETAN
+ 0x0FD5, // 0FD5..0FFF; COMMON
+ 0x1000, // 1000..109F; MYANMAR
+ 0x10A0, // 10A0..10FA; GEORGIAN
+ 0x10FB, // 10FB..10FB; COMMON
+ 0x10FC, // 10FC..10FF; GEORGIAN
+ 0x1100, // 1100..11FF; HANGUL
+ 0x1200, // 1200..139F; ETHIOPIC
+ 0x13A0, // 13A0..13FF; CHEROKEE
+ 0x1400, // 1400..167F; CANADIAN_ABORIGINAL
+ 0x1680, // 1680..169F; OGHAM
+ 0x16A0, // 16A0..16EA; RUNIC
+ 0x16EB, // 16EB..16ED; COMMON
+ 0x16EE, // 16EE..16FF; RUNIC
+ 0x1700, // 1700..171F; TAGALOG
+ 0x1720, // 1720..1734; HANUNOO
+ 0x1735, // 1735..173F; COMMON
+ 0x1740, // 1740..175F; BUHID
+ 0x1760, // 1760..177F; TAGBANWA
+ 0x1780, // 1780..17FF; KHMER
+ 0x1800, // 1800..1801; MONGOLIAN
+ 0x1802, // 1802..1803; COMMON
+ 0x1804, // 1804..1804; MONGOLIAN
+ 0x1805, // 1805..1805; COMMON
+ 0x1806, // 1806..18AF; MONGOLIAN
+ 0x18B0, // 18B0..18FF; CANADIAN_ABORIGINAL
+ 0x1900, // 1900..194F; LIMBU
+ 0x1950, // 1950..197F; TAI_LE
+ 0x1980, // 1980..19DF; NEW_TAI_LUE
+ 0x19E0, // 19E0..19FF; KHMER
+ 0x1A00, // 1A00..1A1F; BUGINESE
+ 0x1A20, // 1A20..1AFF; TAI_THAM
+ 0x1B00, // 1B00..1B7F; BALINESE
+ 0x1B80, // 1B80..1BFF; SUNDANESE
+ 0x1C00, // 1C00..1C4F; LEPCHA
+ 0x1C50, // 1C50..1CCF; OL_CHIKI
+ 0x1CD0, // 1CD0..1CD2; INHERITED
+ 0x1CD3, // 1CD3..1CD3; COMMON
+ 0x1CD4, // 1CD4..1CE0; INHERITED
+ 0x1CE1, // 1CE1..1CE1; COMMON
+ 0x1CE2, // 1CE2..1CE8; INHERITED
+ 0x1CE9, // 1CE9..1CEC; COMMON
+ 0x1CED, // 1CED..1CED; INHERITED
+ 0x1CEE, // 1CEE..1CFF; COMMON
+ 0x1D00, // 1D00..1D25; LATIN
+ 0x1D26, // 1D26..1D2A; GREEK
+ 0x1D2B, // 1D2B..1D2B; CYRILLIC
+ 0x1D2C, // 1D2C..1D5C; LATIN
+ 0x1D5D, // 1D5D..1D61; GREEK
+ 0x1D62, // 1D62..1D65; LATIN
+ 0x1D66, // 1D66..1D6A; GREEK
+ 0x1D6B, // 1D6B..1D77; LATIN
+ 0x1D78, // 1D78..1D78; CYRILLIC
+ 0x1D79, // 1D79..1DBE; LATIN
+ 0x1DBF, // 1DBF..1DBF; GREEK
+ 0x1DC0, // 1DC0..1DFF; INHERITED
+ 0x1E00, // 1E00..1EFF; LATIN
+ 0x1F00, // 1F00..1FFF; GREEK
+ 0x2000, // 2000..200B; COMMON
+ 0x200C, // 200C..200D; INHERITED
+ 0x200E, // 200E..2070; COMMON
+ 0x2071, // 2071..2073; LATIN
+ 0x2074, // 2074..207E; COMMON
+ 0x207F, // 207F..207F; LATIN
+ 0x2080, // 2080..208F; COMMON
+ 0x2090, // 2090..209F; LATIN
+ 0x20A0, // 20A0..20CF; COMMON
+ 0x20D0, // 20D0..20FF; INHERITED
+ 0x2100, // 2100..2125; COMMON
+ 0x2126, // 2126..2126; GREEK
+ 0x2127, // 2127..2129; COMMON
+ 0x212A, // 212A..212B; LATIN
+ 0x212C, // 212C..2131; COMMON
+ 0x2132, // 2132..2132; LATIN
+ 0x2133, // 2133..214D; COMMON
+ 0x214E, // 214E..214E; LATIN
+ 0x214F, // 214F..215F; COMMON
+ 0x2160, // 2160..2188; LATIN
+ 0x2189, // 2189..27FF; COMMON
+ 0x2800, // 2800..28FF; BRAILLE
+ 0x2900, // 2900..2BFF; COMMON
+ 0x2C00, // 2C00..2C5F; GLAGOLITIC
+ 0x2C60, // 2C60..2C7F; LATIN
+ 0x2C80, // 2C80..2CFF; COPTIC
+ 0x2D00, // 2D00..2D2F; GEORGIAN
+ 0x2D30, // 2D30..2D7F; TIFINAGH
+ 0x2D80, // 2D80..2DDF; ETHIOPIC
+ 0x2DE0, // 2DE0..2DFF; CYRILLIC
+ 0x2E00, // 2E00..2E7F; COMMON
+ 0x2E80, // 2E80..2FEF; HAN
+ 0x2FF0, // 2FF0..3004; COMMON
+ 0x3005, // 3005..3005; HAN
+ 0x3006, // 3006..3006; COMMON
+ 0x3007, // 3007..3007; HAN
+ 0x3008, // 3008..3020; COMMON
+ 0x3021, // 3021..3029; HAN
+ 0x302A, // 302A..302F; INHERITED
+ 0x3030, // 3030..3037; COMMON
+ 0x3038, // 3038..303B; HAN
+ 0x303C, // 303C..3040; COMMON
+ 0x3041, // 3041..3098; HIRAGANA
+ 0x3099, // 3099..309A; INHERITED
+ 0x309B, // 309B..309C; COMMON
+ 0x309D, // 309D..309F; HIRAGANA
+ 0x30A0, // 30A0..30A0; COMMON
+ 0x30A1, // 30A1..30FA; KATAKANA
+ 0x30FB, // 30FB..30FC; COMMON
+ 0x30FD, // 30FD..3104; KATAKANA
+ 0x3105, // 3105..3130; BOPOMOFO
+ 0x3131, // 3131..318F; HANGUL
+ 0x3190, // 3190..319F; COMMON
+ 0x31A0, // 31A0..31BF; BOPOMOFO
+ 0x31C0, // 31C0..31EF; COMMON
+ 0x31F0, // 31F0..31FF; KATAKANA
+ 0x3200, // 3200..321F; HANGUL
+ 0x3220, // 3220..325F; COMMON
+ 0x3260, // 3260..327E; HANGUL
+ 0x327F, // 327F..32CF; COMMON
+ 0x32D0, // 32D0..3357; KATAKANA
+ 0x3358, // 3358..33FF; COMMON
+ 0x3400, // 3400..4DBF; HAN
+ 0x4DC0, // 4DC0..4DFF; COMMON
+ 0x4E00, // 4E00..9FFF; HAN
+ 0xA000, // A000..A4CF; YI
+ 0xA4D0, // A4D0..A4FF; LISU
+ 0xA500, // A500..A63F; VAI
+ 0xA640, // A640..A69F; CYRILLIC
+ 0xA6A0, // A6A0..A6FF; BAMUM
+ 0xA700, // A700..A721; COMMON
+ 0xA722, // A722..A787; LATIN
+ 0xA788, // A788..A78A; COMMON
+ 0xA78B, // A78B..A7FF; LATIN
+ 0xA800, // A800..A82F; SYLOTI_NAGRI
+ 0xA830, // A830..A83F; COMMON
+ 0xA840, // A840..A87F; PHAGS_PA
+ 0xA880, // A880..A8DF; SAURASHTRA
+ 0xA8E0, // A8E0..A8FF; DEVANAGARI
+ 0xA900, // A900..A92F; KAYAH_LI
+ 0xA930, // A930..A95F; REJANG
+ 0xA960, // A960..A97F; HANGUL
+ 0xA980, // A980..A9FF; JAVANESE
+ 0xAA00, // AA00..AA5F; CHAM
+ 0xAA60, // AA60..AA7F; MYANMAR
+ 0xAA80, // AA80..ABBF; TAI_VIET
+ 0xABC0, // ABC0..ABFF; MEETEI_MAYEK
+ 0xAC00, // AC00..D7FB; HANGUL
+ 0xD7FC, // D7FC..F8FF; UNKNOWN
+ 0xF900, // F900..FAFF; HAN
+ 0xFB00, // FB00..FB12; LATIN
+ 0xFB13, // FB13..FB1C; ARMENIAN
+ 0xFB1D, // FB1D..FB4F; HEBREW
+ 0xFB50, // FB50..FD3D; ARABIC
+ 0xFD3E, // FD3E..FD4F; COMMON
+ 0xFD50, // FD50..FDFC; ARABIC
+ 0xFDFD, // FDFD..FDFF; COMMON
+ 0xFE00, // FE00..FE0F; INHERITED
+ 0xFE10, // FE10..FE1F; COMMON
+ 0xFE20, // FE20..FE2F; INHERITED
+ 0xFE30, // FE30..FE6F; COMMON
+ 0xFE70, // FE70..FEFE; ARABIC
+ 0xFEFF, // FEFF..FF20; COMMON
+ 0xFF21, // FF21..FF3A; LATIN
+ 0xFF3B, // FF3B..FF40; COMMON
+ 0xFF41, // FF41..FF5A; LATIN
+ 0xFF5B, // FF5B..FF65; COMMON
+ 0xFF66, // FF66..FF6F; KATAKANA
+ 0xFF70, // FF70..FF70; COMMON
+ 0xFF71, // FF71..FF9D; KATAKANA
+ 0xFF9E, // FF9E..FF9F; COMMON
+ 0xFFA0, // FFA0..FFDF; HANGUL
+ 0xFFE0, // FFE0..FFFF; COMMON
+ 0x10000, // 10000..100FF; LINEAR_B
+ 0x10100, // 10100..1013F; COMMON
+ 0x10140, // 10140..1018F; GREEK
+ 0x10190, // 10190..101FC; COMMON
+ 0x101FD, // 101FD..1027F; INHERITED
+ 0x10280, // 10280..1029F; LYCIAN
+ 0x102A0, // 102A0..102FF; CARIAN
+ 0x10300, // 10300..1032F; OLD_ITALIC
+ 0x10330, // 10330..1037F; GOTHIC
+ 0x10380, // 10380..1039F; UGARITIC
+ 0x103A0, // 103A0..103FF; OLD_PERSIAN
+ 0x10400, // 10400..1044F; DESERET
+ 0x10450, // 10450..1047F; SHAVIAN
+ 0x10480, // 10480..107FF; OSMANYA
+ 0x10800, // 10800..1083F; CYPRIOT
+ 0x10840, // 10840..108FF; IMPERIAL_ARAMAIC
+ 0x10900, // 10900..1091F; PHOENICIAN
+ 0x10920, // 10920..109FF; LYDIAN
+ 0x10A00, // 10A00..10A5F; KHAROSHTHI
+ 0x10A60, // 10A60..10AFF; OLD_SOUTH_ARABIAN
+ 0x10B00, // 10B00..10B3F; AVESTAN
+ 0x10B40, // 10B40..10B5F; INSCRIPTIONAL_PARTHIAN
+ 0x10B60, // 10B60..10BFF; INSCRIPTIONAL_PAHLAVI
+ 0x10C00, // 10C00..10E5F; OLD_TURKIC
+ 0x10E60, // 10E60..1107F; ARABIC
+ 0x11080, // 11080..11FFF; KAITHI
+ 0x12000, // 12000..12FFF; CUNEIFORM
+ 0x13000, // 13000..1CFFF; EGYPTIAN_HIEROGLYPHS
+ 0x1D000, // 1D000..1D166; COMMON
+ 0x1D167, // 1D167..1D169; INHERITED
+ 0x1D16A, // 1D16A..1D17A; COMMON
+ 0x1D17B, // 1D17B..1D182; INHERITED
+ 0x1D183, // 1D183..1D184; COMMON
+ 0x1D185, // 1D185..1D18B; INHERITED
+ 0x1D18C, // 1D18C..1D1A9; COMMON
+ 0x1D1AA, // 1D1AA..1D1AD; INHERITED
+ 0x1D1AE, // 1D1AE..1D1FF; COMMON
+ 0x1D200, // 1D200..1D2FF; GREEK
+ 0x1D300, // 1D300..1F1FF; COMMON
+ 0x1F200, // 1F200..1F20F; HIRAGANA
+ 0x1F210, // 1F210..1FFFF; COMMON
+ 0x20000, // 20000..E0000; HAN
+ 0xE0001, // E0001..E00FF; COMMON
+ 0xE0100, // E0100..E01EF; INHERITED
+ 0xE01F0 // E01F0..10FFFF; UNKNOWN
+
+ };
+
+ private static final UnicodeScript[] scripts = {
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ INHERITED,
+ GREEK,
+ COMMON,
+ GREEK,
+ COMMON,
+ GREEK,
+ COMMON,
+ GREEK,
+ COMMON,
+ GREEK,
+ COPTIC,
+ GREEK,
+ CYRILLIC,
+ INHERITED,
+ CYRILLIC,
+ ARMENIAN,
+ COMMON,
+ ARMENIAN,
+ HEBREW,
+ COMMON,
+ ARABIC,
+ COMMON,
+ ARABIC,
+ COMMON,
+ ARABIC,
+ COMMON,
+ ARABIC,
+ COMMON,
+ ARABIC,
+ INHERITED,
+ ARABIC,
+ COMMON,
+ ARABIC,
+ INHERITED,
+ ARABIC,
+ COMMON,
+ ARABIC,
+ SYRIAC,
+ ARABIC,
+ THAANA,
+ NKO,
+ SAMARITAN,
+ DEVANAGARI,
+ INHERITED,
+ DEVANAGARI,
+ COMMON,
+ DEVANAGARI,
+ COMMON,
+ DEVANAGARI,
+ BENGALI,
+ GURMUKHI,
+ GUJARATI,
+ ORIYA,
+ TAMIL,
+ TELUGU,
+ KANNADA,
+ COMMON,
+ MALAYALAM,
+ SINHALA,
+ THAI,
+ COMMON,
+ THAI,
+ LAO,
+ TIBETAN,
+ COMMON,
+ MYANMAR,
+ GEORGIAN,
+ COMMON,
+ GEORGIAN,
+ HANGUL,
+ ETHIOPIC,
+ CHEROKEE,
+ CANADIAN_ABORIGINAL,
+ OGHAM,
+ RUNIC,
+ COMMON,
+ RUNIC,
+ TAGALOG,
+ HANUNOO,
+ COMMON,
+ BUHID,
+ TAGBANWA,
+ KHMER,
+ MONGOLIAN,
+ COMMON,
+ MONGOLIAN,
+ COMMON,
+ MONGOLIAN,
+ CANADIAN_ABORIGINAL,
+ LIMBU,
+ TAI_LE,
+ NEW_TAI_LUE,
+ KHMER,
+ BUGINESE,
+ TAI_THAM,
+ BALINESE,
+ SUNDANESE,
+ LEPCHA,
+ OL_CHIKI,
+ INHERITED,
+ COMMON,
+ INHERITED,
+ COMMON,
+ INHERITED,
+ COMMON,
+ INHERITED,
+ COMMON,
+ LATIN,
+ GREEK,
+ CYRILLIC,
+ LATIN,
+ GREEK,
+ LATIN,
+ GREEK,
+ LATIN,
+ CYRILLIC,
+ LATIN,
+ GREEK,
+ INHERITED,
+ LATIN,
+ GREEK,
+ COMMON,
+ INHERITED,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ INHERITED,
+ COMMON,
+ GREEK,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ BRAILLE,
+ COMMON,
+ GLAGOLITIC,
+ LATIN,
+ COPTIC,
+ GEORGIAN,
+ TIFINAGH,
+ ETHIOPIC,
+ CYRILLIC,
+ COMMON,
+ HAN,
+ COMMON,
+ HAN,
+ COMMON,
+ HAN,
+ COMMON,
+ HAN,
+ INHERITED,
+ COMMON,
+ HAN,
+ COMMON,
+ HIRAGANA,
+ INHERITED,
+ COMMON,
+ HIRAGANA,
+ COMMON,
+ KATAKANA,
+ COMMON,
+ KATAKANA,
+ BOPOMOFO,
+ HANGUL,
+ COMMON,
+ BOPOMOFO,
+ COMMON,
+ KATAKANA,
+ HANGUL,
+ COMMON,
+ HANGUL,
+ COMMON,
+ KATAKANA,
+ COMMON,
+ HAN,
+ COMMON,
+ HAN,
+ YI,
+ LISU,
+ VAI,
+ CYRILLIC,
+ BAMUM,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ SYLOTI_NAGRI,
+ COMMON,
+ PHAGS_PA,
+ SAURASHTRA,
+ DEVANAGARI,
+ KAYAH_LI,
+ REJANG,
+ HANGUL,
+ JAVANESE,
+ CHAM,
+ MYANMAR,
+ TAI_VIET,
+ MEETEI_MAYEK,
+ HANGUL,
+ UNKNOWN,
+ HAN,
+ LATIN,
+ ARMENIAN,
+ HEBREW,
+ ARABIC,
+ COMMON,
+ ARABIC,
+ COMMON,
+ INHERITED,
+ COMMON,
+ INHERITED,
+ COMMON,
+ ARABIC,
+ COMMON,
+ LATIN,
+ COMMON,
+ LATIN,
+ COMMON,
+ KATAKANA,
+ COMMON,
+ KATAKANA,
+ COMMON,
+ HANGUL,
+ COMMON,
+ LINEAR_B,
+ COMMON,
+ GREEK,
+ COMMON,
+ INHERITED,
+ LYCIAN,
+ CARIAN,
+ OLD_ITALIC,
+ GOTHIC,
+ UGARITIC,
+ OLD_PERSIAN,
+ DESERET,
+ SHAVIAN,
+ OSMANYA,
+ CYPRIOT,
+ IMPERIAL_ARAMAIC,
+ PHOENICIAN,
+ LYDIAN,
+ KHAROSHTHI,
+ OLD_SOUTH_ARABIAN,
+ AVESTAN,
+ INSCRIPTIONAL_PARTHIAN,
+ INSCRIPTIONAL_PAHLAVI,
+ OLD_TURKIC,
+ ARABIC,
+ KAITHI,
+ CUNEIFORM,
+ EGYPTIAN_HIEROGLYPHS,
+ COMMON,
+ INHERITED,
+ COMMON,
+ INHERITED,
+ COMMON,
+ INHERITED,
+ COMMON,
+ INHERITED,
+ COMMON,
+ GREEK,
+ COMMON,
+ HIRAGANA,
+ COMMON,
+ HAN,
+ COMMON,
+ INHERITED,
+ UNKNOWN
+ };
+
+ private static HashMap<String, Character.UnicodeScript> aliases;
+ static {
+ aliases = new HashMap<String, UnicodeScript>();
+ aliases.put("ARAB", ARABIC);
+ aliases.put("ARMI", IMPERIAL_ARAMAIC);
+ aliases.put("ARMN", ARMENIAN);
+ aliases.put("AVST", AVESTAN);
+ aliases.put("BALI", BALINESE);
+ aliases.put("BAMU", BAMUM);
+ aliases.put("BENG", BENGALI);
+ aliases.put("BOPO", BOPOMOFO);
+ aliases.put("BRAI", BRAILLE);
+ aliases.put("BUGI", BUGINESE);
+ aliases.put("BUHD", BUHID);
+ aliases.put("CANS", CANADIAN_ABORIGINAL);
+ aliases.put("CARI", CARIAN);
+ aliases.put("CHAM", CHAM);
+ aliases.put("CHER", CHEROKEE);
+ aliases.put("COPT", COPTIC);
+ aliases.put("CPRT", CYPRIOT);
+ aliases.put("CYRL", CYRILLIC);
+ aliases.put("DEVA", DEVANAGARI);
+ aliases.put("DSRT", DESERET);
+ aliases.put("EGYP", EGYPTIAN_HIEROGLYPHS);
+ aliases.put("ETHI", ETHIOPIC);
+ aliases.put("GEOR", GEORGIAN);
+ aliases.put("GLAG", GLAGOLITIC);
+ aliases.put("GOTH", GOTHIC);
+ aliases.put("GREK", GREEK);
+ aliases.put("GUJR", GUJARATI);
+ aliases.put("GURU", GURMUKHI);
+ aliases.put("HANG", HANGUL);
+ aliases.put("HANI", HAN);
+ aliases.put("HANO", HANUNOO);
+ aliases.put("HEBR", HEBREW);
+ aliases.put("HIRA", HIRAGANA);
+ // it appears we don't have the KATAKANA_OR_HIRAGANA
+ //aliases.put("HRKT", KATAKANA_OR_HIRAGANA);
+ aliases.put("ITAL", OLD_ITALIC);
+ aliases.put("JAVA", JAVANESE);
+ aliases.put("KALI", KAYAH_LI);
+ aliases.put("KANA", KATAKANA);
+ aliases.put("KHAR", KHAROSHTHI);
+ aliases.put("KHMR", KHMER);
+ aliases.put("KNDA", KANNADA);
+ aliases.put("KTHI", KAITHI);
+ aliases.put("LANA", TAI_THAM);
+ aliases.put("LAOO", LAO);
+ aliases.put("LATN", LATIN);
+ aliases.put("LEPC", LEPCHA);
+ aliases.put("LIMB", LIMBU);
+ aliases.put("LINB", LINEAR_B);
+ aliases.put("LISU", LISU);
+ aliases.put("LYCI", LYCIAN);
+ aliases.put("LYDI", LYDIAN);
+ aliases.put("MLYM", MALAYALAM);
+ aliases.put("MONG", MONGOLIAN);
+ aliases.put("MTEI", MEETEI_MAYEK);
+ aliases.put("MYMR", MYANMAR);
+ aliases.put("NKOO", NKO);
+ aliases.put("OGAM", OGHAM);
+ aliases.put("OLCK", OL_CHIKI);
+ aliases.put("ORKH", OLD_TURKIC);
+ aliases.put("ORYA", ORIYA);
+ aliases.put("OSMA", OSMANYA);
+ aliases.put("PHAG", PHAGS_PA);
+ aliases.put("PHLI", INSCRIPTIONAL_PAHLAVI);
+ aliases.put("PHNX", PHOENICIAN);
+ aliases.put("PRTI", INSCRIPTIONAL_PARTHIAN);
+ aliases.put("RJNG", REJANG);
+ aliases.put("RUNR", RUNIC);
+ aliases.put("SAMR", SAMARITAN);
+ aliases.put("SARB", OLD_SOUTH_ARABIAN);
+ aliases.put("SAUR", SAURASHTRA);
+ aliases.put("SHAW", SHAVIAN);
+ aliases.put("SINH", SINHALA);
+ aliases.put("SUND", SUNDANESE);
+ aliases.put("SYLO", SYLOTI_NAGRI);
+ aliases.put("SYRC", SYRIAC);
+ aliases.put("TAGB", TAGBANWA);
+ aliases.put("TALE", TAI_LE);
+ aliases.put("TALU", NEW_TAI_LUE);
+ aliases.put("TAML", TAMIL);
+ aliases.put("TAVT", TAI_VIET);
+ aliases.put("TELU", TELUGU);
+ aliases.put("TFNG", TIFINAGH);
+ aliases.put("TGLG", TAGALOG);
+ aliases.put("THAA", THAANA);
+ aliases.put("THAI", THAI);
+ aliases.put("TIBT", TIBETAN);
+ aliases.put("UGAR", UGARITIC);
+ aliases.put("VAII", VAI);
+ aliases.put("XPEO", OLD_PERSIAN);
+ aliases.put("XSUX", CUNEIFORM);
+ aliases.put("YIII", YI);
+ aliases.put("ZINH", INHERITED);
+ aliases.put("ZYYY", COMMON);
+ aliases.put("ZZZZ", UNKNOWN);
+ }
+
+ /**
+ * Returns the enum constant representing the Unicode script of which
+ * the given character (Unicode code point) is assigned to.
+ *
+ * @param codePoint the character (Unicode code point) in question.
+ * @return The <code>UnicodeScript</code> constant representing the
+ * Unicode script of which this character is assigned to.
+ *
+ * @exception IllegalArgumentException if the specified
+ * <code>codePoint</code> is an invalid Unicode code point.
+ * @see Character#isValidCodePoint(int)
+ *
+ */
+ public static UnicodeScript of(int codePoint) {
+ if (!isValidCodePoint(codePoint))
+ throw new IllegalArgumentException();
+ int type = getType(codePoint);
+ // leave SURROGATE and PRIVATE_USE for table lookup
+ if (type == UNASSIGNED)
+ return UNKNOWN;
+ int index = Arrays.binarySearch(scriptStarts, codePoint);
+ if (index < 0)
+ index = -index - 2;
+ return scripts[index];
+ }
+
+ /**
+ * Returns the UnicodeScript constant with the given Unicode script
+ * name or the script name alias. Script names and their aliases are
+ * determined by The Unicode Standard. The files Scripts&lt;version&gt;.txt
+ * and PropertyValueAliases&lt;version&gt;.txt define script names
+ * and the script name aliases for a particular version of the
+ * standard. The {@link Character} class specifies the version of
+ * the standard that it supports.
+ * <p>
+ * Character case is ignored for all of the valid script names.
+ * The en_US locale's case mapping rules are used to provide
+ * case-insensitive string comparisons for script name validation.
+ * <p>
+ *
+ * @param scriptName A <code>UnicodeScript</code> name.
+ * @return The <code>UnicodeScript</code> constant identified
+ * by <code>scriptName</code>
+ * @throws IllegalArgumentException if <code>scriptName</code> is an
+ * invalid name
+ * @throws NullPointerException if <code>scriptName</code> is null
+ */
+ public static final UnicodeScript forName(String scriptName) {
+ scriptName = scriptName.toUpperCase(Locale.ENGLISH);
+ //.replace(' ', '_'));
+ UnicodeScript sc = aliases.get(scriptName);
+ if (sc != null)
+ return sc;
+ return valueOf(scriptName);
+ }
+ }
+
+ /**
* The value of the <code>Character</code>.
*
* @serial
@@ -5042,4 +6278,51 @@ class Character extends Object implements java.io.Serializable, Comparable<Chara
public static char reverseBytes(char ch) {
return (char) (((ch & 0xFF00) >> 8) | (ch << 8));
}
+
+ /**
+ * Returns the Unicode name of the specified character
+ * <code>codePoint</code>, or null if the code point is
+ * {@link #UNASSIGNED unassigned}.
+ * <p>
+ * Note: if the specified character is not assigned a name by
+ * the <i>UnicodeData</i> file (part of the Unicode Character
+ * Database maintained by the Unicode Consortium), the returned
+ * name is the same as the result of expression
+ *
+ * <blockquote><code>
+ * Character.UnicodeBlock.of(codePoint)
+ * .toString()
+ * .replace('_', ' ')
+ * + " "
+ * + Integer.toHexString(codePoint).toUpperCase(Locale.ENGLISH);
+ *
+ * </code></blockquote>
+ *
+ * @param codePoint the character (Unicode code point)
+ *
+ * @return the Unicode name of the specified character, or null if
+ * the code point is unassigned.
+ *
+ * @exception IllegalArgumentException if the specified
+ * <code>codePoint</code> is not a valid Unicode
+ * code point.
+ *
+ * @since 1.7
+ */
+ public static String getName(int codePoint) {
+ if (!isValidCodePoint(codePoint)) {
+ throw new IllegalArgumentException();
+ }
+ String name = CharacterName.get(codePoint);
+ if (name != null)
+ return name;
+ if (getType(codePoint) == UNASSIGNED)
+ return null;
+ UnicodeBlock block = UnicodeBlock.of(codePoint);
+ if (block != null)
+ return block.toString().replace('_', ' ') + " "
+ + Integer.toHexString(codePoint).toUpperCase(Locale.ENGLISH);
+ // should never come here
+ return Integer.toHexString(codePoint).toUpperCase(Locale.ENGLISH);
+ }
}
diff --git a/src/share/classes/java/lang/CharacterName.java b/src/share/classes/java/lang/CharacterName.java
new file mode 100644
index 000000000..d09734087
--- /dev/null
+++ b/src/share/classes/java/lang/CharacterName.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package java.lang;
+
+import java.io.DataInputStream;
+import java.io.InputStream;
+import java.lang.ref.SoftReference;
+import java.util.Arrays;
+import java.util.zip.InflaterInputStream;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+class CharacterName {
+
+ private static SoftReference<byte[]> refStrPool;
+ private static int[][] lookup;
+
+ private static synchronized byte[] initNamePool() {
+ byte[] strPool = null;
+ if (refStrPool != null && (strPool = refStrPool.get()) != null)
+ return strPool;
+ DataInputStream dis = null;
+ try {
+ dis = new DataInputStream(new InflaterInputStream(
+ AccessController.doPrivileged(new PrivilegedAction<InputStream>()
+ {
+ public InputStream run() {
+ return getClass().getResourceAsStream("uniName.dat");
+ }
+ })));
+
+ lookup = new int[(Character.MAX_CODE_POINT + 1) >> 8][];
+ int total = dis.readInt();
+ int cpEnd = dis.readInt();
+ byte ba[] = new byte[cpEnd];
+ dis.readFully(ba);
+
+ int nameOff = 0;
+ int cpOff = 0;
+ int cp = 0;
+ do {
+ int len = ba[cpOff++] & 0xff;
+ if (len == 0) {
+ len = ba[cpOff++] & 0xff;
+ // always big-endian
+ cp = ((ba[cpOff++] & 0xff) << 16) |
+ ((ba[cpOff++] & 0xff) << 8) |
+ ((ba[cpOff++] & 0xff));
+ } else {
+ cp++;
+ }
+ int hi = cp >> 8;
+ if (lookup[hi] == null) {
+ lookup[hi] = new int[0x100];
+ }
+ lookup[hi][cp&0xff] = (nameOff << 8) | len;
+ nameOff += len;
+ } while (cpOff < cpEnd);
+ strPool = new byte[total - cpEnd];
+ dis.readFully(strPool);
+ refStrPool = new SoftReference<byte[]>(strPool);
+ } catch (Exception x) {
+ throw new InternalError(x.getMessage());
+ } finally {
+ try {
+ if (dis != null)
+ dis.close();
+ } catch (Exception xx) {}
+ }
+ return strPool;
+ }
+
+ public static String get(int cp) {
+ byte[] strPool = null;
+ if (refStrPool == null || (strPool = refStrPool.get()) == null)
+ strPool = initNamePool();
+ int off = 0;
+ if (lookup[cp>>8] == null ||
+ (off = lookup[cp>>8][cp&0xff]) == 0)
+ return null;
+ return new String(strPool, 0, off >>> 8, off & 0xff); // ASCII
+ }
+}
diff --git a/src/share/classes/java/net/URI.java b/src/share/classes/java/net/URI.java
index 41968832a..ed8c27b12 100644
--- a/src/share/classes/java/net/URI.java
+++ b/src/share/classes/java/net/URI.java
@@ -2491,6 +2491,8 @@ public final class URI
// Tell whether the given character is permitted by the given mask pair
private static boolean match(char c, long lowMask, long highMask) {
+ if (c == 0) // 0 doesn't have a slot in the mask. So, it never matches.
+ return false;
if (c < 64)
return ((1L << c) & lowMask) != 0;
if (c < 128)
diff --git a/src/share/classes/java/util/jar/JarVerifier.java b/src/share/classes/java/util/jar/JarVerifier.java
index bd5b489b2..33c67c15a 100644
--- a/src/share/classes/java/util/jar/JarVerifier.java
+++ b/src/share/classes/java/util/jar/JarVerifier.java
@@ -76,7 +76,7 @@ class JarVerifier {
private ByteArrayOutputStream baos;
/** The ManifestDigester object */
- private ManifestDigester manDig;
+ private volatile ManifestDigester manDig;
/** the bytes for the manDig object */
byte manifestRawBytes[] = null;
diff --git a/src/share/classes/java/util/regex/Pattern.java b/src/share/classes/java/util/regex/Pattern.java
index 50a381f41..9f326c24d 100644
--- a/src/share/classes/java/util/regex/Pattern.java
+++ b/src/share/classes/java/util/regex/Pattern.java
@@ -29,6 +29,7 @@ import java.security.AccessController;
import java.security.PrivilegedAction;
import java.text.CharacterIterator;
import java.text.Normalizer;
+import java.util.Locale;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashMap;
@@ -200,8 +201,9 @@ import java.util.Arrays;
* <td>Equivalent to java.lang.Character.isMirrored()</td></tr>
*
* <tr><th>&nbsp;</th></tr>
- * <tr align="left"><th colspan="2" id="unicode">Classes for Unicode blocks and categories</th></tr>
- *
+ * <tr align="left"><th colspan="2" id="unicode">Classes for Unicode scripts, blocks and categories</th></tr>
+ * * <tr><td valign="top" headers="construct unicode"><tt>\p{IsLatin}</tt></td>
+ * <td headers="matches">A Latin&nbsp;script character (simple <a href="#ubc">script</a>)</td></tr>
* <tr><td valign="top" headers="construct unicode"><tt>\p{InGreek}</tt></td>
* <td headers="matches">A character in the Greek&nbsp;block (simple <a href="#ubc">block</a>)</td></tr>
* <tr><td valign="top" headers="construct unicode"><tt>\p{Lu}</tt></td>
@@ -527,25 +529,40 @@ import java.util.Arrays;
* while not equal, compile into the same pattern, which matches the character
* with hexadecimal value <tt>0x2014</tt>.
*
- * <a name="ubc"> <p>Unicode blocks and categories are written with the
- * <tt>\p</tt> and <tt>\P</tt> constructs as in
- * Perl. <tt>\p{</tt><i>prop</i><tt>}</tt> matches if the input has the
- * property <i>prop</i>, while <tt>\P{</tt><i>prop</i><tt>}</tt> does not match if
- * the input has that property. Blocks are specified with the prefix
- * <tt>In</tt>, as in <tt>InMongolian</tt>. Categories may be specified with
- * the optional prefix <tt>Is</tt>: Both <tt>\p{L}</tt> and <tt>\p{IsL}</tt>
- * denote the category of Unicode letters. Blocks and categories can be used
- * both inside and outside of a character class.
- *
+ * <a name="ubc">
+ * <p>Unicode scripts, blocks and categories are written with the <tt>\p</tt> and
+ * <tt>\P</tt> constructs as in Perl. <tt>\p{</tt><i>prop</i><tt>}</tt> matches if
+ * the input has the property <i>prop</i>, while <tt>\P{</tt><i>prop</i><tt>}</tt>
+ * does not match if the input has that property.
+ * <p>
+ * Scripts are specified either with the prefix {@code Is}, as in
+ * {@code IsHiragana}, or by using the {@code script} keyword (or its short
+ * form {@code sc})as in {@code script=Hiragana} or {@code sc=Hiragana}.
+ * <p>
+ * Blocks are specified with the prefix {@code In}, as in
+ * {@code InMongolian}, or by using the keyword {@code block} (or its short
+ * form {@code blk}) as in {@code block=Mongolian} or {@code blk=Mongolian}.
+ * <p>
+ * Categories may be specified with the optional prefix {@code Is}:
+ * Both {@code \p{L}} and {@code \p{IsL}} denote the category of Unicode
+ * letters. Same as scripts and blocks, categories can also be specified
+ * by using the keyword {@code general_category} (or its short form
+ * {@code gc}) as in {@code general_category=Lu} or {@code gc=Lu}.
+ * <p>
+ * Scripts, blocks and categories can be used both inside and outside of a
+ * character class.
* <p> The supported categories are those of
* <a href="http://www.unicode.org/unicode/standard/standard.html">
* <i>The Unicode Standard</i></a> in the version specified by the
* {@link java.lang.Character Character} class. The category names are those
* defined in the Standard, both normative and informative.
+ * The script names supported by <code>Pattern</code> are the valid script names
+ * accepted and defined by
+ * {@link java.lang.Character.UnicodeScript#forName(String) UnicodeScript.forName}.
* The block names supported by <code>Pattern</code> are the valid block names
* accepted and defined by
* {@link java.lang.Character.UnicodeBlock#forName(String) UnicodeBlock.forName}.
- *
+ * <p>
* <a name="jcc"> <p>Categories that behave like the java.lang.Character
* boolean is<i>methodname</i> methods (except for the deprecated ones) are
* available through the same <tt>\p{</tt><i>prop</i><tt>}</tt> syntax where
@@ -2488,12 +2505,34 @@ loop: for(int x=0, offset=0; x<nCodePoints; x++, offset+=len) {
name = new String(temp, i, j-i-1);
}
- if (name.startsWith("In")) {
- node = unicodeBlockPropertyFor(name.substring(2));
+ int i = name.indexOf('=');
+ if (i != -1) {
+ // property construct \p{name=value}
+ String value = name.substring(i + 1);
+ name = name.substring(0, i).toLowerCase(Locale.ENGLISH);
+ if ("sc".equals(name) || "script".equals(name)) {
+ node = unicodeScriptPropertyFor(value);
+ } else if ("blk".equals(name) || "block".equals(name)) {
+ node = unicodeBlockPropertyFor(value);
+ } else if ("gc".equals(name) || "general_category".equals(name)) {
+ node = charPropertyNodeFor(value);
+ } else {
+ throw error("Unknown Unicode property {name=<" + name + ">, "
+ + "value=<" + value + ">}");
+ }
} else {
- if (name.startsWith("Is"))
+ if (name.startsWith("In")) {
+ // \p{inBlockName}
+ node = unicodeBlockPropertyFor(name.substring(2));
+ } else if (name.startsWith("Is")) {
+ // \p{isGeneralCategory} and \p{isScriptName}
name = name.substring(2);
- node = charPropertyNodeFor(name);
+ node = CharPropertyNames.charPropertyFor(name);
+ if (node == null)
+ node = unicodeScriptPropertyFor(name);
+ } else {
+ node = charPropertyNodeFor(name);
+ }
}
if (maybeComplement) {
if (node instanceof Category || node instanceof Block)
@@ -2503,6 +2542,21 @@ loop: for(int x=0, offset=0; x<nCodePoints; x++, offset+=len) {
return node;
}
+
+ /**
+ * Returns a CharProperty matching all characters belong to
+ * a UnicodeScript.
+ */
+ private CharProperty unicodeScriptPropertyFor(String name) {
+ final Character.UnicodeScript script;
+ try {
+ script = Character.UnicodeScript.forName(name);
+ } catch (IllegalArgumentException iae) {
+ throw error("Unknown character script name {" + name + "}");
+ }
+ return new Script(script);
+ }
+
/**
* Returns a CharProperty matching all characters in a UnicodeBlock.
*/
@@ -3567,6 +3621,19 @@ loop: for(int x=0, offset=0; x<nCodePoints; x++, offset+=len) {
}
/**
+ * Node class that matches a Unicode script
+ */
+ static final class Script extends CharProperty {
+ final Character.UnicodeScript script;
+ Script(Character.UnicodeScript script) {
+ this.script = script;
+ }
+ boolean isSatisfiedBy(int ch) {
+ return script == Character.UnicodeScript.of(ch);
+ }
+ }
+
+ /**
* Node class that matches a Unicode category.
*/
static final class Category extends CharProperty {
diff --git a/src/share/classes/java/util/zip/GZIPInputStream.java b/src/share/classes/java/util/zip/GZIPInputStream.java
index 1140c38b3..8d60d1996 100644
--- a/src/share/classes/java/util/zip/GZIPInputStream.java
+++ b/src/share/classes/java/util/zip/GZIPInputStream.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2010, 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
@@ -66,19 +66,24 @@ class GZIPInputStream extends InflaterInputStream {
* Creates a new input stream with the specified buffer size.
* @param in the input stream
* @param size the input buffer size
+ *
+ * @exception ZipException if a GZIP format error has occurred or the
+ * compression method used is unsupported
* @exception IOException if an I/O error has occurred
* @exception IllegalArgumentException if size is <= 0
*/
public GZIPInputStream(InputStream in, int size) throws IOException {
super(in, new Inflater(true), size);
usesDefaultInflater = true;
- readHeader();
- crc.reset();
+ readHeader(in);
}
/**
* Creates a new input stream with a default buffer size.
* @param in the input stream
+ *
+ * @exception ZipException if a GZIP format error has occurred or the
+ * compression method used is unsupported
* @exception IOException if an I/O error has occurred
*/
public GZIPInputStream(InputStream in) throws IOException {
@@ -94,26 +99,30 @@ class GZIPInputStream extends InflaterInputStream {
* @param len the maximum number of bytes read
* @return the actual number of bytes read, or -1 if the end of the
* compressed input stream is reached
+ *
* @exception NullPointerException If <code>buf</code> is <code>null</code>.
* @exception IndexOutOfBoundsException If <code>off</code> is negative,
* <code>len</code> is negative, or <code>len</code> is greater than
* <code>buf.length - off</code>
- * @exception IOException if an I/O error has occurred or the compressed
- * input data is corrupt
+ * @exception ZipException if the compressed input data is corrupt.
+ * @exception IOException if an I/O error has occurred.
+ *
*/
public int read(byte[] buf, int off, int len) throws IOException {
ensureOpen();
if (eos) {
return -1;
}
- len = super.read(buf, off, len);
- if (len == -1) {
- readTrailer();
- eos = true;
+ int n = super.read(buf, off, len);
+ if (n == -1) {
+ if (readTrailer())
+ eos = true;
+ else
+ return this.read(buf, off, len);
} else {
- crc.update(buf, off, len);
+ crc.update(buf, off, n);
}
- return len;
+ return n;
}
/**
@@ -144,48 +153,61 @@ class GZIPInputStream extends InflaterInputStream {
private final static int FCOMMENT = 16; // File comment
/*
- * Reads GZIP member header.
+ * Reads GZIP member header and returns the total byte number
+ * of this member header.
*/
- private void readHeader() throws IOException {
- CheckedInputStream in = new CheckedInputStream(this.in, crc);
+ private int readHeader(InputStream this_in) throws IOException {
+ CheckedInputStream in = new CheckedInputStream(this_in, crc);
crc.reset();
// Check header magic
if (readUShort(in) != GZIP_MAGIC) {
- throw new IOException("Not in GZIP format");
+ throw new ZipException("Not in GZIP format");
}
// Check compression method
if (readUByte(in) != 8) {
- throw new IOException("Unsupported compression method");
+ throw new ZipException("Unsupported compression method");
}
// Read flags
int flg = readUByte(in);
// Skip MTIME, XFL, and OS fields
skipBytes(in, 6);
+ int n = 2 + 2 + 6;
// Skip optional extra field
if ((flg & FEXTRA) == FEXTRA) {
- skipBytes(in, readUShort(in));
+ int m = readUShort(in);
+ skipBytes(in, m);
+ n += m + 2;
}
// Skip optional file name
if ((flg & FNAME) == FNAME) {
- while (readUByte(in) != 0) ;
+ do {
+ n++;
+ } while (readUByte(in) != 0);
}
// Skip optional file comment
if ((flg & FCOMMENT) == FCOMMENT) {
- while (readUByte(in) != 0) ;
+ do {
+ n++;
+ } while (readUByte(in) != 0);
}
// Check optional header CRC
if ((flg & FHCRC) == FHCRC) {
int v = (int)crc.getValue() & 0xffff;
if (readUShort(in) != v) {
- throw new IOException("Corrupt GZIP header");
+ throw new ZipException("Corrupt GZIP header");
}
+ n += 2;
}
+ crc.reset();
+ return n;
}
/*
- * Reads GZIP member trailer.
+ * Reads GZIP member trailer and returns true if the eos
+ * reached, false if there are more (concatenated gzip
+ * data set)
*/
- private void readTrailer() throws IOException {
+ private boolean readTrailer() throws IOException {
InputStream in = this.in;
int n = inf.getRemaining();
if (n > 0) {
@@ -196,7 +218,25 @@ class GZIPInputStream extends InflaterInputStream {
if ((readUInt(in) != crc.getValue()) ||
// rfc1952; ISIZE is the input size modulo 2^32
(readUInt(in) != (inf.getBytesWritten() & 0xffffffffL)))
- throw new IOException("Corrupt GZIP trailer");
+ throw new ZipException("Corrupt GZIP trailer");
+
+ // If there are more bytes available in "in" or
+ // the leftover in the "inf" is > 26 bytes:
+ // this.trailer(8) + next.header.min(10) + next.trailer(8)
+ // try concatenated case
+ if (this.in.available() > 0 || n > 26) {
+ int m = 8; // this.trailer
+ try {
+ m += readHeader(in); // next.header
+ } catch (IOException ze) {
+ return true; // ignore any malformed, do nothing
+ }
+ inf.reset();
+ if (n > m)
+ inf.setInput(buf, len - n + m, n - m);
+ return false;
+ }
+ return true;
}
/*
@@ -231,7 +271,6 @@ class GZIPInputStream extends InflaterInputStream {
return b;
}
-
private byte[] tmpbuf = new byte[128];
/*
diff --git a/src/share/classes/java/util/zip/GZIPOutputStream.java b/src/share/classes/java/util/zip/GZIPOutputStream.java
index 4473f78db..d5edcf122 100644
--- a/src/share/classes/java/util/zip/GZIPOutputStream.java
+++ b/src/share/classes/java/util/zip/GZIPOutputStream.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2010, 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
@@ -54,25 +54,82 @@ class GZIPOutputStream extends DeflaterOutputStream {
/**
* Creates a new output stream with the specified buffer size.
+ *
+ * <p>The new output stream instance is created as if by invoking
+ * the 3-argument constructor GZIPOutputStream(out, size, false).
+ *
* @param out the output stream
* @param size the output buffer size
* @exception IOException If an I/O error has occurred.
* @exception IllegalArgumentException if size is <= 0
+
*/
public GZIPOutputStream(OutputStream out, int size) throws IOException {
- super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true), size);
+ this(out, size, false);
+ }
+
+ /**
+ * Creates a new output stream with the specified buffer size and
+ * flush mode.
+ *
+ * @param out the output stream
+ * @param size the output buffer size
+ * @param syncFlush
+ * if {@code true} invocation of the inherited
+ * {@link DeflaterOutputStream#flush() flush()} method of
+ * this instance flushes the compressor with flush mode
+ * {@link Deflater#SYNC_FLUSH} before flushing the output
+ * stream, otherwise only flushes the output stream
+ * @exception IOException If an I/O error has occurred.
+ * @exception IllegalArgumentException if size is <= 0
+ *
+ * @since 1.7
+ */
+ public GZIPOutputStream(OutputStream out, int size, boolean syncFlush)
+ throws IOException
+ {
+ super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true),
+ size,
+ syncFlush);
usesDefaultDeflater = true;
writeHeader();
crc.reset();
}
+
/**
* Creates a new output stream with a default buffer size.
+ *
+ * <p>The new output stream instance is created as if by invoking
+ * the 2-argument constructor GZIPOutputStream(out, false).
+ *
* @param out the output stream
* @exception IOException If an I/O error has occurred.
*/
public GZIPOutputStream(OutputStream out) throws IOException {
- this(out, 512);
+ this(out, 512, false);
+ }
+
+ /**
+ * Creates a new output stream with a default buffer size and
+ * the specified flush mode.
+ *
+ * @param out the output stream
+ * @param syncFlush
+ * if {@code true} invocation of the inherited
+ * {@link DeflaterOutputStream#flush() flush()} method of
+ * this instance flushes the compressor with flush mode
+ * {@link Deflater#SYNC_FLUSH} before flushing the output
+ * stream, otherwise only flushes the output stream
+ *
+ * @exception IOException If an I/O error has occurred.
+ *
+ * @since 1.7
+ */
+ public GZIPOutputStream(OutputStream out, boolean syncFlush)
+ throws IOException
+ {
+ this(out, 512, syncFlush);
}
/**
@@ -122,22 +179,19 @@ class GZIPOutputStream extends DeflaterOutputStream {
/*
* Writes GZIP member header.
*/
-
- private final static byte[] header = {
- (byte) GZIP_MAGIC, // Magic number (short)
- (byte)(GZIP_MAGIC >> 8), // Magic number (short)
- Deflater.DEFLATED, // Compression method (CM)
- 0, // Flags (FLG)
- 0, // Modification time MTIME (int)
- 0, // Modification time MTIME (int)
- 0, // Modification time MTIME (int)
- 0, // Modification time MTIME (int)
- 0, // Extra flags (XFLG)
- 0 // Operating system (OS)
- };
-
private void writeHeader() throws IOException {
- out.write(header);
+ out.write(new byte[] {
+ (byte) GZIP_MAGIC, // Magic number (short)
+ (byte)(GZIP_MAGIC >> 8), // Magic number (short)
+ Deflater.DEFLATED, // Compression method (CM)
+ 0, // Flags (FLG)
+ 0, // Modification time MTIME (int)
+ 0, // Modification time MTIME (int)
+ 0, // Modification time MTIME (int)
+ 0, // Modification time MTIME (int)
+ 0, // Extra flags (XFLG)
+ 0 // Operating system (OS)
+ });
}
/*
diff --git a/src/share/classes/java/util/zip/ZipException.java b/src/share/classes/java/util/zip/ZipException.java
index 4c5fb99c2..4bcfe0368 100644
--- a/src/share/classes/java/util/zip/ZipException.java
+++ b/src/share/classes/java/util/zip/ZipException.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2010, 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
@@ -40,7 +40,7 @@ class ZipException extends IOException {
private static final long serialVersionUID = 8000196834066748623L;
/**
- * Constructs an <code>ZipException</code> with <code>null</code>
+ * Constructs a <code>ZipException</code> with <code>null</code>
* as its error detail message.
*/
public ZipException() {
@@ -48,7 +48,7 @@ class ZipException extends IOException {
}
/**
- * Constructs an <code>ZipException</code> with the specified detail
+ * Constructs a <code>ZipException</code> with the specified detail
* message.
*
* @param s the detail message.
diff --git a/src/share/classes/java/util/zip/package.html b/src/share/classes/java/util/zip/package.html
index 9365f15f0..e83f98fde 100644
--- a/src/share/classes/java/util/zip/package.html
+++ b/src/share/classes/java/util/zip/package.html
@@ -58,25 +58,22 @@ input streams.
PKWARE ZIP File Format Specification</a> - Language Encoding Flag (EFS) to
encode ZIP entry filename and comment fields using UTF-8.
<p>
- <li><a href="http://www.isi.edu/in-notes/rfc1950.txt">
+ <li><a href="http://www.ietf.org/rfc/rfc1950.txt">
ZLIB Compressed Data Format Specification version 3.3</a>
&nbsp;
- <a href="http://www.isi.edu/in-notes/rfc1950.ps">
- (PostScript)</a>
+ <a href="http://www.ietf.org/rfc/rfc1950.txt.pdf">(pdf)</a>
(RFC 1950)
<p>
- <li><a href="http://www.isi.edu/in-notes/rfc1951.txt">
+ <li><a href="http://www.ietf.org/rfc/rfc1951.txt">
DEFLATE Compressed Data Format Specification version 1.3</a>
&nbsp;
- <a href="http://www.isi.edu/in-notes/rfc1951.ps">
- (PostScript)</a>
+ <a href="http://www.ietf.org/rfc/rfc1951.txt.pdf">(pdf)</a>
(RFC 1951)
<p>
- <li><a href="http://www.isi.edu/in-notes/rfc1952.txt">
+ <li><a href="http://www.ietf.org/rfc/rfc1952.txt">
GZIP file format specification version 4.3</a>
&nbsp;
- <a href="http://www.isi.edu/in-notes/rfc1952.ps">
- (PostScript)</a>
+ <a href="http://www.ietf.org/rfc/rfc1952.txt.pdf">(pdf)</a>
(RFC 1952)
<p>
<li>CRC-32 checksum is described in RFC 1952 (above)
diff --git a/src/share/classes/javax/naming/event/EventDirContext.java b/src/share/classes/javax/naming/event/EventDirContext.java
index 1cfec51d6..1e555e6dd 100644
--- a/src/share/classes/javax/naming/event/EventDirContext.java
+++ b/src/share/classes/javax/naming/event/EventDirContext.java
@@ -34,7 +34,7 @@ import javax.naming.directory.SearchControls;
* of events fired when objects named in a directory context changes.
*<p>
* The methods in this interface support identification of objects by
- * <A HREF="ftp://ftp.isi.edu/in-notes/rfc2254.txt">RFC 2254</a>
+ * <A HREF="http://www.ietf.org/rfc/rfc2254.txt">RFC 2254</a>
* search filters.
*
*<P>Using the search filter, it is possible to register interest in objects
diff --git a/src/share/classes/javax/naming/ldap/Control.java b/src/share/classes/javax/naming/ldap/Control.java
index e9b102aa3..b208ab00d 100644
--- a/src/share/classes/javax/naming/ldap/Control.java
+++ b/src/share/classes/javax/naming/ldap/Control.java
@@ -27,7 +27,7 @@ package javax.naming.ldap;
/**
* This interface represents an LDAPv3 control as defined in
- * <A HREF="ftp://ftp.isi.edu/in-notes/rfc2251.txt">RFC 2251</A>.
+ * <A HREF="http://www.ietf.org/rfc/rfc2251.txt">RFC 2251</A>.
*<p>
* The LDAPv3 protocol uses controls to send and receive additional data
* to affect the behavior of predefined operations.
diff --git a/src/share/classes/javax/naming/ldap/ControlFactory.java b/src/share/classes/javax/naming/ldap/ControlFactory.java
index c327d24d0..e8ec6a276 100644
--- a/src/share/classes/javax/naming/ldap/ControlFactory.java
+++ b/src/share/classes/javax/naming/ldap/ControlFactory.java
@@ -37,7 +37,7 @@ import com.sun.naming.internal.ResourceManager;
/**
* This abstract class represents a factory for creating LDAPv3 controls.
* LDAPv3 controls are defined in
- * <A HREF="ftp://ftp.isi.edu/in-notes/rfc2251.txt">RFC 2251</A>.
+ * <A HREF="http://www.ietf.org/rfc/rfc2251.txt">RFC 2251</A>.
*<p>
* When a service provider receives a response control, it uses control
* factories to return the specific/appropriate control class implementation.
diff --git a/src/share/classes/javax/naming/ldap/ExtendedRequest.java b/src/share/classes/javax/naming/ldap/ExtendedRequest.java
index f18b10899..130205323 100644
--- a/src/share/classes/javax/naming/ldap/ExtendedRequest.java
+++ b/src/share/classes/javax/naming/ldap/ExtendedRequest.java
@@ -29,7 +29,7 @@ import javax.naming.NamingException;
/**
* This interface represents an LDAPv3 extended operation request as defined in
- * <A HREF="ftp://ftp.isi.edu/in-notes/rfc2251.txt">RFC 2251</A>.
+ * <A HREF="http://www.ietf.org/rfc/rfc2251.txt">RFC 2251</A>.
* <pre>
* ExtendedRequest ::= [APPLICATION 23] SEQUENCE {
* requestName [0] LDAPOID,
diff --git a/src/share/classes/javax/naming/ldap/ExtendedResponse.java b/src/share/classes/javax/naming/ldap/ExtendedResponse.java
index c517e953d..407fd927c 100644
--- a/src/share/classes/javax/naming/ldap/ExtendedResponse.java
+++ b/src/share/classes/javax/naming/ldap/ExtendedResponse.java
@@ -27,7 +27,7 @@ package javax.naming.ldap;
/**
* This interface represents an LDAP extended operation response as defined in
- * <A HREF="ftp://ftp.isi.edu/in-notes/rfc2251.txt">RFC 2251</A>.
+ * <A HREF="http://www.ietf.org/rfc/rfc2251.txt">RFC 2251</A>.
* <pre>
* ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
* COMPONENTS OF LDAPResult,
diff --git a/src/share/classes/javax/naming/ldap/UnsolicitedNotification.java b/src/share/classes/javax/naming/ldap/UnsolicitedNotification.java
index b6defc9f2..e06834411 100644
--- a/src/share/classes/javax/naming/ldap/UnsolicitedNotification.java
+++ b/src/share/classes/javax/naming/ldap/UnsolicitedNotification.java
@@ -29,7 +29,7 @@ import javax.naming.NamingException;
/**
* This interface represents an unsolicited notification as defined in
- * <A HREF="ftp://ftp.isi.edu/in-notes/rfc2251.txt">RFC 2251</A>.
+ * <A HREF="http://www.ietf.org/rfc/rfc2251.txt">RFC 2251</A>.
* An unsolicited notification is sent by the LDAP server to the LDAP
* client without any provocation from the client.
* Its format is that of an extended response (<tt>ExtendedResponse</tt>).
diff --git a/src/share/classes/javax/naming/ldap/UnsolicitedNotificationListener.java b/src/share/classes/javax/naming/ldap/UnsolicitedNotificationListener.java
index d2c900cbc..8ffdd4a0f 100644
--- a/src/share/classes/javax/naming/ldap/UnsolicitedNotificationListener.java
+++ b/src/share/classes/javax/naming/ldap/UnsolicitedNotificationListener.java
@@ -30,7 +30,7 @@ import javax.naming.event.NamingListener;
/**
* This interface is for handling <tt>UnsolicitedNotificationEvent</tt>.
* "Unsolicited notification" is defined in
- * <A HREF="ftp://ftp.isi.edu/in-notes/rfc2251.txt">RFC 2251</A>.
+ * <A HREF="http://www.ietf.org/rfc/rfc2251.txt">RFC 2251</A>.
* It allows the server to send unsolicited notifications to the client.
* A <tt>UnsolicitedNotificationListener</tt> must:
*<ol>
diff --git a/src/share/classes/javax/print/DocFlavor.java b/src/share/classes/javax/print/DocFlavor.java
index e4c24f1ab..b835efec7 100644
--- a/src/share/classes/javax/print/DocFlavor.java
+++ b/src/share/classes/javax/print/DocFlavor.java
@@ -83,7 +83,7 @@ import java.io.Serializable;
* doc flavor's MIME type is one of the standard media types telling how to
* interpret the sequence of characters or bytes. For a list of standard media
* types, see the Internet Assigned Numbers Authority's (IANA's) <A
- * HREF="http://www.isi.edu/in-notes/iana/assignments/media-types/">Media Types
+ * HREF="http://www.iana.org/assignments/media-types/">Media Types
* Directory</A>. Interface {@link Doc Doc} provides two utility operations,
* {@link Doc#getReaderForText() getReaderForText} and
* {@link Doc#getStreamForBytes() getStreamForBytes()}, to help a
diff --git a/src/share/classes/javax/swing/DefaultDesktopManager.java b/src/share/classes/javax/swing/DefaultDesktopManager.java
index 923bd5a36..d53152626 100644
--- a/src/share/classes/javax/swing/DefaultDesktopManager.java
+++ b/src/share/classes/javax/swing/DefaultDesktopManager.java
@@ -26,17 +26,13 @@
package javax.swing;
-import java.awt.*;
-import java.beans.PropertyVetoException;
-import java.beans.PropertyChangeEvent;
-import javax.swing.border.Border;
-import java.awt.event.ComponentListener;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-
+import com.sun.awt.AWTUtilities;
import sun.awt.AWTAccessor;
import sun.awt.SunToolkit;
+import java.awt.*;
+import java.beans.PropertyVetoException;
+
/** This is an implementation of the <code>DesktopManager</code>.
* It currently implements the basic behaviors for managing
* <code>JInternalFrame</code>s in an arbitrary parent.
@@ -318,7 +314,10 @@ public class DefaultDesktopManager implements DesktopManager, java.io.Serializab
dragMode = DEFAULT_DRAG_MODE;
if (p != null) {
String mode = (String)p.getClientProperty("JDesktopPane.dragMode");
- if (mode != null && mode.equals("outline")) {
+ Window window = SwingUtilities.getWindowAncestor(f);
+ if (window != null && !AWTUtilities.isWindowOpaque(window)) {
+ dragMode = DEFAULT_DRAG_MODE;
+ } else if (mode != null && mode.equals("outline")) {
dragMode = OUTLINE_DRAG_MODE;
} else if (mode != null && mode.equals("faster")
&& f instanceof JInternalFrame
diff --git a/src/share/classes/javax/swing/JTable.java b/src/share/classes/javax/swing/JTable.java
index 950b5de50..fd0e4eab6 100644
--- a/src/share/classes/javax/swing/JTable.java
+++ b/src/share/classes/javax/swing/JTable.java
@@ -2583,10 +2583,8 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
* @see #convertColumnIndexToView
*/
public int convertColumnIndexToModel(int viewColumnIndex) {
- if (viewColumnIndex < 0) {
- return viewColumnIndex;
- }
- return getColumnModel().getColumn(viewColumnIndex).getModelIndex();
+ return SwingUtilities2.convertColumnIndexToModel(
+ getColumnModel(), viewColumnIndex);
}
/**
@@ -2603,16 +2601,8 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
* @see #convertColumnIndexToModel
*/
public int convertColumnIndexToView(int modelColumnIndex) {
- if (modelColumnIndex < 0) {
- return modelColumnIndex;
- }
- TableColumnModel cm = getColumnModel();
- for (int column = 0; column < getColumnCount(); column++) {
- if (cm.getColumn(column).getModelIndex() == modelColumnIndex) {
- return column;
- }
- }
- return -1;
+ return SwingUtilities2.convertColumnIndexToView(
+ getColumnModel(), modelColumnIndex);
}
/**
diff --git a/src/share/classes/javax/swing/border/MatteBorder.java b/src/share/classes/javax/swing/border/MatteBorder.java
index f7719abaf..02ca200a0 100644
--- a/src/share/classes/javax/swing/border/MatteBorder.java
+++ b/src/share/classes/javax/swing/border/MatteBorder.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2010, 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
@@ -26,7 +26,6 @@ package javax.swing.border;
import java.awt.Graphics;
import java.awt.Insets;
-import java.awt.Rectangle;
import java.awt.Component;
import java.awt.Color;
@@ -133,63 +132,29 @@ public class MatteBorder extends EmptyBorder
g.fillRect(width - insets.right, 0, insets.right, height - insets.bottom);
} else if (tileIcon != null) {
-
int tileW = tileIcon.getIconWidth();
int tileH = tileIcon.getIconHeight();
- int xpos, ypos, startx, starty;
- Graphics cg;
-
- // Paint top matte edge
- cg = g.create();
- cg.setClip(0, 0, width, insets.top);
- for (ypos = 0; insets.top - ypos > 0; ypos += tileH) {
- for (xpos = 0; width - xpos > 0; xpos += tileW) {
- tileIcon.paintIcon(c, cg, xpos, ypos);
- }
- }
- cg.dispose();
-
- // Paint left matte edge
- cg = g.create();
- cg.setClip(0, insets.top, insets.left, height - insets.top);
- starty = insets.top - (insets.top%tileH);
- startx = 0;
- for (ypos = starty; height - ypos > 0; ypos += tileH) {
- for (xpos = startx; insets.left - xpos > 0; xpos += tileW) {
- tileIcon.paintIcon(c, cg, xpos, ypos);
- }
- }
- cg.dispose();
-
- // Paint bottom matte edge
- cg = g.create();
- cg.setClip(insets.left, height - insets.bottom, width - insets.left, insets.bottom);
- starty = (height - insets.bottom) - ((height - insets.bottom)%tileH);
- startx = insets.left - (insets.left%tileW);
- for (ypos = starty; height - ypos > 0; ypos += tileH) {
- for (xpos = startx; width - xpos > 0; xpos += tileW) {
- tileIcon.paintIcon(c, cg, xpos, ypos);
- }
- }
- cg.dispose();
-
- // Paint right matte edge
- cg = g.create();
- cg.setClip(width - insets.right, insets.top, insets.right, height - insets.top - insets.bottom);
- starty = insets.top - (insets.top%tileH);
- startx = width - insets.right - ((width - insets.right)%tileW);
- for (ypos = starty; height - ypos > 0; ypos += tileH) {
- for (xpos = startx; width - xpos > 0; xpos += tileW) {
- tileIcon.paintIcon(c, cg, xpos, ypos);
- }
- }
- cg.dispose();
+ paintEdge(c, g, 0, 0, width - insets.right, insets.top, tileW, tileH);
+ paintEdge(c, g, 0, insets.top, insets.left, height - insets.top, tileW, tileH);
+ paintEdge(c, g, insets.left, height - insets.bottom, width - insets.left, insets.bottom, tileW, tileH);
+ paintEdge(c, g, width - insets.right, 0, insets.right, height - insets.bottom, tileW, tileH);
}
g.translate(-x, -y);
g.setColor(oldColor);
}
+ private void paintEdge(Component c, Graphics g, int x, int y, int width, int height, int tileW, int tileH) {
+ g = g.create(x, y, width, height);
+ int sY = -(y % tileH);
+ for (x = -(x % tileW); x < width; x += tileW) {
+ for (y = sY; y < height; y += tileH) {
+ this.tileIcon.paintIcon(c, g, x, y);
+ }
+ }
+ g.dispose();
+ }
+
/**
* Reinitialize the insets parameter with this Border's current Insets.
* @param c the component for which this border insets value applies
diff --git a/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java b/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java
index 2ed72d3b2..0e9e23caf 100644
--- a/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java
+++ b/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java
@@ -3524,7 +3524,13 @@ public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants {
}
else if (name =="indexForTitle") {
calculatedBaseline = false;
- updateHtmlViews((Integer)e.getNewValue());
+ Integer index = (Integer) e.getNewValue();
+ // remove the current index
+ // to let updateHtmlViews() insert the correct one
+ if (htmlViews != null) {
+ htmlViews.removeElementAt(index);
+ }
+ updateHtmlViews(index);
} else if (name == "tabLayoutPolicy") {
BasicTabbedPaneUI.this.uninstallUI(pane);
BasicTabbedPaneUI.this.installUI(pane);
diff --git a/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java b/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java
index 8ff6e85b3..1524c03ea 100644
--- a/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java
+++ b/src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java
@@ -98,15 +98,18 @@ public class BasicTableHeaderUI extends TableHeaderUI {
private Cursor otherCursor = resizeCursor;
public void mouseClicked(MouseEvent e) {
+ if (!header.isEnabled()) {
+ return;
+ }
if (e.getClickCount() % 2 == 1 &&
- SwingUtilities.isLeftMouseButton(e)){
+ SwingUtilities.isLeftMouseButton(e)) {
JTable table = header.getTable();
RowSorter sorter;
if (table != null && (sorter = table.getRowSorter()) != null) {
int columnIndex = header.columnAtPoint(e.getPoint());
if (columnIndex != -1) {
columnIndex = table.convertColumnIndexToModel(
- columnIndex);
+ columnIndex);
sorter.toggleSortOrder(columnIndex);
}
}
@@ -140,6 +143,9 @@ public class BasicTableHeaderUI extends TableHeaderUI {
}
public void mousePressed(MouseEvent e) {
+ if (!header.isEnabled()) {
+ return;
+ }
header.setDraggedColumn(null);
header.setResizingColumn(null);
header.setDraggedDistance(0);
@@ -182,6 +188,9 @@ public class BasicTableHeaderUI extends TableHeaderUI {
}
public void mouseMoved(MouseEvent e) {
+ if (!header.isEnabled()) {
+ return;
+ }
if (canResize(getResizingColumn(e.getPoint()), header) !=
(header.getCursor() == resizeCursor)) {
swapCursor();
@@ -190,6 +199,9 @@ public class BasicTableHeaderUI extends TableHeaderUI {
}
public void mouseDragged(MouseEvent e) {
+ if (!header.isEnabled()) {
+ return;
+ }
int mouseX = e.getX();
TableColumn resizingColumn = header.getResizingColumn();
@@ -217,21 +229,23 @@ public class BasicTableHeaderUI extends TableHeaderUI {
if (0 <= newColumnIndex && newColumnIndex < cm.getColumnCount()) {
int width = cm.getColumn(newColumnIndex).getWidth();
if (Math.abs(draggedDistance) > (width / 2)) {
- JTable table = header.getTable();
mouseXOffset = mouseXOffset + direction * width;
header.setDraggedDistance(draggedDistance - direction * width);
//Cache the selected column.
- int selectedIndex = table.convertColumnIndexToModel(
- getSelectedColumnIndex());
+ int selectedIndex =
+ SwingUtilities2.convertColumnIndexToModel(
+ header.getColumnModel(),
+ getSelectedColumnIndex());
//Now do the move.
cm.moveColumn(columnIndex, newColumnIndex);
//Update the selected index.
selectColumn(
- table.convertColumnIndexToView(selectedIndex),
+ SwingUtilities2.convertColumnIndexToView(
+ header.getColumnModel(), selectedIndex),
false);
return;
@@ -244,6 +258,9 @@ public class BasicTableHeaderUI extends TableHeaderUI {
}
public void mouseReleased(MouseEvent e) {
+ if (!header.isEnabled()) {
+ return;
+ }
setDraggedDistance(0, viewIndexForColumn(header.getDraggedColumn()));
header.setResizingColumn(null);
@@ -253,10 +270,16 @@ public class BasicTableHeaderUI extends TableHeaderUI {
}
public void mouseEntered(MouseEvent e) {
+ if (!header.isEnabled()) {
+ return;
+ }
updateRolloverColumn(e);
}
public void mouseExited(MouseEvent e) {
+ if (!header.isEnabled()) {
+ return;
+ }
int oldRolloverColumn = rolloverColumn;
rolloverColumn = -1;
rolloverColumnUpdated(oldRolloverColumn, rolloverColumn);
diff --git a/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java b/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java
index 46a8f9be0..fa226f168 100644
--- a/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java
+++ b/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java
@@ -779,20 +779,16 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory {
if (c instanceof JTextComponent) {
editor = (JTextComponent) c;
+ // common case is background painted... this can
+ // easily be changed by subclasses or from outside
+ // of the component.
+ LookAndFeel.installProperty(editor, "opaque", Boolean.TRUE);
+ LookAndFeel.installProperty(editor, "autoscrolls", Boolean.TRUE);
+
// install defaults
installDefaults();
installDefaults2();
- // This is a workaround as these should not override what synth has
- // set them to
- if (! (this instanceof SynthUI)) {
- // common case is background painted... this can
- // easily be changed by subclasses or from outside
- // of the component.
- LookAndFeel.installProperty(editor, "opaque", Boolean.TRUE);
- LookAndFeel.installProperty(editor, "autoscrolls", Boolean.TRUE);
- }
-
// attach to the model and editor
editor.addPropertyChangeListener(updateHandler);
Document doc = editor.getDocument();
diff --git a/src/share/classes/javax/swing/plaf/basic/BasicViewportUI.java b/src/share/classes/javax/swing/plaf/basic/BasicViewportUI.java
index 30cd816df..7c56e24f2 100644
--- a/src/share/classes/javax/swing/plaf/basic/BasicViewportUI.java
+++ b/src/share/classes/javax/swing/plaf/basic/BasicViewportUI.java
@@ -56,8 +56,8 @@ public class BasicViewportUI extends ViewportUI {
}
public void uninstallUI(JComponent c) {
+ uninstallDefaults(c);
super.uninstallUI(c);
-
}
protected void installDefaults(JComponent c) {
diff --git a/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java b/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java
index 292773a52..86321ac34 100644
--- a/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java
+++ b/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java
@@ -361,12 +361,14 @@ public class SynthTableUI extends BasicTableUI
cMax = table.getColumnCount()-1;
}
- // Paint the grid.
- paintGrid(context, g, rMin, rMax, cMin, cMax);
-
// Paint the cells.
paintCells(context, g, rMin, rMax, cMin, cMax);
+ // Paint the grid.
+ // it is important to paint the grid after the cells, otherwise the grid will be overpainted
+ // because in Synth cell renderers are likely to be opaque
+ paintGrid(context, g, rMin, rMax, cMin, cMax);
+
paintDropLines(context, g);
}
diff --git a/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java b/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java
index 90fd41e61..74d3d1d53 100644
--- a/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java
+++ b/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java
@@ -72,7 +72,28 @@ public class SynthTextPaneUI extends SynthEditorPaneUI {
}
/**
- * @inheritDoc
+ * Installs the UI for a component. This does the following
+ * things.
+ * <ol>
+ * <li>
+ * Sets opaqueness of the associated component according to its style,
+ * if the opaque property has not already been set by the client program.
+ * <li>
+ * Installs the default caret and highlighter into the
+ * associated component. These properties are only set if their
+ * current value is either {@code null} or an instance of
+ * {@link UIResource}.
+ * <li>
+ * Attaches to the editor and model. If there is no
+ * model, a default one is created.
+ * <li>
+ * Creates the view factory and the view hierarchy used
+ * to represent the model.
+ * </ol>
+ *
+ * @param c the editor component
+ * @see BasicTextUI#installUI
+ * @see ComponentUI#installUI
*/
@Override
public void installUI(JComponent c) {
diff --git a/src/share/classes/javax/swing/text/WrappedPlainView.java b/src/share/classes/javax/swing/text/WrappedPlainView.java
index e192c0776..7d01cd904 100644
--- a/src/share/classes/javax/swing/text/WrappedPlainView.java
+++ b/src/share/classes/javax/swing/text/WrappedPlainView.java
@@ -24,8 +24,6 @@
*/
package javax.swing.text;
-import java.util.Vector;
-import java.util.Properties;
import java.awt.*;
import java.lang.ref.SoftReference;
import javax.swing.event.*;
@@ -236,9 +234,6 @@ public class WrappedPlainView extends BoxView implements TabExpander {
Segment segment = SegmentCache.getSharedSegment();
loadText(segment, p0, p1);
int currentWidth = getWidth();
- if (currentWidth == Integer.MAX_VALUE) {
- currentWidth = (int) getDefaultSpan(View.X_AXIS);
- }
if (wordWrap) {
p = p0 + Utilities.getBreakLocation(segment, metrics,
tabBase, tabBase + currentWidth,
@@ -324,53 +319,6 @@ public class WrappedPlainView extends BoxView implements TabExpander {
tabSize = getTabSize() * metrics.charWidth('m');
}
- /**
- * Return reasonable default values for the view dimensions. The standard
- * text terminal size 80x24 is pretty suitable for the wrapped plain view.
- *
- * The size should not be larger than the component housing the view's
- * container.
- */
- private float getDefaultSpan(int axis) {
- Container host = getContainer();
- Component parent = null;
-
- if (host != null) {
- parent = host.getParent();
- }
-
- switch (axis) {
- case View.X_AXIS:
- int defaultWidth = 80 * metrics.getWidths()['M'];
- int parentWidth = 0;
-
- if (parent != null) {
- parentWidth = parent.getWidth();
- }
-
- if (defaultWidth > parentWidth) {
- return parentWidth;
- }
- return defaultWidth;
-
- case View.Y_AXIS:
- int defaultHeight = 24 * metrics.getHeight();
- int parentHeight = 0;
-
- if (parent != null) {
- parentHeight = parent.getHeight();
- }
-
- if (defaultHeight > parentHeight) {
- return parentHeight;
- }
- return defaultHeight;
-
- default:
- throw new IllegalArgumentException("Invalid axis: " + axis);
- }
- }
-
// --- TabExpander methods ------------------------------------------
/**
@@ -605,18 +553,14 @@ public class WrappedPlainView extends BoxView implements TabExpander {
if (width == Integer.MAX_VALUE) {
// We have been initially set to MAX_VALUE, but we don't
// want this as our preferred.
- width = getDefaultSpan(axis);
+ return 100f;
}
return width;
case View.Y_AXIS:
- if (getDocument().getLength() > 0) {
- if ((lineCount < 0) || widthChanging) {
- breakLines(getStartOffset());
- }
- return lineCount * metrics.getHeight();
- } else {
- return getDefaultSpan(axis);
+ if (lineCount < 0 || widthChanging) {
+ breakLines(getStartOffset());
}
+ return lineCount * metrics.getHeight();
default:
throw new IllegalArgumentException("Invalid axis: " + axis);
}
diff --git a/src/share/classes/javax/swing/text/html/parser/html32.bdtd b/src/share/classes/javax/swing/text/html/parser/html32.bdtd
deleted file mode 100644
index a48d51ce8..000000000
--- a/src/share/classes/javax/swing/text/html/parser/html32.bdtd
+++ /dev/null
Binary files differ
diff --git a/src/share/classes/sun/font/GlyphDisposedListener.java b/src/share/classes/sun/font/GlyphDisposedListener.java
new file mode 100644
index 000000000..41a38380c
--- /dev/null
+++ b/src/share/classes/sun/font/GlyphDisposedListener.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.font;
+
+import java.util.*;
+
+public interface GlyphDisposedListener {
+ public void glyphDisposed(ArrayList<Long> glyphs);
+}
diff --git a/src/share/classes/sun/font/StrikeCache.java b/src/share/classes/sun/font/StrikeCache.java
index d40ffac82..6a83347d4 100644
--- a/src/share/classes/sun/font/StrikeCache.java
+++ b/src/share/classes/sun/font/StrikeCache.java
@@ -31,6 +31,7 @@ import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
+import java.util.*;
import sun.java2d.Disposer;
import sun.java2d.pipe.BufferedContext;
@@ -66,6 +67,9 @@ public final class StrikeCache {
static ReferenceQueue refQueue = Disposer.getQueue();
+ static ArrayList<GlyphDisposedListener> disposeListeners = new ArrayList<GlyphDisposedListener>(1);
+
+
/* Reference objects may have their referents cleared when GC chooses.
* During application client start-up there is typically at least one
* GC which causes the hotspot VM to clear soft (not just weak) references
@@ -108,6 +112,8 @@ public final class StrikeCache {
static int topLeftXOffset;
static int topLeftYOffset;
static int pixelDataOffset;
+ static int cacheCellOffset;
+ static int managedOffset;
static long invisibleGlyphPtr;
/* Native method used to return information used for unsafe
@@ -129,7 +135,7 @@ public final class StrikeCache {
static {
- long[] nativeInfo = new long[11];
+ long[] nativeInfo = new long[13];
getGlyphCacheDescription(nativeInfo);
//Can also get address size from Unsafe class :-
//nativeAddressSize = unsafe.addressSize();
@@ -144,6 +150,9 @@ public final class StrikeCache {
topLeftYOffset = (int)nativeInfo[8];
pixelDataOffset = (int)nativeInfo[9];
invisibleGlyphPtr = nativeInfo[10];
+ cacheCellOffset = (int) nativeInfo[11];
+ managedOffset = (int) nativeInfo[12];
+
if (nativeAddressSize < 4) {
throw new InternalError("Unexpected address size for font data: " +
nativeAddressSize);
@@ -195,10 +204,10 @@ public final class StrikeCache {
private static final void doDispose(FontStrikeDisposer disposer) {
if (disposer.intGlyphImages != null) {
- freeIntMemory(disposer.intGlyphImages,
+ freeCachedIntMemory(disposer.intGlyphImages,
disposer.pScalerContext);
} else if (disposer.longGlyphImages != null) {
- freeLongMemory(disposer.longGlyphImages,
+ freeCachedLongMemory(disposer.longGlyphImages,
disposer.pScalerContext);
} else if (disposer.segIntGlyphImages != null) {
/* NB Now making multiple JNI calls in this case.
@@ -207,7 +216,7 @@ public final class StrikeCache {
*/
for (int i=0; i<disposer.segIntGlyphImages.length; i++) {
if (disposer.segIntGlyphImages[i] != null) {
- freeIntMemory(disposer.segIntGlyphImages[i],
+ freeCachedIntMemory(disposer.segIntGlyphImages[i],
disposer.pScalerContext);
/* native will only free the scaler context once */
disposer.pScalerContext = 0L;
@@ -218,19 +227,19 @@ public final class StrikeCache {
* for a strike that never was asked to rasterise a glyph.
*/
if (disposer.pScalerContext != 0L) {
- freeIntMemory(new int[0], disposer.pScalerContext);
+ freeCachedIntMemory(new int[0], disposer.pScalerContext);
}
} else if (disposer.segLongGlyphImages != null) {
for (int i=0; i<disposer.segLongGlyphImages.length; i++) {
if (disposer.segLongGlyphImages[i] != null) {
- freeLongMemory(disposer.segLongGlyphImages[i],
+ freeCachedLongMemory(disposer.segLongGlyphImages[i],
disposer.pScalerContext);
disposer.pScalerContext = 0L;
disposer.segLongGlyphImages[i] = null;
}
}
if (disposer.pScalerContext != 0L) {
- freeLongMemory(new long[0], disposer.pScalerContext);
+ freeCachedLongMemory(new long[0], disposer.pScalerContext);
}
} else if (disposer.pScalerContext != 0L) {
/* Rarely a strike may have been created that never cached
@@ -238,9 +247,9 @@ public final class StrikeCache {
* context.
*/
if (longAddresses()) {
- freeLongMemory(new long[0], disposer.pScalerContext);
+ freeCachedLongMemory(new long[0], disposer.pScalerContext);
} else {
- freeIntMemory(new int[0], disposer.pScalerContext);
+ freeCachedIntMemory(new int[0], disposer.pScalerContext);
}
}
}
@@ -304,6 +313,68 @@ public final class StrikeCache {
private static native void freeIntMemory(int[] glyphPtrs, long pContext);
private static native void freeLongMemory(long[] glyphPtrs, long pContext);
+ private static void freeCachedIntMemory(int[] glyphPtrs, long pContext) {
+ synchronized(disposeListeners) {
+ if (disposeListeners.size() > 0) {
+ ArrayList<Long> gids = null;
+
+ for (int i = 0; i < glyphPtrs.length; i++) {
+ if (glyphPtrs[i] != 0 && unsafe.getByte(glyphPtrs[i] + managedOffset) == 0
+ && unsafe.getInt(glyphPtrs[i] + cacheCellOffset) != 0) {
+
+ if (gids == null) {
+ gids = new ArrayList<Long>();
+ }
+ gids.add((long) glyphPtrs[i]);
+ }
+ }
+
+ if (gids != null) {
+ notifyDisposeListeners(gids);
+ }
+ }
+ }
+
+ freeIntMemory(glyphPtrs, pContext);
+ }
+
+ private static void freeCachedLongMemory(long[] glyphPtrs, long pContext) {
+ synchronized(disposeListeners) {
+ if (disposeListeners.size() > 0) {
+ ArrayList<Long> gids = null;
+
+ for (int i=0; i < glyphPtrs.length; i++) {
+ if (glyphPtrs[i] != 0
+ && unsafe.getByte(glyphPtrs[i] + managedOffset) == 0
+ && unsafe.getInt(glyphPtrs[i] + cacheCellOffset) != 0) {
+
+ if (gids == null) {
+ gids = new ArrayList<Long>();
+ }
+ gids.add((long) glyphPtrs[i]);
+ }
+ }
+
+ if (gids != null) {
+ notifyDisposeListeners(gids);
+ }
+ }
+ }
+
+ freeLongMemory(glyphPtrs, pContext);
+ }
+
+ public static void addGlyphDisposedListener(GlyphDisposedListener listener) {
+ synchronized(disposeListeners) {
+ disposeListeners.add(listener);
+ }
+ }
+
+ private static void notifyDisposeListeners(ArrayList<Long> glyphs) {
+ for (GlyphDisposedListener listener : disposeListeners) {
+ listener.glyphDisposed(glyphs);
+ }
+ }
public static Reference getStrikeRef(FontStrike strike) {
return getStrikeRef(strike, cacheRefTypeWeak);
diff --git a/src/share/classes/sun/font/SunFontManager.java b/src/share/classes/sun/font/SunFontManager.java
index 54a94bb29..2932a296c 100644
--- a/src/share/classes/sun/font/SunFontManager.java
+++ b/src/share/classes/sun/font/SunFontManager.java
@@ -73,7 +73,9 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
return(name.startsWith(".ttf", offset) ||
name.startsWith(".TTF", offset) ||
name.startsWith(".ttc", offset) ||
- name.startsWith(".TTC", offset));
+ name.startsWith(".TTC", offset) ||
+ name.startsWith(".otf", offset) ||
+ name.startsWith(".OTF", offset));
}
}
}
@@ -108,7 +110,9 @@ public abstract class SunFontManager implements FontSupport, FontManagerForSGE {
name.startsWith(".ttf", offset) ||
name.startsWith(".TTF", offset) ||
name.startsWith(".ttc", offset) ||
- name.startsWith(".TTC", offset);
+ name.startsWith(".TTC", offset) ||
+ name.startsWith(".otf", offset) ||
+ name.startsWith(".OTF", offset);
if (isTT) {
return true;
} else if (noType1Font) {
diff --git a/src/share/classes/sun/java2d/pipe/BufferedPaints.java b/src/share/classes/sun/java2d/pipe/BufferedPaints.java
index 56dbeba37..7f5fc1d04 100644
--- a/src/share/classes/sun/java2d/pipe/BufferedPaints.java
+++ b/src/share/classes/sun/java2d/pipe/BufferedPaints.java
@@ -307,7 +307,7 @@ public class BufferedPaints {
* linear RGB space. Copied directly from the
* MultipleGradientPaintContext class.
*/
- private static int convertSRGBtoLinearRGB(int color) {
+ public static int convertSRGBtoLinearRGB(int color) {
float input, output;
input = color / 255.0f;
diff --git a/src/share/classes/sun/java2d/pipe/RenderBuffer.java b/src/share/classes/sun/java2d/pipe/RenderBuffer.java
index 77df175ab..6d207ee30 100644
--- a/src/share/classes/sun/java2d/pipe/RenderBuffer.java
+++ b/src/share/classes/sun/java2d/pipe/RenderBuffer.java
@@ -117,6 +117,11 @@ public class RenderBuffer {
curAddress = baseAddress;
}
+ public final RenderBuffer skip(long numBytes) {
+ curAddress += numBytes;
+ return this;
+ }
+
/**
* putByte() methods...
*/
diff --git a/src/share/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine b/src/share/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine
index 607ff5905..66b2ae9c6 100644
--- a/src/share/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine
+++ b/src/share/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine
@@ -1,2 +1,5 @@
+# Jules Rendering Engine module
+sun.java2d.jules.JulesRenderingEngine
+
# Pisces Rendering Engine module
-sun.java2d.pisces.PiscesRenderingEngine
+sun.java2d.pisces.PiscesRenderingEngine \ No newline at end of file
diff --git a/src/share/classes/sun/jvmstat/monitor/AbstractMonitor.java b/src/share/classes/sun/jvmstat/monitor/AbstractMonitor.java
index 57a2c1e32..b8d50ddc5 100644
--- a/src/share/classes/sun/jvmstat/monitor/AbstractMonitor.java
+++ b/src/share/classes/sun/jvmstat/monitor/AbstractMonitor.java
@@ -25,9 +25,6 @@
package sun.jvmstat.monitor;
-import sun.management.counter.Units;
-import sun.management.counter.Variability;
-
/**
* The base class for Instrumentation Monitoring Objects. This base class
* provides implementations of the {@link Monitor} methods that are common
diff --git a/src/share/classes/sun/jvmstat/monitor/Monitor.java b/src/share/classes/sun/jvmstat/monitor/Monitor.java
index c83a751e2..8560990fd 100644
--- a/src/share/classes/sun/jvmstat/monitor/Monitor.java
+++ b/src/share/classes/sun/jvmstat/monitor/Monitor.java
@@ -25,9 +25,6 @@
package sun.jvmstat.monitor;
-import sun.management.counter.Units;
-import sun.management.counter.Variability;
-
/**
* Interface provided by Instrumentation Monitoring Objects.
*
diff --git a/src/share/classes/sun/jvmstat/monitor/Units.java b/src/share/classes/sun/jvmstat/monitor/Units.java
new file mode 100644
index 000000000..5e632196d
--- /dev/null
+++ b/src/share/classes/sun/jvmstat/monitor/Units.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2003-2004 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.jvmstat.monitor;
+
+/**
+ * Provides a typesafe enumeration for describing units of measurement
+ * attribute for instrumentation objects.
+ *
+ * @author Brian Doherty
+ */
+public class Units implements java.io.Serializable {
+
+ /* The enumeration values for this typesafe enumeration must be
+ * kept in synchronization with the Units enum in the perfData.hpp file
+ * in the HotSpot source base.
+ */
+
+ private static final int NUNITS=8;
+
+ private static Units[] map = new Units[NUNITS];
+
+ private final String name;
+ private final int value;
+
+ /**
+ * An Invalid Units value.
+ */
+ public static final Units INVALID = new Units("Invalid", 0);
+
+ /**
+ * Units attribute representing unit-less quantities.
+ */
+ public static final Units NONE = new Units("None", 1);
+
+ /**
+ * Units attribute representing Bytes.
+ */
+ public static final Units BYTES = new Units("Bytes", 2);
+
+ /**
+ * Units attribute representing Ticks.
+ */
+ public static final Units TICKS = new Units("Ticks", 3);
+
+ /**
+ * Units attribute representing a count of events.
+ */
+ public static final Units EVENTS = new Units("Events", 4);
+
+ /**
+ * Units attribute representing String data. Although not really
+ * a unit of measure, this Units value serves to distinguish String
+ * instrumentation objects from instrumentation objects of other types.
+ */
+ public static final Units STRING = new Units("String", 5);
+
+ /**
+ * Units attribute representing Hertz (frequency).
+ */
+ public static final Units HERTZ = new Units("Hertz", 6);
+
+ /**
+ * Returns a string describing this Unit of measurement attribute
+ *
+ * @return String - a descriptive string for this enum.
+ */
+ public String toString() {
+ return name;
+ }
+
+ /**
+ * Returns the integer representation of this Units attribute
+ *
+ * @return int - an integer representation of this Units attribute.
+ */
+ public int intValue() {
+ return value;
+ }
+
+ /**
+ * Maps an integer value to its corresponding Units attribute.
+ * If the integer value does not have a corresponding Units enum
+ * value, then {@link Units#INVALID} is returned.
+ *
+ * @param value an integer representation of counter Units
+ * @return Units - the Units object for the given <code>value</code>
+ * or {@link Units#INVALID} if out of range.
+ */
+ public static Units toUnits(int value) {
+
+ if (value < 0 || value >= map.length || map[value] == null) {
+ return INVALID;
+ }
+
+ return map[value];
+ }
+
+ private Units(String name, int value) {
+ this.name = name;
+ this.value = value;
+ map[value] = this;
+ }
+
+ private static final long serialVersionUID = 6992337162326171013L;
+}
diff --git a/src/share/classes/sun/jvmstat/monitor/Variability.java b/src/share/classes/sun/jvmstat/monitor/Variability.java
new file mode 100644
index 000000000..1323226d4
--- /dev/null
+++ b/src/share/classes/sun/jvmstat/monitor/Variability.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2003-2004 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.jvmstat.monitor;
+
+/**
+ * Provides a typesafe enumeration for the Variability attribute for
+ * instrumentation objects.
+ *
+ * @author Brian Doherty
+ */
+public class Variability implements java.io.Serializable {
+
+ /* The enumeration values for this typesafe enumeration must be
+ * kept in synchronization with the Variability enum in the perfData.hpp file
+ * in the HotSpot source base.
+ */
+
+ private static final int NATTRIBUTES = 4;
+ private static Variability[] map = new Variability[NATTRIBUTES];
+
+ private String name;
+ private int value;
+
+ /**
+ * An invalid Variablity value.
+ */
+ public static final Variability INVALID = new Variability("Invalid",0);
+
+ /**
+ * Variability attribute representing Constant counters.
+ */
+ public static final Variability CONSTANT = new Variability("Constant",1);
+
+ /**
+ * Variability attribute representing a Monotonically changing counters.
+ */
+ public static final Variability MONOTONIC = new Variability("Monotonic",2);
+
+ /**
+ * Variability attribute representing Variable counters.
+ */
+ public static final Variability VARIABLE = new Variability("Variable",3);
+
+ /**
+ * Returns a string describing this Variability attribute.
+ *
+ * @return String - a descriptive string for this enum.
+ */
+ public String toString() {
+ return name;
+ }
+
+ /**
+ * Returns the integer representation of this Variability attribute.
+ *
+ * @return int - an integer representation of this Variability attribute.
+ */
+ public int intValue() {
+ return value;
+ }
+
+ /**
+ * Maps an integer value its corresponding Variability attribute.
+ * If the integer value does not have a corresponding Variability enum
+ * value, the {@link Variability#INVALID} is returned
+ *
+ * @param value an integer representation of a Variability attribute
+ * @return Variability - The Variability object for the given
+ * <code>value</code> or {@link Variability#INVALID}
+ * if out of range.
+ */
+ public static Variability toVariability(int value) {
+
+ if (value < 0 || value >= map.length || map[value] == null) {
+ return INVALID;
+ }
+
+ return map[value];
+ }
+
+ private Variability(String name, int value) {
+ this.name = name;
+ this.value = value;
+ map[value]=this;
+ }
+
+ private static final long serialVersionUID = 6992337162326171013L;
+}
diff --git a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfByteArrayMonitor.java b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfByteArrayMonitor.java
index f052b98a9..b5000511a 100644
--- a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfByteArrayMonitor.java
+++ b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfByteArrayMonitor.java
@@ -26,8 +26,6 @@
package sun.jvmstat.perfdata.monitor;
import sun.jvmstat.monitor.*;
-import sun.management.counter.Units;
-import sun.management.counter.Variability;
import java.nio.ByteBuffer;
/**
diff --git a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfIntegerMonitor.java b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfIntegerMonitor.java
index 5a27f3946..d1f486c73 100644
--- a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfIntegerMonitor.java
+++ b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfIntegerMonitor.java
@@ -26,8 +26,6 @@
package sun.jvmstat.perfdata.monitor;
import sun.jvmstat.monitor.*;
-import sun.management.counter.Units;
-import sun.management.counter.Variability;
import java.nio.IntBuffer;
/**
diff --git a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfLongMonitor.java b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfLongMonitor.java
index 669977c66..3dcf4e59c 100644
--- a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfLongMonitor.java
+++ b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfLongMonitor.java
@@ -26,8 +26,6 @@
package sun.jvmstat.perfdata.monitor;
import sun.jvmstat.monitor.*;
-import sun.management.counter.Units;
-import sun.management.counter.Variability;
import java.nio.LongBuffer;
/**
diff --git a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringConstantMonitor.java b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringConstantMonitor.java
index fb4d759c1..672110138 100644
--- a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringConstantMonitor.java
+++ b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringConstantMonitor.java
@@ -26,7 +26,6 @@
package sun.jvmstat.perfdata.monitor;
import sun.jvmstat.monitor.*;
-import sun.management.counter.Variability;
import java.nio.ByteBuffer;
/**
diff --git a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringMonitor.java b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringMonitor.java
index add428237..f689db82e 100644
--- a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringMonitor.java
+++ b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringMonitor.java
@@ -26,8 +26,6 @@
package sun.jvmstat.perfdata.monitor;
import sun.jvmstat.monitor.*;
-import sun.management.counter.Units;
-import sun.management.counter.Variability;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
diff --git a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringVariableMonitor.java b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringVariableMonitor.java
index ffcf1a148..156eeb8c8 100644
--- a/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringVariableMonitor.java
+++ b/src/share/classes/sun/jvmstat/perfdata/monitor/PerfStringVariableMonitor.java
@@ -26,7 +26,6 @@
package sun.jvmstat.perfdata.monitor;
import sun.jvmstat.monitor.*;
-import sun.management.counter.Variability;
import java.nio.ByteBuffer;
/**
diff --git a/src/share/classes/sun/jvmstat/perfdata/monitor/v1_0/PerfDataBuffer.java b/src/share/classes/sun/jvmstat/perfdata/monitor/v1_0/PerfDataBuffer.java
index 7d10a1693..d13a8476c 100644
--- a/src/share/classes/sun/jvmstat/perfdata/monitor/v1_0/PerfDataBuffer.java
+++ b/src/share/classes/sun/jvmstat/perfdata/monitor/v1_0/PerfDataBuffer.java
@@ -25,8 +25,6 @@
package sun.jvmstat.perfdata.monitor.v1_0;
-import sun.management.counter.Units;
-import sun.management.counter.Variability;
import sun.jvmstat.monitor.*;
import sun.jvmstat.perfdata.monitor.*;
import java.util.*;
diff --git a/src/share/classes/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBuffer.java b/src/share/classes/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBuffer.java
index 102208615..7675509dd 100644
--- a/src/share/classes/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBuffer.java
+++ b/src/share/classes/sun/jvmstat/perfdata/monitor/v2_0/PerfDataBuffer.java
@@ -27,8 +27,6 @@ package sun.jvmstat.perfdata.monitor.v2_0;
import sun.jvmstat.monitor.*;
import sun.jvmstat.perfdata.monitor.*;
-import sun.management.counter.Units;
-import sun.management.counter.Variability;
import java.util.*;
import java.util.regex.*;
import java.nio.*;
diff --git a/src/share/classes/sun/nio/ch/CompletedFuture.java b/src/share/classes/sun/nio/ch/CompletedFuture.java
index 6f8b2a5ef..85ffdd25c 100644
--- a/src/share/classes/sun/nio/ch/CompletedFuture.java
+++ b/src/share/classes/sun/nio/ch/CompletedFuture.java
@@ -44,20 +44,17 @@ final class CompletedFuture<V> implements Future<V> {
this.exc = exc;
}
- @SuppressWarnings("unchecked")
static <V> CompletedFuture<V> withResult(V result) {
return new CompletedFuture<V>(result, null);
}
- @SuppressWarnings("unchecked")
static <V> CompletedFuture<V> withFailure(Throwable exc) {
// exception must be IOException or SecurityException
if (!(exc instanceof IOException) && !(exc instanceof SecurityException))
exc = new IOException(exc);
- return new CompletedFuture(null, exc);
+ return new CompletedFuture<V>(null, exc);
}
- @SuppressWarnings("unchecked")
static <V> CompletedFuture<V> withResult(V result, Throwable exc) {
if (exc == null) {
return withResult(result);
diff --git a/src/share/classes/sun/rmi/rmic/BatchEnvironment.java b/src/share/classes/sun/rmi/rmic/BatchEnvironment.java
index bfe33bc14..7f37662bb 100644
--- a/src/share/classes/sun/rmi/rmic/BatchEnvironment.java
+++ b/src/share/classes/sun/rmi/rmic/BatchEnvironment.java
@@ -429,7 +429,7 @@ public class BatchEnvironment extends sun.tools.javac.BatchEnvironment {
st.hasMoreTokens();) {
String elt = st.nextToken();
if (jarParent != null)
- elt = new File(jarParent, elt).toString();
+ elt = new File(jarParent, elt).getCanonicalPath();
addFile(elt, warn);
}
} finally {
diff --git a/src/share/classes/sun/security/krb5/KrbAsReq.java b/src/share/classes/sun/security/krb5/KrbAsReq.java
index 2ef8a1a9a..4073ddf26 100644
--- a/src/share/classes/sun/security/krb5/KrbAsReq.java
+++ b/src/share/classes/sun/security/krb5/KrbAsReq.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2010, 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
@@ -344,16 +344,13 @@ public class KrbAsReq extends KrbKdcReq {
princName = cname;
EncryptionKey key = null;
- int[] tktETypes = null;
+ int[] tktETypes = EType.getDefaults("default_tkt_enctypes");
if (pa_exists && pa_etype != EncryptedData.ETYPE_NULL) {
if (DEBUG) {
System.out.println("Pre-Authenticaton: find key for etype = " + pa_etype);
}
key = EncryptionKey.findKey(pa_etype, keys);
- tktETypes = new int[1];
- tktETypes[0] = pa_etype;
} else {
- tktETypes = EType.getDefaults("default_tkt_enctypes", keys);
key = EncryptionKey.findKey(tktETypes[0], keys);
}
diff --git a/src/share/classes/sun/security/krb5/internal/KerberosTime.java b/src/share/classes/sun/security/krb5/internal/KerberosTime.java
index 4432a2bfa..1e0cbeccb 100644
--- a/src/share/classes/sun/security/krb5/internal/KerberosTime.java
+++ b/src/share/classes/sun/security/krb5/internal/KerberosTime.java
@@ -57,11 +57,20 @@ import java.io.IOException;
* specification available at
* <a href="http://www.ietf.org/rfc/rfc4120.txt">
* http://www.ietf.org/rfc/rfc4120.txt</a>.
+ *
+ * The implementation also includes the microseconds info so that the
+ * same class can be used as a precise timestamp in Authenticator etc.
*/
public class KerberosTime implements Cloneable {
private long kerberosTime; // milliseconds since epoch, a Date.getTime() value
+ private int microSeconds; // the last three digits of the microsecond value
+
+ // The time when this class is loaded. Used in setNow()
+ private static final long initMilli = System.currentTimeMillis();
+ private static final long initMicro = System.nanoTime() / 1000;
+
private static long syncTime;
private static boolean DEBUG = Krb5.DEBUG;
@@ -77,9 +86,13 @@ public class KerberosTime implements Cloneable {
kerberosTime = time;
}
+ private KerberosTime(long time, int micro) {
+ kerberosTime = time;
+ microSeconds = micro;
+ }
public Object clone() {
- return new KerberosTime(kerberosTime);
+ return new KerberosTime(kerberosTime, microSeconds);
}
// This constructor is used in the native code
@@ -109,8 +122,8 @@ public class KerberosTime implements Cloneable {
// | | | | | | |
// 0 4 6 8 | | |
// 10 | |
- // 12 |
- // 14
+ // 12 |
+ // 14
if (time.length() != 15)
throw new Asn1Exception(Krb5.ASN1_BAD_TIMEFORMAT);
@@ -148,11 +161,8 @@ public class KerberosTime implements Cloneable {
public KerberosTime(boolean initToNow) {
if (initToNow) {
- Date temp = new Date();
- setTime(temp);
+ setNow();
}
- else
- kerberosTime = 0;
}
/**
@@ -192,10 +202,12 @@ public class KerberosTime implements Cloneable {
public void setTime(Date time) {
kerberosTime = time.getTime(); // (time.getTimezoneOffset() * 60000L);
+ microSeconds = 0;
}
public void setTime(long time) {
kerberosTime = time;
+ microSeconds = 0;
}
public Date toDate() {
@@ -205,16 +217,18 @@ public class KerberosTime implements Cloneable {
}
public void setNow() {
- Date temp = new Date();
- setTime(temp);
+ long microElapsed = System.nanoTime() / 1000 - initMicro;
+ setTime(initMilli + microElapsed/1000);
+ microSeconds = (int)(microElapsed % 1000);
}
public int getMicroSeconds() {
Long temp_long = new Long((kerberosTime % 1000L) * 1000L);
- return temp_long.intValue();
+ return temp_long.intValue() + microSeconds;
}
public void setMicroSeconds(int usec) {
+ microSeconds = usec % 1000;
Integer temp_int = new Integer(usec);
long temp_long = temp_int.longValue() / 1000L;
kerberosTime = kerberosTime - (kerberosTime % 1000L) + temp_long;
@@ -222,6 +236,7 @@ public class KerberosTime implements Cloneable {
public void setMicroSeconds(Integer usec) {
if (usec != null) {
+ microSeconds = usec.intValue() % 1000;
long temp_long = usec.longValue() / 1000L;
kerberosTime = kerberosTime - (kerberosTime % 1000L) + temp_long;
}
@@ -262,7 +277,9 @@ public class KerberosTime implements Cloneable {
}
public boolean greaterThan(KerberosTime time) {
- return kerberosTime > time.kerberosTime;
+ return kerberosTime > time.kerberosTime ||
+ kerberosTime == time.kerberosTime &&
+ microSeconds > time.microSeconds;
}
public boolean equals(Object obj) {
@@ -274,15 +291,17 @@ public class KerberosTime implements Cloneable {
return false;
}
- return kerberosTime == ((KerberosTime)obj).kerberosTime;
+ return kerberosTime == ((KerberosTime)obj).kerberosTime &&
+ microSeconds == ((KerberosTime)obj).microSeconds;
}
public int hashCode() {
- return 37 * 17 + (int)(kerberosTime ^ (kerberosTime >>> 32));
+ int result = 37 * 17 + (int)(kerberosTime ^ (kerberosTime >>> 32));
+ return result * 17 + microSeconds;
}
public boolean isZero() {
- return kerberosTime == 0;
+ return kerberosTime == 0 && microSeconds == 0;
}
public int getSeconds() {
diff --git a/src/share/classes/sun/security/provider/X509Factory.java b/src/share/classes/sun/security/provider/X509Factory.java
index 8dbe55d22..e785b655a 100644
--- a/src/share/classes/sun/security/provider/X509Factory.java
+++ b/src/share/classes/sun/security/provider/X509Factory.java
@@ -518,6 +518,7 @@ public class X509Factory extends CertificateFactorySpi {
// Step 2: Read the rest of header, determine the line end
int end;
+ StringBuffer header = new StringBuffer("-----");
while (true) {
int next = is.read();
if (next == -1) {
@@ -540,6 +541,7 @@ public class X509Factory extends CertificateFactorySpi {
}
break;
}
+ header.append((char)next);
}
// Step 3: Read the data
@@ -559,6 +561,7 @@ public class X509Factory extends CertificateFactorySpi {
}
// Step 4: Consume the footer
+ StringBuffer footer = new StringBuffer("-");
while (true) {
int next = is.read();
// Add next == '\n' for maximum safety, in case endline
@@ -566,13 +569,34 @@ public class X509Factory extends CertificateFactorySpi {
if (next == -1 || next == end || next == '\n') {
break;
}
+ if (next != '\r') footer.append((char)next);
}
+ checkHeaderFooter(header.toString(), footer.toString());
+
BASE64Decoder decoder = new BASE64Decoder();
return decoder.decodeBuffer(new String(data, 0, pos));
}
}
+ private static void checkHeaderFooter(String header,
+ String footer) throws IOException {
+ if (header.length() < 16 || !header.startsWith("-----BEGIN ") ||
+ !header.endsWith("-----")) {
+ throw new IOException("Illegal header: " + header);
+ }
+ if (footer.length() < 14 || !footer.startsWith("-----END ") ||
+ !footer.endsWith("-----")) {
+ throw new IOException("Illegal footer: " + footer);
+ }
+ String headerType = header.substring(11, header.length()-5);
+ String footerType = footer.substring(9, footer.length()-5);
+ if (!headerType.equals(footerType)) {
+ throw new IOException("Header and footer do not match: " +
+ header + " " + footer);
+ }
+ }
+
/**
* Read one BER data block. This method is aware of indefinite-length BER
* encoding and will read all of the sub-sections in a recursive way
diff --git a/src/share/classes/sun/security/tools/JarSigner.java b/src/share/classes/sun/security/tools/JarSigner.java
index 661e63fc9..981b7fd53 100644
--- a/src/share/classes/sun/security/tools/JarSigner.java
+++ b/src/share/classes/sun/security/tools/JarSigner.java
@@ -1486,7 +1486,7 @@ public class JarSigner {
for (int i=0; i<len; i++) {
switch (bs[i]) {
case '\r':
- if (i < len && bs[i+1] == '\n') i++;
+ if (i < len - 1 && bs[i+1] == '\n') i++;
// fallthrough
case '\n':
if (newline) return i+1; //+1 to get length
diff --git a/src/share/classes/sun/security/tools/PolicyTool.java b/src/share/classes/sun/security/tools/policytool/PolicyTool.java
index d8a1888fe..bba2945c1 100644
--- a/src/share/classes/sun/security/tools/PolicyTool.java
+++ b/src/share/classes/sun/security/tools/policytool/PolicyTool.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2010, 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
@@ -23,7 +23,7 @@
* questions.
*/
-package sun.security.tools;
+package sun.security.tools.policytool;
import java.io.*;
import java.util.LinkedList;
diff --git a/src/share/classes/sun/security/validator/PKIXValidator.java b/src/share/classes/sun/security/validator/PKIXValidator.java
index a760a05fc..8068a9db8 100644
--- a/src/share/classes/sun/security/validator/PKIXValidator.java
+++ b/src/share/classes/sun/security/validator/PKIXValidator.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2010, 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
@@ -155,12 +155,15 @@ public final class PKIXValidator extends Validator {
X500Principal prevIssuer = null;
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i];
+ X500Principal dn = cert.getSubjectX500Principal();
if (i != 0 &&
- !cert.getSubjectX500Principal().equals(prevIssuer)) {
+ !dn.equals(prevIssuer)) {
// chain is not ordered correctly, call builder instead
return doBuild(chain, otherCerts);
}
- if (trustedCerts.contains(cert)) {
+ if (trustedSubjects.containsKey(dn)
+ && trustedSubjects.get(dn).getPublicKey()
+ .equals(cert.getPublicKey())) {
if (i == 0) {
return new X509Certificate[] {chain[0]};
}
diff --git a/src/share/classes/sun/swing/SwingUtilities2.java b/src/share/classes/sun/swing/SwingUtilities2.java
index 443fb90d1..6358d9870 100644
--- a/src/share/classes/sun/swing/SwingUtilities2.java
+++ b/src/share/classes/sun/swing/SwingUtilities2.java
@@ -44,6 +44,8 @@ import javax.swing.text.JTextComponent;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.DefaultCaret;
import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumnModel;
+
import sun.swing.PrintColorUIResource;
import sun.swing.ImageIconUIResource;
import sun.print.ProxyPrintGraphics;
@@ -1807,4 +1809,54 @@ public class SwingUtilities2 {
boolean three) {
return liesIn(rect, p, false, false, three);
}
+
+ /**
+ * Maps the index of the column in the view at
+ * {@code viewColumnIndex} to the index of the column
+ * in the table model. Returns the index of the corresponding
+ * column in the model. If {@code viewColumnIndex}
+ * is less than zero, returns {@code viewColumnIndex}.
+ *
+ * @param cm the table model
+ * @param viewColumnIndex the index of the column in the view
+ * @return the index of the corresponding column in the model
+ *
+ * @see JTable#convertColumnIndexToModel(int)
+ * @see javax.swing.plaf.basic.BasicTableHeaderUI
+ */
+ public static int convertColumnIndexToModel(TableColumnModel cm,
+ int viewColumnIndex) {
+ if (viewColumnIndex < 0) {
+ return viewColumnIndex;
+ }
+ return cm.getColumn(viewColumnIndex).getModelIndex();
+ }
+
+ /**
+ * Maps the index of the column in the {@code cm} at
+ * {@code modelColumnIndex} to the index of the column
+ * in the view. Returns the index of the
+ * corresponding column in the view; returns {@code -1} if this column
+ * is not being displayed. If {@code modelColumnIndex} is less than zero,
+ * returns {@code modelColumnIndex}.
+ *
+ * @param cm the table model
+ * @param modelColumnIndex the index of the column in the model
+ * @return the index of the corresponding column in the view
+ *
+ * @see JTable#convertColumnIndexToView(int)
+ * @see javax.swing.plaf.basic.BasicTableHeaderUI
+ */
+ public static int convertColumnIndexToView(TableColumnModel cm,
+ int modelColumnIndex) {
+ if (modelColumnIndex < 0) {
+ return modelColumnIndex;
+ }
+ for (int column = 0; column < cm.getColumnCount(); column++) {
+ if (cm.getColumn(column).getModelIndex() == modelColumnIndex) {
+ return column;
+ }
+ }
+ return -1;
+ }
}
diff --git a/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java b/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java
index f45c60f67..08745ad19 100644
--- a/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java
+++ b/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java
@@ -788,7 +788,7 @@ public class SynthFileChooserUIImpl extends SynthFileChooserUI {
// for example /foo/bar/ becomes /foo/bar
File canonical;
try {
- canonical = directory.getCanonicalFile();
+ canonical = ShellFolder.getNormalizedFile(directory);
} catch (IOException e) {
// Maybe drive is not ready. Can't abort here.
canonical = directory;
diff --git a/src/share/classes/sun/swing/table/DefaultTableCellHeaderRenderer.java b/src/share/classes/sun/swing/table/DefaultTableCellHeaderRenderer.java
index 492578f57..8187fea6f 100644
--- a/src/share/classes/sun/swing/table/DefaultTableCellHeaderRenderer.java
+++ b/src/share/classes/sun/swing/table/DefaultTableCellHeaderRenderer.java
@@ -24,6 +24,8 @@
*/
package sun.swing.table;
+import sun.swing.DefaultLookup;
+
import java.awt.Component;
import java.awt.Color;
import java.awt.FontMetrics;
@@ -31,12 +33,11 @@ import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
+import java.io.Serializable;
import javax.swing.*;
import javax.swing.plaf.UIResource;
import javax.swing.border.Border;
import javax.swing.table.*;
-import sun.swing.DefaultLookup;
-
public class DefaultTableCellHeaderRenderer extends DefaultTableCellRenderer
implements UIResource {
@@ -186,7 +187,7 @@ public class DefaultTableCellHeaderRenderer extends DefaultTableCellRenderer
return new Point(x, y);
}
- private class EmptyIcon implements Icon {
+ private class EmptyIcon implements Icon, Serializable {
int width = 0;
int height = 0;
public void paintIcon(Component c, Graphics g, int x, int y) {}
diff --git a/src/share/classes/sun/tools/jar/Main.java b/src/share/classes/sun/tools/jar/Main.java
index e8379e44b..feab77349 100644
--- a/src/share/classes/sun/tools/jar/Main.java
+++ b/src/share/classes/sun/tools/jar/Main.java
@@ -306,28 +306,28 @@ class Main {
for (int i = 0; i < flags.length(); i++) {
switch (flags.charAt(i)) {
case 'c':
- if (xflag || tflag || uflag) {
+ if (xflag || tflag || uflag || iflag) {
usageError();
return false;
}
cflag = true;
break;
case 'u':
- if (cflag || xflag || tflag) {
+ if (cflag || xflag || tflag || iflag) {
usageError();
return false;
}
uflag = true;
break;
case 'x':
- if (cflag || uflag || tflag) {
+ if (cflag || uflag || tflag || iflag) {
usageError();
return false;
}
xflag = true;
break;
case 't':
- if (cflag || uflag || xflag) {
+ if (cflag || uflag || xflag || iflag) {
usageError();
return false;
}
@@ -349,6 +349,10 @@ class Main {
flag0 = true;
break;
case 'i':
+ if (cflag || uflag || xflag || tflag) {
+ usageError();
+ return false;
+ }
// do not increase the counter, files will contain rootjar
rootjar = args[count++];
iflag = true;
diff --git a/src/share/classes/sun/tools/jstat/ExpressionResolver.java b/src/share/classes/sun/tools/jstat/ExpressionResolver.java
index a23169882..040455ec2 100644
--- a/src/share/classes/sun/tools/jstat/ExpressionResolver.java
+++ b/src/share/classes/sun/tools/jstat/ExpressionResolver.java
@@ -26,7 +26,6 @@
package sun.tools.jstat;
import sun.jvmstat.monitor.*;
-import sun.management.counter.Variability;
/**
* A class implementing the ExpressionEvaluator to resolve unresolved
diff --git a/src/share/classes/sun/tools/jstat/JStatLogger.java b/src/share/classes/sun/tools/jstat/JStatLogger.java
index 254b4c4c1..77b17bdd3 100644
--- a/src/share/classes/sun/tools/jstat/JStatLogger.java
+++ b/src/share/classes/sun/tools/jstat/JStatLogger.java
@@ -29,8 +29,6 @@ import java.util.*;
import java.io.*;
import sun.jvmstat.monitor.*;
import sun.jvmstat.monitor.event.*;
-import sun.management.counter.Units;
-import sun.management.counter.Variability;
import java.util.regex.PatternSyntaxException;
/**
diff --git a/src/share/classes/sun/tools/jstat/Jstat.java b/src/share/classes/sun/tools/jstat/Jstat.java
index 8b45c5933..7682fb0c3 100644
--- a/src/share/classes/sun/tools/jstat/Jstat.java
+++ b/src/share/classes/sun/tools/jstat/Jstat.java
@@ -28,8 +28,6 @@ package sun.tools.jstat;
import java.util.*;
import sun.jvmstat.monitor.*;
import sun.jvmstat.monitor.event.*;
-import sun.management.counter.Variability;
-import sun.management.counter.Units;
/**
* Application to output jvmstat statistics exported by a target Java
diff --git a/src/share/native/sun/font/AccelGlyphCache.c b/src/share/native/sun/font/AccelGlyphCache.c
index b1d4087b5..f6e34c755 100644
--- a/src/share/native/sun/font/AccelGlyphCache.c
+++ b/src/share/native/sun/font/AccelGlyphCache.c
@@ -325,6 +325,7 @@ AccelGlyphCache_AddCellInfo(GlyphInfo *glyph, CacheCellInfo *cellInfo)
cellInfo->glyphInfo = glyph;
cellInfo->nextGCI = glyph->cellInfo;
glyph->cellInfo = cellInfo;
+ glyph->managed = MANAGED_GLYPH;
}
/**
diff --git a/src/share/native/sun/font/fontscalerdefs.h b/src/share/native/sun/font/fontscalerdefs.h
index db5edf4d4..9b5ad7fe4 100644
--- a/src/share/native/sun/font/fontscalerdefs.h
+++ b/src/share/native/sun/font/fontscalerdefs.h
@@ -84,15 +84,26 @@ typedef float t2kScalar;
#define t2kScalarAverage(a, b) (((a) + (b)) / (t2kScalar)(2))
+ /* managed: 1 means the glyph has a hardware cached
+ * copy, and its freeing is managed by the the usual
+ * 2D disposer code.
+ * A value of 0 means its either unaccelerated (and so has no cellInfos)
+ * or we want to free this in a different way.
+ * The field uses previously unused padding, so doesn't enlarge
+ * the structure.
+ */
+#define UNMANAGED_GLYPH 0
+#define MANAGED_GLYPH 1
typedef struct GlyphInfo {
float advanceX;
float advanceY;
UInt16 width;
UInt16 height;
UInt16 rowBytes;
+ UInt8 managed;
float topLeftX;
float topLeftY;
- struct _CacheCellInfo *cellInfo;
+ void *cellInfo;
UInt8 *image;
} GlyphInfo;
diff --git a/src/share/native/sun/font/freetypeScaler.c b/src/share/native/sun/font/freetypeScaler.c
index 6e7edb11b..39768c467 100644
--- a/src/share/native/sun/font/freetypeScaler.c
+++ b/src/share/native/sun/font/freetypeScaler.c
@@ -782,6 +782,7 @@ Java_sun_font_FreetypeFontScaler_getGlyphImageNative(
return ptr_to_jlong(glyphInfo);
}
glyphInfo->cellInfo = NULL;
+ glyphInfo->managed = UNMANAGED_GLYPH;
glyphInfo->rowBytes = width;
glyphInfo->width = width;
glyphInfo->height = height;
@@ -1130,7 +1131,7 @@ static void addToGP(GPData* gpdata, FT_Outline*outline) {
current_type = SEG_LINETO;
}
} else if (FT_CURVE_TAG(outline->tags[i]) == FT_CURVE_TAG_CUBIC) {
- /* Bit 1 is meaningful for ‘off’ points only.
+ /* Bit 1 is meaningful for 'off' points only.
If set, it indicates a third-order Bezier arc control
point; and a second-order control point if unset. */
current_type = SEG_CUBICTO;
diff --git a/src/share/native/sun/font/sunFont.c b/src/share/native/sun/font/sunFont.c
index 0140e7019..4c6949e20 100644
--- a/src/share/native/sun/font/sunFont.c
+++ b/src/share/native/sun/font/sunFont.c
@@ -233,7 +233,8 @@ JNIEXPORT void JNICALL Java_sun_font_StrikeCache_freeIntMemory
for (i=0; i< len; i++) {
if (ptrs[i] != 0) {
GlyphInfo *ginfo = (GlyphInfo *)ptrs[i];
- if (ginfo->cellInfo != NULL) {
+ if (ginfo->cellInfo != NULL &&
+ ginfo->managed == MANAGED_GLYPH) {
// invalidate this glyph's accelerated cache cell
AccelGlyphCache_RemoveAllCellInfos(ginfo);
}
@@ -264,7 +265,8 @@ JNIEXPORT void JNICALL Java_sun_font_StrikeCache_freeLongMemory
for (i=0; i< len; i++) {
if (ptrs[i] != 0L) {
GlyphInfo *ginfo = (GlyphInfo *) jlong_to_ptr(ptrs[i]);
- if (ginfo->cellInfo != NULL) {
+ if (ginfo->cellInfo != NULL &&
+ ginfo->managed == MANAGED_GLYPH) {
AccelGlyphCache_RemoveAllCellInfos(ginfo);
}
free((void*)ginfo);
@@ -285,7 +287,7 @@ Java_sun_font_StrikeCache_getGlyphCacheDescription
GlyphInfo *info;
size_t baseAddr;
- if ((*env)->GetArrayLength(env, results) < 10) {
+ if ((*env)->GetArrayLength(env, results) < 13) {
return;
}
@@ -310,6 +312,9 @@ Java_sun_font_StrikeCache_getGlyphCacheDescription
nresults[8] = (size_t)&(info->topLeftY)-baseAddr;
nresults[9] = (size_t)&(info->image)-baseAddr;
nresults[10] = (jlong)(uintptr_t)info; /* invisible glyph */
+ nresults[11] = (size_t)&(info->cellInfo)-baseAddr;
+ nresults[12] = (size_t)&(info->managed)-baseAddr;
+
(*env)->ReleasePrimitiveArrayCritical(env, results, nresults, 0);
}
diff --git a/src/share/native/sun/java2d/opengl/OGLTextRenderer.c b/src/share/native/sun/java2d/opengl/OGLTextRenderer.c
index c1dfd585e..7b35884a2 100644
--- a/src/share/native/sun/java2d/opengl/OGLTextRenderer.c
+++ b/src/share/native/sun/java2d/opengl/OGLTextRenderer.c
@@ -244,6 +244,7 @@ static void
OGLTR_AddToGlyphCache(GlyphInfo *glyph, jboolean rgbOrder)
{
GLenum pixelFormat;
+ CacheCellInfo *ccinfo;
J2dTraceLn(J2D_TRACE_INFO, "OGLTR_AddToGlyphCache");
@@ -258,11 +259,12 @@ OGLTR_AddToGlyphCache(GlyphInfo *glyph, jboolean rgbOrder)
}
AccelGlyphCache_AddGlyph(glyphCache, glyph);
+ ccinfo = (CacheCellInfo *) glyph->cellInfo;
- if (glyph->cellInfo != NULL) {
+ if (ccinfo != NULL) {
// store glyph image in texture cell
j2d_glTexSubImage2D(GL_TEXTURE_2D, 0,
- glyph->cellInfo->x, glyph->cellInfo->y,
+ ccinfo->x, ccinfo->y,
glyph->width, glyph->height,
pixelFormat, GL_UNSIGNED_BYTE, glyph->image);
}
@@ -668,7 +670,7 @@ OGLTR_DrawGrayscaleGlyphViaCache(OGLContext *oglc,
}
}
- cell = ginfo->cellInfo;
+ cell = (CacheCellInfo *) (ginfo->cellInfo);
cell->timesRendered++;
x1 = (jfloat)x;
@@ -871,7 +873,7 @@ OGLTR_DrawLCDGlyphViaCache(OGLContext *oglc, OGLSDOps *dstOps,
}
}
- cell = ginfo->cellInfo;
+ cell = (CacheCellInfo *) (ginfo->cellInfo);
cell->timesRendered++;
// location of the glyph in the destination's coordinate space
diff --git a/src/solaris/classes/sun/awt/X11GraphicsDevice.java b/src/solaris/classes/sun/awt/X11GraphicsDevice.java
index 5e6dee4e1..1f15542fd 100644
--- a/src/solaris/classes/sun/awt/X11GraphicsDevice.java
+++ b/src/solaris/classes/sun/awt/X11GraphicsDevice.java
@@ -39,6 +39,7 @@ import java.util.HashSet;
import java.util.HashMap;
import sun.java2d.opengl.GLXGraphicsConfig;
+import sun.java2d.xr.XRGraphicsConfig;
import sun.java2d.loops.SurfaceType;
/**
@@ -152,6 +153,8 @@ public class X11GraphicsDevice
}
boolean glxSupported = X11GraphicsEnvironment.isGLXAvailable();
+ boolean xrenderSupported = X11GraphicsEnvironment.isXRenderAvailable();
+
boolean dbeSupported = isDBESupported();
if (dbeSupported && doubleBufferVisuals == null) {
doubleBufferVisuals = new HashSet();
@@ -167,9 +170,15 @@ public class X11GraphicsDevice
boolean doubleBuffer =
(dbeSupported &&
doubleBufferVisuals.contains(Integer.valueOf(visNum)));
- ret[i] = X11GraphicsConfig.getConfig(this, visNum, depth,
- getConfigColormap(i, screen),
- doubleBuffer);
+
+ if (xrenderSupported) {
+ ret[i] = XRGraphicsConfig.getConfig(this, visNum, depth, getConfigColormap(i, screen),
+ doubleBuffer);
+ } else {
+ ret[i] = X11GraphicsConfig.getConfig(this, visNum, depth,
+ getConfigColormap(i, screen),
+ doubleBuffer);
+ }
}
}
configs = ret;
@@ -243,9 +252,19 @@ public class X11GraphicsDevice
doubleBuffer =
doubleBufferVisuals.contains(Integer.valueOf(visNum));
}
- defaultConfig = X11GraphicsConfig.getConfig(this, visNum,
- depth, getConfigColormap(0, screen),
- doubleBuffer);
+
+ if (X11GraphicsEnvironment.isXRenderAvailable()) {
+ if (X11GraphicsEnvironment.isXRenderVerbose()) {
+ System.out.println("XRender pipeline enabled");
+ }
+ defaultConfig = XRGraphicsConfig.getConfig(this, visNum,
+ depth, getConfigColormap(0, screen),
+ doubleBuffer);
+ } else {
+ defaultConfig = X11GraphicsConfig.getConfig(this, visNum,
+ depth, getConfigColormap(0, screen),
+ doubleBuffer);
+ }
}
}
}
diff --git a/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java b/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java
index 23a2ace96..533d22dc1 100644
--- a/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java
+++ b/src/solaris/classes/sun/awt/X11GraphicsEnvironment.java
@@ -26,6 +26,7 @@
package sun.awt;
import java.awt.GraphicsDevice;
+
import java.awt.Point;
import java.awt.Rectangle;
import java.io.BufferedReader;
@@ -51,6 +52,7 @@ import sun.java2d.SunGraphicsEnvironment;
import sun.java2d.SurfaceManagerFactory;
import sun.java2d.UnixSurfaceManagerFactory;
import sun.util.logging.PlatformLogger;
+import sun.java2d.xr.XRSurfaceData;
/**
* This is an implementation of a GraphicsEnvironment object for the
@@ -92,6 +94,18 @@ public class X11GraphicsEnvironment
}
}
+ // Now check for XRender system property
+ boolean xRenderRequested = false;
+ String xProp = System.getProperty("sun.java2d.xrender");
+ if (xProp != null) {
+ if (xProp.equals("true") || xProp.equals("t")) {
+ xRenderRequested = true;
+ } else if (xProp.equals("True") || xProp.equals("T")) {
+ xRenderRequested = true;
+ xRenderVerbose = true;
+ }
+ }
+
// initialize the X11 display connection
initDisplay(glxRequested);
@@ -104,6 +118,19 @@ public class X11GraphicsEnvironment
"pipeline (GLX 1.3 not available)");
}
}
+
+ // only attempt to initialize Xrender if it was requested
+ if (xRenderRequested) {
+ xRenderAvailable = initXRender();
+ if (xRenderVerbose && !xRenderAvailable) {
+ System.out.println(
+ "Could not enable XRender pipeline");
+ }
+ }
+
+ if (xRenderAvailable) {
+ XRSurfaceData.initXRSurfaceData();
+ }
}
return null;
@@ -115,6 +142,7 @@ public class X11GraphicsEnvironment
}
+
private static boolean glxAvailable;
private static boolean glxVerbose;
@@ -128,6 +156,18 @@ public class X11GraphicsEnvironment
return glxVerbose;
}
+ private static boolean xRenderVerbose;
+ private static boolean xRenderAvailable;
+
+ private static native boolean initXRender();
+ public static boolean isXRenderAvailable() {
+ return xRenderAvailable;
+ }
+
+ public static boolean isXRenderVerbose() {
+ return xRenderVerbose;
+ }
+
/**
* Checks if Shared Memory extension can be used.
* Returns:
diff --git a/src/solaris/classes/sun/font/XRGlyphCache.java b/src/solaris/classes/sun/font/XRGlyphCache.java
new file mode 100644
index 000000000..82c7c6a87
--- /dev/null
+++ b/src/solaris/classes/sun/font/XRGlyphCache.java
@@ -0,0 +1,301 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.font;
+
+import java.io.*;
+import java.util.*;
+
+import sun.awt.*;
+import sun.java2d.xr.*;
+
+/**
+ * Glyph cache used by the XRender pipeline.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class XRGlyphCache implements GlyphDisposedListener {
+ XRBackend con;
+ XRCompositeManager maskBuffer;
+ HashMap<MutableInteger, XRGlyphCacheEntry> cacheMap = new HashMap<MutableInteger, XRGlyphCacheEntry>(256);
+
+ int nextID = 1;
+ MutableInteger tmp = new MutableInteger(0);
+
+ int grayGlyphSet;
+ int lcdGlyphSet;
+
+ int time = 0;
+ int cachedPixels = 0;
+ static final int MAX_CACHED_PIXELS = 100000;
+
+ ArrayList<Integer> freeGlyphIDs = new ArrayList<Integer>(255);
+
+ static final boolean batchGlyphUpload = true; // Boolean.parseBoolean(System.getProperty("sun.java2d.xrender.batchGlyphUpload"));
+
+ public XRGlyphCache(XRCompositeManager maskBuf) {
+ this.con = maskBuf.getBackend();
+ this.maskBuffer = maskBuf;
+
+ grayGlyphSet = con.XRenderCreateGlyphSet(XRUtils.PictStandardA8);
+ lcdGlyphSet = con.XRenderCreateGlyphSet(XRUtils.PictStandardARGB32);
+
+ StrikeCache.addGlyphDisposedListener(this);
+ }
+
+ public void glyphDisposed(ArrayList<Long> glyphPtrList) {
+ try {
+ SunToolkit.awtLock();
+
+ ArrayList<Integer> glyphIDList = new ArrayList<Integer>(glyphPtrList.size());
+ for (long glyphPtr : glyphPtrList) {
+ glyphIDList.add(XRGlyphCacheEntry.getGlyphID(glyphPtr));
+ }
+ freeGlyphs(glyphIDList);
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ protected int getFreeGlyphID() {
+ if (freeGlyphIDs.size() > 0) {
+ int newID = freeGlyphIDs.remove(freeGlyphIDs.size() - 1);
+ ;
+ return newID;
+ }
+ return nextID++;
+ }
+
+ protected XRGlyphCacheEntry getEntryForPointer(long imgPtr) {
+ int id = XRGlyphCacheEntry.getGlyphID(imgPtr);
+
+ if (id == 0) {
+ return null;
+ }
+
+ tmp.setValue(id);
+ return cacheMap.get(tmp);
+ }
+
+ public XRGlyphCacheEntry[] cacheGlyphs(GlyphList glyphList) {
+ time++;
+
+ XRGlyphCacheEntry[] entries = new XRGlyphCacheEntry[glyphList.getNumGlyphs()];
+ long[] imgPtrs = glyphList.getImages();
+ ArrayList<XRGlyphCacheEntry> uncachedGlyphs = null;
+
+ for (int i = 0; i < glyphList.getNumGlyphs(); i++) {
+ XRGlyphCacheEntry glyph;
+
+ // Find uncached glyphs and queue them for upload
+ if ((glyph = getEntryForPointer(imgPtrs[i])) == null) {
+ glyph = new XRGlyphCacheEntry(imgPtrs[i], glyphList);
+ glyph.setGlyphID(getFreeGlyphID());
+ cacheMap.put(new MutableInteger(glyph.getGlyphID()), glyph);
+
+ if (uncachedGlyphs == null) {
+ uncachedGlyphs = new ArrayList<XRGlyphCacheEntry>();
+ }
+ uncachedGlyphs.add(glyph);
+ }
+ glyph.setLastUsed(time);
+ entries[i] = glyph;
+ }
+
+ // Add glyphs to cache
+ if (uncachedGlyphs != null) {
+ uploadGlyphs(entries, uncachedGlyphs, glyphList, null);
+ }
+
+ return entries;
+ }
+
+ protected void uploadGlyphs(XRGlyphCacheEntry[] glyphs, ArrayList<XRGlyphCacheEntry> uncachedGlyphs, GlyphList gl, int[] glIndices) {
+ for (XRGlyphCacheEntry glyph : uncachedGlyphs) {
+ cachedPixels += glyph.getPixelCnt();
+ }
+
+ if (cachedPixels > MAX_CACHED_PIXELS) {
+ clearCache(glyphs);
+ }
+
+ boolean containsLCDGlyphs = containsLCDGlyphs(uncachedGlyphs);
+ List<XRGlyphCacheEntry>[] seperatedGlyphList = seperateGlyphTypes(uncachedGlyphs, containsLCDGlyphs);
+ List<XRGlyphCacheEntry> grayGlyphList = seperatedGlyphList[0];
+ List<XRGlyphCacheEntry> lcdGlyphList = seperatedGlyphList[1];
+
+ /*
+ * Some XServers crash when uploading multiple glyphs at once. TODO:
+ * Implement build-switch in local case for distributors who know their
+ * XServer is fixed
+ */
+ if (batchGlyphUpload) {
+ if (grayGlyphList != null && grayGlyphList.size() > 0) {
+ con.XRenderAddGlyphs(grayGlyphSet, gl, grayGlyphList, generateGlyphImageStream(grayGlyphList));
+ }
+ if (lcdGlyphList != null && lcdGlyphList.size() > 0) {
+ con.XRenderAddGlyphs(lcdGlyphSet, gl, lcdGlyphList, generateGlyphImageStream(lcdGlyphList));
+ }
+ } else {
+ ArrayList<XRGlyphCacheEntry> tmpList = new ArrayList<XRGlyphCacheEntry>(1);
+ tmpList.add(null);
+
+ for (XRGlyphCacheEntry entry : uncachedGlyphs) {
+ tmpList.set(0, entry);
+
+ if (entry.getGlyphSet() == grayGlyphSet) {
+ con.XRenderAddGlyphs(grayGlyphSet, gl, tmpList, generateGlyphImageStream(tmpList));
+ } else {
+ con.XRenderAddGlyphs(lcdGlyphSet, gl, tmpList, generateGlyphImageStream(tmpList));
+ }
+ }
+ }
+ }
+
+ /**
+ * Seperates lcd and grayscale glyphs queued for upload, and sets the
+ * appropriate glyphset for the cache entries.
+ */
+ protected List<XRGlyphCacheEntry>[] seperateGlyphTypes(List<XRGlyphCacheEntry> glyphList, boolean containsLCDGlyphs) {
+ ArrayList<XRGlyphCacheEntry> lcdGlyphs = null;
+ ArrayList<XRGlyphCacheEntry> grayGlyphs = null;
+
+ for (XRGlyphCacheEntry cacheEntry : glyphList) {
+ if (cacheEntry.isGrayscale(containsLCDGlyphs)) {
+ if (grayGlyphs == null) {
+ grayGlyphs = new ArrayList<XRGlyphCacheEntry>(glyphList.size());
+ }
+ cacheEntry.setGlyphSet(grayGlyphSet);
+ grayGlyphs.add(cacheEntry);
+ } else {
+ if (lcdGlyphs == null) {
+ lcdGlyphs = new ArrayList<XRGlyphCacheEntry>(glyphList.size());
+ }
+ cacheEntry.setGlyphSet(lcdGlyphSet);
+ lcdGlyphs.add(cacheEntry);
+ }
+ }
+
+ return new List[] { grayGlyphs, lcdGlyphs };
+ }
+
+ /**
+ * Copies the glyph-images into a continous buffer, required for uploading.
+ */
+ protected byte[] generateGlyphImageStream(List<XRGlyphCacheEntry> glyphList) {
+ boolean isLCDGlyph = glyphList.get(0).getGlyphSet() == lcdGlyphSet;
+
+ ByteArrayOutputStream stream = new ByteArrayOutputStream((isLCDGlyph ? 4 : 1) * 48 * glyphList.size());
+ for (XRGlyphCacheEntry cacheEntry : glyphList) {
+ cacheEntry.writePixelData(stream, isLCDGlyph);
+ }
+
+ return stream.toByteArray();
+ }
+
+ protected boolean containsLCDGlyphs(List<XRGlyphCacheEntry> entries) {
+ boolean containsLCDGlyphs = false;
+
+ for (XRGlyphCacheEntry entry : entries) {
+ containsLCDGlyphs = !(entry.getSourceRowBytes() == entry.getWidth());
+
+ if (containsLCDGlyphs) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected void clearCache(XRGlyphCacheEntry[] glyps) {
+ /*
+ * Glyph uploading is so slow anyway, we can afford some inefficiency
+ * here, as the cache should usually be quite small. TODO: Implement
+ * something not that stupid ;)
+ */
+ ArrayList<XRGlyphCacheEntry> cacheList = new ArrayList<XRGlyphCacheEntry>(cacheMap.values());
+ Collections.sort(cacheList, new Comparator<XRGlyphCacheEntry>() {
+ public int compare(XRGlyphCacheEntry e1, XRGlyphCacheEntry e2) {
+ return e2.getLastUsed() - e1.getLastUsed();
+ }
+ });
+
+ for (XRGlyphCacheEntry glyph : glyps) {
+ glyph.setPinned();
+ }
+
+ ArrayList<Integer> deleteGlyphList = new ArrayList<Integer>();
+ int pixelsToRelease = cachedPixels - MAX_CACHED_PIXELS;
+
+ for (int i = cacheList.size() - 1; i >= 0 && pixelsToRelease > 0; i--) {
+ XRGlyphCacheEntry entry = cacheList.get(i);
+
+ if (!entry.isPinned()) {
+ pixelsToRelease -= entry.getPixelCnt();
+ deleteGlyphList.add(new Integer(entry.getGlyphID()));
+ }
+ }
+
+ for (XRGlyphCacheEntry glyph : glyps) {
+ glyph.setUnpinned();
+ }
+
+ freeGlyphs(deleteGlyphList);
+ }
+
+ private void freeGlyphs(List<Integer> glyphIdList) {
+
+ freeGlyphIDs.addAll(glyphIdList);
+
+ GrowableIntArray removedLCDGlyphs = new GrowableIntArray(1, 1);
+ GrowableIntArray removedGrayscaleGlyphs = new GrowableIntArray(1, 1);
+
+ for (Integer glyphId : glyphIdList) {
+ tmp.setValue(glyphId.intValue());
+ XRGlyphCacheEntry entry = cacheMap.get(tmp);
+ cachedPixels -= entry.getPixelCnt();
+
+ int removedGlyphID = entry.getGlyphID();
+ tmp.setValue(removedGlyphID);
+ cacheMap.remove(tmp);
+
+ if (entry.getGlyphSet() == grayGlyphSet) {
+ removedGrayscaleGlyphs.addInt(removedGlyphID);
+ } else {
+ removedLCDGlyphs.addInt(removedGlyphID);
+ }
+
+ entry.setGlyphID(0);
+ }
+
+ if (removedGrayscaleGlyphs.getSize() > 0) {
+ con.XRenderFreeGlyphs(grayGlyphSet, removedGrayscaleGlyphs.getSizedArray());
+ }
+
+ if (removedLCDGlyphs.getSize() > 0) {
+ con.XRenderFreeGlyphs(lcdGlyphSet, removedLCDGlyphs.getSizedArray());
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/font/XRGlyphCacheEntry.java b/src/solaris/classes/sun/font/XRGlyphCacheEntry.java
new file mode 100644
index 000000000..e7f6281ca
--- /dev/null
+++ b/src/solaris/classes/sun/font/XRGlyphCacheEntry.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.font;
+
+import java.io.*;
+
+/**
+ * Stores glyph-related data, used in the pure-java glyphcache.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class XRGlyphCacheEntry {
+ long glyphInfoPtr;
+
+ int lastUsed;
+ boolean pinned;
+
+ int xOff;
+ int yOff;
+
+ int glyphSet;
+
+ public XRGlyphCacheEntry(long glyphInfoPtr, GlyphList gl) {
+ this.glyphInfoPtr = glyphInfoPtr;
+
+ /* TODO: Does it make sence to cache results? */
+ xOff = (int) Math.round(getXAdvance());
+ yOff = (int) Math.round(getYAdvance());
+ }
+
+ public int getXOff() {
+ return xOff;
+ }
+
+ public int getYOff() {
+ return yOff;
+ }
+
+ public void setGlyphSet(int glyphSet) {
+ this.glyphSet = glyphSet;
+ }
+
+ public int getGlyphSet() {
+ return glyphSet;
+ }
+
+ public static int getGlyphID(long glyphInfoPtr) {
+ return (int) StrikeCache.unsafe.getInt(glyphInfoPtr + StrikeCache.cacheCellOffset);
+ }
+
+ public static void setGlyphID(long glyphInfoPtr, int id) {
+ StrikeCache.unsafe.putInt(glyphInfoPtr + StrikeCache.cacheCellOffset, id);
+ }
+
+ public int getGlyphID() {
+ return getGlyphID(glyphInfoPtr);
+ }
+
+ public void setGlyphID(int id) {
+ setGlyphID(glyphInfoPtr, id);
+ }
+
+ public float getXAdvance() {
+ return StrikeCache.unsafe.getFloat(glyphInfoPtr + StrikeCache.xAdvanceOffset);
+ }
+
+ public float getYAdvance() {
+ return StrikeCache.unsafe.getFloat(glyphInfoPtr + StrikeCache.yAdvanceOffset);
+ }
+
+ public int getSourceRowBytes() {
+ return StrikeCache.unsafe.getShort(glyphInfoPtr + StrikeCache.rowBytesOffset);
+ }
+
+ public int getWidth() {
+ return StrikeCache.unsafe.getShort(glyphInfoPtr + StrikeCache.widthOffset);
+ }
+
+ public int getHeight() {
+ return StrikeCache.unsafe.getShort(glyphInfoPtr + StrikeCache.heightOffset);
+ }
+
+ public void writePixelData(ByteArrayOutputStream os, boolean uploadAsLCD) {
+ long pixelDataAddress;
+ if (StrikeCache.nativeAddressSize == 4) {
+ pixelDataAddress = 0xffffffff & StrikeCache.unsafe.getInt(glyphInfoPtr + StrikeCache.pixelDataOffset);
+ } else {
+ pixelDataAddress = StrikeCache.unsafe.getLong(glyphInfoPtr + StrikeCache.pixelDataOffset);
+ }
+ if (pixelDataAddress == 0L) {
+ return;
+ }
+
+ int width = getWidth();
+ int height = getHeight();
+ int rowBytes = getSourceRowBytes();
+ int paddedWidth = getPaddedWidth(uploadAsLCD);
+
+ if (!uploadAsLCD) {
+ for (int line = 0; line < height; line++) {
+ for(int x = 0; x < paddedWidth; x++) {
+ if(x < width) {
+ os.write(StrikeCache.unsafe.getByte(pixelDataAddress + (line * rowBytes + x)));
+ }else {
+ /*pad to multiple of 4 bytes per line*/
+ os.write(0);
+ }
+ }
+ }
+ } else {
+ for (int line = 0; line < height; line++) {
+ int rowStart = line * rowBytes;
+ int rowBytesWidth = width * 3;
+ int srcpix = 0;
+ while (srcpix < rowBytesWidth) {
+ os.write(StrikeCache.unsafe.getByte
+ (pixelDataAddress + (rowStart + srcpix + 2)));
+ os.write(StrikeCache.unsafe.getByte
+ (pixelDataAddress + (rowStart + srcpix + 1)));
+ os.write(StrikeCache.unsafe.getByte
+ (pixelDataAddress + (rowStart + srcpix + 0)));
+ os.write(255);
+ srcpix += 3;
+ }
+ }
+ }
+ }
+
+ public float getTopLeftXOffset() {
+ return StrikeCache.unsafe.getFloat(glyphInfoPtr + StrikeCache.topLeftXOffset);
+ }
+
+ public float getTopLeftYOffset() {
+ return StrikeCache.unsafe.getFloat(glyphInfoPtr + StrikeCache.topLeftYOffset);
+ }
+
+ public long getGlyphInfoPtr() {
+ return glyphInfoPtr;
+ }
+
+ public boolean isGrayscale(boolean listContainsLCDGlyphs) {
+ return getSourceRowBytes() == getWidth() && !(getWidth() == 0 && getHeight() == 0 && listContainsLCDGlyphs);
+ }
+
+ public int getPaddedWidth(boolean listContainsLCDGlyphs) {
+ int width = getWidth();
+ return isGrayscale(listContainsLCDGlyphs) ? (int) Math.ceil(width / 4.0) * 4 : width;
+ }
+
+ public int getDestinationRowBytes(boolean listContainsLCDGlyphs) {
+ boolean grayscale = isGrayscale(listContainsLCDGlyphs);
+ return grayscale ? getPaddedWidth(grayscale) : getWidth() * 4;
+ }
+
+ public int getGlyphDataLenth(boolean listContainsLCDGlyphs) {
+ return getDestinationRowBytes(listContainsLCDGlyphs) * getHeight();
+ }
+
+ public void setPinned() {
+ pinned = true;
+ }
+
+ public void setUnpinned() {
+ pinned = false;
+ }
+
+ public int getLastUsed() {
+ return lastUsed;
+ }
+
+ public void setLastUsed(int lastUsed) {
+ this.lastUsed = lastUsed;
+ }
+
+ public int getPixelCnt() {
+ return getWidth() * getHeight();
+ }
+
+ public boolean isPinned() {
+ return pinned;
+ }
+}
diff --git a/src/solaris/classes/sun/font/XRTextRenderer.java b/src/solaris/classes/sun/font/XRTextRenderer.java
new file mode 100644
index 000000000..2787160a5
--- /dev/null
+++ b/src/solaris/classes/sun/font/XRTextRenderer.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.font;
+
+import sun.awt.*;
+import sun.java2d.SunGraphics2D;
+import sun.java2d.pipe.GlyphListPipe;
+import sun.java2d.xr.*;
+
+/**
+ * A delegate pipe of SG2D for drawing any text to a XRender surface
+ *
+ * @author Clemens Eisserer
+ */
+public class XRTextRenderer extends GlyphListPipe {
+
+ XRGlyphCache glyphCache;
+ XRCompositeManager maskBuffer;
+ XRBackend backend;
+
+ GrowableEltArray eltList;
+
+ public XRTextRenderer(XRCompositeManager buffer) {
+ glyphCache = new XRGlyphCache(buffer);
+ maskBuffer = buffer;
+ backend = buffer.getBackend();
+ eltList = new GrowableEltArray(64);
+ }
+
+ protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
+ if (gl.getNumGlyphs() == 0) {
+ return;
+ }
+
+ try {
+ SunToolkit.awtLock();
+
+ XRSurfaceData x11sd = (XRSurfaceData) sg2d.surfaceData;
+ x11sd.validateAsDestination(null, sg2d.getCompClip());
+ x11sd.maskBuffer.validateCompositeState(sg2d.composite, sg2d.transform, sg2d.paint, sg2d);
+
+ float advX = gl.getX();
+ float advY = gl.getY();
+ int oldPosX = 0, oldPosY = 0;
+
+ if (gl.isSubPixPos()) {
+ advX += 0.1666667f;
+ advY += 0.1666667f;
+ } else {
+ advX += 0.5f;
+ advY += 0.5f;
+ }
+
+ XRGlyphCacheEntry[] cachedGlyphs = glyphCache.cacheGlyphs(gl);
+ boolean containsLCDGlyphs = false;
+ int activeGlyphSet = cachedGlyphs[0].getGlyphSet();
+
+ int eltIndex = -1;
+ gl.getBounds();
+ float[] positions = gl.getPositions();
+ for (int i = 0; i < gl.getNumGlyphs(); i++) {
+ gl.setGlyphIndex(i);
+ XRGlyphCacheEntry cacheEntry = cachedGlyphs[i];
+
+ eltList.getGlyphs().addInt(cacheEntry.getGlyphID());
+ int glyphSet = cacheEntry.getGlyphSet();
+
+ containsLCDGlyphs |= (glyphSet == glyphCache.lcdGlyphSet);
+
+ int posX = 0, posY = 0;
+ if (gl.usePositions()
+ || (cacheEntry.getXAdvance() != ((float) cacheEntry.getXOff()) || cacheEntry.getYAdvance() != ((float) cacheEntry.getYOff()))
+ || eltIndex < 0 || glyphSet != activeGlyphSet) {
+
+ eltIndex = eltList.getNextIndex();
+ eltList.setCharCnt(eltIndex, 1);
+ activeGlyphSet = glyphSet;
+ eltList.setGlyphSet(eltIndex, glyphSet);
+
+ if (gl.usePositions()) {
+ // /*In this case advX only stores rounding errors*/
+ float x = positions[i * 2] + advX;
+ float y = positions[i * 2 + 1] + advY;
+ posX = (int) Math.floor(x);
+ posY = (int) Math.floor(y);
+ advX -= cacheEntry.getXOff();
+ advY -= cacheEntry.getYOff();
+ } else {
+ /*
+ * Calculate next glyph's position in the case of
+ * relative positioning. In XRender we can only position
+ * glyphs using integer coordinates, therefor we sum all
+ * the advances up as float, and convert them to integer
+ * later. This way rounding-error can be corrected, and
+ * is required to be consistent with the software loops.
+ */
+ posX = (int) Math.floor(advX);
+ posY = (int) Math.floor(advY);
+
+ // Advance of ELT = difference between stored
+ // relative
+ // positioning information and required float.
+ advX += (cacheEntry.getXAdvance() - cacheEntry.getXOff());
+ advY += (cacheEntry.getYAdvance() - cacheEntry.getYOff());
+ }
+ /*
+ * Offset of the current glyph is the difference to the last
+ * glyph and this one
+ */
+ eltList.setXOff(eltIndex, (posX - oldPosX));
+ eltList.setYOff(eltIndex, (posY - oldPosY));
+
+ oldPosX = posX;
+ oldPosY = posY;
+
+ } else {
+ eltList.setCharCnt(eltIndex, eltList.getCharCnt(eltIndex) + 1);
+ }
+ }
+
+ int maskFormat = containsLCDGlyphs ? XRUtils.PictStandardARGB32 : XRUtils.PictStandardA8;
+ maskBuffer.compositeText(x11sd.picture, 0, maskFormat, eltList);
+
+ eltList.clear();
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java b/src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java
index 7935f0cf9..627048449 100644
--- a/src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java
+++ b/src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java
@@ -33,6 +33,7 @@ import sun.awt.image.VolatileSurfaceManager;
import sun.java2d.opengl.GLXGraphicsConfig;
import sun.java2d.opengl.GLXVolatileSurfaceManager;
import sun.java2d.x11.X11VolatileSurfaceManager;
+import sun.java2d.xr.*;
/**
* The SurfaceManagerFactory that creates VolatileSurfaceManager
@@ -54,9 +55,12 @@ public class UnixSurfaceManagerFactory extends SurfaceManagerFactory {
Object context)
{
GraphicsConfiguration gc = vImg.getGraphicsConfig();
+
if (gc instanceof GLXGraphicsConfig) {
return new GLXVolatileSurfaceManager(vImg, context);
- } else {
+ } else if(gc instanceof XRGraphicsConfig) {
+ return new XRVolatileSurfaceManager(vImg, context);
+ }else {
return new X11VolatileSurfaceManager(vImg, context);
}
}
diff --git a/src/solaris/classes/sun/java2d/jules/IdleTileCache.java b/src/solaris/classes/sun/java2d/jules/IdleTileCache.java
new file mode 100644
index 000000000..2ea09a308
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/jules/IdleTileCache.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.jules;
+
+import java.util.*;
+
+public class IdleTileCache {
+ final static int IDLE_TILE_SYNC_GRANULARITY = 16;
+ final static ArrayList<JulesTile> idleBuffers = new ArrayList<JulesTile>();
+
+ ArrayList<JulesTile> idleTileWorkerCacheList = new ArrayList<JulesTile>();
+ ArrayList<JulesTile> idleTileConsumerCacheList =
+ new ArrayList<JulesTile>(IDLE_TILE_SYNC_GRANULARITY);
+
+ /**
+ * Return a cached Tile, if possible from cache.
+ * Allowed caller: Rasterizer/Producer-Thread
+ *
+ * @param: maxCache - Specify the maximum amount of tiles needed
+ */
+ public JulesTile getIdleTileWorker(int maxCache) {
+ /* Try to fetch idle tiles from the global cache list */
+ if (idleTileWorkerCacheList.size() == 0) {
+ idleTileWorkerCacheList.ensureCapacity(maxCache);
+
+ synchronized (idleBuffers) {
+ for (int i = 0; i < maxCache && idleBuffers.size() > 0; i++) {
+ idleTileWorkerCacheList.add(
+ idleBuffers.remove(idleBuffers.size() - 1));
+ }
+ }
+ }
+
+ if (idleTileWorkerCacheList.size() > 0) {
+ return idleTileWorkerCacheList.remove(idleTileWorkerCacheList.size() - 1);
+ }
+
+ return new JulesTile();
+ }
+
+ /**
+ * Release tile and allow it to be re-used by another thread. Allowed
+ * Allowed caller: MaskBlit/Consumer-Thread
+ */
+ public void releaseTile(JulesTile tile) {
+ if (tile != null && tile.hasBuffer()) {
+ idleTileConsumerCacheList.add(tile);
+
+ if (idleTileConsumerCacheList.size() > IDLE_TILE_SYNC_GRANULARITY) {
+ synchronized (idleBuffers) {
+ idleBuffers.addAll(idleTileConsumerCacheList);
+ }
+ idleTileConsumerCacheList.clear();
+ }
+ }
+ }
+
+ /**
+ * Releases thread-local tiles cached for use by the rasterizing thread.
+ * Allowed caller: Rasterizer/Producer-Thread
+ */
+ public void disposeRasterizerResources() {
+ releaseTiles(idleTileWorkerCacheList);
+ }
+
+ /**
+ * Releases thread-local tiles cached for performance reasons. Allowed
+ * Allowed caller: MaskBlit/Consumer-Thread
+ */
+ public void disposeConsumerResources() {
+ releaseTiles(idleTileConsumerCacheList);
+ }
+
+ /**
+ * Release a list of tiles and allow it to be re-used by another thread.
+ * Thread safe.
+ */
+ public void releaseTiles(List<JulesTile> tileList) {
+ if (tileList.size() > 0) {
+ synchronized (idleBuffers) {
+ idleBuffers.addAll(tileList);
+ }
+ tileList.clear();
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java b/src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java
new file mode 100644
index 000000000..218386ffe
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.jules;
+
+import java.awt.*;
+import java.awt.geom.*;
+import java.util.concurrent.*;
+import sun.java2d.pipe.*;
+import sun.java2d.xr.*;
+
+public class JulesAATileGenerator implements AATileGenerator {
+ /* Threading stuff */
+ final static ExecutorService rasterThreadPool =
+ Executors.newCachedThreadPool();
+ final static int CPU_CNT = Runtime.getRuntime().availableProcessors();
+
+ final static boolean ENABLE_THREADING = false;
+ final static int THREAD_MIN = 16;
+ final static int THREAD_BEGIN = 16;
+
+ IdleTileCache tileCache;
+ TileWorker worker;
+ boolean threaded = false;
+ int rasterTileCnt;
+
+ /* Tiling */
+ final static int TILE_SIZE = 32;
+ final static int TILE_SIZE_FP = 32 << 16;
+ int left, right, top, bottom, width, height;
+ int leftFP, topFP;
+ int tileCnt, tilesX, tilesY;
+ int currTilePos = 0;
+ TrapezoidList traps;
+ TileTrapContainer[] tiledTrapArray;
+ JulesTile mainTile;
+
+ public JulesAATileGenerator(Shape s, AffineTransform at, Region clip,
+ BasicStroke bs, boolean thin,
+ boolean normalize, int[] bbox) {
+ JulesPathBuf buf = new JulesPathBuf();
+
+ if (bs == null) {
+ traps = buf.tesselateFill(s, at, clip);
+ } else {
+ traps = buf.tesselateStroke(s, bs, thin, false, true, at, clip);
+ }
+
+ calculateArea(bbox);
+ bucketSortTraps();
+ calculateTypicalAlpha();
+
+ threaded = ENABLE_THREADING &&
+ rasterTileCnt >= THREAD_MIN && CPU_CNT >= 2;
+ if (threaded) {
+ tileCache = new IdleTileCache();
+ worker = new TileWorker(this, THREAD_BEGIN, tileCache);
+ rasterThreadPool.execute(worker);
+ }
+
+ mainTile = new JulesTile();
+ }
+
+ private static native long
+ rasterizeTrapezoidsNative(long pixmanImagePtr, int[] traps,
+ int[] trapPos, int trapCnt,
+ byte[] buffer, int xOff, int yOff);
+
+ private static native void freePixmanImgPtr(long pixmanImgPtr);
+
+ private void calculateArea(int[] bbox) {
+ tilesX = 0;
+ tilesY = 0;
+ tileCnt = 0;
+ bbox[0] = 0;
+ bbox[1] = 0;
+ bbox[2] = 0;
+ bbox[3] = 0;
+
+ if (traps.getSize() > 0) {
+ left = traps.getLeft();
+ right = traps.getRight();
+ top = traps.getTop();
+ bottom = traps.getBottom();
+ leftFP = left << 16;
+ topFP = top << 16;
+
+ bbox[0] = left;
+ bbox[1] = top;
+ bbox[2] = right;
+ bbox[3] = bottom;
+
+ width = right - left;
+ height = bottom - top;
+
+ if (width > 0 && height > 0) {
+ tilesX = (int) Math.ceil(((double) width) / TILE_SIZE);
+ tilesY = (int) Math.ceil(((double) height) / TILE_SIZE);
+ tileCnt = tilesY * tilesX;
+ tiledTrapArray = new TileTrapContainer[tileCnt];
+ } else {
+ // If there is no area touched by the traps, don't
+ // render them.
+ traps.setSize(0);
+ }
+ }
+ }
+
+
+ private void bucketSortTraps() {
+
+ for (int i = 0; i < traps.getSize(); i++) {
+ int top = traps.getTop(i) - XRUtils.XDoubleToFixed(this.top);
+ int bottom = traps.getBottom(i) - topFP;
+ int p1xLeft = traps.getP1XLeft(i) - leftFP;
+ int p2xLeft = traps.getP2XLeft(i) - leftFP;
+ int p1xRight = traps.getP1XRight(i) - leftFP;
+ int p2xRight = traps.getP2XRight(i) - leftFP;
+
+ int minLeft = Math.min(p1xLeft, p2xLeft);
+ int maxRight = Math.max(p1xRight, p2xRight);
+
+ maxRight = maxRight > 0 ? maxRight - 1 : maxRight;
+ bottom = bottom > 0 ? bottom - 1 : bottom;
+
+ int startTileY = top / TILE_SIZE_FP;
+ int endTileY = bottom / TILE_SIZE_FP;
+ int startTileX = minLeft / TILE_SIZE_FP;
+ int endTileX = maxRight / TILE_SIZE_FP;
+
+ for (int n = startTileY; n <= endTileY; n++) {
+
+ for (int m = startTileX; m <= endTileX; m++) {
+ int trapArrayPos = n * tilesX + m;
+ TileTrapContainer trapTileList = tiledTrapArray[trapArrayPos];
+ if (trapTileList == null) {
+ trapTileList = new TileTrapContainer(new GrowableIntArray(1, 16));
+ tiledTrapArray[trapArrayPos] = trapTileList;
+ }
+
+ trapTileList.getTraps().addInt(i);
+ }
+ }
+ }
+ }
+
+ public void getAlpha(byte[] tileBuffer, int offset, int rowstride) {
+ JulesTile tile = null;
+
+ if (threaded) {
+ tile = worker.getPreRasterizedTile(currTilePos);
+ }
+
+ if (tile != null) {
+ System.arraycopy(tile.getImgBuffer(), 0,
+ tileBuffer, 0, tileBuffer.length);
+ tileCache.releaseTile(tile);
+ } else {
+ mainTile.setImgBuffer(tileBuffer);
+ rasterizeTile(currTilePos, mainTile);
+ }
+
+ nextTile();
+ }
+
+ public void calculateTypicalAlpha() {
+ rasterTileCnt = 0;
+
+ for (int index = 0; index < tileCnt; index++) {
+
+ TileTrapContainer trapCont = tiledTrapArray[index];
+ if (trapCont != null) {
+ GrowableIntArray trapList = trapCont.getTraps();
+
+ int tileAlpha = 127;
+ if (trapList == null || trapList.getSize() == 0) {
+ tileAlpha = 0;
+ } else if (doTrapsCoverTile(trapList, index)) {
+ tileAlpha = 0xff;
+ }
+
+ if (tileAlpha == 127 || tileAlpha == 0xff) {
+ rasterTileCnt++;
+ }
+
+ trapCont.setTileAlpha(tileAlpha);
+ }
+ }
+ }
+
+ /*
+ * Optimization for large fills. Foutunatly cairo does generate an y-sorted
+ * list of trapezoids. This makes it quite simple to check wether a tile is
+ * fully covered by traps by: - Checking wether the tile is fully covered by
+ * traps vertically (trap 2 starts where trap 1 ended) - Checking wether all
+ * traps cover the tile horizontally This also works, when a single tile
+ * coveres the whole tile.
+ */
+ protected boolean doTrapsCoverTile(GrowableIntArray trapList, int tileIndex) {
+
+ // Don't bother optimizing tiles with lots of traps, usually it won't
+ // succeed anyway.
+ if (trapList.getSize() > TILE_SIZE) {
+ return false;
+ }
+
+ int tileStartX = getXPos(tileIndex) * TILE_SIZE_FP + leftFP;
+ int tileStartY = getYPos(tileIndex) * TILE_SIZE_FP + topFP;
+ int tileEndX = tileStartX + TILE_SIZE_FP;
+ int tileEndY = tileStartY + TILE_SIZE_FP;
+
+ // Check wether first tile covers the beginning of the tile vertically
+ int firstTop = traps.getTop(trapList.getInt(0));
+ int firstBottom = traps.getBottom(trapList.getInt(0));
+ if (firstTop > tileStartY || firstBottom < tileStartY) {
+ return false;
+ }
+
+ // Initialize lastBottom with top, in order to pass the checks for the
+ // first iteration
+ int lastBottom = firstTop;
+
+ for (int i = 0; i < trapList.getSize(); i++) {
+ int trapPos = trapList.getInt(i);
+ if (traps.getP1XLeft(trapPos) > tileStartX ||
+ traps.getP2XLeft(trapPos) > tileStartX ||
+ traps.getP1XRight(trapPos) < tileEndX ||
+ traps.getP2XRight(trapPos) < tileEndX ||
+ traps.getTop(trapPos) != lastBottom)
+ {
+ return false;
+ }
+ lastBottom = traps.getBottom(trapPos);
+ }
+
+ // When the last trap covered the tileEnd vertically, the tile is fully
+ // covered
+ return lastBottom >= tileEndY;
+ }
+
+ public int getTypicalAlpha() {
+ if (tiledTrapArray[currTilePos] == null) {
+ return 0;
+ } else {
+ return tiledTrapArray[currTilePos].getTileAlpha();
+ }
+ }
+
+ public void dispose() {
+ freePixmanImgPtr(mainTile.getPixmanImgPtr());
+
+ if (threaded) {
+ tileCache.disposeConsumerResources();
+ worker.disposeConsumerResources();
+ }
+ }
+
+ protected JulesTile rasterizeTile(int tileIndex, JulesTile tile) {
+ int tileOffsetX = left + getXPos(tileIndex) * TILE_SIZE;
+ int tileOffsetY = top + getYPos(tileIndex) * TILE_SIZE;
+ TileTrapContainer trapCont = tiledTrapArray[tileIndex];
+ GrowableIntArray trapList = trapCont.getTraps();
+
+ if (trapCont.getTileAlpha() == 127) {
+ long pixmanImgPtr =
+ rasterizeTrapezoidsNative(tile.getPixmanImgPtr(),
+ traps.getTrapArray(),
+ trapList.getArray(),
+ trapList.getSize(),
+ tile.getImgBuffer(),
+ tileOffsetX, tileOffsetY);
+ tile.setPixmanImgPtr(pixmanImgPtr);
+ }
+
+ tile.setTilePos(tileIndex);
+ return tile;
+ }
+
+ protected int getXPos(int arrayPos) {
+ return arrayPos % tilesX;
+ }
+
+ protected int getYPos(int arrayPos) {
+ return arrayPos / tilesX;
+ }
+
+ public void nextTile() {
+ currTilePos++;
+ }
+
+ public int getTileHeight() {
+ return TILE_SIZE;
+ }
+
+ public int getTileWidth() {
+ return TILE_SIZE;
+ }
+
+ public int getTileCount() {
+ return tileCnt;
+ }
+
+ public TileTrapContainer getTrapContainer(int index) {
+ return tiledTrapArray[index];
+ }
+}
+
+class TileTrapContainer {
+ int tileAlpha;
+ GrowableIntArray traps;
+
+ public TileTrapContainer(GrowableIntArray traps) {
+ this.traps = traps;
+ }
+
+ public void setTileAlpha(int tileAlpha) {
+ this.tileAlpha = tileAlpha;
+ }
+
+ public int getTileAlpha() {
+ return tileAlpha;
+ }
+
+ public GrowableIntArray getTraps() {
+ return traps;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/jules/JulesPathBuf.java b/src/solaris/classes/sun/java2d/jules/JulesPathBuf.java
new file mode 100644
index 000000000..00c9407e7
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/jules/JulesPathBuf.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.jules;
+
+import java.awt.*;
+import java.awt.geom.*;
+import sun.awt.X11GraphicsEnvironment;
+import sun.java2d.pipe.*;
+import sun.java2d.xr.*;
+
+public class JulesPathBuf {
+ static final double[] emptyDash = new double[0];
+
+ private static final byte CAIRO_PATH_OP_MOVE_TO = 0;
+ private static final byte CAIRO_PATH_OP_LINE_TO = 1;
+ private static final byte CAIRO_PATH_OP_CURVE_TO = 2;
+ private static final byte CAIRO_PATH_OP_CLOSE_PATH = 3;
+
+ private static final int CAIRO_FILL_RULE_WINDING = 0;
+ private static final int CAIRO_FILL_RULE_EVEN_ODD = 1;
+
+ GrowablePointArray points = new GrowablePointArray(128);
+ GrowableByteArray ops = new GrowableByteArray(1, 128);
+ int[] xTrapArray = new int[512];
+
+ private static final boolean isCairoAvailable;
+
+ static {
+ isCairoAvailable =
+ java.security.AccessController.doPrivileged(
+ new java.security.PrivilegedAction<Boolean>() {
+ public Boolean run() {
+ boolean loadSuccess = false;
+ if (X11GraphicsEnvironment.isXRenderAvailable()) {
+ try {
+ System.loadLibrary("jules");
+ loadSuccess = true;
+ if (X11GraphicsEnvironment.isXRenderVerbose()) {
+ System.out.println(
+ "Xrender: INFO: Jules library loaded");
+ }
+ } catch (UnsatisfiedLinkError ex) {
+ loadSuccess = false;
+ if (X11GraphicsEnvironment.isXRenderVerbose()) {
+ System.out.println(
+ "Xrender: INFO: Jules library not installed.");
+ }
+ }
+ }
+ return Boolean.valueOf(loadSuccess);
+ }
+ });
+ }
+
+ public static boolean isCairoAvailable() {
+ return isCairoAvailable;
+ }
+
+ public TrapezoidList tesselateFill(Shape s, AffineTransform at, Region clip) {
+ int windingRule = convertPathData(s, at);
+ xTrapArray[0] = 0;
+
+ xTrapArray = tesselateFillNative(points.getArray(), ops.getArray(),
+ points.getSize(), ops.getSize(),
+ xTrapArray, xTrapArray.length,
+ getCairoWindingRule(windingRule),
+ clip.getLoX(), clip.getLoY(),
+ clip.getHiX(), clip.getHiY());
+
+ return new TrapezoidList(xTrapArray);
+ }
+
+ public TrapezoidList tesselateStroke(Shape s, BasicStroke bs, boolean thin,
+ boolean adjust, boolean antialias,
+ AffineTransform at, Region clip) {
+
+ float lw;
+ if (thin) {
+ if (antialias) {
+ lw = 0.5f;
+ } else {
+ lw = 1.0f;
+ }
+ } else {
+ lw = bs.getLineWidth();
+ }
+
+ convertPathData(s, at);
+
+ double[] dashArray = floatToDoubleArray(bs.getDashArray());
+ xTrapArray[0] = 0;
+
+ xTrapArray =
+ tesselateStrokeNative(points.getArray(), ops.getArray(),
+ points.getSize(), ops.getSize(),
+ xTrapArray, xTrapArray.length, lw,
+ bs.getEndCap(), bs.getLineJoin(),
+ bs.getMiterLimit(), dashArray,
+ dashArray.length, bs.getDashPhase(),
+ 1, 0, 0, 0, 1, 0,
+ clip.getLoX(), clip.getLoY(),
+ clip.getHiX(), clip.getHiY());
+
+ return new TrapezoidList(xTrapArray);
+ }
+
+ protected double[] floatToDoubleArray(float[] dashArrayFloat) {
+ double[] dashArrayDouble = emptyDash;
+ if (dashArrayFloat != null) {
+ dashArrayDouble = new double[dashArrayFloat.length];
+
+ for (int i = 0; i < dashArrayFloat.length; i++) {
+ dashArrayDouble[i] = dashArrayFloat[i];
+ }
+ }
+
+ return dashArrayDouble;
+ }
+
+ protected int convertPathData(Shape s, AffineTransform at) {
+ PathIterator pi = s.getPathIterator(at);
+
+ double[] coords = new double[6];
+ double currX = 0;
+ double currY = 0;
+
+ while (!pi.isDone()) {
+ int curOp = pi.currentSegment(coords);
+
+ int pointIndex;
+ switch (curOp) {
+
+ case PathIterator.SEG_MOVETO:
+ ops.addByte(CAIRO_PATH_OP_MOVE_TO);
+ pointIndex = points.getNextIndex();
+ points.setX(pointIndex, DoubleToCairoFixed(coords[0]));
+ points.setY(pointIndex, DoubleToCairoFixed(coords[1]));
+ currX = coords[0];
+ currY = coords[1];
+ break;
+
+ case PathIterator.SEG_LINETO:
+ ops.addByte(CAIRO_PATH_OP_LINE_TO);
+ pointIndex = points.getNextIndex();
+ points.setX(pointIndex, DoubleToCairoFixed(coords[0]));
+ points.setY(pointIndex, DoubleToCairoFixed(coords[1]));
+ currX = coords[0];
+ currY = coords[1];
+ break;
+
+ /**
+ * q0 = p0
+ * q1 = (p0+2*p1)/3
+ * q2 = (p2+2*p1)/3
+ * q3 = p2
+ */
+ case PathIterator.SEG_QUADTO:
+ double x1 = coords[0];
+ double y1 = coords[1];
+ double x2, y2;
+ double x3 = coords[2];
+ double y3 = coords[3];
+
+ x2 = x1 + (x3 - x1) / 3;
+ y2 = y1 + (y3 - y1) / 3;
+ x1 = currX + 2 * (x1 - currX) / 3;
+ y1 =currY + 2 * (y1 - currY) / 3;
+
+ ops.addByte(CAIRO_PATH_OP_CURVE_TO);
+ pointIndex = points.getNextIndex();
+ points.setX(pointIndex, DoubleToCairoFixed(x1));
+ points.setY(pointIndex, DoubleToCairoFixed(y1));
+ pointIndex = points.getNextIndex();
+ points.setX(pointIndex, DoubleToCairoFixed(x2));
+ points.setY(pointIndex, DoubleToCairoFixed(y2));
+ pointIndex = points.getNextIndex();
+ points.setX(pointIndex, DoubleToCairoFixed(x3));
+ points.setY(pointIndex, DoubleToCairoFixed(y3));
+ currX = x3;
+ currY = y3;
+ break;
+
+ case PathIterator.SEG_CUBICTO:
+ ops.addByte(CAIRO_PATH_OP_CURVE_TO);
+ pointIndex = points.getNextIndex();
+ points.setX(pointIndex, DoubleToCairoFixed(coords[0]));
+ points.setY(pointIndex, DoubleToCairoFixed(coords[1]));
+ pointIndex = points.getNextIndex();
+ points.setX(pointIndex, DoubleToCairoFixed(coords[2]));
+ points.setY(pointIndex, DoubleToCairoFixed(coords[3]));
+ pointIndex = points.getNextIndex();
+ points.setX(pointIndex, DoubleToCairoFixed(coords[4]));
+ points.setY(pointIndex, DoubleToCairoFixed(coords[5]));
+ currX = coords[4];
+ currY = coords[5];
+ break;
+
+ case PathIterator.SEG_CLOSE:
+ ops.addByte(CAIRO_PATH_OP_CLOSE_PATH);
+ break;
+ }
+
+ pi.next();
+ }
+
+ return pi.getWindingRule();
+ }
+
+ private static native int[]
+ tesselateStrokeNative(int[] pointArray, byte[] ops,
+ int pointCnt, int opCnt,
+ int[] xTrapArray, int xTrapArrayLength,
+ double lineWidth, int lineCap, int lineJoin,
+ double miterLimit, double[] dashArray,
+ int dashCnt, double offset,
+ double m00, double m01, double m02,
+ double m10, double m11, double m12,
+ int clipLowX, int clipLowY,
+ int clipWidth, int clipHeight);
+
+ private static native int[]
+ tesselateFillNative(int[] pointArray, byte[] ops, int pointCnt,
+ int opCnt, int[] xTrapArray, int xTrapArrayLength,
+ int windingRule, int clipLowX, int clipLowY, int clipWidth, int clipHeight);
+
+ public void clear() {
+ points.clear();
+ ops.clear();
+ xTrapArray[0] = 0;
+ }
+
+ private static int DoubleToCairoFixed(double dbl) {
+ return (int) (dbl * 256);
+ }
+
+ private static int getCairoWindingRule(int j2dWindingRule) {
+ switch(j2dWindingRule) {
+ case PathIterator.WIND_EVEN_ODD:
+ return CAIRO_FILL_RULE_EVEN_ODD;
+
+ case PathIterator.WIND_NON_ZERO:
+ return CAIRO_FILL_RULE_WINDING;
+
+ default:
+ throw new IllegalArgumentException("Illegal Java2D winding rule specified");
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/jules/JulesRenderingEngine.java b/src/solaris/classes/sun/java2d/jules/JulesRenderingEngine.java
new file mode 100644
index 000000000..c65e1761a
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/jules/JulesRenderingEngine.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.jules;
+
+import java.awt.*;
+
+import java.awt.geom.*;
+import sun.java2d.pipe.*;
+import sun.java2d.pisces.*;
+
+public class JulesRenderingEngine extends PiscesRenderingEngine {
+
+ @Override
+ public AATileGenerator
+ getAATileGenerator(Shape s, AffineTransform at, Region clip,
+ BasicStroke bs, boolean thin,
+ boolean normalize, int[] bbox) {
+
+ if (JulesPathBuf.isCairoAvailable()) {
+ return new JulesAATileGenerator(s, at, clip, bs, thin,
+ normalize, bbox);
+ } else {
+ return super.getAATileGenerator(s, at, clip, bs, thin,
+ normalize, bbox);
+ }
+ }
+
+ public float getMinimumAAPenSize() {
+ return 0.5f;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/jules/JulesShapePipe.java b/src/solaris/classes/sun/java2d/jules/JulesShapePipe.java
new file mode 100644
index 000000000..22e56d186
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/jules/JulesShapePipe.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.jules;
+
+import java.awt.*;
+import sun.awt.*;
+import sun.java2d.*;
+import sun.java2d.pipe.*;
+import sun.java2d.xr.*;
+
+public class JulesShapePipe implements ShapeDrawPipe {
+
+ XRCompositeManager compMan;
+ JulesPathBuf buf = new JulesPathBuf();
+
+ public JulesShapePipe(XRCompositeManager compMan) {
+ this.compMan = compMan;
+ }
+
+ /**
+ * Common validate method, used by all XRRender functions to validate the
+ * destination context.
+ */
+ private final void validateSurface(SunGraphics2D sg2d) {
+ XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData;
+ xrsd.validateAsDestination(sg2d, sg2d.getCompClip());
+ xrsd.maskBuffer.validateCompositeState(sg2d.composite, sg2d.transform,
+ sg2d.paint, sg2d);
+ }
+
+ public void draw(SunGraphics2D sg2d, Shape s) {
+ try {
+ SunToolkit.awtLock();
+ validateSurface(sg2d);
+ XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData;
+
+ BasicStroke bs;
+
+ if (sg2d.stroke instanceof BasicStroke) {
+ bs = (BasicStroke) sg2d.stroke;
+ } else { //TODO: What happens in the case of a !BasicStroke??
+ s = sg2d.stroke.createStrokedShape(s);
+ bs = null;
+ }
+
+ boolean adjust =
+ (bs != null && sg2d.strokeHint != SunHints.INTVAL_STROKE_PURE);
+ boolean thin = (sg2d.strokeState <= SunGraphics2D.STROKE_THINDASHED);
+
+ TrapezoidList traps =
+ buf.tesselateStroke(s, bs, thin, adjust, true,
+ sg2d.transform, sg2d.getCompClip());
+ compMan.XRCompositeTraps(xrsd.picture,
+ sg2d.transX, sg2d.transY, traps);
+
+ buf.clear();
+
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ public void fill(SunGraphics2D sg2d, Shape s) {
+ try {
+ SunToolkit.awtLock();
+ validateSurface(sg2d);
+
+ XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData;
+
+ TrapezoidList traps = buf.tesselateFill(s, sg2d.transform,
+ sg2d.getCompClip());
+ compMan.XRCompositeTraps(xrsd.picture, 0, 0, traps);
+
+ buf.clear();
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/jules/JulesTile.java b/src/solaris/classes/sun/java2d/jules/JulesTile.java
new file mode 100644
index 000000000..dc973d1d3
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/jules/JulesTile.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.jules;
+
+public class JulesTile {
+ byte[] imgBuffer;
+ long pixmanImgPtr = 0;
+ int tilePos;
+
+ public JulesTile() {
+ }
+
+ public byte[] getImgBuffer() {
+ if(imgBuffer == null) {
+ imgBuffer = new byte[1024];
+ }
+
+ return imgBuffer;
+ }
+
+ public long getPixmanImgPtr() {
+ return pixmanImgPtr;
+ }
+
+ public void setPixmanImgPtr(long pixmanImgPtr) {
+ this.pixmanImgPtr = pixmanImgPtr;
+ }
+
+ public boolean hasBuffer() {
+ return imgBuffer != null;
+ }
+
+ public int getTilePos() {
+ return tilePos;
+ }
+
+ public void setTilePos(int tilePos) {
+ this.tilePos = tilePos;
+ }
+
+ public void setImgBuffer(byte[] imgBuffer){
+ this.imgBuffer = imgBuffer;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/jules/TileWorker.java b/src/solaris/classes/sun/java2d/jules/TileWorker.java
new file mode 100644
index 000000000..8410261f4
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/jules/TileWorker.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.jules;
+
+import java.util.*;
+
+public class TileWorker implements Runnable {
+ final static int RASTERIZED_TILE_SYNC_GRANULARITY = 8;
+ final ArrayList<JulesTile> rasterizedTileConsumerCache =
+ new ArrayList<JulesTile>();
+ final LinkedList<JulesTile> rasterizedBuffers = new LinkedList<JulesTile>();
+
+ IdleTileCache tileCache;
+ JulesAATileGenerator tileGenerator;
+ int workerStartIndex;
+ volatile int consumerPos = 0;
+
+ /* Threading statistics */
+ int mainThreadCnt = 0;
+ int workerCnt = 0;
+ int doubled = 0;
+
+ public TileWorker(JulesAATileGenerator tileGenerator, int workerStartIndex, IdleTileCache tileCache) {
+ this.tileGenerator = tileGenerator;
+ this.workerStartIndex = workerStartIndex;
+ this.tileCache = tileCache;
+ }
+
+ public void run() {
+ ArrayList<JulesTile> tiles = new ArrayList<JulesTile>(16);
+
+ for (int i = workerStartIndex; i < tileGenerator.getTileCount(); i++) {
+ TileTrapContainer tile = tileGenerator.getTrapContainer(i);
+
+ if (tile != null && tile.getTileAlpha() == 127) {
+ JulesTile rasterizedTile =
+ tileGenerator.rasterizeTile(i,
+ tileCache.getIdleTileWorker(
+ tileGenerator.getTileCount() - i - 1));
+ tiles.add(rasterizedTile);
+
+ if (tiles.size() > RASTERIZED_TILE_SYNC_GRANULARITY) {
+ addRasterizedTiles(tiles);
+ tiles.clear();
+ }
+ }
+
+ i = Math.max(i, consumerPos + RASTERIZED_TILE_SYNC_GRANULARITY / 2);
+ }
+ addRasterizedTiles(tiles);
+
+ tileCache.disposeRasterizerResources();
+ }
+
+ /**
+ * Returns a rasterized tile for the specified tilePos,
+ * or null if it isn't available.
+ * Allowed caller: MaskBlit/Consumer-Thread
+ */
+ public JulesTile getPreRasterizedTile(int tilePos) {
+ JulesTile tile = null;
+
+ if (rasterizedTileConsumerCache.size() == 0 &&
+ tilePos >= workerStartIndex)
+ {
+ synchronized (rasterizedBuffers) {
+ rasterizedTileConsumerCache.addAll(rasterizedBuffers);
+ rasterizedBuffers.clear();
+ }
+ }
+
+ while (tile == null && rasterizedTileConsumerCache.size() > 0) {
+ JulesTile t = rasterizedTileConsumerCache.get(0);
+
+ if (t.getTilePos() > tilePos) {
+ break;
+ }
+
+ if (t.getTilePos() < tilePos) {
+ tileCache.releaseTile(t);
+ doubled++;
+ }
+
+ if (t.getTilePos() <= tilePos) {
+ rasterizedTileConsumerCache.remove(0);
+ }
+
+ if (t.getTilePos() == tilePos) {
+ tile = t;
+ }
+ }
+
+ if (tile == null) {
+ mainThreadCnt++;
+
+ // If there are no tiles left, tell the producer the current
+ // position. This avoids producing tiles twice.
+ consumerPos = tilePos;
+ } else {
+ workerCnt++;
+ }
+
+ return tile;
+ }
+
+ private void addRasterizedTiles(ArrayList<JulesTile> tiles) {
+ synchronized (rasterizedBuffers) {
+ rasterizedBuffers.addAll(tiles);
+ }
+ }
+
+ /**
+ * Releases cached tiles.
+ * Allowed caller: MaskBlit/Consumer-Thread
+ */
+ public void disposeConsumerResources() {
+ synchronized (rasterizedBuffers) {
+ tileCache.releaseTiles(rasterizedBuffers);
+ }
+
+ tileCache.releaseTiles(rasterizedTileConsumerCache);
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/jules/TrapezoidList.java b/src/solaris/classes/sun/java2d/jules/TrapezoidList.java
new file mode 100644
index 000000000..00368f004
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/jules/TrapezoidList.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.jules;
+
+public class TrapezoidList {
+ public static final int TRAP_START_INDEX = 5;
+ public static final int TRAP_SIZE = 10;
+
+ int[] trapArray;
+
+ public TrapezoidList(int[] trapArray) {
+ this.trapArray = trapArray;
+ }
+
+ public final int[] getTrapArray() {
+ return trapArray;
+ }
+
+ public final int getSize() {
+ return trapArray[0];
+ }
+
+ public final void setSize(int size) {
+ trapArray[0] = 0;
+ }
+
+ public final int getLeft() {
+ return trapArray[1];
+ }
+
+ public final int getTop() {
+ return trapArray[2];
+ }
+
+ public final int getRight() {
+ return trapArray[3];
+ }
+
+ public final int getBottom() {
+ return trapArray[4];
+ }
+
+
+ private final int getTrapStartAddresse(int pos) {
+ return TRAP_START_INDEX + TRAP_SIZE * pos;
+ }
+
+ public final int getTop(int pos) {
+ return trapArray[getTrapStartAddresse(pos) + 0];
+ }
+
+ public final int getBottom(int pos) {
+ return trapArray[getTrapStartAddresse(pos) + 1];
+ }
+
+ public final int getP1XLeft(int pos) {
+ return trapArray[getTrapStartAddresse(pos) + 2];
+ }
+
+ public final int getP1YLeft(int pos) {
+ return trapArray[getTrapStartAddresse(pos) + 3];
+ }
+
+ public final int getP2XLeft(int pos) {
+ return trapArray[getTrapStartAddresse(pos) + 4];
+ }
+
+ public final int getP2YLeft(int pos) {
+ return trapArray[getTrapStartAddresse(pos) + 5];
+ }
+
+ public final int getP1XRight(int pos) {
+ return trapArray[getTrapStartAddresse(pos) + 6];
+ }
+
+ public final int getP1YRight(int pos) {
+ return trapArray[getTrapStartAddresse(pos) + 7];
+ }
+
+ public final int getP2XRight(int pos) {
+ return trapArray[getTrapStartAddresse(pos) + 8];
+ }
+
+ public final int getP2YRight(int pos) {
+ return trapArray[getTrapStartAddresse(pos) + 9];
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java b/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java
index e94f85223..81adf8315 100644
--- a/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java
+++ b/src/solaris/classes/sun/java2d/x11/X11SurfaceData.java
@@ -46,6 +46,7 @@ import sun.awt.SunHints;
import sun.awt.SunToolkit;
import sun.awt.X11ComponentPeer;
import sun.awt.X11GraphicsConfig;
+import sun.awt.X11GraphicsEnvironment;
import sun.awt.image.PixelConverter;
import sun.font.X11TextRenderer;
import sun.java2d.InvalidPipeException;
@@ -64,7 +65,7 @@ import sun.java2d.pipe.PixelToShapeConverter;
import sun.java2d.pipe.TextPipe;
import sun.java2d.pipe.Region;
-public abstract class X11SurfaceData extends SurfaceData {
+public abstract class X11SurfaceData extends XSurfaceData {
X11ComponentPeer peer;
X11GraphicsConfig graphicsConfig;
private RenderLoops solidloops;
@@ -74,8 +75,6 @@ public abstract class X11SurfaceData extends SurfaceData {
private static native void initIDs(Class xorComp, boolean tryDGA);
protected native void initSurface(int depth, int width, int height,
long drawable);
- native boolean isDrawableValid();
- protected native void flushNativeSurface();
public static final String
DESC_INT_BGR_X11 = "Integer BGR Pixmap";
@@ -212,7 +211,8 @@ public abstract class X11SurfaceData extends SurfaceData {
protected static boolean dgaAvailable;
static {
- if (!GraphicsEnvironment.isHeadless()) {
+ if (!isX11SurfaceDataInitialized() &&
+ !GraphicsEnvironment.isHeadless()) {
// If a screen magnifier is present, don't attempt to use DGA
String magPresent = (String) java.security.AccessController.doPrivileged
(new sun.security.action.GetPropertyAction("javax.accessibility.screen_magnifier_present"));
@@ -245,7 +245,7 @@ public abstract class X11SurfaceData extends SurfaceData {
X11PMBlitLoops.register();
X11PMBlitBgLoops.register();
}
- }
+ }
}
/**
@@ -432,11 +432,11 @@ public abstract class X11SurfaceData extends SurfaceData {
cm, drawable, transparency);
}
- /**
- * Initializes the native Ops pointer.
- */
- private native void initOps(X11ComponentPeer peer,
- X11GraphicsConfig gc, int depth);
+// /**
+// * Initializes the native Ops pointer.
+// */
+// private native void initOps(X11ComponentPeer peer,
+// X11GraphicsConfig gc, int depth);
protected X11SurfaceData(X11ComponentPeer peer,
X11GraphicsConfig gc,
@@ -613,8 +613,6 @@ public abstract class X11SurfaceData extends SurfaceData {
return sType;
}
- public native void setInvalid();
-
public void invalidate() {
if (isValid()) {
setInvalid();
@@ -628,16 +626,9 @@ public abstract class X11SurfaceData extends SurfaceData {
* X11SurfaceData object.
*/
- private static native long XCreateGC(long pXSData);
- private static native void XResetClip(long xgc);
- private static native void XSetClip(long xgc,
- int lox, int loy, int hix, int hiy,
- Region complexclip);
private static native void XSetCopyMode(long xgc);
private static native void XSetXorMode(long xgc);
private static native void XSetForeground(long xgc, int pixel);
- private static native void XSetGraphicsExposures(long xgc,
- boolean needExposures);
private long xgc;
private Region validatedClip;
diff --git a/src/solaris/classes/sun/java2d/x11/XSurfaceData.java b/src/solaris/classes/sun/java2d/x11/XSurfaceData.java
new file mode 100644
index 000000000..8e71a80a0
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/x11/XSurfaceData.java
@@ -0,0 +1,40 @@
+package sun.java2d.x11;
+
+import java.awt.image.*;
+
+import sun.awt.*;
+import sun.java2d.*;
+import sun.java2d.loops.*;
+import sun.java2d.pipe.*;
+
+public abstract class XSurfaceData extends SurfaceData {
+ static boolean isX11SurfaceDataInitialized = false;
+
+ public static boolean isX11SurfaceDataInitialized() {
+ return isX11SurfaceDataInitialized;
+ }
+
+ public static void setX11SurfaceDataInitialized() {
+ isX11SurfaceDataInitialized = true;
+ }
+
+ public XSurfaceData(SurfaceType surfaceType, ColorModel cm) {
+ super(surfaceType, cm);
+ }
+
+ protected native void initOps(X11ComponentPeer peer, X11GraphicsConfig gc, int depth);
+
+ protected static native long XCreateGC(long pXSData);
+
+ protected static native void XResetClip(long xgc);
+
+ protected static native void XSetClip(long xgc, int lox, int loy, int hix, int hiy, Region complexclip);
+
+ protected native void flushNativeSurface();
+
+ protected native boolean isDrawableValid();
+
+ protected native void setInvalid();
+
+ protected static native void XSetGraphicsExposures(long xgc, boolean needExposures);
+}
diff --git a/src/solaris/classes/sun/java2d/xr/DirtyRegion.java b/src/solaris/classes/sun/java2d/xr/DirtyRegion.java
new file mode 100644
index 000000000..2866055b6
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/DirtyRegion.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import static java.lang.Math.min;
+import static java.lang.Math.max;
+import static sun.java2d.xr.MaskTileManager.MASK_SIZE;
+
+/**
+ * This class implements region tracking, used by the tiled-mask code.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class DirtyRegion implements Cloneable {
+ int x, y, x2, y2;
+
+ public DirtyRegion() {
+ clear();
+ }
+
+ public void clear() {
+ x = Integer.MAX_VALUE;
+ y = Integer.MAX_VALUE;
+ x2 = Integer.MIN_VALUE;
+ y2 = Integer.MIN_VALUE;
+ }
+
+ public void growDirtyRegion(int x, int y, int x2, int y2) {
+ this.x = min(x, this.x);
+ this.y = min(y, this.y);
+ this.x2 = max(x2, this.x2);
+ this.y2 = max(y2, this.y2);
+ }
+
+ public int getWidth() {
+ return x2 - x;
+ }
+
+ public int getHeight() {
+ return y2 - y;
+ }
+
+ public void growDirtyRegionTileLimit(int x, int y, int x2, int y2) {
+ if (x < this.x) {
+ this.x = max(x, 0);
+ }
+ if (y < this.y) {
+ this.y = max(y, 0);
+ }
+ if (x2 > this.x2) {
+ this.x2 = min(x2, MASK_SIZE);
+ }
+ if (y2 > this.y2) {
+ this.y2 = min(y2, MASK_SIZE);
+ }
+ }
+
+ public static DirtyRegion combineRegion(DirtyRegion region1,
+ DirtyRegion region2) {
+ DirtyRegion region = new DirtyRegion();
+ region.x = min(region1.x, region2.x);
+ region.y = min(region1.y, region2.y);
+ region.x2 = max(region1.x2, region2.x2);
+ region.y2 = max(region1.y2, region2.y2);
+ return region;
+ }
+
+ public void setDirtyLineRegion(int x1, int y1, int x2, int y2) {
+ if (x1 < x2) {
+ this.x = x1;
+ this.x2 = x2;
+ } else {
+ this.x = x2;
+ this.x2 = x1;
+ }
+
+ if (y1 < y2) {
+ this.y = y1;
+ this.y2 = y2;
+ } else {
+ this.y = y2;
+ this.y2 = y1;
+ }
+ }
+
+ public void translate(int x, int y) {
+ if (this.x != Integer.MAX_VALUE) {
+ this.x += x;
+ this.x2 += x;
+ this.y += y;
+ this.y2 += y;
+ }
+ }
+
+ public String toString() {
+ return this.getClass().getName() +
+ "(x: " + x + ", y:" + y + ", x2:" + x2 + ", y2:" + y2 + ")";
+ }
+
+ public DirtyRegion cloneRegion() {
+ try {
+ return (DirtyRegion) clone();
+ } catch (CloneNotSupportedException ex) {
+ ex.printStackTrace();
+ }
+
+ return null;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/GrowableByteArray.java b/src/solaris/classes/sun/java2d/xr/GrowableByteArray.java
new file mode 100644
index 000000000..a8e22fa49
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/GrowableByteArray.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.util.*;
+
+/**
+ * Growable int array, designed to allow subclasses to emulate
+ * the behaviour of value types.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class GrowableByteArray
+{
+
+ byte[] array;
+ int size;
+ int cellSize;
+
+ public GrowableByteArray(int cellSize, int initialSize)
+ {
+ array = new byte[initialSize];
+ size = 0;
+ this.cellSize = cellSize;
+ }
+
+ private int getNextCellIndex()
+ {
+ int oldSize = size;
+ size += cellSize;
+
+ if (size >= array.length)
+ {
+ growArray();
+ }
+
+ return oldSize;
+ }
+
+ /**
+ * @return a direct reference to the backing array.
+ */
+ public byte[] getArray()
+ {
+ return array;
+ }
+
+ /**
+ * @return a copy of the backing array.
+ */
+ public byte[] getSizedArray()
+ {
+ return Arrays.copyOf(array, getSize());
+ }
+
+ public final int getByte(int index)
+ {
+ return array[getCellIndex(index)];
+ }
+
+ /**
+ * Returns the index of the next free cell,
+ * and grows the backing arrays if required.
+ */
+ public final int getNextIndex()
+ {
+ return getNextCellIndex() / cellSize;
+ }
+
+ protected final int getCellIndex(int cellIndex)
+ {
+ return cellSize * cellIndex;
+ }
+
+ public final void addByte(byte i)
+ {
+ int nextIndex = getNextIndex();
+ array[nextIndex] = i;
+ }
+
+ /**
+ * @return The number of stored cells.
+ */
+ public final int getSize()
+ {
+ return size / cellSize;
+ }
+
+ public void clear()
+ {
+ size = 0;
+ }
+
+ protected void growArray()
+ {
+ int newSize = Math.max(array.length * 2, 10);
+ byte[] oldArray = array;
+ array = new byte[newSize];
+
+ System.arraycopy(oldArray, 0, array, 0, oldArray.length);
+ }
+
+}
diff --git a/src/solaris/classes/sun/java2d/xr/GrowableEltArray.java b/src/solaris/classes/sun/java2d/xr/GrowableEltArray.java
new file mode 100644
index 000000000..88128614a
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/GrowableEltArray.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+/**
+ * Class to efficiently store glyph information for laid out glyphs,
+ * passed to native or java backend.
+ *
+ * @author Clemens Eisserer
+ */
+public class GrowableEltArray extends GrowableIntArray {
+ private static final int ELT_SIZE = 4;
+ GrowableIntArray glyphs;
+
+ public GrowableEltArray(int initialSize)
+ {
+ super(ELT_SIZE, initialSize);
+ glyphs = new GrowableIntArray(1, initialSize*8);
+ }
+
+ public final int getCharCnt(int index) {
+ return array[getCellIndex(index) + 0];
+ }
+
+ public final void setCharCnt(int index, int cnt) {
+ array[getCellIndex(index) + 0] = cnt;
+ }
+
+ public final int getXOff(int index) {
+ return array[getCellIndex(index) + 1];
+ }
+
+ public final void setXOff(int index, int xOff) {
+ array[getCellIndex(index) + 1] = xOff;
+ }
+
+ public final int getYOff(int index) {
+ return array[getCellIndex(index) + 2];
+ }
+
+ public final void setYOff(int index, int yOff) {
+ array[getCellIndex(index) + 2] = yOff;
+ }
+
+ public final int getGlyphSet(int index) {
+ return array[getCellIndex(index) + 3];
+ }
+
+ public final void setGlyphSet(int index, int glyphSet) {
+ array[getCellIndex(index) + 3] = glyphSet;
+ }
+
+ public GrowableIntArray getGlyphs() {
+ return glyphs;
+ }
+
+ public void clear() {
+ glyphs.clear();
+ super.clear();
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/GrowableIntArray.java b/src/solaris/classes/sun/java2d/xr/GrowableIntArray.java
new file mode 100644
index 000000000..12c03622c
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/GrowableIntArray.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.util.*;
+
+/**
+ * Growable int array, designed to allow subclasses to emulate
+ * the behaviour of value types.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class GrowableIntArray {
+
+ int[] array;
+ int size;
+ int cellSize;
+
+ public GrowableIntArray(int cellSize, int initialSize) {
+ array = new int[initialSize];
+ size = 0;
+ this.cellSize = cellSize;
+ }
+
+ private int getNextCellIndex() {
+ int oldSize = size;
+ size += cellSize;
+
+ if (size >= array.length) {
+ growArray();
+ }
+
+ return oldSize;
+ }
+
+ /**
+ * @return a direct reference to the backing array.
+ */
+ public int[] getArray() {
+ return array;
+ }
+
+ /**
+ * @return a copy of the backing array.
+ */
+ public int[] getSizedArray() {
+ return Arrays.copyOf(array, getSize());
+ }
+
+ /**
+ * Returns the index of the next free cell,
+ * and grows the backing arrays if required.
+ */
+ public final int getNextIndex() {
+ return getNextCellIndex() / cellSize;
+ }
+
+ protected final int getCellIndex(int cellIndex) {
+ return cellSize * cellIndex;
+ }
+
+ public final int getInt(int cellIndex) {
+ return array[cellIndex];
+ }
+
+ public final void addInt(int i) {
+ int nextIndex = getNextIndex();
+ array[nextIndex] = i;
+ }
+
+ /**
+ * @return The number of stored cells.
+ */
+ public final int getSize() {
+ return size / cellSize;
+ }
+
+ public void clear() {
+ size = 0;
+ }
+
+ protected void growArray() {
+ int newSize = Math.max(array.length * 2, 10);
+ int[] oldArray = array;
+ array = new int[newSize];
+
+ System.arraycopy(oldArray, 0, array, 0, oldArray.length);
+ }
+
+}
diff --git a/src/solaris/classes/sun/java2d/xr/GrowablePointArray.java b/src/solaris/classes/sun/java2d/xr/GrowablePointArray.java
new file mode 100644
index 000000000..241bff3bb
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/GrowablePointArray.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+/**
+ * Class to efficiently store rectangles.
+ *
+ * @author Clemens Eisserer
+ */
+public class GrowablePointArray extends GrowableIntArray
+{
+
+ private static final int POINT_SIZE = 2;
+
+ public GrowablePointArray(int initialSize)
+ {
+ super(POINT_SIZE, initialSize);
+ }
+
+ public final int getX(int index)
+ {
+ return array[getCellIndex(index)];
+ }
+
+ public final int getY(int index)
+ {
+ return array[getCellIndex(index) + 1];
+ }
+
+ public final void setX(int index, int x)
+ {
+ array[getCellIndex(index)] = x;
+ }
+
+ public final void setY(int index, int y)
+ {
+ array[getCellIndex(index) + 1] = y;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/GrowableRectArray.java b/src/solaris/classes/sun/java2d/xr/GrowableRectArray.java
new file mode 100644
index 000000000..01a8a6954
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/GrowableRectArray.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+/**
+ * Class to efficiently store rectangles.
+ *
+ * @author Clemens Eisserer
+ */
+public class GrowableRectArray extends GrowableIntArray {
+
+ private static final int RECT_SIZE = 4;
+
+ public GrowableRectArray(int initialSize) {
+ super(RECT_SIZE, initialSize);
+ }
+
+ public final void setX(int index, int x) {
+ array[getCellIndex(index)] = x;
+ }
+
+ public final void setY(int index, int y) {
+ array[getCellIndex(index) + 1] = y;
+ }
+
+ public final void setWidth(int index, int width) {
+ array[getCellIndex(index) + 2] = width;
+ }
+
+ public final void setHeight(int index, int height) {
+ array[getCellIndex(index) + 3] = height;
+ }
+
+ public final int getX(int index) {
+ return array[getCellIndex(index)];
+ }
+
+ public final int getY(int index) {
+ return array[getCellIndex(index) + 1];
+ }
+
+ public final int getWidth(int index) {
+ return array[getCellIndex(index) + 2];
+ }
+
+ public final int getHeight(int index) {
+ return array[getCellIndex(index) + 3];
+ }
+
+ public final void translateRects(int x, int y) {
+ for (int i = 0; i < getSize(); i++) {
+ setX(i, getX(i) + x);
+ setY(i, getY(i) + y);
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/MaskTile.java b/src/solaris/classes/sun/java2d/xr/MaskTile.java
new file mode 100644
index 000000000..4937b339f
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/MaskTile.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+/**
+ * Represents a single tile, used to store the rectangles covering the area
+ * of the mask where the tile is located.
+ *
+ * @author Clemens Eisserer
+ */
+public class MaskTile {
+ GrowableRectArray rects;
+ DirtyRegion dirtyArea;
+
+ public MaskTile()
+ {
+ rects = new GrowableRectArray(128);
+ dirtyArea = new DirtyRegion();
+ }
+
+ public void addRect(int x, int y, int width, int height) {
+ int index = rects.getNextIndex();
+ rects.setX(index, x);
+ rects.setY(index, y);
+ rects.setWidth(index, width);
+ rects.setHeight(index, height);
+ }
+
+ public void addLine(int x1, int y1, int x2, int y2) {
+ /*
+ * EXA is not able to accalerate diagonal lines, we try to "guide" it a
+ * bit to avoid excessive migration See project documentation for an
+ * detailed explanation
+ */
+ DirtyRegion region = new DirtyRegion();
+ region.setDirtyLineRegion(x1, y1, x2, y2);
+ int xDiff = region.x2 - region.x;
+ int yDiff = region.y2 - region.y;
+
+ if (xDiff == 0 || yDiff == 0) {
+ addRect(region.x, region.y,
+ region.x2 - region.x + 1, region.y2 - region.y + 1);
+ } else if (xDiff == 1 && yDiff == 1) {
+ addRect(x1, y1, 1, 1);
+ addRect(x2, y2, 1, 1);
+ } else {
+ lineToRects(x1, y1, x2, y2);
+ }
+ }
+
+ private void lineToRects(int xstart, int ystart, int xend, int yend) {
+ int x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err;
+
+ /* Entfernung in beiden Dimensionen berechnen */
+ dx = xend - xstart;
+ dy = yend - ystart;
+
+ /* Vorzeichen des Inkrements bestimmen */
+ incx = dx > 0 ? 1 : (dx < 0) ? -1 : 0;
+ incy = dy > 0 ? 1 : (dy < 0) ? -1 : 0;
+ if (dx < 0)
+ dx = -dx;
+ if (dy < 0)
+ dy = -dy;
+
+ /* feststellen, welche Entfernung groesser ist */
+ if (dx > dy) {
+ /* x ist schnelle Richtung */
+ pdx = incx;
+ pdy = 0; /* pd. ist Parallelschritt */
+ ddx = incx;
+ ddy = incy; /* dd. ist Diagonalschritt */
+ es = dy;
+ el = dx; /* Fehlerschritte schnell, langsam */
+ } else {
+ /* y ist schnelle Richtung */
+ pdx = 0;
+ pdy = incy; /* pd. ist Parallelschritt */
+ ddx = incx;
+ ddy = incy; /* dd. ist Diagonalschritt */
+ es = dx;
+ el = dy; /* Fehlerschritte schnell, langsam */
+ }
+
+ /* Initialisierungen vor Schleifenbeginn */
+ x = xstart;
+ y = ystart;
+ err = el / 2;
+ addRect(x, y, 1, 1);
+
+ /* Pixel berechnen */
+ for (t = 0; t < el; ++t) /* t zaehlt die Pixel, el ist auch Anzahl */
+ {
+ /* Aktualisierung Fehlerterm */
+ err -= es;
+ if (err < 0) {
+ /* Fehlerterm wieder positiv (>=0) machen */
+ err += el;
+ /* Schritt in langsame Richtung, Diagonalschritt */
+ x += ddx;
+ y += ddy;
+ } else {
+ /* Schritt in schnelle Richtung, Parallelschritt */
+ x += pdx;
+ y += pdy;
+ }
+ addRect(x, y, 1, 1);
+ // SetPixel(x,y);
+ // System.out.println(x+":"+y);
+ }
+ }
+
+ public void calculateDirtyAreas()
+ {
+ for (int i=0; i < rects.getSize(); i++) {
+ int x = rects.getX(i);
+ int y = rects.getY(i);
+ dirtyArea.growDirtyRegion(x, y,
+ x + rects.getWidth(i),
+ y + rects.getHeight(i));
+ }
+ }
+
+ public void reset() {
+ rects.clear();
+ dirtyArea.clear();
+ }
+
+ public void translate(int x, int y) {
+ if (rects.getSize() > 0) {
+ dirtyArea.translate(x, y);
+ }
+ rects.translateRects(x, y);
+ }
+
+ public GrowableRectArray getRects() {
+ return rects;
+ }
+
+ public DirtyRegion getDirtyArea() {
+ return dirtyArea;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/MaskTileManager.java b/src/solaris/classes/sun/java2d/xr/MaskTileManager.java
new file mode 100644
index 000000000..535e648f4
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/MaskTileManager.java
@@ -0,0 +1,327 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.*;
+import java.util.*;
+
+/**
+ * We render non-antialiased geometry (consisting of rectangles) into a mask,
+ * which is later used in a composition step.
+ * To avoid mask-allocations of large size, MaskTileManager splits
+ * geometry larger than MASK_SIZE into several tiles,
+ * and stores the geometry in instances of MaskTile.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class MaskTileManager {
+
+ public static final int MASK_SIZE = 256;
+
+ MaskTile mainTile = new MaskTile();
+
+ ArrayList<MaskTile> tileList;
+ int allocatedTiles = 0;
+ int xTiles, yTiles;
+
+ XRCompositeManager xrMgr;
+ XRBackend con;
+
+ int maskPixmap;
+ int maskPicture;
+ long maskGC;
+ int lineMaskPixmap;
+ int lineMaskPicture;
+ long drawLineGC;
+ long clearLineGC;
+
+ public MaskTileManager(XRCompositeManager xrMgr, int parentXid) {
+ tileList = new ArrayList<MaskTile>();
+ this.xrMgr = xrMgr;
+ this.con = xrMgr.getBackend();
+
+ maskPixmap = con.createPixmap(parentXid, 8, MASK_SIZE, MASK_SIZE);
+ maskPicture = con.createPicture(maskPixmap, XRUtils.PictStandardA8);
+ con.renderRectangle(maskPicture, XRUtils.PictOpClear,
+ new XRColor(Color.black),
+ 0, 0, MASK_SIZE, MASK_SIZE);
+ maskGC = con.createGC(maskPixmap);
+ con.setGCExposures(maskGC, false);
+
+ lineMaskPixmap = con.createPixmap(parentXid, 8, MASK_SIZE, MASK_SIZE);
+ lineMaskPicture =
+ con.createPicture(lineMaskPixmap, XRUtils.PictStandardA8);
+ con.renderRectangle(lineMaskPicture, XRUtils.PictOpClear,
+ new XRColor(Color.black), 0, 0, MASK_SIZE, MASK_SIZE);
+
+ drawLineGC = con.createGC(lineMaskPixmap);
+ con.setGCExposures(drawLineGC, false);
+ con.setGCForeground(drawLineGC, 255);
+
+ clearLineGC = con.createGC(lineMaskPixmap);
+ con.setGCExposures(clearLineGC, false);
+ con.setGCForeground(clearLineGC, 0);
+ }
+
+ /**
+ * Adds a rectangle to the mask.
+ */
+ public void addRect(int x, int y, int width, int height) {
+ mainTile.addRect(x, y, width, height);
+ }
+
+ /**
+ * Adds a line to the mask.
+ */
+ public void addLine(int x1, int y1, int x2, int y2) {
+ mainTile.addLine(x1, y1, x2, y2);
+ }
+
+ /**
+ * Transfers the geometry stored (rectangles, lines) to one or more masks,
+ * and renders the result to the destination surface.
+ */
+ public void fillMask(XRSurfaceData dst) {
+
+ boolean maskRequired = xrMgr.maskRequired();
+
+ if (maskRequired) {
+ mainTile.calculateDirtyAreas();
+ DirtyRegion dirtyArea = mainTile.getDirtyArea().cloneRegion();
+ mainTile.translate(-dirtyArea.x, -dirtyArea.y);
+
+ XRColor maskColor = xrMgr.getMaskColor();
+
+ // We don't need tiling if all geometry fits in a single tile
+ if (dirtyArea.getWidth() <= MASK_SIZE &&
+ dirtyArea.getHeight() <= MASK_SIZE)
+ {
+ compositeSingleTile(dst, mainTile, dirtyArea,
+ maskRequired, 0, 0, maskColor);
+ } else {
+ allocTiles(dirtyArea);
+ tileRects();
+
+ for (int i = 0; i < yTiles; i++) {
+ for (int m = 0; m < xTiles; m++) {
+ MaskTile tile = tileList.get(i * xTiles + m);
+
+ int tileStartX = m * MASK_SIZE;
+ int tileStartY = i * MASK_SIZE;
+ compositeSingleTile(dst, tile, dirtyArea, maskRequired,
+ tileStartX, tileStartY, maskColor);
+ }
+ }
+ }
+ } else {
+ xrMgr.XRRenderRectangles(dst, mainTile.getRects());
+ }
+
+ mainTile.reset();
+ }
+
+ /**
+ * Uploads aa geometry generated for maskblit/fill into the mask pixmap.
+ */
+ public int uploadMask(int w, int h, int maskscan, int maskoff, byte[] mask) {
+ int maskPic = XRUtils.None;
+
+ if (mask != null) {
+ float maskAlpha =
+ xrMgr.isTexturePaintActive() ? xrMgr.getExtraAlpha() : 1.0f;
+ con.putMaskImage(maskPixmap, maskGC, mask, 0, 0, 0, 0,
+ w, h, maskoff, maskscan, maskAlpha);
+ maskPic = maskPicture;
+ } else if (xrMgr.isTexturePaintActive()) {
+ maskPic = xrMgr.getExtraAlphaMask();
+ }
+
+ return maskPic;
+ }
+
+ /**
+ * Clears the area of the mask-pixmap used for uploading aa coverage values.
+ */
+ public void clearUploadMask(int mask, int w, int h) {
+ if (mask == maskPicture) {
+ con.renderRectangle(maskPicture, XRUtils.PictOpClear,
+ XRColor.NO_ALPHA, 0, 0, w, h);
+ }
+ }
+
+
+ /**
+ * Renders the rectangles provided to the mask, and does a composition
+ * operation with the properties set inXRCompositeManager.
+ */
+ protected void compositeSingleTile(XRSurfaceData dst, MaskTile tile,
+ DirtyRegion dirtyArea,
+ boolean maskRequired,
+ int tileStartX, int tileStartY,
+ XRColor maskColor) {
+ if (tile.rects.getSize() > 0) {
+ DirtyRegion tileDirtyArea = tile.getDirtyArea();
+
+ int x = tileDirtyArea.x + tileStartX + dirtyArea.x;
+ int y = tileDirtyArea.y + tileStartY + dirtyArea.y;
+ int width = tileDirtyArea.x2 - tileDirtyArea.x;
+ int height = tileDirtyArea.y2 - tileDirtyArea.y;
+ width = Math.min(width, MASK_SIZE);
+ height = Math.min(height, MASK_SIZE);
+
+ int rectCnt = tile.rects.getSize();
+
+ if (maskRequired) {
+ int mask = XRUtils.None;
+
+ /*
+ * Optimization: When the tile only contains one rectangle, the
+ * composite-operation boundaries can be used as geometry
+ */
+ if (rectCnt > 1) {
+ con.renderRectangles(maskPicture, XRUtils.PictOpSrc,
+ maskColor, tile.rects);
+ mask = maskPicture;
+ } else {
+ if (xrMgr.isTexturePaintActive()) {
+ mask = xrMgr.getExtraAlphaMask();
+ }
+ }
+
+ xrMgr.XRComposite(XRUtils.None, mask, dst.getPicture(),
+ x, y, tileDirtyArea.x, tileDirtyArea.y,
+ x, y, width, height);
+
+ /* Clear dirty rectangle of the rect-mask */
+ if (rectCnt > 1) {
+ con.renderRectangle(maskPicture, XRUtils.PictOpClear,
+ XRColor.NO_ALPHA,
+ tileDirtyArea.x, tileDirtyArea.y,
+ width, height);
+ }
+
+ tile.reset();
+ } else if (rectCnt > 0) {
+ tile.rects.translateRects(tileStartX + dirtyArea.x,
+ tileStartY + dirtyArea.y);
+ xrMgr.XRRenderRectangles(dst, tile.rects);
+ }
+ }
+ }
+
+
+ /**
+ * Allocates enough MaskTile instances, to cover the whole
+ * mask area, or resets existing ones.
+ */
+ protected void allocTiles(DirtyRegion maskArea) {
+ xTiles = (maskArea.getWidth() / MASK_SIZE) + 1;
+ yTiles = (maskArea.getHeight() / MASK_SIZE) + 1;
+ int tileCnt = xTiles * yTiles;
+
+ if (tileCnt > allocatedTiles) {
+ for (int i = 0; i < tileCnt; i++) {
+ if (i < allocatedTiles) {
+ tileList.get(i).reset();
+ } else {
+ tileList.add(new MaskTile());
+ }
+ }
+
+ allocatedTiles = tileCnt;
+ }
+ }
+
+ /**
+ * Tiles the stored rectangles, if they are larger than the MASK_SIZE
+ */
+ protected void tileRects() {
+ GrowableRectArray rects = mainTile.rects;
+
+ for (int i = 0; i < rects.getSize(); i++) {
+ int tileXStartIndex = rects.getX(i) / MASK_SIZE;
+ int tileYStartIndex = rects.getY(i) / MASK_SIZE;
+ int tileXLength =
+ ((rects.getX(i) + rects.getWidth(i)) / MASK_SIZE + 1) -
+ tileXStartIndex;
+ int tileYLength =
+ ((rects.getY(i) + rects.getHeight(i)) / MASK_SIZE + 1) -
+ tileYStartIndex;
+
+ for (int n = 0; n < tileYLength; n++) {
+ for (int m = 0; m < tileXLength; m++) {
+
+ int tileIndex =
+ xTiles * (tileYStartIndex + n) + tileXStartIndex + m;
+ MaskTile tile = tileList.get(tileIndex);
+
+ GrowableRectArray rectTileList = tile.getRects();
+ int tileArrayIndex = rectTileList.getNextIndex();
+
+ int tileStartPosX = (tileXStartIndex + m) * MASK_SIZE;
+ int tileStartPosY = (tileYStartIndex + n) * MASK_SIZE;
+
+ rectTileList.setX(tileArrayIndex, rects.getX(i) - tileStartPosX);
+ rectTileList.setY(tileArrayIndex, rects.getY(i) - tileStartPosY);
+ rectTileList.setWidth(tileArrayIndex, rects.getWidth(i));
+ rectTileList.setHeight(tileArrayIndex, rects.getHeight(i));
+
+ limitRectCoords(rectTileList, tileArrayIndex);
+
+ tile.getDirtyArea().growDirtyRegion
+ (rectTileList.getX(tileArrayIndex),
+ rectTileList.getY(tileArrayIndex),
+ rectTileList.getWidth(tileArrayIndex) +
+ rectTileList.getX(tileArrayIndex),
+ rectTileList.getHeight(tileArrayIndex) +
+ rectTileList.getY(tileArrayIndex));
+ }
+ }
+ }
+ }
+
+ /**
+ * Limits the rect's coordinates to the mask coordinates. The result is used
+ * by growDirtyRegion.
+ */
+ private void limitRectCoords(GrowableRectArray rects, int index) {
+ if ((rects.getX(index) + rects.getWidth(index)) > MASK_SIZE) {
+ rects.setWidth(index, MASK_SIZE - rects.getX(index));
+ }
+ if ((rects.getY(index) + rects.getHeight(index)) > MASK_SIZE) {
+ rects.setHeight(index, MASK_SIZE - rects.getY(index));
+ }
+ if (rects.getX(index) < 0) {
+ rects.setWidth(index, rects.getWidth(index) + rects.getX(index));
+ rects.setX(index, 0);
+ }
+ if (rects.getY(index) < 0) {
+ rects.setHeight(index, rects.getHeight(index) + rects.getY(index));
+ rects.setY(index, 0);
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/MutableInteger.java b/src/solaris/classes/sun/java2d/xr/MutableInteger.java
new file mode 100644
index 000000000..c18894f87
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/MutableInteger.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+/**
+ * Simple MutableInteger implementation to be used as a reuseable HashMap key.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class MutableInteger {
+ private int value;
+
+ public MutableInteger(int value) {
+ this.setValue(value);
+ }
+
+ public int hashCode() {
+ return getValue();
+ }
+
+ public boolean equals(Object o) {
+ return (o instanceof MutableInteger) &&
+ (((MutableInteger) o).getValue() == getValue());
+ }
+
+ public void setValue(int value) {
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XIDGenerator.java b/src/solaris/classes/sun/java2d/xr/XIDGenerator.java
new file mode 100644
index 000000000..ffbea0eb0
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XIDGenerator.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+/**
+ * Class provides unused XIDs, used for creating server-side objects
+ * created by the java backend.
+ * It does buffering, to minimize JNI overhead.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class XIDGenerator {
+ private final static int XID_BUFFER_SIZE = 512;
+
+ int[] xidBuffer = new int[XID_BUFFER_SIZE];
+ int currentIndex = XID_BUFFER_SIZE;
+
+ public int getNextXID() {
+
+ if (currentIndex >= XID_BUFFER_SIZE) {
+ bufferXIDs(xidBuffer, xidBuffer.length);
+ currentIndex = 0;
+ }
+
+ return xidBuffer[currentIndex++];
+ }
+
+ private static native void bufferXIDs(int[] buffer, int arraySize);
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRBackend.java b/src/solaris/classes/sun/java2d/xr/XRBackend.java
new file mode 100644
index 000000000..9589e9429
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRBackend.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+/**
+ * XRender pipeline backend interface.
+ * Currently there are two different backends implemented:
+ * - XRBackendJava: And experimental backend, generating protocol directly using java-code and xcb's socket handoff functionality.
+ * - XRBackendNative: Native 1:1 binding with libX11.
+ */
+
+import java.awt.geom.*;
+import java.util.*;
+
+import sun.font.*;
+import sun.java2d.jules.*;
+import sun.java2d.pipe.*;
+
+public interface XRBackend {
+
+ public void freePicture(int picture);
+
+ public void freePixmap(int pixmap);
+
+ public int createPixmap(int drawable, int depth, int width, int height);
+
+ public int createPicture(int drawable, int formatID);
+
+ public long createGC(int drawable);
+
+ public void freeGC(long gc); /* TODO: Use!! */
+
+ public void copyArea(int src, int dst, long gc, int srcx, int srcy,
+ int width, int height, int dstx, int dsty);
+
+ public void putMaskImage(int drawable, long gc, byte[] imageData,
+ int sx, int sy, int dx, int dy,
+ int width, int height, int maskOff,
+ int maskScan, float ea);
+
+ public void setGCClipRectangles(long gc, Region clip);
+
+ public void GCRectangles(int drawable, long gc, GrowableRectArray rects);
+
+ public void setClipRectangles(int picture, Region clip);
+
+ public void setGCExposures(long gc, boolean exposure);
+
+ public void setGCForeground(long gc, int pixel);
+
+ public void setPictureTransform(int picture, AffineTransform transform);
+
+ public void setPictureRepeat(int picture, int repeat);
+
+ public void setFilter(int picture, int filter);
+
+ public void renderRectangle(int dst, byte op, XRColor color,
+ int x, int y, int width, int height);
+
+ public void renderRectangles(int dst, byte op, XRColor color,
+ GrowableRectArray rects);
+
+ public void renderComposite(byte op, int src, int mask, int dst,
+ int srcX, int srcY, int maskX, int maskY,
+ int dstX, int dstY, int width, int height);
+
+ public int XRenderCreateGlyphSet(int formatID);
+
+ public void XRenderAddGlyphs(int glyphSet, GlyphList gl,
+ List<XRGlyphCacheEntry> cacheEntries,
+ byte[] pixelData);
+
+ public void XRenderFreeGlyphs(int glyphSet, int[] gids);
+
+ public void XRenderCompositeText(byte op, int src, int dst,
+ int maskFormatID,
+ int xSrc, int ySrc, int xDst, int yDst,
+ int glyphset, GrowableEltArray elts);
+
+ public int createRadialGradient(Point2D inner, Point2D outer,
+ float innerRadius, float outerRadius,
+ float[] fractions, int[] pixels,
+ int repeat, AffineTransform transform);
+
+ public int createLinearGradient(Point2D p1, Point2D p2, float[] fractions,
+ int[] pixels, int repeat,
+ AffineTransform transform);
+
+ public void setGCMode(long gc, boolean copy);
+
+ public void renderCompositeTrapezoids(byte op, int src, int maskFormat,
+ int dst, int srcX, int srcY,
+ TrapezoidList trapList);
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRBackendNative.java b/src/solaris/classes/sun/java2d/xr/XRBackendNative.java
new file mode 100644
index 000000000..3108b1224
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRBackendNative.java
@@ -0,0 +1,343 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.geom.*;
+import java.util.*;
+
+import sun.font.*;
+import sun.java2d.jules.*;
+import sun.java2d.pipe.*;
+
+import static sun.java2d.xr.XRUtils.XDoubleToFixed;
+
+/**
+ * Native implementation of XRBackend.
+ * Almost direct 1:1 binding to libX11.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class XRBackendNative implements XRBackend {
+
+ static {
+ initIDs();
+ }
+
+ private static long FMTPTR_A8;
+ private static long FMTPTR_ARGB32;
+ private static long MASK_XIMG;
+
+ private static native void initIDs();
+
+ public native long createGC(int drawable);
+
+ public native void freeGC(long gc);
+
+ public native int createPixmap(int drawable, int depth,
+ int width, int height);
+
+ private native int createPictureNative(int drawable, long formatID);
+
+ public native void freePicture(int picture);
+
+ public native void freePixmap(int pixmap);
+
+ public native void setGCExposures(long gc, boolean exposure);
+
+ public native void setGCForeground(long gc, int pixel);
+
+ public native void setPictureRepeat(int picture, int repeat);
+
+ public native void copyArea(int src, int dst, long gc,
+ int srcx, int srcy, int width, int height,
+ int dstx, int dsty);
+
+ public native void setGCMode(long gc, boolean copy);
+
+ private static native void GCRectanglesNative(int drawable, long gc,
+ int[] rectArray, int rectCnt);
+
+ public native void renderComposite(byte op, int src, int mask,
+ int dst, int srcX, int srcY,
+ int maskX, int maskY, int dstX, int dstY,
+ int width, int height);
+
+ private native void renderRectangle(int dst, byte op,
+ short red, short green,
+ short blue, short alpha,
+ int x, int y, int width, int height);
+
+ private static native void
+ XRenderRectanglesNative(int dst, byte op,
+ short red, short green,
+ short blue, short alpha,
+ int[] rects, int rectCnt);
+
+ private native void XRSetTransformNative(int pic,
+ int m00, int m01, int m02,
+ int m10, int m11, int m12);
+
+ private static native int
+ XRCreateLinearGradientPaintNative(float[] fractionsArray,
+ short[] pixelsArray,
+ int x1, int y1, int x2, int y2,
+ int numStops, int repeat,
+ int m00, int m01, int m02,
+ int m10, int m11, int m12);
+
+ private native static int
+ XRCreateRadialGradientPaintNative(float[] fractionsArray,
+ short[] pixelsArray, int numStops,
+ int innerRadius, int outerRadius,
+ int repeat,
+ int m00, int m01, int m02,
+ int m10, int m11, int m12);
+
+ public native void setFilter(int picture, int filter);
+
+ private static native void XRSetClipNative(long dst,
+ int x1, int y1, int x2, int y2,
+ Region clip, boolean isGC);
+
+ public void GCRectangles(int drawable, long gc, GrowableRectArray rects) {
+ GCRectanglesNative(drawable, gc, rects.getArray(), rects.getSize());
+ }
+
+ public int createPicture(int drawable, int formatID) {
+ return createPictureNative(drawable, getFormatPtr(formatID));
+ }
+
+ public void setPictureTransform(int picture, AffineTransform transform) {
+ XRSetTransformNative(picture,
+ XDoubleToFixed(transform.getScaleX()),
+ XDoubleToFixed(transform.getShearX()),
+ XDoubleToFixed(transform.getTranslateX()),
+ XDoubleToFixed(transform.getShearY()),
+ XDoubleToFixed(transform.getScaleY()),
+ XDoubleToFixed(transform.getTranslateY()));
+ }
+
+ public void renderRectangle(int dst, byte op, XRColor color,
+ int x, int y, int width, int height) {
+ renderRectangle(dst, op, (short)color.red, (short)color.green,
+ (short)color.blue, (short)color.alpha,
+ x, y, width, height);
+ }
+
+ private short[] getRenderColors(int[] pixels) {
+ short[] renderColors = new short[pixels.length * 4];
+
+ XRColor c = new XRColor();
+ for (int i = 0; i < pixels.length; i++) {
+ c.setColorValues(pixels[i], true);
+ renderColors[i * 4 + 0] = (short) c.alpha;
+ renderColors[i * 4 + 1] = (short) c.red;
+ renderColors[i * 4 + 2] = (short) c.green;
+ renderColors[i * 4 + 3] = (short) c.blue;
+ }
+
+ return renderColors;
+ }
+
+ private static long getFormatPtr(int formatID) {
+ switch (formatID) {
+ case XRUtils.PictStandardA8:
+ return FMTPTR_A8;
+ case XRUtils.PictStandardARGB32:
+ return FMTPTR_ARGB32;
+ }
+
+ return 0L;
+ }
+
+ public int createLinearGradient(Point2D p1, Point2D p2, float[] fractions,
+ int[] pixels, int repeat, AffineTransform trx) {
+
+ short[] colorValues = getRenderColors(pixels);
+ int gradient =
+ XRCreateLinearGradientPaintNative(fractions, colorValues,
+ XDoubleToFixed(p1.getX()), XDoubleToFixed(p1.getY()),
+ XDoubleToFixed(p2.getX()), XDoubleToFixed(p2.getY()),
+ fractions.length, repeat,
+ XDoubleToFixed(trx.getScaleX()),
+ XDoubleToFixed(trx.getShearX()),
+ XDoubleToFixed(trx.getTranslateX()),
+ XDoubleToFixed(trx.getShearY()),
+ XDoubleToFixed(trx.getScaleY()),
+ XDoubleToFixed(trx.getTranslateY()));
+ return gradient;
+ }
+
+ public int createRadialGradient(Point2D inner, Point2D outer,
+ float innerRadius, float outerRadius,
+ float[] fractions, int[] pixels, int repeat,
+ AffineTransform trx) {
+
+ short[] colorValues = getRenderColors(pixels);
+ return XRCreateRadialGradientPaintNative
+ (fractions, colorValues, fractions.length,
+ XDoubleToFixed(innerRadius),
+ XDoubleToFixed(outerRadius),
+ repeat,
+ XDoubleToFixed(trx.getScaleX()),
+ XDoubleToFixed(trx.getShearX()),
+ XDoubleToFixed(trx.getTranslateX()),
+ XDoubleToFixed(trx.getShearY()),
+ XDoubleToFixed(trx.getScaleY()),
+ XDoubleToFixed(trx.getTranslateY()));
+ }
+
+ public void setGCClipRectangles(long gc, Region clip) {
+ XRSetClipNative(gc, clip.getLoX(), clip.getLoY(),
+ clip.getHiX(), clip.getHiY(),
+ clip.isRectangular() ? null : clip, true);
+ }
+
+ public void setClipRectangles(int picture, Region clip) {
+ if (clip != null) {
+ XRSetClipNative(picture, clip.getLoX(), clip.getLoY(),
+ clip.getHiX(), clip.getHiY(),
+ clip.isRectangular() ? null : clip, false);
+ } else {
+ XRSetClipNative(picture, 0, 0, 32767, 32767, null, false);
+ }
+ }
+
+ public void renderRectangles(int dst, byte op, XRColor color,
+ GrowableRectArray rects) {
+ XRenderRectanglesNative(dst, op,
+ (short) color.red, (short) color.green,
+ (short) color.blue, (short) color.alpha,
+ rects.getArray(), rects
+ .getSize());
+ }
+
+ private static long[] getGlyphInfoPtrs(List<XRGlyphCacheEntry> cacheEntries) {
+ long[] glyphInfoPtrs = new long[cacheEntries.size()];
+ for (int i = 0; i < cacheEntries.size(); i++) {
+ glyphInfoPtrs[i] = cacheEntries.get(i).getGlyphInfoPtr();
+ }
+ return glyphInfoPtrs;
+ }
+
+ public void XRenderAddGlyphs(int glyphSet, GlyphList gl,
+ List<XRGlyphCacheEntry> cacheEntries,
+ byte[] pixelData) {
+ long[] glyphInfoPtrs = getGlyphInfoPtrs(cacheEntries);
+ XRAddGlyphsNative(glyphSet, glyphInfoPtrs,
+ glyphInfoPtrs.length, pixelData, pixelData.length);
+ }
+
+ public void XRenderFreeGlyphs(int glyphSet, int[] gids) {
+ XRFreeGlyphsNative(glyphSet, gids, gids.length);
+ }
+
+ private static native void XRAddGlyphsNative(int glyphSet,
+ long[] glyphInfoPtrs,
+ int glyphCnt,
+ byte[] pixelData,
+ int pixelDataLength);
+
+ private static native void XRFreeGlyphsNative(int glyphSet,
+ int[] gids, int idCnt);
+
+ private static native void
+ XRenderCompositeTextNative(int op, int src, int dst,
+ long maskFormat, int[] eltArray,
+ int[] glyphIDs, int eltCnt, int glyphCnt);
+
+ public int XRenderCreateGlyphSet(int formatID) {
+ return XRenderCreateGlyphSetNative(getFormatPtr(formatID));
+ }
+
+ private static native int XRenderCreateGlyphSetNative(long format);
+
+ public void XRenderCompositeText(byte op, int src, int dst,
+ int maskFormatID,
+ int src2, int src3, int dst2, int dst3,
+ int glyphset, GrowableEltArray elts) {
+
+ GrowableIntArray glyphs = elts.getGlyphs();
+ XRenderCompositeTextNative(op, src, dst, 0, elts.getArray(),
+ glyphs.getArray(), elts.getSize(),
+ glyphs.getSize());
+ }
+
+ public void putMaskImage(int drawable, long gc, byte[] imageData,
+ int sx, int sy, int dx, int dy,
+ int width, int height, int maskOff,
+ int maskScan, float ea) {
+ putMaskNative(drawable, gc, imageData, sx, sy, dx, dy,
+ width, height, maskOff, maskScan, ea, MASK_XIMG);
+ }
+
+ private static native void putMaskNative(int drawable, long gc,
+ byte[] imageData,
+ int sx, int sy, int dx, int dy,
+ int width, int height,
+ int maskOff, int maskScan,
+ float ea, long xImg);
+
+ public void padBlit(byte op, int srcPict, int maskPict, int dstPict,
+ AffineTransform maskTrx, int maskWidth, int maskHeight,
+ int lastMaskWidth, int lastMaskHeight,
+ int sx, int sy, int dx, int dy, int w, int h) {
+
+ padBlitNative(op, srcPict, maskPict, dstPict,
+ XDoubleToFixed(maskTrx.getScaleX()),
+ XDoubleToFixed(maskTrx.getShearX()),
+ XDoubleToFixed(maskTrx.getTranslateX()),
+ XDoubleToFixed(maskTrx.getShearY()),
+ XDoubleToFixed(maskTrx.getScaleY()),
+ XDoubleToFixed(maskTrx.getTranslateY()),
+ maskWidth, maskHeight, lastMaskWidth, lastMaskHeight,
+ sx, sy, dx, dy, w, h);
+ }
+
+ private static native void padBlitNative(byte op, int srcPict,
+ int maskPict, int dstPict,
+ int m00, int m01, int m02,
+ int m10, int m11, int m12,
+ int maskWidth, int maskHeight,
+ int lastMaskWidth,
+ int lastMaskHeight,
+ int sx, int sy, int dx, int dy,
+ int w, int h);
+
+ public void renderCompositeTrapezoids(byte op, int src, int maskFormat,
+ int dst, int srcX, int srcY,
+ TrapezoidList trapList) {
+ renderCompositeTrapezoidsNative(op, src, getFormatPtr(maskFormat),
+ dst, srcX, srcY,
+ trapList.getTrapArray());
+ }
+
+ private static native void
+ renderCompositeTrapezoidsNative(byte op, int src, long maskFormat,
+ int dst, int srcX, int srcY,
+ int[] trapezoids);
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRColor.java b/src/solaris/classes/sun/java2d/xr/XRColor.java
new file mode 100644
index 000000000..29200de4b
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRColor.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.*;
+
+/**
+ * XRender color class.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class XRColor {
+ public static final XRColor FULL_ALPHA = new XRColor(0xffff, 0, 0, 0);
+ public static final XRColor NO_ALPHA = new XRColor(0, 0, 0, 0);
+
+ int red, green, blue, alpha;
+
+ public XRColor() {
+ red = 0;
+ green = 0;
+ blue = 0;
+ alpha = 0;
+ }
+
+ public XRColor(int alpha, int red, int green, int blue) {
+ this.alpha = alpha;
+ this.red = red;
+ this.green = green;
+ this.blue = blue;
+ }
+
+ public XRColor(Color color) {
+ }
+
+ public void setColorValues(Color color) {
+ alpha = byteToXRColorValue(color.getAlpha());
+
+ red = byteToXRColorValue(
+ (int)(color.getRed() * color.getAlpha() / 255.0));
+ green = byteToXRColorValue(
+ (int)(color.getGreen() * color.getAlpha() / 255.0));
+ blue = byteToXRColorValue(
+ (int)(color.getBlue() * color.getAlpha() / 255.0));
+ }
+
+ public static int[] ARGBPrePixelToXRColors(int[] pixels) {
+ int[] colorValues = new int[pixels.length * 4];
+ XRColor c = new XRColor();
+
+ for (int i = 0; i < pixels.length; i++) {
+ c.setColorValues(pixels[i], true);
+ colorValues[i * 4 + 0] = c.alpha;
+ colorValues[i * 4 + 1] = c.red;
+ colorValues[i * 4 + 2] = c.green;
+ colorValues[i * 4 + 3] = c.blue;
+ }
+
+ return colorValues;
+ }
+
+ public void setColorValues(int pixel, boolean pre) {
+ long pix = XRUtils.intToULong(pixel);
+ alpha = (int) (((pix & 0xFF000000) >> 16) + 255);
+ red = (int) (((pix & 0x00FF0000) >> 8) + 255);
+ green = (int) (((pix & 0x0000FF00) >> 0) + 255);
+ blue = (int) (((pix & 0x000000FF) << 8) + 255);
+
+ if (alpha == 255) {
+ alpha = 0;
+ }
+
+ if (!pre) {
+ double alphaMult = XRUtils.XFixedToDouble(alpha);
+ this.red = (int) (red * alphaMult);
+ this.green = (int) (green * alphaMult);
+ this.blue = (int) (blue * alphaMult);
+ }
+ }
+
+ public static int byteToXRColorValue(int byteValue) {
+ int xrValue = 0;
+
+ if (byteValue != 0) {
+ if (byteValue == 255) {
+ xrValue = 0xffff;
+ } else {
+ xrValue = ((byteValue << 8) + 255);
+ }
+ }
+
+ return xrValue;
+ }
+
+ public String toString(){
+ return "A:"+alpha+" R:"+red+" G:"+green+" B:"+blue;
+ }
+
+ public void setAlpha(int alpha) {
+ this.alpha = alpha;
+ }
+
+ public int getAlpha() {
+ return alpha;
+ }
+
+ public int getRed() {
+ return red;
+ }
+
+ public int getGreen() {
+ return green;
+ }
+
+ public int getBlue() {
+ return blue;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRCompositeManager.java b/src/solaris/classes/sun/java2d/xr/XRCompositeManager.java
new file mode 100644
index 000000000..8a6d4f65f
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRCompositeManager.java
@@ -0,0 +1,334 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.*;
+import java.awt.geom.*;
+
+import sun.font.*;
+import sun.java2d.*;
+import sun.java2d.jules.*;
+import sun.java2d.loops.*;
+
+/**
+ * Manages per-application resources, e.g. the 1x1 pixmap used for solid color
+ * fill as well as per-application state e.g. the currently set source picture
+ * used for composition .
+ *
+ * @author Clemens Eisserer
+ */
+
+public class XRCompositeManager {
+ private static boolean enableGradCache = true;
+ private static XRCompositeManager instance;
+
+ XRSurfaceData src;
+ XRSurfaceData texture;
+ XRSurfaceData gradient;
+ int alphaMask = XRUtils.None;
+
+ XRColor solidColor = new XRColor();
+ float extraAlpha = 1.0f;
+ byte compRule = XRUtils.PictOpOver;
+ XRColor alphaColor = new XRColor();
+
+ XRSurfaceData solidSrcPict;
+ int alphaMaskPict;
+ int gradCachePixmap;
+ int gradCachePicture;
+
+ boolean xorEnabled = false;
+ int validatedPixel = 0;
+ Composite validatedComp;
+ Paint validatedPaint;
+ float validatedExtraAlpha = 1.0f;
+
+ XRBackend con;
+ MaskTileManager maskBuffer;
+ XRTextRenderer textRenderer;
+ XRMaskImage maskImage;
+
+ public static synchronized XRCompositeManager getInstance(
+ XRSurfaceData surface) {
+ if (instance == null) {
+ instance = new XRCompositeManager(surface);
+ }
+ return instance;
+ }
+
+ private XRCompositeManager(XRSurfaceData surface) {
+ con = new XRBackendNative();
+ // con = XRBackendJava.getInstance();
+
+ String gradProp = System.getProperty("sun.java2d.xrgradcache");
+ enableGradCache = gradProp == null ||
+ !(gradProp.equalsIgnoreCase("false") ||
+ gradProp.equalsIgnoreCase("f"));
+
+ XRPaints.register(this);
+
+ initResources(surface);
+
+ maskBuffer = new MaskTileManager(this, surface.getXid());
+ textRenderer = new XRTextRenderer(this);
+ maskImage = new XRMaskImage(this, surface.getXid());
+ }
+
+ public void initResources(XRSurfaceData surface) {
+ int parentXid = surface.getXid();
+
+ int solidPixmap = con.createPixmap(parentXid, 32, 1, 1);
+ int solidSrcPictXID = con.createPicture(solidPixmap,
+ XRUtils.PictStandardARGB32);
+ con.setPictureRepeat(solidSrcPictXID, XRUtils.RepeatNormal);
+ con.renderRectangle(solidSrcPictXID, XRUtils.PictOpSrc,
+ XRColor.FULL_ALPHA, 0, 0, 1, 1);
+ solidSrcPict = new XRSurfaceData.XRInternalSurfaceData(con,
+ solidSrcPictXID, null);
+ setForeground(0);
+
+ int extraAlphaMask = con.createPixmap(parentXid, 8, 1, 1);
+ alphaMaskPict = con.createPicture(extraAlphaMask,
+ XRUtils.PictStandardA8);
+ con.setPictureRepeat(alphaMaskPict, XRUtils.RepeatNormal);
+ con.renderRectangle(alphaMaskPict, XRUtils.PictOpClear,
+ XRColor.NO_ALPHA, 0, 0, 1, 1);
+
+ if (enableGradCache) {
+ gradCachePixmap = con.createPixmap(parentXid, 32,
+ MaskTileManager.MASK_SIZE, MaskTileManager.MASK_SIZE);
+ gradCachePicture = con.createPicture(gradCachePixmap,
+ XRUtils.PictStandardARGB32);
+ }
+ }
+
+ public void setForeground(int pixel) {
+ solidColor.setColorValues(pixel, false);
+ con.renderRectangle(solidSrcPict.picture, XRUtils.PictOpSrc,
+ solidColor, 0, 0, 1, 1);
+ }
+
+ public void setGradientPaint(XRSurfaceData gradient) {
+ if (this.gradient != null) {
+ con.freePicture(this.gradient.picture);
+ }
+ this.gradient = gradient;
+ src = gradient;
+ }
+
+ public void setTexturePaint(XRSurfaceData texture) {
+ this.texture = texture;
+ src = texture;
+ }
+
+ public void XRResetPaint() {
+ src = solidSrcPict;
+ }
+
+ public void validateCompositeState(Composite comp, AffineTransform xform,
+ Paint paint, SunGraphics2D sg2d) {
+ boolean updatePaint = (paint != validatedPaint) || paint == null;
+
+ // validate composite
+ if ((comp != validatedComp)) {
+ if (comp != null) {
+ setComposite(comp);
+ } else {
+ comp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER);
+ setComposite(comp);
+ }
+ // the paint state is dependent on the composite state, so make
+ // sure we update the color below
+ updatePaint = true;
+ validatedComp = comp;
+ }
+
+ if (sg2d != null && validatedPixel != sg2d.pixel) {
+ validatedPixel = sg2d.pixel;
+ setForeground(validatedPixel);
+ }
+
+ // validate paint
+ if (updatePaint) {
+ if (paint != null && sg2d != null
+ && sg2d.paintState >= SunGraphics2D.PAINT_GRADIENT) {
+ XRPaints.setPaint(sg2d, paint);
+ } else {
+ XRResetPaint();
+ }
+ validatedPaint = paint;
+ }
+
+ if (src != solidSrcPict) {
+ AffineTransform at = (AffineTransform) xform.clone();
+ try {
+ at.invert();
+ } catch (NoninvertibleTransformException e) {
+ at.setToIdentity();
+ }
+ src.validateAsSource(at, -1, -1);
+ }
+ }
+
+ private void setComposite(Composite comp) {
+ if (comp instanceof AlphaComposite) {
+ AlphaComposite aComp = (AlphaComposite) comp;
+ validatedExtraAlpha = aComp.getAlpha();
+
+ this.compRule = XRUtils.j2dAlphaCompToXR(aComp.getRule());
+ this.extraAlpha = validatedExtraAlpha;
+
+ if (extraAlpha == 1.0f) {
+ alphaMask = XRUtils.None;
+ alphaColor.alpha = XRColor.FULL_ALPHA.alpha;
+ } else {
+ alphaColor.alpha = XRColor
+ .byteToXRColorValue((int) (extraAlpha * 255));
+ alphaMask = alphaMaskPict;
+ con.renderRectangle(alphaMaskPict, XRUtils.PictOpSrc,
+ alphaColor, 0, 0, 1, 1);
+ }
+
+ xorEnabled = false;
+ } else if (comp instanceof XORComposite) {
+ /* XOR composite validation is handled in XRSurfaceData */
+ xorEnabled = true;
+ } else {
+ throw new InternalError(
+ "Composite accaleration not implemented for: "
+ + comp.getClass().getName());
+ }
+ }
+
+ public boolean maskRequired() {
+ return (!xorEnabled)
+ && ((src != solidSrcPict)
+ || (src == solidSrcPict && solidColor.alpha != 0xffff) || (extraAlpha != 1.0f));
+ }
+
+ public void XRComposite(int src, int mask, int dst, int srcX, int srcY,
+ int maskX, int maskY, int dstX, int dstY, int width, int height) {
+ int cachedSrc = (src == XRUtils.None) ? this.src.picture : src;
+ int cachedX = srcX;
+ int cachedY = srcY;
+
+ if (enableGradCache && gradient != null
+ && cachedSrc == gradient.picture) {
+ con.renderComposite(XRUtils.PictOpSrc, gradient.picture,
+ XRUtils.None, gradCachePicture, srcX, srcY, 0, 0, 0, 0,
+ width, height);
+ cachedX = 0;
+ cachedY = 0;
+ cachedSrc = gradCachePicture;
+ }
+
+ con.renderComposite(compRule, cachedSrc, mask, dst, cachedX, cachedY,
+ maskX, maskY, dstX, dstY, width, height);
+ }
+
+ public void XRCompositeTraps(int dst, int srcX, int srcY,
+ TrapezoidList trapList) {
+ int renderReferenceX = 0;
+ int renderReferenceY = 0;
+
+ if (trapList.getP1YLeft(0) < trapList.getP2YLeft(0)) {
+ renderReferenceX = trapList.getP1XLeft(0);
+ renderReferenceY = trapList.getP1YLeft(0);
+ } else {
+ renderReferenceX = trapList.getP2XLeft(0);
+ renderReferenceY = trapList.getP2YLeft(0);
+ }
+
+ renderReferenceX = (int) Math.floor(XRUtils
+ .XFixedToDouble(renderReferenceX));
+ renderReferenceY = (int) Math.floor(XRUtils
+ .XFixedToDouble(renderReferenceY));
+
+ con.renderCompositeTrapezoids(compRule, src.picture,
+ XRUtils.PictStandardA8, dst, renderReferenceX,
+ renderReferenceY, trapList);
+ }
+
+ public void XRRenderRectangles(XRSurfaceData dst, GrowableRectArray rects) {
+ if (xorEnabled) {
+ con.GCRectangles(dst.getXid(), dst.getGC(), rects);
+ } else {
+ con.renderRectangles(dst.getPicture(), compRule, solidColor, rects);
+ }
+ }
+
+ public void compositeBlit(XRSurfaceData src, XRSurfaceData dst, int sx,
+ int sy, int dx, int dy, int w, int h) {
+ con.renderComposite(compRule, src.picture, alphaMask, dst.picture, sx,
+ sy, 0, 0, dx, dy, w, h);
+ }
+
+ public void compositeText(int dst, int glyphSet, int maskFormat,
+ GrowableEltArray elts) {
+ con.XRenderCompositeText(compRule, src.picture, dst, maskFormat, 0, 0,
+ 0, 0, glyphSet, elts);
+ }
+
+ public XRColor getMaskColor() {
+ return !isTexturePaintActive() ? XRColor.FULL_ALPHA : getAlphaColor();
+ }
+
+ public int getExtraAlphaMask() {
+ return alphaMask;
+ }
+
+ public boolean isTexturePaintActive() {
+ return src == texture;
+ }
+
+ public XRColor getAlphaColor() {
+ return alphaColor;
+ }
+
+ public XRBackend getBackend() {
+ return con;
+ }
+
+ public float getExtraAlpha() {
+ return validatedExtraAlpha;
+ }
+
+ public byte getCompRule() {
+ return compRule;
+ }
+
+ public XRTextRenderer getTextRenderer() {
+ return textRenderer;
+ }
+
+ public MaskTileManager getMaskBuffer() {
+ return maskBuffer;
+ }
+
+ public XRMaskImage getMaskImage() {
+ return maskImage;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRDrawImage.java b/src/solaris/classes/sun/java2d/xr/XRDrawImage.java
new file mode 100644
index 000000000..6db898741
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRDrawImage.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.*;
+import java.awt.geom.*;
+
+import sun.java2d.*;
+import sun.java2d.loops.*;
+import sun.java2d.pipe.*;
+
+/**
+ * Class used for re-routing transformed blits to the accelerated loops.
+ */
+
+public class XRDrawImage extends DrawImage {
+ @Override
+ protected void renderImageXform(SunGraphics2D sg, Image img,
+ AffineTransform tx, int interpType, int sx1, int sy1, int sx2,
+ int sy2, Color bgColor) {
+ SurfaceData dstData = sg.surfaceData;
+ SurfaceData srcData = dstData.getSourceSurfaceData(img,
+ SunGraphics2D.TRANSFORM_GENERIC, sg.imageComp, bgColor);
+
+ if (srcData != null && !isBgOperation(srcData, bgColor)) { // TODO: Do we bail out on bgBlits?
+ // && srcData instanceof XRSurfaceData) {
+ SurfaceType srcType = srcData.getSurfaceType();
+ SurfaceType dstType = dstData.getSurfaceType();
+
+ TransformBlit blit = TransformBlit.getFromCache(srcType,
+ sg.imageComp, dstType);
+
+ if (blit != null) {
+ blit.Transform(srcData, dstData, sg.composite,
+ sg.getCompClip(), tx, interpType, sx1, sy1, 0, 0, sx2
+ - sx1, sy2 - sy1);
+ return;
+ }
+ }
+
+ super.renderImageXform(sg, img, tx, interpType, sx1, sy1, sx2, sy2,
+ bgColor);
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRGraphicsConfig.java b/src/solaris/classes/sun/java2d/xr/XRGraphicsConfig.java
new file mode 100644
index 000000000..a2c9dac26
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRGraphicsConfig.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package sun.java2d.xr;
+
+import sun.awt.*;
+import sun.awt.image.*;
+import sun.java2d.*;
+
+public class XRGraphicsConfig extends X11GraphicsConfig implements
+ SurfaceManager.ProxiedGraphicsConfig {
+ private XRGraphicsConfig(X11GraphicsDevice device, int visualnum,
+ int depth, int colormap, boolean doubleBuffer) {
+ super(device, visualnum, depth, colormap, doubleBuffer);
+ }
+
+ public SurfaceData createSurfaceData(X11ComponentPeer peer) {
+ return XRSurfaceData.createData(peer);
+ }
+
+ public static XRGraphicsConfig getConfig(X11GraphicsDevice device,
+ int visualnum, int depth, int colormap, boolean doubleBuffer) {
+ if (!X11GraphicsEnvironment.isXRenderAvailable()) {
+ return null;
+ }
+
+ return new XRGraphicsConfig(device, visualnum, depth, colormap,
+ doubleBuffer);
+ }
+
+ public Object getProxyKey() {
+ return this;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRMaskBlit.java b/src/solaris/classes/sun/java2d/xr/XRMaskBlit.java
new file mode 100644
index 000000000..ed6a6412a
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRMaskBlit.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import static sun.java2d.loops.CompositeType.SrcNoEa;
+import static sun.java2d.loops.CompositeType.SrcOver;
+
+import java.awt.Composite;
+
+import sun.awt.*;
+import sun.java2d.*;
+import sun.java2d.loops.*;
+import sun.java2d.pipe.Region;
+
+/**
+ * For XRender there is no "blit", everything is just a fill with Repeat or Not.
+ * So basically this just quite the same as MaskFill.
+ *
+ * @author Clemens Eisserer
+ */
+public class XRMaskBlit extends MaskBlit {
+ static void register() {
+ GraphicsPrimitive[] primitives = {
+ new XRMaskBlit(XRSurfaceData.IntArgbPreX11, SrcOver,
+ XRSurfaceData.IntArgbPreX11),
+ new XRMaskBlit(XRSurfaceData.IntRgbX11, SrcOver,
+ XRSurfaceData.IntRgbX11),
+ new XRMaskBlit(XRSurfaceData.IntArgbPreX11, SrcNoEa,
+ XRSurfaceData.IntRgbX11),
+ new XRMaskBlit(XRSurfaceData.IntRgbX11, SrcNoEa,
+ XRSurfaceData.IntArgbPreX11)
+ };
+ GraphicsPrimitiveMgr.register(primitives);
+ }
+
+ public XRMaskBlit(SurfaceType srcType, CompositeType compType,
+ SurfaceType dstType) {
+ super(srcType, CompositeType.AnyAlpha, dstType);
+ }
+
+ protected native void maskBlit(long srcXsdo, long dstxsdo, int srcx,
+ int srcy, int dstx, int dsty, int w, int h, int maskoff,
+ int maskscan, int masklen, byte[] mask);
+
+ public void MaskBlit(SurfaceData src, SurfaceData dst, Composite comp,
+ Region clip, int srcx, int srcy, int dstx, int dsty, int width,
+ int height, byte[] mask, int maskoff, int maskscan) {
+ if (width <= 0 || height <= 0) {
+ return;
+ }
+
+ try {
+ SunToolkit.awtLock();
+
+ XRSurfaceData x11sd = (XRSurfaceData) src;
+ x11sd.validateAsSource(null, XRUtils.RepeatNone, XRUtils.FAST);
+
+ XRCompositeManager maskBuffer = x11sd.maskBuffer;
+ XRSurfaceData x11dst = (XRSurfaceData) dst;
+ x11dst.validateAsDestination(null, clip);
+
+ int maskPict = maskBuffer.getMaskBuffer().
+ uploadMask(width, height, maskscan, maskoff, mask);
+ maskBuffer.XRComposite(x11sd.getPicture(), maskPict, x11sd.picture,
+ srcx, srcy, 0, 0, dstx, dsty, width, height);
+ maskBuffer.getMaskBuffer().clearUploadMask(maskPict, width, height);
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRMaskFill.java b/src/solaris/classes/sun/java2d/xr/XRMaskFill.java
new file mode 100644
index 000000000..5ec6c28a4
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRMaskFill.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import static sun.java2d.loops.CompositeType.SrcNoEa;
+
+import static sun.java2d.loops.CompositeType.SrcOver;
+import static sun.java2d.loops.SurfaceType.AnyColor;
+import static sun.java2d.loops.SurfaceType.GradientPaint;
+import static sun.java2d.loops.SurfaceType.LinearGradientPaint;
+import static sun.java2d.loops.SurfaceType.OpaqueColor;
+import static sun.java2d.loops.SurfaceType.OpaqueGradientPaint;
+import static sun.java2d.loops.SurfaceType.OpaqueLinearGradientPaint;
+import static sun.java2d.loops.SurfaceType.OpaqueRadialGradientPaint;
+import static sun.java2d.loops.SurfaceType.OpaqueTexturePaint;
+import static sun.java2d.loops.SurfaceType.RadialGradientPaint;
+import static sun.java2d.loops.SurfaceType.TexturePaint;
+
+import java.awt.*;
+import sun.awt.*;
+import sun.java2d.*;
+import sun.java2d.loops.*;
+
+public class XRMaskFill extends MaskFill {
+ static void register() {
+ GraphicsPrimitive[] primitives = {
+ new XRMaskFill(AnyColor, SrcOver, XRSurfaceData.IntRgbX11),
+ new XRMaskFill(OpaqueColor, SrcNoEa, XRSurfaceData.IntRgbX11),
+ new XRMaskFill(GradientPaint, SrcOver, XRSurfaceData.IntRgbX11),
+ new XRMaskFill(OpaqueGradientPaint, SrcNoEa,
+ XRSurfaceData.IntRgbX11),
+ new XRMaskFill(LinearGradientPaint, SrcOver,
+ XRSurfaceData.IntRgbX11),
+ new XRMaskFill(OpaqueLinearGradientPaint, SrcNoEa,
+ XRSurfaceData.IntRgbX11),
+ new XRMaskFill(RadialGradientPaint, SrcOver,
+ XRSurfaceData.IntRgbX11),
+ new XRMaskFill(OpaqueRadialGradientPaint, SrcNoEa,
+ XRSurfaceData.IntRgbX11),
+ new XRMaskFill(TexturePaint, SrcOver, XRSurfaceData.IntRgbX11),
+ new XRMaskFill(OpaqueTexturePaint, SrcNoEa,
+ XRSurfaceData.IntRgbX11),
+
+ new XRMaskFill(AnyColor, SrcOver, XRSurfaceData.IntArgbPreX11),
+ new XRMaskFill(OpaqueColor, SrcNoEa, XRSurfaceData.IntArgbPreX11),
+ new XRMaskFill(GradientPaint, SrcOver, XRSurfaceData.IntArgbPreX11),
+ new XRMaskFill(OpaqueGradientPaint, SrcNoEa,
+ XRSurfaceData.IntArgbPreX11),
+ new XRMaskFill(LinearGradientPaint, SrcOver,
+ XRSurfaceData.IntArgbPreX11),
+ new XRMaskFill(OpaqueLinearGradientPaint, SrcNoEa,
+ XRSurfaceData.IntArgbPreX11),
+ new XRMaskFill(RadialGradientPaint, SrcOver,
+ XRSurfaceData.IntArgbPreX11),
+ new XRMaskFill(OpaqueRadialGradientPaint, SrcNoEa,
+ XRSurfaceData.IntArgbPreX11),
+ new XRMaskFill(TexturePaint, SrcOver, XRSurfaceData.IntArgbPreX11),
+ new XRMaskFill(OpaqueTexturePaint, SrcNoEa,
+ XRSurfaceData.IntArgbPreX11)
+ };
+
+ GraphicsPrimitiveMgr.register(primitives);
+ }
+
+ protected XRMaskFill(SurfaceType srcType, CompositeType compType,
+ SurfaceType surfaceType) {
+ super(srcType, compType, surfaceType);
+ }
+
+ protected native void maskFill(long xsdo, int x, int y, int w, int h,
+ int maskoff, int maskscan, int masklen, byte[] mask);
+
+ public void MaskFill(SunGraphics2D sg2d, SurfaceData sData, Composite comp,
+ final int x, final int y, final int w, final int h,
+ final byte[] mask, final int maskoff, final int maskscan) {
+ try {
+ SunToolkit.awtLock();
+
+ XRSurfaceData x11sd = (XRSurfaceData) sData;
+ x11sd.validateAsDestination(null, sg2d.getCompClip());
+
+ XRCompositeManager maskBuffer = x11sd.maskBuffer;
+ maskBuffer.validateCompositeState(comp, sg2d.transform, sg2d.paint, sg2d);
+
+ int maskPict = maskBuffer.getMaskBuffer().uploadMask(w, h, maskscan, maskoff, mask);
+ maskBuffer.XRComposite(XRUtils.None, maskPict, x11sd.picture, x, y, 0, 0, x, y, w, h);
+ maskBuffer.getMaskBuffer().clearUploadMask(maskPict, w, h);
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRMaskImage.java b/src/solaris/classes/sun/java2d/xr/XRMaskImage.java
new file mode 100644
index 000000000..555adcc9e
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRMaskImage.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.*;
+import java.awt.geom.*;
+
+/**
+ * Management of mask used for some blit-types.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class XRMaskImage {
+
+ private static final int MASK_SCALE_FACTOR = 8;
+
+ private static final int BLIT_MASK_SIZE = 8;
+
+ Dimension blitMaskDimensions = new Dimension(BLIT_MASK_SIZE, BLIT_MASK_SIZE);
+ int blitMaskPixmap;
+ int blitMaskPicture;
+ int lastMaskWidth = 0;
+ int lastMaskHeight = 0;
+ AffineTransform lastMaskTransform;
+
+ XRCompositeManager xrMgr;
+ XRBackend con;
+
+ public XRMaskImage(XRCompositeManager xrMgr, int parentDrawable) {
+ this.xrMgr = xrMgr;
+ this.con = xrMgr.getBackend();
+
+ initBlitMask(parentDrawable, BLIT_MASK_SIZE, BLIT_MASK_SIZE);
+ }
+
+
+ /**
+ * Prepares a mask used by a TransformedBlit, fills mask-contents and applies
+ * transformation.
+ */
+ public int prepareBlitMask(XRSurfaceData dst, AffineTransform maskTX, int width,
+ int height) {
+
+ int maskWidth = Math.max(width / MASK_SCALE_FACTOR, 1);
+ int maskHeight = Math.max(height / MASK_SCALE_FACTOR, 1);
+ maskTX.scale(((double) width) / maskWidth, ((double) height) / maskHeight);
+
+ try {
+ maskTX.invert();
+ } catch (NoninvertibleTransformException ex) {
+ maskTX.setToIdentity();
+ }
+
+ ensureBlitMaskSize(maskWidth, maskHeight);
+
+ if (lastMaskTransform == null || !lastMaskTransform.equals(maskTX)) {
+ con.setPictureTransform(blitMaskPicture, maskTX);
+ lastMaskTransform = maskTX;
+ }
+
+ if (lastMaskWidth != maskWidth || lastMaskHeight != maskHeight) {
+ //Only clear mask, if previous mask area is larger than new one, otherwise simple overpaint it
+ if (lastMaskWidth > maskWidth || lastMaskHeight > maskHeight) {
+ con.renderRectangle(blitMaskPicture, XRUtils.PictOpClear, XRColor.NO_ALPHA, 0, 0, lastMaskWidth, lastMaskHeight);
+ }
+
+ con.renderRectangle(blitMaskPicture, XRUtils.PictOpSrc, xrMgr.getAlphaColor(), 0, 0, maskWidth, maskHeight);
+ }
+
+ lastMaskWidth = maskWidth;
+ lastMaskHeight = maskHeight;
+
+ return blitMaskPicture;
+ }
+
+ private void initBlitMask(int parentDrawable, int width, int height) {
+ int newPM = con.createPixmap(parentDrawable, 8, width, height);
+ int newPict = con.createPicture(newPM, XRUtils.PictStandardA8);
+
+ /*Free old mask*/
+ if (blitMaskPixmap != 0) {
+ con.freePixmap(blitMaskPixmap);
+ con.freePicture(blitMaskPicture);
+ }
+
+ blitMaskPixmap = newPM;
+ blitMaskPicture = newPict;
+
+ con.renderRectangle(blitMaskPicture, XRUtils.PictOpClear, XRColor.NO_ALPHA, 0, 0, width, height);
+
+ blitMaskDimensions.width = width;
+ blitMaskDimensions.height = height;
+ lastMaskWidth = 0;
+ lastMaskHeight = 0;
+ lastMaskTransform = null;
+ }
+
+ private void ensureBlitMaskSize(int minSizeX, int minSizeY) {
+ if (minSizeX > blitMaskDimensions.width || minSizeY > blitMaskDimensions.height) {
+ int newWidth = Math.max(minSizeX, blitMaskDimensions.width);
+ int newHeight = Math.max(minSizeY, blitMaskDimensions.height);
+ initBlitMask(blitMaskPixmap, newWidth, newHeight);
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java b/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java
new file mode 100644
index 000000000..40536066f
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java
@@ -0,0 +1,400 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import sun.awt.SunToolkit;
+import sun.awt.image.*;
+import sun.java2d.loops.*;
+import sun.java2d.pipe.*;
+import sun.java2d.*;
+import java.awt.*;
+import java.awt.geom.*;
+import java.lang.ref.*;
+
+public class XRPMBlitLoops {
+
+ static WeakReference<SunVolatileImage> argbTmpPM = new WeakReference<SunVolatileImage>(null);
+ static WeakReference<SunVolatileImage> rgbTmpPM = new WeakReference<SunVolatileImage>(null);
+
+ public XRPMBlitLoops() {
+ }
+
+ public static void register() {
+ GraphicsPrimitive[] primitives = { new XRPMBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntRgbX11),
+ new XRPMBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntArgbPreX11),
+ new XRPMBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntRgbX11),
+ new XRPMBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntArgbPreX11),
+
+ new XRPMScaledBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntRgbX11),
+ new XRPMScaledBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntArgbPreX11),
+ new XRPMScaledBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntRgbX11),
+ new XRPMScaledBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntArgbPreX11),
+
+ new XRPMTransformedBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntRgbX11),
+ new XRPMTransformedBlit(XRSurfaceData.IntRgbX11, XRSurfaceData.IntArgbPreX11),
+ new XRPMTransformedBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntRgbX11),
+ new XRPMTransformedBlit(XRSurfaceData.IntArgbPreX11, XRSurfaceData.IntArgbPreX11),
+
+ /* SW -> Surface Blits */
+ new XrSwToPMBlit(SurfaceType.IntArgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMBlit(SurfaceType.IntRgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMBlit(SurfaceType.IntBgr, XRSurfaceData.IntRgbX11),
+ new XrSwToPMBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntRgbX11),
+ new XrSwToPMBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntRgbX11),
+
+ new XrSwToPMBlit(SurfaceType.IntArgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMBlit(SurfaceType.IntRgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMBlit(SurfaceType.IntBgr, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntArgbPreX11),
+
+ /* SW->Surface Scales */
+ new XrSwToPMScaledBlit(SurfaceType.IntArgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMScaledBlit(SurfaceType.IntRgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMScaledBlit(SurfaceType.IntBgr, XRSurfaceData.IntRgbX11),
+ new XrSwToPMScaledBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntRgbX11),
+ new XrSwToPMScaledBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMScaledBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMScaledBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntRgbX11),
+
+ new XrSwToPMScaledBlit(SurfaceType.IntArgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMScaledBlit(SurfaceType.IntRgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMScaledBlit(SurfaceType.IntBgr, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMScaledBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMScaledBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMScaledBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMScaledBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntArgbPreX11),
+
+ /* SW->Surface Transforms */
+ new XrSwToPMTransformedBlit(SurfaceType.IntArgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMTransformedBlit(SurfaceType.IntRgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMTransformedBlit(SurfaceType.IntBgr, XRSurfaceData.IntRgbX11),
+ new XrSwToPMTransformedBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntRgbX11),
+ new XrSwToPMTransformedBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMTransformedBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntRgbX11),
+ new XrSwToPMTransformedBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntRgbX11),
+
+ new XrSwToPMTransformedBlit(SurfaceType.IntArgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMTransformedBlit(SurfaceType.IntRgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMTransformedBlit(SurfaceType.IntBgr, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMTransformedBlit(SurfaceType.ThreeByteBgr, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMTransformedBlit(SurfaceType.Ushort565Rgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMTransformedBlit(SurfaceType.Ushort555Rgb, XRSurfaceData.IntArgbPreX11),
+ new XrSwToPMTransformedBlit(SurfaceType.ByteIndexed, XRSurfaceData.IntArgbPreX11), };
+ GraphicsPrimitiveMgr.register(primitives);
+ }
+
+ /**
+ * Caches a SW surface using a temporary pixmap. The pixmap is held by a WeakReference,
+ * allowing it to shrink again after some time.
+ */
+ protected static XRSurfaceData cacheToTmpSurface(SurfaceData src, XRSurfaceData dst, int w, int h, int sx, int sy) {
+ SunVolatileImage vImg;
+ SurfaceType vImgSurfaceType;
+
+ if (src.getTransparency() == Transparency.OPAQUE) {
+ vImg = rgbTmpPM.get();
+ vImgSurfaceType = SurfaceType.IntRgb;
+ } else {
+ vImg = argbTmpPM.get();
+ vImgSurfaceType = SurfaceType.IntArgbPre;
+ }
+
+ if (vImg == null || vImg.getWidth() < w || vImg.getHeight() < h) {
+ if (vImg != null) {
+ vImg.flush();
+ }
+ vImg = (SunVolatileImage) dst.getGraphicsConfig().createCompatibleVolatileImage(w, h, src.getTransparency());
+ vImg.setAccelerationPriority(1.0f);
+
+ if (src.getTransparency() == SurfaceData.OPAQUE) {
+ rgbTmpPM = new WeakReference<SunVolatileImage>(vImg);
+ } else {
+ argbTmpPM = new WeakReference<SunVolatileImage>(vImg);
+ }
+ }
+
+ Blit swToSurfaceBlit = Blit.getFromCache(src.getSurfaceType(), CompositeType.SrcNoEa, vImgSurfaceType);
+ XRSurfaceData vImgSurface = (XRSurfaceData) vImg.getDestSurface();
+ swToSurfaceBlit.Blit(src, vImgSurface, null, null, sx, sy, 0, 0, w, h);
+
+ return vImgSurface;
+ }
+}
+
+class XRPMBlit extends Blit {
+ public XRPMBlit(SurfaceType srcType, SurfaceType dstType) {
+ super(srcType, CompositeType.AnyAlpha, dstType);
+ }
+
+ public void Blit(SurfaceData src, SurfaceData dst, Composite comp, Region clip, int sx, int sy, int dx, int dy, int w, int h) {
+ try {
+ SunToolkit.awtLock();
+
+ XRSurfaceData x11sdDst = (XRSurfaceData) dst;
+ x11sdDst.validateAsDestination(null, clip);
+ XRSurfaceData x11sdSrc = (XRSurfaceData) src;
+ x11sdSrc.validateAsSource(null, XRUtils.RepeatNone, XRUtils.FAST);
+
+ x11sdDst.maskBuffer.validateCompositeState(comp, null, null, null);
+
+ x11sdDst.maskBuffer.compositeBlit(x11sdSrc, x11sdDst, sx, sy, dx, dy, w, h);
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+}
+
+class XRPMScaledBlit extends ScaledBlit {
+ public XRPMScaledBlit(SurfaceType srcType, SurfaceType dstType) {
+ super(srcType, CompositeType.AnyAlpha, dstType);
+ }
+
+ /*
+ * TODO: This breaks scales with non-integer coordinates!?!?!
+ */
+ public void Scale(SurfaceData src, SurfaceData dst, Composite comp, Region clip, int sx1, int sy1, int sx2, int sy2, double dx1, double dy1,
+ double dx2, double dy2) {
+ try {
+ SunToolkit.awtLock();
+
+ XRSurfaceData x11sdDst = (XRSurfaceData) dst;
+ x11sdDst.validateAsDestination(null, clip);
+ XRSurfaceData x11sdSrc = (XRSurfaceData) src;
+ x11sdDst.maskBuffer.validateCompositeState(comp, null, null, null);
+
+ double xScale = (dx2 - dx1) / (sx2 - sx1);
+ double yScale = (dy2 - dy1) / (sy2 - sy1);
+
+ sx1 *= xScale;
+ sx2 *= xScale;
+ sy1 *= yScale;
+ sy2 *= yScale;
+
+ AffineTransform xForm = AffineTransform.getScaleInstance(1 / xScale, 1 / yScale);
+
+ x11sdSrc.validateAsSource(xForm, XRUtils.RepeatNone, XRUtils.FAST); /*
+ * TODO:
+ * padded
+ * blit
+ * required
+ * :
+ * -
+ * /
+ * ?
+ * ?
+ */
+ x11sdDst.maskBuffer.compositeBlit(x11sdSrc, x11sdDst, (int) sx1, (int) sy1, (int) dx1, (int) dy1, (int) (dx2 - dx1), (int) (dy2 - dy1));
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+}
+
+/**
+ * Called also if scale+transform is set
+ *
+ * @author Clemens Eisserer
+ */
+class XRPMTransformedBlit extends TransformBlit {
+
+ public XRPMTransformedBlit(SurfaceType srcType, SurfaceType dstType) {
+ super(srcType, CompositeType.AnyAlpha, dstType);
+ }
+
+ /*
+ * Calculates the composite-rectangle required for transformed blits. This
+ * method is functionally equal to: Shape shp =
+ * xform.createTransformedShape(rect); Rectangle bounds = shp.getBounds();
+ * but performs significantly better.
+ */
+ public Rectangle getCompositeBounds(AffineTransform tr, int dstx, int dsty, int width, int height) {
+ double[] compBounds = new double[8];
+ compBounds[0] = dstx;
+ compBounds[1] = dsty;
+ compBounds[2] = dstx + width;
+ compBounds[3] = dsty;
+ compBounds[4] = dstx + width;
+ compBounds[5] = dsty + height;
+ compBounds[6] = dstx;
+ compBounds[7] = dsty + height;
+
+ tr.transform(compBounds, 0, compBounds, 0, 4);
+
+ double minX = Math.min(compBounds[0], Math.min(compBounds[2], Math.min(compBounds[4], compBounds[6])));
+ double minY = Math.min(compBounds[1], Math.min(compBounds[3], Math.min(compBounds[5], compBounds[7])));
+ double maxX = Math.max(compBounds[0], Math.max(compBounds[2], Math.max(compBounds[4], compBounds[6])));
+ double maxY = Math.max(compBounds[1], Math.max(compBounds[3], Math.max(compBounds[5], compBounds[7])));
+
+ minX = Math.floor(minX);
+ minY = Math.floor(minY);
+ maxX = Math.ceil(maxX);
+ maxY = Math.ceil(maxY);
+
+ return new Rectangle((int) minX, (int) minY, (int) (maxX - minX), (int) (maxY - minY));
+ }
+
+ public void Transform(SurfaceData src, SurfaceData dst, Composite comp, Region clip, AffineTransform xform, int hint, int srcx, int srcy,
+ int dstx, int dsty, int width, int height) {
+ try {
+ SunToolkit.awtLock();
+
+ int filter = XRUtils.ATransOpToXRQuality(hint);
+
+ XRSurfaceData x11sdDst = (XRSurfaceData) dst;
+ x11sdDst.validateAsDestination(null, clip);
+ XRSurfaceData x11sdSrc = (XRSurfaceData) src;
+ x11sdDst.maskBuffer.validateCompositeState(comp, null, null, null);
+
+ Rectangle bounds = getCompositeBounds(xform, dstx, dsty, width, height);
+
+ AffineTransform trx = AffineTransform.getTranslateInstance((-bounds.x), (-bounds.y));
+ trx.concatenate(xform);
+ AffineTransform maskTX = (AffineTransform) trx.clone();
+
+ trx.translate(-srcx, -srcy);
+
+ try {
+ trx.invert();
+ } catch (NoninvertibleTransformException ex) {
+ trx.setToIdentity();
+ System.err.println("Reseted to identity!");
+ }
+
+ boolean omitMask = isMaskOmittable(trx, comp, filter);
+
+ if (!omitMask) {
+ XRMaskImage mask = x11sdSrc.maskBuffer.getMaskImage();
+
+ x11sdSrc.validateAsSource(trx, XRUtils.RepeatPad, filter);
+ int maskPicture = mask.prepareBlitMask(x11sdDst, maskTX, width, height);
+ x11sdDst.maskBuffer.con.renderComposite(XRCompositeManager.getInstance(x11sdSrc).getCompRule(), x11sdSrc.picture, maskPicture, x11sdDst.picture,
+ 0, 0, 0, 0, bounds.x, bounds.y, bounds.width, bounds.height);
+ } else {
+ int repeat = filter == XRUtils.FAST ? XRUtils.RepeatNone : XRUtils.RepeatPad;
+
+ x11sdSrc.validateAsSource(trx, repeat, filter);
+ x11sdDst.maskBuffer.compositeBlit(x11sdSrc, x11sdDst, 0, 0, bounds.x, bounds.y, bounds.width, bounds.height);
+ }
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ /* TODO: Is mask ever omitable??? ... should be for 90 degree rotation and no shear, but we always need to use RepeatPad */
+ protected static boolean isMaskOmittable(AffineTransform trx, Composite comp, int filter) {
+ return (filter == XRUtils.FAST || trx.getTranslateX() == (int) trx.getTranslateX() /*
+ * If
+ * translate
+ * is
+ * integer
+ * only
+ */
+ && trx.getTranslateY() == (int) trx.getTranslateY() && (trx.getShearX() == 0 && trx.getShearY() == 0 // Only
+ // 90 degree
+ // rotation
+ || trx.getShearX() == -trx.getShearY())) && ((AlphaComposite) comp).getAlpha() == 1.0f; // No
+ // ExtraAlpha!=1
+ }
+}
+
+class XrSwToPMBlit extends Blit {
+ Blit pmToSurfaceBlit;
+
+ XrSwToPMBlit(SurfaceType srcType, SurfaceType dstType) {
+ super(srcType, CompositeType.AnyAlpha, dstType);
+ pmToSurfaceBlit = new XRPMBlit(dstType, dstType);
+ }
+
+ public void Blit(SurfaceData src, SurfaceData dst, Composite comp, Region clip, int sx, int sy, int dx, int dy, int w, int h) {
+ /*
+ * If the blit is write-only (putimge), no need for a temporary VI.
+ */
+ if (CompositeType.SrcOverNoEa.equals(comp) && (src.getTransparency() == Transparency.OPAQUE)) {
+ Blit opaqueSwToSurfaceBlit = Blit.getFromCache(src.getSurfaceType(), CompositeType.SrcNoEa, dst.getSurfaceType());
+ opaqueSwToSurfaceBlit.Blit(src, dst, comp, clip, sx, sy, dx, dy, w, h);
+ } else {
+ try {
+ SunToolkit.awtLock();
+
+ XRSurfaceData vImgSurface = XRPMBlitLoops.cacheToTmpSurface(src, (XRSurfaceData) dst, w, h, sx, sy);
+ pmToSurfaceBlit.Blit(vImgSurface, dst, comp, clip, 0, 0, dx, dy, w, h);
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+ }
+}
+
+class XrSwToPMScaledBlit extends ScaledBlit {
+ ScaledBlit pmToSurfaceBlit;
+
+ XrSwToPMScaledBlit(SurfaceType srcType, SurfaceType dstType) {
+ super(srcType, CompositeType.AnyAlpha, dstType);
+ pmToSurfaceBlit = new XRPMScaledBlit(dstType, dstType);
+ }
+
+ public void Scale(SurfaceData src, SurfaceData dst, Composite comp, Region clip, int sx1, int sy1, int sx2, int sy2, double dx1, double dy1,
+ double dx2, double dy2) {
+ {
+ int w = sx2 - sx1;
+ int h = sy2 - sy1;
+
+ try {
+ SunToolkit.awtLock();
+ XRSurfaceData vImgSurface = XRPMBlitLoops.cacheToTmpSurface(src, (XRSurfaceData) dst, w, h, sx1, sy1);
+ pmToSurfaceBlit.Scale(vImgSurface, dst, comp, clip, 0, 0, w, h, dx1, dy1, dx2, dy2);
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+ }
+}
+
+class XrSwToPMTransformedBlit extends TransformBlit {
+ TransformBlit pmToSurfaceBlit;
+
+ XrSwToPMTransformedBlit(SurfaceType srcType, SurfaceType dstType) {
+ super(srcType, CompositeType.AnyAlpha, dstType);
+ pmToSurfaceBlit = new XRPMTransformedBlit(dstType, dstType);
+ }
+
+ public void Transform(SurfaceData src, SurfaceData dst, Composite comp, Region clip, AffineTransform xform, int hint, int sx, int sy, int dstx,
+ int dsty, int w, int h) {
+ try {
+ SunToolkit.awtLock();
+
+ XRSurfaceData vImgSurface = XRPMBlitLoops.cacheToTmpSurface(src, (XRSurfaceData) dst, w, h, sx, sy);
+ pmToSurfaceBlit.Transform(vImgSurface, dst, comp, clip, xform, hint, 0, 0, dstx, dsty, w, h);
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRPaints.java b/src/solaris/classes/sun/java2d/xr/XRPaints.java
new file mode 100644
index 000000000..42dec990f
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRPaints.java
@@ -0,0 +1,314 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.*;
+import java.awt.MultipleGradientPaint.*;
+import java.awt.geom.*;
+import java.awt.image.*;
+
+import sun.java2d.*;
+import sun.java2d.loops.*;
+import sun.java2d.pipe.*;
+
+abstract class XRPaints {
+ static XRCompositeManager xrCompMan;
+
+ static final XRGradient xrGradient = new XRGradient();
+ static final XRLinearGradient xrLinearGradient = new XRLinearGradient();
+ static final XRRadialGradient xrRadialGradient = new XRRadialGradient();
+ static final XRTexture xrTexture = new XRTexture();
+
+ public static void register(XRCompositeManager xrComp) {
+ xrCompMan = xrComp;
+ }
+
+ private static XRPaints getXRPaint(SunGraphics2D sg2d) {
+ switch (sg2d.paintState) {
+ case SunGraphics2D.PAINT_GRADIENT:
+ return xrGradient;
+
+ case SunGraphics2D.PAINT_LIN_GRADIENT:
+ return xrLinearGradient;
+
+ case SunGraphics2D.PAINT_RAD_GRADIENT:
+ return xrRadialGradient;
+
+ case SunGraphics2D.PAINT_TEXTURE:
+ return xrTexture;
+
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Attempts to locate an implementation corresponding to the paint state of
+ * the provided SunGraphics2D object. If no implementation can be found, or
+ * if the paint cannot be accelerated under the conditions of the
+ * SunGraphics2D, this method returns false; otherwise, returns true.
+ */
+ static boolean isValid(SunGraphics2D sg2d) {
+ XRPaints impl = getXRPaint(sg2d);
+ return (impl != null && impl.isPaintValid(sg2d));
+ }
+
+ static void setPaint(SunGraphics2D sg2d, Paint paint) {
+ XRPaints impl = getXRPaint(sg2d);
+ if (impl != null) {
+ impl.setXRPaint(sg2d, paint);
+ }
+ }
+
+ /**
+ * Returns true if this implementation is able to accelerate the Paint
+ * object associated with, and under the conditions of, the provided
+ * SunGraphics2D instance; otherwise returns false.
+ */
+ abstract boolean isPaintValid(SunGraphics2D sg2d);
+
+ abstract void setXRPaint(SunGraphics2D sg2d, Paint paint);
+
+ private static class XRGradient extends XRPaints {
+ private XRGradient() {
+ }
+
+ /**
+ * There are no restrictions for accelerating GradientPaint, so this
+ * method always returns true.
+ */
+ @Override
+ boolean isPaintValid(SunGraphics2D sg2d) {
+ return true;
+ }
+
+ void setXRPaint(SunGraphics2D sg2d, Paint pt) {
+ GradientPaint paint = (GradientPaint) pt;
+
+ int[] pixels = convertToIntArgbPixels(new Color[] { paint.getColor1(), paint.getColor2() }, false);
+
+ float fractions[] = new float[2];
+ fractions[0] = 0;
+ fractions[1] = 1;
+
+ Point2D pt1 = paint.getPoint1();
+ Point2D pt2 = paint.getPoint2();
+
+ AffineTransform at = (AffineTransform) sg2d.transform.clone();
+ try {
+ at.invert();
+ } catch (NoninvertibleTransformException ex) {
+ at.setToIdentity();
+ }
+
+ int repeat = paint.isCyclic() ? XRUtils.RepeatReflect : XRUtils.RepeatPad;
+
+ XRBackend con = xrCompMan.getBackend();
+ int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat, at);
+ xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at));
+ }
+ }
+
+ public int getGradientLength(Point2D pt1, Point2D pt2) {
+ double xDiff = Math.max(pt1.getX(), pt2.getX()) - Math.min(pt1.getX(), pt2.getX());
+ double yDiff = Math.max(pt1.getY(), pt2.getY()) - Math.min(pt1.getY(), pt2.getY());
+ return (int) Math.ceil(Math.sqrt(xDiff*xDiff + yDiff*yDiff));
+ }
+
+ private static class XRLinearGradient extends XRPaints {
+
+ @Override
+ boolean isPaintValid(SunGraphics2D sg2d) {
+ return true;
+ }
+
+ @Override
+ void setXRPaint(SunGraphics2D sg2d, Paint pt) {
+ LinearGradientPaint paint = (LinearGradientPaint) pt;
+ boolean linear = (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB);
+
+ Color[] colors = paint.getColors();
+ Point2D pt1 = paint.getStartPoint();
+ Point2D pt2 = paint.getEndPoint();
+
+
+ AffineTransform at = paint.getTransform();
+ at.preConcatenate(sg2d.transform);
+
+ int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod());
+ float[] fractions = paint.getFractions();
+ int[] pixels = convertToIntArgbPixels(colors, linear);
+
+ try {
+ at.invert();
+ } catch (NoninvertibleTransformException ex) {
+ ex.printStackTrace();
+ }
+
+ XRBackend con = xrCompMan.getBackend();
+ int gradient = con.createLinearGradient(pt1, pt2, fractions, pixels, repeat, at);
+ xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at));
+ }
+ }
+
+ private static class XRRadialGradient extends XRPaints {
+
+ @Override
+ boolean isPaintValid(SunGraphics2D sg2d) {
+ RadialGradientPaint grad = (RadialGradientPaint) sg2d.paint;
+ return grad.getFocusPoint().equals(grad.getCenterPoint());
+ }
+
+ @Override
+ void setXRPaint(SunGraphics2D sg2d, Paint pt) {
+ RadialGradientPaint paint = (RadialGradientPaint) pt;
+ boolean linear = (paint.getColorSpace() == ColorSpaceType.LINEAR_RGB);
+ Color[] colors = paint.getColors();
+ Point2D center = paint.getCenterPoint();
+ Point2D focus = paint.getFocusPoint();
+
+ int repeat = XRUtils.getRepeatForCycleMethod(paint.getCycleMethod());
+ float[] fractions = paint.getFractions();
+ int[] pixels = convertToIntArgbPixels(colors, linear);
+ float radius = paint.getRadius();
+
+ // save original (untransformed) center and focus points
+ double cx = center.getX();
+ double cy = center.getY();
+ double fx = focus.getX();
+ double fy = focus.getY();
+
+ AffineTransform at = paint.getTransform();
+ at.preConcatenate(sg2d.transform);
+ focus = at.transform(focus, focus);
+
+ // transform unit circle to gradient coords; we start with the
+ // unit circle (center=(0,0), focus on positive x-axis, radius=1)
+ // and then transform into gradient space
+ at.translate(cx, cy);
+ at.rotate(fx - cx, fy - cy);
+ // at.scale(radius, radius);
+
+ // invert to get mapping from device coords to unit circle
+ try {
+ at.invert();
+ } catch (Exception e) {
+ at.setToScale(0.0, 0.0);
+ }
+ focus = at.transform(focus, focus);
+
+ // clamp the focus point so that it does not rest on, or outside
+ // of, the circumference of the gradient circle
+ fx = Math.min(focus.getX(), 0.99);
+
+ XRBackend con = xrCompMan.getBackend();
+ int gradient = con.createRadialGradient(new Point2D.Float(0, 0), new Point2D.Float(0, 0), 0, radius, fractions, pixels, repeat, at);
+ xrCompMan.setGradientPaint(new XRSurfaceData.XRInternalSurfaceData(con, gradient, at));
+ }
+ }
+
+ private static class XRTexture extends XRPaints {
+
+ @Override
+ boolean isPaintValid(SunGraphics2D sg2d) {
+ TexturePaint paint = (TexturePaint) sg2d.paint;
+ BufferedImage bi = paint.getImage();
+ XRSurfaceData dstData = (XRSurfaceData) sg2d.getDestSurface();
+
+ SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
+ if (!(srcData instanceof XRSurfaceData)) {
+ // REMIND: this is a hack that attempts to cache the system
+ // memory image from the TexturePaint instance into an
+ // OpenGL texture...
+ srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
+ if (!(srcData instanceof XRSurfaceData)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ void setXRPaint(SunGraphics2D sg2d, Paint pt) {
+ TexturePaint paint = (TexturePaint) pt;
+
+ BufferedImage bi = paint.getImage();
+ SurfaceData dstData = sg2d.surfaceData;
+ SurfaceData srcData = dstData.getSourceSurfaceData(bi, SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
+
+ // REMIND: this hack tries to ensure that we have a cached texture
+ if (!(srcData instanceof XRSurfaceData)) {
+ srcData = dstData.getSourceSurfaceData(paint.getImage(), SunGraphics2D.TRANSFORM_ISIDENT, CompositeType.SrcOver, null);
+ if (!(srcData instanceof XRSurfaceData)) {
+ throw new InternalError("Surface not cachable");
+ }
+ }
+
+ XRSurfaceData x11SrcData = (XRSurfaceData) srcData;
+
+ AffineTransform at = (AffineTransform) sg2d.transform.clone();
+ Rectangle2D anchor = paint.getAnchorRect();
+ at.translate(anchor.getX(), anchor.getY());
+ at.scale(anchor.getWidth() / ((double) bi.getWidth()), anchor.getHeight() / ((double) bi.getHeight()));
+
+ try {
+ at.invert();
+ } catch (NoninvertibleTransformException ex) {
+ at.setToIdentity(); /* TODO: Right thing to do in this case? */
+ }
+
+ x11SrcData.validateAsSource(at, XRUtils.RepeatNormal, XRUtils.ATransOpToXRQuality(sg2d.interpolationType));
+ xrCompMan.setTexturePaint(((XRSurfaceData) srcData));
+ }
+ }
+
+ public int[] convertToIntArgbPixels(Color[] colors, boolean linear) {
+ int[] pixels = new int[colors.length];
+ for (int i = 0; i < colors.length; i++) {
+ pixels[i] = colorToIntArgbPixel(colors[i], linear);
+ }
+ return pixels;
+ }
+
+ public int colorToIntArgbPixel(Color c, boolean linear) {
+ int rgb = c.getRGB();
+
+ int a = rgb >>> 24;
+ int r = (rgb >> 16) & 0xff;
+ int g = (rgb >> 8) & 0xff;
+ int b = (rgb) & 0xff;
+ if (linear) {
+ r = BufferedPaints.convertSRGBtoLinearRGB(r);
+ g = BufferedPaints.convertSRGBtoLinearRGB(g);
+ b = BufferedPaints.convertSRGBtoLinearRGB(b);
+ }
+
+ a *= xrCompMan.getExtraAlpha();
+
+ return ((a << 24) | (r << 16) | (g << 8) | (b));
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRRenderer.java b/src/solaris/classes/sun/java2d/xr/XRRenderer.java
new file mode 100644
index 000000000..f6333e5e7
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRRenderer.java
@@ -0,0 +1,331 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.*;
+import java.awt.geom.*;
+
+import sun.awt.SunToolkit;
+import sun.java2d.SunGraphics2D;
+import sun.java2d.loops.*;
+import sun.java2d.pipe.Region;
+import sun.java2d.pipe.PixelDrawPipe;
+import sun.java2d.pipe.PixelFillPipe;
+import sun.java2d.pipe.ShapeDrawPipe;
+import sun.java2d.pipe.SpanIterator;
+import sun.java2d.pipe.ShapeSpanIterator;
+import sun.java2d.pipe.LoopPipe;
+
+/**
+ * XRender provides only accalerated rectangles. To emulate higher "order"
+ * geometry we have to pass everything else to DoPath/FillSpans.
+ *
+ * TODO: DrawRect could be instrified
+ *
+ * @author Clemens Eisserer
+ */
+
+public class XRRenderer implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe {
+ XRDrawHandler drawHandler;
+ MaskTileManager tileManager;
+
+ public XRRenderer(MaskTileManager tileManager) {
+ this.tileManager = tileManager;
+ this.drawHandler = new XRDrawHandler();
+ }
+
+ /**
+ * Common validate method, used by all XRRender functions to validate the
+ * destination context.
+ */
+ private final void validateSurface(SunGraphics2D sg2d) {
+ XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData;
+ xrsd.validateAsDestination(sg2d, sg2d.getCompClip());
+ xrsd.maskBuffer.validateCompositeState(sg2d.composite, sg2d.transform,
+ sg2d.paint, sg2d);
+ }
+
+ public void drawLine(SunGraphics2D sg2d, int x1, int y1, int x2, int y2) {
+ try {
+ SunToolkit.awtLock();
+
+ validateSurface(sg2d);
+ int transx = sg2d.transX;
+ int transy = sg2d.transY;
+
+ XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData;
+
+ tileManager.addLine(x1 + transx, y1 + transy,
+ x2 + transx, y2 + transy);
+ tileManager.fillMask(xrsd);
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ public void drawRect(SunGraphics2D sg2d,
+ int x, int y, int width, int height) {
+ draw(sg2d, new Rectangle2D.Float(x, y, width, height));
+ }
+
+ public void drawPolyline(SunGraphics2D sg2d,
+ int xpoints[], int ypoints[], int npoints) {
+ Path2D.Float p2d = new Path2D.Float();
+ if (npoints > 1) {
+ p2d.moveTo(xpoints[0], ypoints[0]);
+ for (int i = 1; i < npoints; i++) {
+ p2d.lineTo(xpoints[i], ypoints[i]);
+ }
+ }
+
+ draw(sg2d, p2d);
+ }
+
+ public void drawPolygon(SunGraphics2D sg2d,
+ int xpoints[], int ypoints[], int npoints) {
+ draw(sg2d, new Polygon(xpoints, ypoints, npoints));
+ }
+
+ public synchronized void fillRect(SunGraphics2D sg2d,
+ int x, int y, int width, int height) {
+ SunToolkit.awtLock();
+ try {
+ validateSurface(sg2d);
+
+ XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData;
+
+ x += sg2d.transform.getTranslateX();
+ y += sg2d.transform.getTranslateY();
+
+ tileManager.addRect(x, y, width, height);
+ tileManager.fillMask(xrsd);
+
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ public void fillPolygon(SunGraphics2D sg2d,
+ int xpoints[], int ypoints[], int npoints) {
+ fill(sg2d, new Polygon(xpoints, ypoints, npoints));
+ }
+
+ public void drawRoundRect(SunGraphics2D sg2d,
+ int x, int y, int width, int height,
+ int arcWidth, int arcHeight) {
+ draw(sg2d, new RoundRectangle2D.Float(x, y, width, height,
+ arcWidth, arcHeight));
+ }
+
+ public void fillRoundRect(SunGraphics2D sg2d, int x, int y,
+ int width, int height,
+ int arcWidth, int arcHeight) {
+ fill(sg2d, new RoundRectangle2D.Float(x, y, width, height,
+ arcWidth, arcHeight));
+ }
+
+ public void drawOval(SunGraphics2D sg2d,
+ int x, int y, int width, int height) {
+ draw(sg2d, new Ellipse2D.Float(x, y, width, height));
+ }
+
+ public void fillOval(SunGraphics2D sg2d,
+ int x, int y, int width, int height) {
+ fill(sg2d, new Ellipse2D.Float(x, y, width, height));
+ }
+
+ public void drawArc(SunGraphics2D sg2d,
+ int x, int y, int width, int height,
+ int startAngle, int arcAngle) {
+ draw(sg2d, new Arc2D.Float(x, y, width, height,
+ startAngle, arcAngle, Arc2D.OPEN));
+ }
+
+ public void fillArc(SunGraphics2D sg2d,
+ int x, int y, int width, int height,
+ int startAngle, int arcAngle) {
+ fill(sg2d, new Arc2D.Float(x, y, width, height,
+ startAngle, arcAngle, Arc2D.PIE));
+ }
+
+ private class XRDrawHandler extends ProcessPath.DrawHandler {
+
+ XRDrawHandler() {
+ // these are bogus values; the caller will use validate()
+ // to ensure that they are set properly prior to each usage
+ super(0, 0, 0, 0);
+ }
+
+ /**
+ * This method needs to be called prior to each draw/fillPath()
+ * operation to ensure the clip bounds are up to date.
+ */
+ void validate(SunGraphics2D sg2d) {
+ Region clip = sg2d.getCompClip();
+ setBounds(clip.getLoX(), clip.getLoY(),
+ clip.getHiX(), clip.getHiY(), sg2d.strokeHint);
+ validateSurface(sg2d);
+ }
+
+ public void drawLine(int x1, int y1, int x2, int y2) {
+ tileManager.addLine(x1, y1, x2, y2);
+ }
+
+ public void drawPixel(int x, int y) {
+ tileManager.addRect(x, y, 1, 1);
+ }
+
+ public void drawScanline(int x1, int x2, int y) {
+ tileManager.addRect(x1, y, x2 - x1 + 1, 1);
+ }
+ }
+
+ protected void drawPath(SunGraphics2D sg2d, Path2D.Float p2df,
+ int transx, int transy) {
+ SunToolkit.awtLock();
+ try {
+ validateSurface(sg2d);
+ drawHandler.validate(sg2d);
+ ProcessPath.drawPath(drawHandler, p2df, transx, transy);
+ tileManager.fillMask(((XRSurfaceData) sg2d.surfaceData));
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ protected void fillPath(SunGraphics2D sg2d, Path2D.Float p2df,
+ int transx, int transy) {
+ SunToolkit.awtLock();
+ try {
+ validateSurface(sg2d);
+ drawHandler.validate(sg2d);
+ ProcessPath.fillPath(drawHandler, p2df, transx, transy);
+ tileManager.fillMask(((XRSurfaceData) sg2d.surfaceData));
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ protected void fillSpans(SunGraphics2D sg2d, SpanIterator si,
+ int transx, int transy) {
+ SunToolkit.awtLock();
+ try {
+ validateSurface(sg2d);
+ int[] spanBox = new int[4];
+ while (si.nextSpan(spanBox)) {
+ tileManager.addRect(spanBox[0] + transx,
+ spanBox[1] + transy,
+ spanBox[2] - spanBox[0],
+ spanBox[3] - spanBox[1]);
+ }
+ tileManager.fillMask(((XRSurfaceData) sg2d.surfaceData));
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ public void draw(SunGraphics2D sg2d, Shape s) {
+ if (sg2d.strokeState == SunGraphics2D.STROKE_THIN) {
+ Path2D.Float p2df;
+ int transx, transy;
+ if (sg2d.transformState <= SunGraphics2D.TRANSFORM_INT_TRANSLATE) {
+ if (s instanceof Path2D.Float) {
+ p2df = (Path2D.Float) s;
+ } else {
+ p2df = new Path2D.Float(s);
+ }
+ transx = sg2d.transX;
+ transy = sg2d.transY;
+ } else {
+ p2df = new Path2D.Float(s, sg2d.transform);
+ transx = 0;
+ transy = 0;
+ }
+ drawPath(sg2d, p2df, transx, transy);
+ } else if (sg2d.strokeState < SunGraphics2D.STROKE_CUSTOM) {
+ ShapeSpanIterator si = LoopPipe.getStrokeSpans(sg2d, s);
+ try {
+ fillSpans(sg2d, si, 0, 0);
+ } finally {
+ si.dispose();
+ }
+ } else {
+ fill(sg2d, sg2d.stroke.createStrokedShape(s));
+ }
+ }
+
+ public void fill(SunGraphics2D sg2d, Shape s) {
+ int transx, transy;
+
+ if (sg2d.strokeState == SunGraphics2D.STROKE_THIN) {
+ // Here we are able to use fillPath() for
+ // high-quality fills.
+ Path2D.Float p2df;
+ if (sg2d.transformState <= SunGraphics2D.TRANSFORM_INT_TRANSLATE) {
+ if (s instanceof Path2D.Float) {
+ p2df = (Path2D.Float) s;
+ } else {
+ p2df = new Path2D.Float(s);
+ }
+ transx = sg2d.transX;
+ transy = sg2d.transY;
+ } else {
+ p2df = new Path2D.Float(s, sg2d.transform);
+ transx = 0;
+ transy = 0;
+ }
+ fillPath(sg2d, p2df, transx, transy);
+ return;
+ }
+
+ AffineTransform at;
+ if (sg2d.transformState <= SunGraphics2D.TRANSFORM_INT_TRANSLATE) {
+ // Transform (translation) will be done by FillSpans
+ at = null;
+ transx = sg2d.transX;
+ transy = sg2d.transY;
+ } else {
+ // Transform will be done by the PathIterator
+ at = sg2d.transform;
+ transx = transy = 0;
+ }
+
+ ShapeSpanIterator ssi = LoopPipe.getFillSSI(sg2d);
+ try {
+ // Subtract transx/y from the SSI clip to match the
+ // (potentially untranslated) geometry fed to it
+ Region clip = sg2d.getCompClip();
+ ssi.setOutputAreaXYXY(clip.getLoX() - transx,
+ clip.getLoY() - transy,
+ clip.getHiX() - transx,
+ clip.getHiY() - transy);
+ ssi.appendPath(s.getPathIterator(at));
+ fillSpans(sg2d, ssi, transx, transy);
+ } finally {
+ ssi.dispose();
+ }
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRSurfaceData.java b/src/solaris/classes/sun/java2d/xr/XRSurfaceData.java
new file mode 100644
index 000000000..8bfbd1098
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRSurfaceData.java
@@ -0,0 +1,668 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.*;
+import java.awt.geom.*;
+import java.awt.image.*;
+import sun.awt.*;
+import sun.java2d.InvalidPipeException;
+import sun.java2d.SunGraphics2D;
+import sun.java2d.SurfaceData;
+import sun.java2d.SurfaceDataProxy;
+import sun.java2d.jules.*;
+import sun.java2d.loops.*;
+import sun.java2d.pipe.*;
+import sun.java2d.x11.*;
+import sun.font.FontManagerNativeLibrary;
+
+public abstract class XRSurfaceData extends XSurfaceData {
+ X11ComponentPeer peer;
+ XRGraphicsConfig graphicsConfig;
+ XRBackend renderQueue;
+
+ private RenderLoops solidloops;
+
+ protected int depth;
+
+ private static native void initIDs();
+
+ protected native void XRInitSurface(int depth, int width, int height,
+ long drawable, int pictFormat);
+
+ native void initXRPicture(long xsdo, int pictForm);
+
+ public static final String DESC_BYTE_A8_X11 = "Byte A8 Pixmap";
+ public static final String DESC_INT_RGB_X11 = "Integer RGB Pixmap";
+ public static final String DESC_INT_ARGB_X11 = "Integer ARGB-Pre Pixmap";
+
+ public static final SurfaceType
+ ByteA8X11 = SurfaceType.ByteGray.deriveSubType(DESC_BYTE_A8_X11);
+ public static final SurfaceType
+ IntRgbX11 = SurfaceType.IntRgb.deriveSubType(DESC_INT_RGB_X11);
+ public static final SurfaceType
+ IntArgbPreX11 = SurfaceType.IntArgbPre.deriveSubType(DESC_INT_ARGB_X11);
+
+ public Raster getRaster(int x, int y, int w, int h) {
+ throw new InternalError("not implemented yet");
+ }
+
+ protected XRRenderer xrpipe;
+ protected PixelToShapeConverter xrtxpipe;
+ protected TextPipe xrtextpipe;
+ protected XRDrawImage xrDrawImage;
+
+ protected ShapeDrawPipe aaShapePipe;
+ protected PixelToShapeConverter aaPixelToShapeConv;
+
+ public static void initXRSurfaceData() {
+ if (!isX11SurfaceDataInitialized()) {
+ FontManagerNativeLibrary.load();
+ initIDs();
+ XRPMBlitLoops.register();
+ XRMaskFill.register();
+ XRMaskBlit.register();
+
+ setX11SurfaceDataInitialized();
+ }
+ }
+
+ /**
+ * Synchronized accessor method for isDrawableValid.
+ */
+ protected boolean isXRDrawableValid() {
+ try {
+ SunToolkit.awtLock();
+ return isDrawableValid();
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ @Override
+ public SurfaceDataProxy makeProxyFor(SurfaceData srcData) {
+ return XRSurfaceDataProxy.createProxy(srcData, graphicsConfig);
+ }
+
+ public void validatePipe(SunGraphics2D sg2d) {
+ TextPipe textpipe;
+ boolean validated = false;
+
+ /*
+ * The textpipe for now can't handle TexturePaint when extra-alpha is
+ * specified nore XOR mode
+ */
+ if (sg2d.compositeState < SunGraphics2D.COMP_XOR &&
+ (sg2d.paintState < SunGraphics2D.PAINT_TEXTURE ||
+ sg2d.composite == null ||
+ !(sg2d.composite instanceof AlphaComposite) ||
+ ((AlphaComposite) sg2d.composite).getAlpha() == 1.0f))
+ {
+ textpipe = xrtextpipe;
+ } else {
+ super.validatePipe(sg2d);
+ textpipe = sg2d.textpipe;
+ validated = true;
+ }
+
+ PixelToShapeConverter txPipe = null;
+ XRRenderer nonTxPipe = null;
+
+ /*
+ * TODO: Can we rely on the GC for ARGB32 surfaces?
+ */
+ if (sg2d.antialiasHint != SunHints.INTVAL_ANTIALIAS_ON) {
+ if (sg2d.paintState <= SunGraphics2D.PAINT_ALPHACOLOR) {
+ if (sg2d.compositeState <= SunGraphics2D.COMP_XOR) {
+ txPipe = xrtxpipe;
+ nonTxPipe = xrpipe;
+ }
+ } else if (sg2d.compositeState <= SunGraphics2D.COMP_ALPHA) {
+ if (XRPaints.isValid(sg2d)) {
+ txPipe = xrtxpipe;
+ nonTxPipe = xrpipe;
+ }
+ // custom paints handled by super.validatePipe() below
+ }
+ }
+
+ if (sg2d.antialiasHint == SunHints.INTVAL_ANTIALIAS_ON &&
+ JulesPathBuf.isCairoAvailable())
+ {
+ sg2d.shapepipe = aaShapePipe;
+ sg2d.drawpipe = aaPixelToShapeConv;
+ sg2d.fillpipe = aaPixelToShapeConv;
+ } else {
+ if (txPipe != null) {
+ if (sg2d.transformState >= SunGraphics2D.TRANSFORM_TRANSLATESCALE) {
+ sg2d.drawpipe = txPipe;
+ sg2d.fillpipe = txPipe;
+ } else if (sg2d.strokeState != SunGraphics2D.STROKE_THIN) {
+ sg2d.drawpipe = txPipe;
+ sg2d.fillpipe = nonTxPipe;
+ } else {
+ sg2d.drawpipe = nonTxPipe;
+ sg2d.fillpipe = nonTxPipe;
+ }
+ sg2d.shapepipe = nonTxPipe;
+ } else {
+ if (!validated) {
+ super.validatePipe(sg2d);
+ }
+ }
+ }
+
+ // install the text pipe based on our earlier decision
+ sg2d.textpipe = textpipe;
+
+ // always override the image pipe with the specialized XRender pipe
+ sg2d.imagepipe = xrDrawImage;
+ }
+
+ protected MaskFill getMaskFill(SunGraphics2D sg2d) {
+ if (sg2d.paintState > SunGraphics2D.PAINT_ALPHACOLOR &&
+ !XRPaints.isValid(sg2d))
+ {
+ return null;
+ }
+ return super.getMaskFill(sg2d);
+ }
+
+ public RenderLoops getRenderLoops(SunGraphics2D sg2d) {
+ if (sg2d.paintState <= SunGraphics2D.PAINT_ALPHACOLOR &&
+ sg2d.compositeState <= SunGraphics2D.COMP_ALPHA)
+ {
+ return solidloops;
+ }
+
+ return super.getRenderLoops(sg2d);
+ }
+
+ public GraphicsConfiguration getDeviceConfiguration() {
+ return graphicsConfig;
+ }
+
+ /**
+ * Method for instantiating a Window SurfaceData
+ */
+ public static XRWindowSurfaceData createData(X11ComponentPeer peer) {
+ XRGraphicsConfig gc = getGC(peer);
+ return new XRWindowSurfaceData(peer, gc, gc.getSurfaceType());
+ }
+
+ /**
+ * Method for instantiating a Pixmap SurfaceData (offscreen).
+ * If the surface * is opaque a 24-bit/RGB surface is chosen,
+ * otherwise a 32-bit ARGB surface.
+ */
+ public static XRPixmapSurfaceData createData(XRGraphicsConfig gc,
+ int width, int height,
+ ColorModel cm, Image image,
+ long drawable,
+ int transparency) {
+ int depth = transparency > Transparency.OPAQUE ? 32 : 24;
+ if (depth == 24) {
+ cm = new DirectColorModel(depth,
+ 0x00FF0000, 0x0000FF00, 0x000000FF);
+ } else {
+ cm = new DirectColorModel(depth, 0x00FF0000, 0x0000FF00,
+ 0x000000FF, 0xFF000000);
+ }
+
+ return new XRPixmapSurfaceData
+ (gc, width, height, image, getSurfaceType(gc, transparency),
+ cm, drawable, transparency,
+ XRUtils.getPictureFormatForTransparency(transparency), depth);
+ }
+
+ protected XRSurfaceData(X11ComponentPeer peer, XRGraphicsConfig gc,
+ SurfaceType sType, ColorModel cm, int depth, int transparency)
+ {
+ super(sType, cm);
+ this.peer = peer;
+ this.graphicsConfig = gc;
+ this.solidloops = graphicsConfig.getSolidLoops(sType);
+ this.depth = depth;
+ initOps(peer, graphicsConfig, depth);
+
+ setBlitProxyKey(gc.getProxyKey());
+ }
+
+ protected XRSurfaceData(XRBackend renderQueue) {
+ super(XRSurfaceData.IntRgbX11,
+ new DirectColorModel(24, 0x00FF0000, 0x0000FF00, 0x000000FF));
+ this.renderQueue = renderQueue;
+ }
+
+ /**
+ * Inits the XRender-data-structures which belong to the XRSurfaceData.
+ *
+ * @param pictureFormat
+ */
+ public void initXRender(int pictureFormat) {
+ try {
+ SunToolkit.awtLock();
+ initXRPicture(getNativeOps(), pictureFormat);
+ renderQueue = XRCompositeManager.getInstance(this).getBackend();
+ maskBuffer = XRCompositeManager.getInstance(this);
+ } catch (Throwable ex) {
+ ex.printStackTrace();
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ public static XRGraphicsConfig getGC(X11ComponentPeer peer) {
+ if (peer != null) {
+ return (XRGraphicsConfig) peer.getGraphicsConfiguration();
+ } else {
+ GraphicsEnvironment env =
+ GraphicsEnvironment.getLocalGraphicsEnvironment();
+ GraphicsDevice gd = env.getDefaultScreenDevice();
+ return (XRGraphicsConfig) gd.getDefaultConfiguration();
+ }
+ }
+
+ /**
+ * Returns a boolean indicating whether or not a copyArea from the given
+ * rectangle source coordinates might be incomplete and result in X11
+ * GraphicsExposure events being generated from XCopyArea. This method
+ * allows the SurfaceData copyArea method to determine if it needs to set
+ * the GraphicsExposures attribute of the X11 GC to True or False to receive
+ * or avoid the events.
+ *
+ * @return true if there is any chance that an XCopyArea from the given
+ * source coordinates could produce any X11 Exposure events.
+ */
+ public abstract boolean canSourceSendExposures(int x, int y, int w, int h);
+
+ /**
+ * CopyArea is implemented using the "old" X11 GC, therefor clip and
+ * needExposures have to be validated against that GC. Pictures and GCs
+ * don't share state.
+ */
+ public void validateCopyAreaGC(Region gcClip, boolean needExposures) {
+ if (validatedGCClip != gcClip) {
+ if (gcClip != null)
+ renderQueue.setGCClipRectangles(xgc, gcClip);
+ validatedGCClip = gcClip;
+ }
+
+ if (validatedExposures != needExposures) {
+ validatedExposures = needExposures;
+ renderQueue.setGCExposures(xgc, needExposures);
+ }
+
+ if (validatedXorComp != null) {
+ renderQueue.setGCMode(xgc, true);
+ renderQueue.setGCForeground(xgc, validatedGCForegroundPixel);
+ validatedXorComp = null;
+ }
+ }
+
+ public boolean copyArea(SunGraphics2D sg2d, int x, int y, int w, int h,
+ int dx, int dy) {
+ if (xrpipe == null) {
+ if (!isXRDrawableValid()) {
+ return true;
+ }
+ makePipes();
+ }
+ CompositeType comptype = sg2d.imageComp;
+ if (sg2d.transformState < SunGraphics2D.TRANSFORM_TRANSLATESCALE &&
+ (CompositeType.SrcOverNoEa.equals(comptype) ||
+ CompositeType.SrcNoEa.equals(comptype)))
+ {
+ x += sg2d.transX;
+ y += sg2d.transY;
+ try {
+ SunToolkit.awtLock();
+ boolean needExposures = canSourceSendExposures(x, y, w, h);
+ validateCopyAreaGC(sg2d.getCompClip(), needExposures);
+ renderQueue.copyArea(xid, xid, xgc, x, y, w, h, x + dx, y + dy);
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns the XRender SurfaceType which is able to fullfill the specified
+ * transparency requirement.
+ */
+ public static SurfaceType getSurfaceType(XRGraphicsConfig gc,
+ int transparency) {
+ SurfaceType sType = null;
+
+ switch (transparency) {
+ case Transparency.OPAQUE:
+ sType = XRSurfaceData.IntRgbX11;
+ break;
+
+ case Transparency.BITMASK:
+ case Transparency.TRANSLUCENT:
+ sType = XRSurfaceData.IntArgbPreX11;
+ break;
+ }
+
+ return sType;
+ }
+
+ public void invalidate() {
+ if (isValid()) {
+ setInvalid();
+ super.invalidate();
+ }
+ }
+
+ private long xgc; // GC is still used for copyArea
+ private int validatedGCForegroundPixel = 0;
+ private XORComposite validatedXorComp;
+ private int xid;
+ public int picture;
+ public XRCompositeManager maskBuffer;
+
+ private Region validatedClip;
+ private Region validatedGCClip;
+ private boolean validatedExposures = true;
+
+ boolean transformInUse = false;
+ AffineTransform validatedSourceTransform = new AffineTransform();
+ int validatedRepeat = XRUtils.RepeatNone;
+ int validatedFilter = XRUtils.FAST;
+
+ /**
+ * Validates an XRSurfaceData when used as source. Note that the clip is
+ * applied when used as source as well as destination.
+ */
+ void validateAsSource(AffineTransform sxForm, int repeat, int filter) {
+
+ if (validatedClip != null) {
+ validatedClip = null;
+ renderQueue.setClipRectangles(picture, null);
+ }
+
+ if (validatedRepeat != repeat && repeat != -1) {
+ validatedRepeat = repeat;
+ renderQueue.setPictureRepeat(picture, repeat);
+ }
+
+ if (sxForm == null) {
+ if (transformInUse) {
+ validatedSourceTransform.setToIdentity();
+ renderQueue.setPictureTransform(picture,
+ validatedSourceTransform);
+ transformInUse = false;
+ }
+ } else if (!transformInUse ||
+ (transformInUse && !sxForm.equals(validatedSourceTransform))) {
+ validatedSourceTransform.setTransform(sxForm.getScaleX(),
+ sxForm.getShearY(),
+ sxForm.getShearX(),
+ sxForm.getScaleY(),
+ sxForm.getTranslateX(),
+ sxForm.getTranslateY());
+ renderQueue.setPictureTransform(picture, validatedSourceTransform);
+ transformInUse = true;
+ }
+
+ if (filter != validatedFilter && filter != -1) {
+ renderQueue.setFilter(picture, filter);
+ validatedFilter = filter;
+ }
+ }
+
+ /**
+ * Validates the Surface when used as destination.
+ */
+ public void validateAsDestination(SunGraphics2D sg2d, Region clip) {
+ if (!isValid()) {
+ throw new InvalidPipeException("bounds changed");
+ }
+
+ boolean updateGCClip = false;
+ if (clip != validatedClip) {
+ renderQueue.setClipRectangles(picture, clip);
+ validatedClip = clip;
+ updateGCClip = true;
+ }
+
+ if (sg2d != null && sg2d.compositeState == SunGraphics2D.COMP_XOR) {
+ if (validatedXorComp != sg2d.getComposite()) {
+ validatedXorComp = (XORComposite) sg2d.getComposite();
+ int xorpixelmod = validatedXorComp.getXorPixel();
+ renderQueue.setGCMode(xgc, false);
+
+ // validate pixel
+ int pixel = sg2d.pixel;
+ if (validatedGCForegroundPixel != pixel) {
+ renderQueue.setGCForeground(xgc, pixel ^ xorpixelmod);
+ validatedGCForegroundPixel = pixel;
+ }
+ }
+
+ if (updateGCClip) {
+ renderQueue.setGCClipRectangles(xgc, clip);
+ }
+ }
+ }
+
+ public synchronized void makePipes() { /*
+ * TODO: Why is this synchronized,
+ * but access not?
+ */
+ if (xrpipe == null) {
+ try {
+ SunToolkit.awtLock();
+ xgc = renderQueue.createGC(xid); // TODO: GC leak? where to
+ // clean up?
+
+ xrpipe = new XRRenderer(maskBuffer.getMaskBuffer());
+ xrtxpipe = new PixelToShapeConverter(xrpipe);
+ xrtextpipe = maskBuffer.getTextRenderer();
+ xrDrawImage = new XRDrawImage();
+
+ if (JulesPathBuf.isCairoAvailable()) {
+ aaShapePipe =
+ new JulesShapePipe(XRCompositeManager.getInstance(this));
+ aaPixelToShapeConv = new PixelToShapeConverter(aaShapePipe);
+ }
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+ }
+
+ public static class XRWindowSurfaceData extends XRSurfaceData {
+ public XRWindowSurfaceData(X11ComponentPeer peer,
+ XRGraphicsConfig gc, SurfaceType sType) {
+ super(peer, gc, sType, peer.getColorModel(),
+ peer.getColorModel().getPixelSize(), Transparency.OPAQUE);
+
+ if (isXRDrawableValid()) {
+ initXRender(XRUtils.
+ getPictureFormatForTransparency(Transparency.OPAQUE));
+ makePipes();
+ }
+ }
+
+ public SurfaceData getReplacement() {
+ return peer.getSurfaceData();
+ }
+
+ public Rectangle getBounds() {
+ Rectangle r = peer.getBounds();
+ r.x = r.y = 0;
+ return r;
+ }
+
+ @Override
+ public boolean canSourceSendExposures(int x, int y, int w, int h) {
+ return true;
+ }
+
+ /**
+ * Returns destination Component associated with this SurfaceData.
+ */
+ public Object getDestination() {
+ return peer.getTarget();
+ }
+ }
+
+ public static class XRInternalSurfaceData extends XRSurfaceData {
+ public XRInternalSurfaceData(XRBackend renderQueue, int pictXid,
+ AffineTransform transform) {
+ super(renderQueue);
+ this.picture = pictXid;
+ this.validatedSourceTransform = transform;
+
+ if (validatedSourceTransform != null) {
+ transformInUse = true;
+ }
+ }
+
+ public boolean canSourceSendExposures(int x, int y, int w, int h) {
+ return false;
+ }
+
+ public Rectangle getBounds() {
+ return null;
+ }
+
+ public Object getDestination() {
+ return null;
+ }
+
+ public SurfaceData getReplacement() {
+ return null;
+ }
+ }
+
+ public static class XRPixmapSurfaceData extends XRSurfaceData {
+ Image offscreenImage;
+ int width;
+ int height;
+ int transparency;
+
+ public XRPixmapSurfaceData(XRGraphicsConfig gc, int width, int height,
+ Image image, SurfaceType sType,
+ ColorModel cm, long drawable,
+ int transparency, int pictFormat,
+ int depth) {
+ super(null, gc, sType, cm, depth, transparency);
+ this.width = width;
+ this.height = height;
+ offscreenImage = image;
+ this.transparency = transparency;
+ initSurface(depth, width, height, drawable, pictFormat);
+
+ initXRender(pictFormat);
+ makePipes();
+ }
+
+ public void initSurface(int depth, int width, int height,
+ long drawable, int pictFormat) {
+ try {
+ SunToolkit.awtLock();
+ XRInitSurface(depth, width, height, drawable, pictFormat);
+ } finally {
+ SunToolkit.awtUnlock();
+ }
+ }
+
+ public SurfaceData getReplacement() {
+ return restoreContents(offscreenImage);
+ }
+
+ /**
+ * Need this since the surface data is created with the color model of
+ * the target GC, which is always opaque. But in SunGraphics2D.blitSD we
+ * choose loops based on the transparency on the source SD, so it could
+ * choose wrong loop (blit instead of blitbg, for example).
+ */
+ public int getTransparency() {
+ return transparency;
+ }
+
+ public Rectangle getBounds() {
+ return new Rectangle(width, height);
+ }
+
+ @Override
+ public boolean canSourceSendExposures(int x, int y, int w, int h) {
+ return (x < 0 || y < 0 || (x + w) > width || (y + h) > height);
+ }
+
+ public void flush() {
+ /*
+ * We need to invalidate the surface before disposing the native
+ * Drawable and Picture. This way if an application tries to render
+ * to an already flushed XRSurfaceData, we will notice in the
+ * validate() method above that it has been invalidated, and we will
+ * avoid using those native resources that have already been
+ * disposed.
+ */
+ invalidate();
+ flushNativeSurface();
+ }
+
+ /**
+ * Returns destination Image associated with this SurfaceData.
+ */
+ public Object getDestination() {
+ return offscreenImage;
+ }
+ }
+
+ public long getGC() {
+ return xgc;
+ }
+
+ public static class LazyPipe extends ValidatePipe {
+ public boolean validate(SunGraphics2D sg2d) {
+ XRSurfaceData xsd = (XRSurfaceData) sg2d.surfaceData;
+ if (!xsd.isXRDrawableValid()) {
+ return false;
+ }
+ xsd.makePipes();
+ return super.validate(sg2d);
+ }
+ }
+
+ public int getPicture() {
+ return picture;
+ }
+
+ public int getXid() {
+ return xid;
+ }
+
+ public XRGraphicsConfig getGraphicsConfig() {
+ return graphicsConfig;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRSurfaceDataProxy.java b/src/solaris/classes/sun/java2d/xr/XRSurfaceDataProxy.java
new file mode 100644
index 000000000..83c30656e
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRSurfaceDataProxy.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.Color;
+import java.awt.Transparency;
+import sun.java2d.SurfaceData;
+import sun.java2d.SurfaceDataProxy;
+import sun.java2d.loops.CompositeType;
+
+/**
+ * The proxy class contains the logic if to replace a SurfaceData with a
+ * cached X11 Pixmap and the code to create the accelerated surfaces.
+ */
+public class XRSurfaceDataProxy extends SurfaceDataProxy implements Transparency {
+
+ public static SurfaceDataProxy createProxy(SurfaceData srcData,
+ XRGraphicsConfig dstConfig) {
+
+ /*Don't cache already native surfaces*/
+ if (srcData instanceof XRSurfaceData) {
+ return UNCACHED;
+ }
+
+ return new XRSurfaceDataProxy(dstConfig, srcData.getTransparency());
+ }
+
+ XRGraphicsConfig xrgc;
+ int transparency;
+
+ public XRSurfaceDataProxy(XRGraphicsConfig x11gc) {
+ this.xrgc = x11gc;
+ }
+
+ @Override
+ public SurfaceData validateSurfaceData(SurfaceData srcData,
+ SurfaceData cachedData, int w, int h) {
+ if (cachedData == null) {
+ cachedData = XRSurfaceData.createData(xrgc, w, h, xrgc
+ .getColorModel(), null, 0, getTransparency());
+ }
+ return cachedData;
+ }
+
+ public XRSurfaceDataProxy(XRGraphicsConfig x11gc, int transparency) {
+ this.xrgc = x11gc;
+ this.transparency = transparency;
+ }
+
+ //TODO: Is that really ok?
+ @Override
+ public boolean isSupportedOperation(SurfaceData srcData, int txtype,
+ CompositeType comp, Color bgColor) {
+ return (bgColor == null || transparency == Transparency.TRANSLUCENT);
+ }
+
+ public int getTransparency() {
+ return transparency;
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRUtils.java b/src/solaris/classes/sun/java2d/xr/XRUtils.java
new file mode 100644
index 000000000..0565b89ec
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRUtils.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.*;
+import java.awt.MultipleGradientPaint.*;
+import java.awt.image.*;
+import sun.java2d.loops.*;
+import static java.awt.AlphaComposite.*;
+
+/**
+ * XRender constants and utility methods.
+ *
+ * @author Clemens Eisserer
+ */
+
+public class XRUtils {
+ public static final int None = 0;
+
+ /* Composition Operators */
+ public static final byte PictOpClear = 0;
+ public static final byte PictOpSrc = 1;
+ public static final byte PictOpDst = 2;
+ public static final byte PictOpOver = 3;
+ public static final byte PictOpOverReverse = 4;
+ public static final byte PictOpIn = 5;
+ public static final byte PictOpInReverse = 6;
+ public static final byte PictOpOut = 7;
+ public static final byte PictOpOutReverse = 8;
+ public static final byte PictOpAtop = 9;
+ public static final byte PictOpAtopReverse = 10;
+ public static final byte PictOpXor = 11;
+ public static final byte PictOpAdd = 12;
+ public static final byte PictOpSaturate = 13;
+
+ /* Repeats */
+ public static final int RepeatNone = 0;
+ public static final int RepeatNormal = 1;
+ public static final int RepeatPad = 2;
+ public static final int RepeatReflect = 3;
+
+ /* Interpolation qualities */
+ public static final int FAST = 0;
+ public static final int GOOD = 1;
+ public static final int BEST = 2;
+ public static final byte[] FAST_NAME = "fast".getBytes();
+ public static final byte[] GOOD_NAME = "good".getBytes();
+ public static final byte[] BEST_NAME = "best".getBytes();
+
+ /* PictFormats */
+ public static final int PictStandardARGB32 = 0;
+ public static final int PictStandardRGB24 = 1;
+ public static final int PictStandardA8 = 2;
+ public static final int PictStandardA4 = 3;
+ public static final int PictStandardA1 = 4;
+
+ /**
+ * Maps the specified affineTransformOp to the corresponding XRender image
+ * filter.
+ */
+ public static int ATransOpToXRQuality(int affineTranformOp) {
+
+ switch (affineTranformOp) {
+ case AffineTransformOp.TYPE_NEAREST_NEIGHBOR:
+ return FAST;
+
+ case AffineTransformOp.TYPE_BILINEAR:
+ return GOOD;
+
+ case AffineTransformOp.TYPE_BICUBIC:
+ return BEST;
+ }
+
+ return -1;
+ }
+
+ /**
+ * Maps the specified affineTransformOp to the corresponding XRender image
+ * filter.
+ */
+ public static byte[] ATransOpToXRQualityName(int affineTranformOp) {
+
+ switch (affineTranformOp) {
+ case AffineTransformOp.TYPE_NEAREST_NEIGHBOR:
+ return FAST_NAME;
+
+ case AffineTransformOp.TYPE_BILINEAR:
+ return GOOD_NAME;
+
+ case AffineTransformOp.TYPE_BICUBIC:
+ return BEST_NAME;
+ }
+
+ return null;
+ }
+
+
+ public static byte[] getFilterName(int filterType) {
+ switch (filterType) {
+ case FAST:
+ return FAST_NAME;
+ case GOOD:
+ return GOOD_NAME;
+ case BEST:
+ return BEST_NAME;
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Returns the XRender picture Format which is required to fullfill the
+ * Java2D transparency requirement.
+ */
+ public static int getPictureFormatForTransparency(int transparency) {
+ switch (transparency) {
+ case Transparency.OPAQUE:
+ return PictStandardRGB24;
+
+ case Transparency.BITMASK:
+ case Transparency.TRANSLUCENT:
+ return PictStandardARGB32;
+ }
+
+ return -1;
+ }
+
+
+ public static SurfaceType getXRSurfaceTypeForTransparency(int transparency) {
+ if (transparency == Transparency.OPAQUE) {
+ return SurfaceType.IntRgb;
+ }else {
+ return SurfaceType.IntArgbPre;
+ }
+ }
+
+ /**
+ * Maps Java2D CycleMethod to XRender's Repeat property.
+ */
+ public static int getRepeatForCycleMethod(CycleMethod cycleMethod) {
+ if (cycleMethod.equals(CycleMethod.NO_CYCLE)) {
+ return RepeatPad;
+ } else if (cycleMethod.equals(CycleMethod.REFLECT)) {
+ return RepeatReflect;
+ } else if (cycleMethod.equals(CycleMethod.REPEAT)) {
+ return RepeatNormal;
+ }
+
+ return RepeatNone;
+ }
+
+ /**
+ * Converts a double into an XFixed.
+ */
+ public static int XDoubleToFixed(double dbl) {
+ return (int) (dbl * 65536);
+ }
+
+ public static double XFixedToDouble(int fixed) {
+ return ((double) fixed) / 65536;
+ }
+
+ public static int[] convertFloatsToFixed(float[] values) {
+ int[] fixed = new int[values.length];
+
+ for (int i = 0; i < values.length; i++) {
+ fixed[i] = XDoubleToFixed(values[i]);
+ }
+
+ return fixed;
+ }
+
+ public static long intToULong(int signed) {
+ if (signed < 0) {
+ return ((long) signed) + (((long) Integer.MAX_VALUE) -
+ ((long) Integer.MIN_VALUE) + 1);
+ }
+
+ return signed;
+ }
+
+ /**
+ * Maps the specified Java2D composition rule, to the corresponding XRender
+ * composition rule.
+ */
+ public static byte j2dAlphaCompToXR(int j2dRule) {
+ switch (j2dRule) {
+ case CLEAR:
+ return PictOpClear;
+
+ case SRC:
+ return PictOpSrc;
+
+ case DST:
+ return PictOpDst;
+
+ case SRC_OVER:
+ return PictOpOver;
+
+ case DST_OVER:
+ return PictOpOverReverse;
+
+ case SRC_IN:
+ return PictOpIn;
+
+ case DST_IN:
+ return PictOpInReverse;
+
+ case SRC_OUT:
+ return PictOpOut;
+
+ case DST_OUT:
+ return PictOpOutReverse;
+
+ case SRC_ATOP:
+ return PictOpAtop;
+
+ case DST_ATOP:
+ return PictOpAtopReverse;
+
+ case XOR:
+ return PictOpXor;
+ }
+
+ throw new InternalError("No XRender equivalent available for requested java2d composition rule: "+j2dRule);
+ }
+
+ public static short clampToShort(int x) {
+ return (short) (x > Short.MAX_VALUE
+ ? Short.MAX_VALUE
+ : (x < Short.MIN_VALUE ? Short.MIN_VALUE : x));
+ }
+
+ public static short clampToUShort(int x) {
+ return (short) (x > 65535 ? 65535 : (x < 0) ? 0 : x);
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XRVolatileSurfaceManager.java b/src/solaris/classes/sun/java2d/xr/XRVolatileSurfaceManager.java
new file mode 100644
index 000000000..ef8c00987
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XRVolatileSurfaceManager.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.ImageCapabilities;
+import java.awt.image.ColorModel;
+import sun.awt.image.SunVolatileImage;
+import sun.awt.image.VolatileSurfaceManager;
+import sun.java2d.SurfaceData;
+
+/**
+ * XRender platform implementation of the VolatileSurfaceManager class.
+ */
+public class XRVolatileSurfaceManager extends VolatileSurfaceManager {
+
+ public XRVolatileSurfaceManager(SunVolatileImage vImg, Object context) {
+ super(vImg, context);
+ }
+
+ protected boolean isAccelerationEnabled() {
+ return true;
+ }
+
+ /**
+ * Create a pixmap-based SurfaceData object
+ */
+ protected SurfaceData initAcceleratedSurface() {
+ SurfaceData sData;
+
+ try {
+ XRGraphicsConfig gc = (XRGraphicsConfig) vImg.getGraphicsConfig();
+ ColorModel cm = gc.getColorModel();
+ long drawable = 0;
+ if (context instanceof Long) {
+ drawable = ((Long)context).longValue();
+ }
+ sData = XRSurfaceData.createData(gc,
+ vImg.getWidth(),
+ vImg.getHeight(),
+ cm, vImg, drawable,
+ vImg.getTransparency());
+ } catch (NullPointerException ex) {
+ sData = null;
+ } catch (OutOfMemoryError er) {
+ sData = null;
+ }
+
+ return sData;
+ }
+
+ /**
+ * XRender should allow copies between different formats and depths.
+ * TODO: verify that this assumption is correct.
+ */
+ protected boolean isConfigValid(GraphicsConfiguration gc) {
+ return true;
+ }
+
+ /**
+ * Need to override the default behavior because Pixmaps-based
+ * images are accelerated but not volatile.
+ */
+ @Override
+ public ImageCapabilities getCapabilities(GraphicsConfiguration gc) {
+ if (isConfigValid(gc) && isAccelerationEnabled()) {
+ return new ImageCapabilities(true);
+ }
+ return new ImageCapabilities(false);
+ }
+}
diff --git a/src/solaris/classes/sun/java2d/xr/XcbRequestCounter.java b/src/solaris/classes/sun/java2d/xr/XcbRequestCounter.java
new file mode 100644
index 000000000..b6d407f23
--- /dev/null
+++ b/src/solaris/classes/sun/java2d/xr/XcbRequestCounter.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.java2d.xr;
+
+/**
+ * UInt32 "emulation", mimics the behaviour of xcb's request counter.
+ * In order to be compatible with xcb we have to wrap exactly when xcb would do.
+ * @author Clemens Eisserer
+ */
+
+public class XcbRequestCounter {
+ private final static long MAX_UINT = 4294967295L;
+
+ long value;
+
+ public XcbRequestCounter(long value) {
+ this.value = value;
+ }
+
+ public void setValue(long value) {
+ this.value = value;
+ }
+
+ public long getValue() {
+ return value;
+ }
+
+ public void add(long v) {
+ value += v;
+
+ /*Handle 32-bit unsigned int overflow*/
+ if (value > MAX_UINT) {
+ value = 0; //-= MAX_UINT; //Shouldn't that be zero?!?!
+ }
+ }
+}
diff --git a/src/solaris/native/sun/java2d/x11/X11SurfaceData.c b/src/solaris/native/sun/java2d/x11/X11SurfaceData.c
index 483bf062c..dcd2fba19 100644
--- a/src/solaris/native/sun/java2d/x11/X11SurfaceData.c
+++ b/src/solaris/native/sun/java2d/x11/X11SurfaceData.c
@@ -71,7 +71,7 @@ extern int J2DXErrHandler(Display *display, XErrorEvent *xerr);
extern AwtGraphicsConfigDataPtr
getGraphicsConfigFromComponentPeer(JNIEnv *env, jobject this);
extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs;
-static jint X11SD_InitWindow(JNIEnv *env, X11SDOps *xsdo);
+
static int X11SD_FindClip(SurfaceDataBounds *b, SurfaceDataBounds *bounds,
X11SDOps *xsdo);
static int X11SD_ClipToRoot(SurfaceDataBounds *b, SurfaceDataBounds *bounds,
@@ -97,19 +97,10 @@ static XImage * cachedXImage;
#endif /* !HEADLESS */
-/*
- * Class: sun_java2d_x11_X11SurfaceData
- * Method: initIDs
- * Signature: (Ljava/lang/Class;Z)V
- */
-JNIEXPORT void JNICALL
-Java_sun_java2d_x11_X11SurfaceData_initIDs(JNIEnv *env, jclass xsd,
- jclass XORComp, jboolean tryDGA)
+jboolean XShared_initIDs(JNIEnv *env, jboolean allowShmPixmaps)
{
#ifndef HEADLESS
- void *lib = 0;
-
- union {
+ union {
char c[4];
int i;
} endian;
@@ -117,20 +108,64 @@ Java_sun_java2d_x11_X11SurfaceData_initIDs(JNIEnv *env, jclass xsd,
endian.i = 0xff000000;
nativeByteOrder = (endian.c[0]) ? MSBFirst : LSBFirst;
+ dgaAvailable = JNI_FALSE;
+
cachedXImage = NULL;
if (sizeof(X11RIPrivate) > SD_RASINFO_PRIVATE_SIZE) {
JNU_ThrowInternalError(env, "Private RasInfo structure too large!");
- return;
+ return JNI_FALSE;
}
+#ifdef MITSHM
+ if (getenv("NO_AWT_MITSHM") == NULL &&
+ getenv("NO_J2D_MITSHM") == NULL) {
+ char * force;
+ TryInitMITShm(env, &useMitShmExt, &useMitShmPixmaps);
+
+ if(allowShmPixmaps) {
+ useMitShmPixmaps = (useMitShmPixmaps == CAN_USE_MITSHM);
+ force = getenv("J2D_PIXMAPS");
+ if (force != NULL) {
+ if (useMitShmPixmaps && (strcmp(force, "shared") == 0)) {
+ forceSharedPixmaps = JNI_TRUE;
+ } else if (strcmp(force, "server") == 0) {
+ useMitShmPixmaps = JNI_FALSE;
+ }
+ }
+ }else {
+ useMitShmPixmaps = JNI_FALSE;
+ }
+ }
+
+ return JNI_TRUE;
+#endif /* MITSHM */
+
+#endif /* !HEADLESS */
+}
+
+
+/*
+ * Class: sun_java2d_x11_X11SurfaceData
+ * Method: initIDs
+ * Signature: (Ljava/lang/Class;Z)V
+ */
+JNIEXPORT void JNICALL
+Java_sun_java2d_x11_X11SurfaceData_initIDs(JNIEnv *env, jclass xsd,
+ jclass XORComp, jboolean tryDGA)
+{
+#ifndef HEADLESS
+ if(XShared_initIDs(env, JNI_TRUE))
+ {
+ void *lib = 0;
+
xorCompClass = (*env)->NewGlobalRef(env, XORComp);
if (tryDGA && (getenv("NO_J2D_DGA") == NULL)) {
/* we use RTLD_NOW because of bug 4032715 */
lib = dlopen("libsunwjdga.so", RTLD_NOW);
}
- dgaAvailable = JNI_FALSE;
+
if (lib != NULL) {
JDgaStatus ret = JDGA_FAILED;
void *sym = dlsym(lib, "JDgaLibInit");
@@ -149,24 +184,7 @@ Java_sun_java2d_x11_X11SurfaceData_initIDs(JNIEnv *env, jclass xsd,
lib = NULL;
}
}
-
-#ifdef MITSHM
- if (getenv("NO_AWT_MITSHM") == NULL &&
- getenv("NO_J2D_MITSHM") == NULL) {
- char * force;
- TryInitMITShm(env, &useMitShmExt, &useMitShmPixmaps);
- useMitShmPixmaps = (useMitShmPixmaps == CAN_USE_MITSHM);
- force = getenv("J2D_PIXMAPS");
- if (force != NULL) {
- if (useMitShmPixmaps && (strcmp(force, "shared") == 0)) {
- forceSharedPixmaps = JNI_TRUE;
- } else if (strcmp(force, "server") == 0) {
- useMitShmPixmaps = JNI_FALSE;
- }
- }
- }
-#endif /* MITSHM */
-
+ }
#endif /* !HEADLESS */
}
@@ -176,7 +194,7 @@ Java_sun_java2d_x11_X11SurfaceData_initIDs(JNIEnv *env, jclass xsd,
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL
-Java_sun_java2d_x11_X11SurfaceData_isDrawableValid(JNIEnv *env, jobject this)
+Java_sun_java2d_x11_XSurfaceData_isDrawableValid(JNIEnv *env, jobject this)
{
jboolean ret = JNI_FALSE;
@@ -194,44 +212,42 @@ Java_sun_java2d_x11_X11SurfaceData_isDrawableValid(JNIEnv *env, jobject this)
}
/*
- * Class: sun_java2d_x11_X11SurfaceData
- * Method: isDgaAvailable
+ * Class: sun_java2d_x11_X11SurfaceData
+ * Method: isShmPMAvailable
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL
-Java_sun_java2d_x11_X11SurfaceData_isDgaAvailable(JNIEnv *env, jobject this)
+Java_sun_java2d_x11_X11SurfaceData_isShmPMAvailable(JNIEnv *env, jobject this)
{
-#if defined(HEADLESS) || defined(__linux__)
+#if defined(HEADLESS) || !defined(MITSHM)
return JNI_FALSE;
#else
- return dgaAvailable;
-#endif /* HEADLESS */
+ return useMitShmPixmaps;
+#endif /* HEADLESS, MITSHM */
}
-
/*
* Class: sun_java2d_x11_X11SurfaceData
- * Method: isShmPMAvailable
+ * Method: isDgaAvailable
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL
-Java_sun_java2d_x11_X11SurfaceData_isShmPMAvailable(JNIEnv *env, jobject this)
+Java_sun_java2d_x11_X11SurfaceData_isDgaAvailable(JNIEnv *env, jobject this)
{
-#if defined(HEADLESS) || !defined(MITSHM)
+#if defined(HEADLESS) || defined(__linux__)
return JNI_FALSE;
#else
- return useMitShmPixmaps;
-#endif /* HEADLESS, MITSHM */
+ return dgaAvailable;
+#endif /* HEADLESS */
}
-
/*
* Class: sun_java2d_x11_X11SurfaceData
* Method: initOps
* Signature: (Ljava/lang/Object;I)V
*/
JNIEXPORT void JNICALL
-Java_sun_java2d_x11_X11SurfaceData_initOps(JNIEnv *env, jobject xsd,
+Java_sun_java2d_x11_XSurfaceData_initOps(JNIEnv *env, jobject xsd,
jobject peer,
jobject graphicsConfig, jint depth)
{
@@ -304,6 +320,8 @@ Java_sun_java2d_x11_X11SurfaceData_initOps(JNIEnv *env, jobject xsd,
} else {
xsdo->pixelmask = 0xff;
}
+
+ xsdo->xrPic = None;
#endif /* !HEADLESS */
}
@@ -313,7 +331,7 @@ Java_sun_java2d_x11_X11SurfaceData_initOps(JNIEnv *env, jobject xsd,
* Signature: ()V
*/
JNIEXPORT void JNICALL
-Java_sun_java2d_x11_X11SurfaceData_flushNativeSurface(JNIEnv *env, jobject xsd)
+Java_sun_java2d_x11_XSurfaceData_flushNativeSurface(JNIEnv *env, jobject xsd)
{
#ifndef HEADLESS
SurfaceDataOps *ops = SurfaceData_GetOps(env, xsd);
@@ -384,6 +402,11 @@ X11SD_Dispose(JNIEnv *env, SurfaceDataOps *ops)
XFreeGC(awt_display, xsdo->cachedGC);
xsdo->cachedGC = NULL;
}
+
+ if(xsdo->xrPic != None) {
+ XRenderFreePicture(awt_display, xsdo->xrPic);
+ }
+
AWT_UNLOCK();
#endif /* !HEADLESS */
}
@@ -393,7 +416,7 @@ X11SD_Dispose(JNIEnv *env, SurfaceDataOps *ops)
* Signature: ()V
*/
JNIEXPORT void JNICALL
-Java_sun_java2d_x11_X11SurfaceData_setInvalid(JNIEnv *env, jobject xsd)
+Java_sun_java2d_x11_XSurfaceData_setInvalid(JNIEnv *env, jobject xsd)
{
#ifndef HEADLESS
X11SDOps *xsdo = (X11SDOps *) SurfaceData_GetOps(env, xsd);
@@ -404,29 +427,10 @@ Java_sun_java2d_x11_X11SurfaceData_setInvalid(JNIEnv *env, jobject xsd)
#endif /* !HEADLESS */
}
-/*
- * Class: sun_java2d_x11_X11SurfaceData
- * Method: initSurface
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_java2d_x11_X11SurfaceData_initSurface(JNIEnv *env, jclass xsd,
- jint depth,
- jint width, jint height,
- jlong drawable)
+
+jboolean XShared_initSurface(JNIEnv *env, X11SDOps *xsdo, jint depth, jint width, jint height, jlong drawable)
{
#ifndef HEADLESS
- X11SDOps *xsdo = X11SurfaceData_GetOps(env, xsd);
- if (xsdo == NULL) {
- return;
- }
-
- if (xsdo->configData->awt_cmap == (Colormap)NULL) {
- awtJNI_CreateColorData(env, xsdo->configData, 1);
- }
- /* color_data will be initialized in awtJNI_CreateColorData for
- 8-bit visuals */
- xsdo->cData = xsdo->configData->color_data;
if (drawable != (jlong)0) {
/* Double-buffering */
@@ -452,7 +456,7 @@ Java_sun_java2d_x11_X11SurfaceData_initSurface(JNIEnv *env, jclass xsd,
if (xsdo->drawable) {
xsdo->shmPMData.usingShmPixmap = JNI_TRUE;
xsdo->shmPMData.shmPixmap = xsdo->drawable;
- return;
+ return JNI_TRUE;
}
}
#endif /* MITSHM */
@@ -472,7 +476,40 @@ Java_sun_java2d_x11_X11SurfaceData_initSurface(JNIEnv *env, jclass xsd,
if (xsdo->drawable == 0) {
JNU_ThrowOutOfMemoryError(env,
"Can't create offscreen surface");
+ return JNI_FALSE;
}
+
+ return JNI_TRUE;
+#endif /* !HEADLESS */
+}
+
+
+/*
+ * Class: sun_java2d_x11_X11SurfaceData
+ * Method: initSurface
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_sun_java2d_x11_X11SurfaceData_initSurface(JNIEnv *env, jclass xsd,
+ jint depth,
+ jint width, jint height,
+ jlong drawable)
+{
+#ifndef HEADLESS
+ X11SDOps *xsdo = X11SurfaceData_GetOps(env, xsd);
+ if (xsdo == NULL) {
+ return;
+ }
+
+ if (xsdo->configData->awt_cmap == (Colormap)NULL) {
+ awtJNI_CreateColorData(env, xsdo->configData, 1);
+ }
+ /* color_data will be initialized in awtJNI_CreateColorData for
+ 8-bit visuals */
+ xsdo->cData = xsdo->configData->color_data;
+
+ XShared_initSurface(env, xsdo, depth, width, height, drawable);
+ xsdo->xrPic = NULL;
#endif /* !HEADLESS */
}
@@ -718,7 +755,7 @@ jboolean X11SD_CachedXImageFits(jint width, jint height, jint depth,
}
#endif /* MITSHM */
-static jint X11SD_InitWindow(JNIEnv *env, X11SDOps *xsdo)
+jint X11SD_InitWindow(JNIEnv *env, X11SDOps *xsdo)
{
if (xsdo->isPixmap == JNI_TRUE) {
return SD_FAILURE;
@@ -1568,7 +1605,7 @@ X11SD_ReleasePixmapWithBg(JNIEnv *env, X11SDOps *xsdo)
* Signature: (I)J
*/
JNIEXPORT jlong JNICALL
-Java_sun_java2d_x11_X11SurfaceData_XCreateGC
+Java_sun_java2d_x11_XSurfaceData_XCreateGC
(JNIEnv *env, jclass xsd, jlong pXSData)
{
jlong ret;
@@ -1598,7 +1635,7 @@ Java_sun_java2d_x11_X11SurfaceData_XCreateGC
* Signature: (JIIIILsun/java2d/pipe/Region;)V
*/
JNIEXPORT void JNICALL
-Java_sun_java2d_x11_X11SurfaceData_XResetClip
+Java_sun_java2d_x11_XSurfaceData_XResetClip
(JNIEnv *env, jclass xsd, jlong xgc)
{
#ifndef HEADLESS
@@ -1613,7 +1650,7 @@ Java_sun_java2d_x11_X11SurfaceData_XResetClip
* Signature: (JIIIILsun/java2d/pipe/Region;)V
*/
JNIEXPORT void JNICALL
-Java_sun_java2d_x11_X11SurfaceData_XSetClip
+Java_sun_java2d_x11_XSurfaceData_XSetClip
(JNIEnv *env, jclass xsd, jlong xgc,
jint x1, jint y1, jint x2, jint y2,
jobject complexclip)
@@ -1688,7 +1725,7 @@ Java_sun_java2d_x11_X11SurfaceData_XSetForeground
* Signature: (JZ)V
*/
JNIEXPORT void JNICALL
-Java_sun_java2d_x11_X11SurfaceData_XSetGraphicsExposures
+Java_sun_java2d_x11_XSurfaceData_XSetGraphicsExposures
(JNIEnv *env, jclass xsd, jlong xgc, jboolean needExposures)
{
#ifndef HEADLESS
diff --git a/src/solaris/native/sun/java2d/x11/X11SurfaceData.h b/src/solaris/native/sun/java2d/x11/X11SurfaceData.h
index d530b975f..f5e074bff 100644
--- a/src/solaris/native/sun/java2d/x11/X11SurfaceData.h
+++ b/src/solaris/native/sun/java2d/x11/X11SurfaceData.h
@@ -30,6 +30,8 @@
#include <jdga.h>
+#include <X11/extensions/Xrender.h>
+
/**
* This include file contains support declarations for loops using the
* X11 extended SurfaceData interface to talk to an X11 drawable from
@@ -110,6 +112,7 @@ struct _X11SDOps {
jboolean isBgInitialized; /* whether the bg pixel is valid */
jint pmWidth; /* width, height of the */
jint pmHeight; /* pixmap */
+ Picture xrPic;
#ifdef MITSHM
ShmPixmapData shmPMData; /* data for switching between shm/nonshm pixmaps*/
#endif /* MITSHM */
@@ -136,6 +139,9 @@ void X11SD_DisposeXImage(XImage * image);
void X11SD_DirectRenderNotify(JNIEnv *env, X11SDOps *xsdo);
#endif /* !HEADLESS */
+jboolean XShared_initIDs(JNIEnv *env, jboolean allowShmPixmaps);
+jboolean XShared_initSurface(JNIEnv *env, X11SDOps *xsdo, jint depth, jint width, jint height, jlong drawable);
+
/*
* This function returns a pointer to a native X11SDOps structure
* for accessing the indicated X11 SurfaceData Java object. It
diff --git a/src/solaris/native/sun/java2d/x11/XRBackendNative.c b/src/solaris/native/sun/java2d/x11/XRBackendNative.c
new file mode 100644
index 000000000..32cd20a32
--- /dev/null
+++ b/src/solaris/native/sun/java2d/x11/XRBackendNative.c
@@ -0,0 +1,784 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#include "X11SurfaceData.h"
+#include <jni.h>
+#include <math.h>
+#include "Region.h"
+#include "fontscalerdefs.h"
+
+#include <X11/extensions/Xrender.h>
+
+#ifndef X_RenderCreateLinearGradient
+typedef struct _XLinearGradient {
+ XPointFixed p1;
+ XPointFixed p2;
+} XLinearGradient;
+#endif
+
+#ifndef X_RenderCreateRadialGradient
+typedef struct _XCircle {
+ XFixed x;
+ XFixed y;
+ XFixed radius;
+} XCircle;
+
+typedef struct _XRadialGradient {
+ XCircle inner;
+ XCircle outer;
+} XRadialGradient;
+#endif
+
+#ifdef __solaris__
+/* Solaris 10 will not have these symbols at runtime */
+#include <dlfcn.h>
+#include <link.h>
+
+typedef Picture (*XRenderCreateLinearGradientFuncType)
+ (Display *dpy,
+ const XLinearGradient *gradient,
+ const XFixed *stops,
+ const XRenderColor *colors,
+ int nstops);
+
+typedef Picture (*XRenderCreateRadialGradientFuncType)
+ (Display *dpy,
+ const XRadialGradient *gradient,
+ const XFixed *stops,
+ const XRenderColor *colors,
+ int nstops);
+
+static
+XRenderCreateLinearGradientFuncType XRenderCreateLinearGradientFunc = NULL;
+static
+ XRenderCreateRadialGradientFuncType XRenderCreateRadialGradientFunc = NULL;
+#endif
+
+#define BUILD_TRANSFORM_MATRIX(TRANSFORM, M00, M01, M02, M10, M11, M12) \
+ { \
+ TRANSFORM.matrix[0][0] = M00; \
+ TRANSFORM.matrix[0][1] = M01; \
+ TRANSFORM.matrix[0][2] = M02; \
+ TRANSFORM.matrix[1][0] = M10; \
+ TRANSFORM.matrix[1][1] = M11; \
+ TRANSFORM.matrix[1][2] = M12; \
+ TRANSFORM.matrix[2][0] = 0; \
+ TRANSFORM.matrix[2][1] = 0; \
+ TRANSFORM.matrix[2][2] = 1<<16; \
+ }
+
+
+static jboolean IsXRenderAvailable() {
+
+ void *xrenderlib;
+
+ int major_opcode, first_event, first_error;
+
+ if (!XQueryExtension(awt_display, "RENDER",
+ &major_opcode, &first_event, &first_error)) {
+ return JNI_FALSE;
+ }
+
+#ifdef __solaris__
+ xrenderlib = dlopen("libXrender.so",RTLD_GLOBAL|RTLD_LAZY);
+ if (xrenderlib != NULL) {
+
+ XRenderCreateLinearGradientFunc =
+ (XRenderCreateLinearGradientFuncType)
+ dlsym(xrenderlib, "XRenderCreateLinearGradient");
+
+ XRenderCreateRadialGradientFunc =
+ (XRenderCreateRadialGradientFuncType)
+ dlsym(xrenderlib, "XRenderCreateRadialGradient");
+
+ if (XRenderCreateLinearGradientFunc == NULL ||
+ XRenderCreateRadialGradientFunc == NULL)
+ {
+ dlclose(xrenderlib);
+ return JNI_FALSE;
+ }
+ }
+#endif
+ return JNI_TRUE;
+}
+/*
+ * Class: sun_awt_X11GraphicsEnvironment
+ * Method: initGLX
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_sun_awt_X11GraphicsEnvironment_initXRender
+ (JNIEnv *env, jclass x11ge)
+{
+#ifndef HEADLESS
+ static jboolean xrenderAvailable = JNI_FALSE;
+ static jboolean firstTime = JNI_TRUE;
+
+ if (firstTime) {
+ AWT_LOCK();
+ xrenderAvailable = IsXRenderAvailable();
+ AWT_UNLOCK();
+ firstTime = JNI_FALSE;
+ }
+ return xrenderAvailable;
+#else
+ return JNI_FALSE;
+#endif /* !HEADLESS */
+}
+
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_initIDs(JNIEnv *env, jclass cls) {
+ char *maskData;
+ XImage* defaultImg;
+ jfieldID maskImgID;
+ jlong fmt8 =
+ ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardA8));
+ jlong fmt32 =
+ ptr_to_jlong(XRenderFindStandardFormat(awt_display, PictStandardARGB32));
+ jfieldID a8ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_A8", "J");
+ jfieldID argb32ID = (*env)->GetStaticFieldID(env, cls, "FMTPTR_ARGB32", "J");
+
+ (*env)->SetStaticLongField(env, cls, a8ID, fmt8);
+ (*env)->SetStaticLongField(env, cls, argb32ID, fmt32);
+
+ maskData = (char *) malloc(32*32);
+ if (maskData == NULL) {
+ return;
+ }
+
+ defaultImg = XCreateImage(awt_display, NULL, 8, ZPixmap, 0, maskData, 32, 32, 8, 0);
+ defaultImg->data = maskData; //required?
+ maskImgID = (*env)->GetStaticFieldID(env, cls, "MASK_XIMG", "J");
+ (*env)->SetStaticLongField(env, cls, maskImgID, ptr_to_jlong(defaultImg));
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_freeGC
+ (JNIEnv *env, jobject this, jlong gc) {
+ XFreeGC(awt_display, (GC) jlong_to_ptr(gc));
+}
+
+JNIEXPORT jlong JNICALL
+Java_sun_java2d_xr_XRBackendNative_createGC
+ (JNIEnv *env, jobject this, jint drawable) {
+ GC xgc = XCreateGC(awt_display, (Drawable) drawable, 0L, NULL);
+ return ptr_to_jlong(xgc);
+}
+
+JNIEXPORT jint JNICALL
+Java_sun_java2d_xr_XRBackendNative_createPixmap(JNIEnv *env, jobject this,
+ jint drawable, jint depth,
+ jint width, jint height) {
+ return (jint) XCreatePixmap(awt_display, (Drawable) drawable,
+ width, height, depth);
+}
+
+JNIEXPORT jint JNICALL
+Java_sun_java2d_xr_XRBackendNative_createPictureNative
+ (JNIEnv *env, jclass cls, jint drawable, jlong formatPtr) {
+ XRenderPictureAttributes pict_attr;
+ return XRenderCreatePicture(awt_display, (Drawable) drawable,
+ (XRenderPictFormat *) jlong_to_ptr(formatPtr),
+ 0, &pict_attr);
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_freePicture
+ (JNIEnv *env, jobject this, jint picture) {
+ XRenderFreePicture(awt_display, (Picture) picture);
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_freePixmap
+ (JNIEnv *env, jobject this, jint pixmap) {
+ XFreePixmap(awt_display, (Pixmap) pixmap);
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_setPictureRepeat
+ (JNIEnv *env, jobject this, jint picture, jint repeat) {
+ XRenderPictureAttributes pict_attr;
+ pict_attr.repeat = repeat;
+ XRenderChangePicture (awt_display, (Picture) picture, CPRepeat, &pict_attr);
+}
+
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_setGCExposures
+ (JNIEnv *env, jobject this, jlong gc, jboolean exposure) {
+ XSetGraphicsExposures(awt_display,
+ (GC) jlong_to_ptr(gc), exposure ? True : False); //TODO: ????
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_setGCForeground
+ (JNIEnv *env, jobject this, jlong gc, jint pixel) {
+ XSetForeground(awt_display, (GC) jlong_to_ptr(gc), (unsigned long) pixel);
+}
+
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_copyArea
+ (JNIEnv *env, jobject this, jint src, jint dst, jlong gc,
+ jint srcx, jint srcy, jint width, jint height, jint dstx, jint dsty) {
+ XCopyArea(awt_display, (Drawable) src, (Drawable) dst,
+ (GC) jlong_to_ptr(gc), srcx, srcy, width, height, dstx, dsty);
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_renderComposite
+ (JNIEnv *env, jobject this, jbyte op, jint src, jint mask, jint dst,
+ jint srcX, jint srcY, jint maskX, jint maskY,
+ jint dstX, jint dstY, jint width, jint height) {
+ XRenderComposite (awt_display, op,
+ (Picture)src, (Picture)mask, (Picture)dst,
+ srcX, srcY, maskX, maskY, dstX, dstY, width, height);
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_renderRectangle
+ (JNIEnv *env, jobject this, jint dst, jbyte op,
+ jshort red, jshort green, jshort blue, jshort alpha,
+ jint x, jint y, jint width, jint height) {
+ XRenderColor color;
+ color.alpha = alpha;
+ color.red = red;
+ color.green = green;
+ color.blue = blue;
+ XRenderFillRectangle(awt_display, op, (Picture) dst, &color,
+ x, y, width, height);
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_XRenderRectanglesNative
+ (JNIEnv *env, jclass xsd, jint dst, jbyte op,
+ jshort red, jshort green, jshort blue, jshort alpha,
+ jintArray rectArray, jint rectCnt) {
+ int i;
+ jint* rects;
+ XRectangle *xRects;
+ XRectangle sRects[256];
+
+ XRenderColor color;
+ color.alpha = alpha;
+ color.red = red;
+ color.green = green;
+ color.blue = blue;
+
+ if (rectCnt <= 256) {
+ xRects = &sRects[0];
+ } else {
+ xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt);
+ if (xRects == NULL) {
+ return;
+ }
+ }
+
+ if ((rects = (jint *) (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
+ return;
+ }
+
+ for (i=0; i < rectCnt; i++) {
+ xRects[i].x = rects[i*4 + 0];
+ xRects[i].y = rects[i*4 + 1];
+ xRects[i].width = rects[i*4 + 2];
+ xRects[i].height = rects[i*4 + 3];
+ }
+
+ XRenderFillRectangles(awt_display, op,
+ (Picture) dst, &color, xRects, rectCnt);
+
+ (*env)->ReleasePrimitiveArrayCritical(env, rectArray, rects, JNI_ABORT);
+ if (xRects != &sRects[0]) {
+ free(xRects);
+ }
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_XRSetTransformNative
+ (JNIEnv *env, jclass xsd, jint pic,
+ jint m00, jint m01, jint m02, jint m10, jint m11, jint m12) {
+
+ XTransform tr;
+ BUILD_TRANSFORM_MATRIX(tr, m00, m01, m02, m10, m11, m12);
+ XRenderSetPictureTransform (awt_display, (Picture) pic, &tr);
+}
+
+JNIEXPORT jint JNICALL
+Java_sun_java2d_xr_XRBackendNative_XRCreateLinearGradientPaintNative
+ (JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
+ jshortArray pixelsArray, jint x1, jint y1, jint x2, jint y2,
+ jint numStops, jint repeat,
+ jint m00, jint m01, jint m02, jint m10, jint m11, jint m12) {
+ jint i;
+ jshort* pixels;
+ jfloat* fractions;
+ XTransform tr;
+ XRenderPictureAttributes pict_attr;
+ Picture gradient = 0;
+ XRenderColor *colors;
+ XFixed *stops;
+ XLinearGradient grad;
+
+ if ((pixels = (jshort *)
+ (*env)->GetPrimitiveArrayCritical(env, pixelsArray, NULL)) == NULL) {
+ return -1;
+ }
+ if ((fractions = (jfloat *)
+ (*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL)) == NULL) {
+ (*env)->ReleasePrimitiveArrayCritical(env,
+ pixelsArray, pixels, JNI_ABORT);
+ return -1;
+ }
+
+ grad.p1.x = x1;
+ grad.p1.y = y1;
+ grad.p2.x = x2;
+ grad.p2.y = y2;
+
+ /*TODO optimized & malloc check*/
+ colors = (XRenderColor *) malloc(numStops * sizeof(XRenderColor));
+ stops = (XFixed *) malloc(numStops * sizeof(XFixed));
+
+ for (i=0; i < numStops; i++) {
+ stops[i] = XDoubleToFixed(fractions[i]);
+ colors[i].alpha = pixels[i*4 + 0];
+ colors[i].red = pixels[i*4 + 1];
+ colors[i].green = pixels[i*4 + 2];
+ colors[i].blue = pixels[i*4 + 3];
+ }
+#ifdef __solaris__
+ if (XRenderCreateLinearGradientFunc!=NULL) {
+ gradient = (*XRenderCreateLinearGradientFunc)(awt_display, &grad, stops, colors, numStops);
+ }
+#else
+ gradient = XRenderCreateLinearGradient(awt_display, &grad, stops, colors, numStops);
+#endif
+ free(colors);
+ free(stops);
+
+ (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT);
+ (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
+
+ if (gradient != 0) {
+ BUILD_TRANSFORM_MATRIX(tr, m00, m01, m02, m10, m11, m12);
+ XRenderSetPictureTransform (awt_display, gradient, &tr);
+ pict_attr.repeat = repeat;
+ XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
+ }
+
+ return (jint) gradient;
+}
+
+
+JNIEXPORT jint JNICALL
+Java_sun_java2d_xr_XRBackendNative_XRCreateRadialGradientPaintNative
+ (JNIEnv *env, jclass xsd, jfloatArray fractionsArray,
+ jshortArray pixelsArray, jint numStops,
+ jint innerRadius, jint outerRadius, jint repeat,
+ jint m00, jint m01, jint m02, jint m10, jint m11, jint m12) {
+ jint i;
+ jshort* pixels;
+ jfloat* fractions;
+ XTransform tr;
+ XRenderPictureAttributes pict_attr;
+ Picture gradient = 0;
+ XRenderColor *colors;
+ XFixed *stops;
+ XRadialGradient grad;
+
+
+ if ((pixels =
+ (jshort *)(*env)->GetPrimitiveArrayCritical(env, pixelsArray, NULL)) == NULL) {
+ return -1;
+ }
+ if ((fractions = (jfloat *)
+ (*env)->GetPrimitiveArrayCritical(env, fractionsArray, NULL)) == NULL) {
+ (*env)->ReleasePrimitiveArrayCritical(env,
+ pixelsArray, pixels, JNI_ABORT);
+ return -1; //TODO release pixels first
+ }
+
+ grad.inner.x = 0;
+ grad.inner.y = 0;
+ grad.inner.radius = innerRadius;
+ grad.outer.x = 0;
+ grad.outer.y = 0;
+ grad.outer.radius = outerRadius;
+
+ /*TODO optimized & malloc check*/
+ colors = (XRenderColor *) malloc(numStops * sizeof(XRenderColor));
+ stops = (XFixed *) malloc(numStops * sizeof(XFixed));
+
+ for (i=0; i < numStops; i++) {
+ stops[i] = XDoubleToFixed(fractions[i]);
+ colors[i].alpha = pixels[i*4 + 0];
+ colors[i].red = pixels[i*4 + 1];
+ colors[i].green = pixels[i*4 + 2];
+ colors[i].blue = pixels[i*4 + 3];
+ }
+#ifdef __solaris__
+ if (XRenderCreateRadialGradientFunc != NULL) {
+ gradient = (jint) (*XRenderCreateRadialGradientFunc)(awt_display, &grad, stops, colors, numStops);
+ }
+#else
+ gradient = (jint) XRenderCreateRadialGradient(awt_display, &grad, stops, colors, numStops);
+#endif
+ free(colors);
+ free(stops);
+
+ (*env)->ReleasePrimitiveArrayCritical(env, pixelsArray, pixels, JNI_ABORT);
+ (*env)->ReleasePrimitiveArrayCritical(env, fractionsArray, fractions, JNI_ABORT);
+
+
+ if (gradient != 0) {
+ BUILD_TRANSFORM_MATRIX(tr, m00, m01, m02, m10, m11, m12);
+ XRenderSetPictureTransform (awt_display, gradient, &tr);
+ pict_attr.repeat = repeat;
+ XRenderChangePicture (awt_display, gradient, CPRepeat, &pict_attr);
+ }
+
+ return (jint) gradient;
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_setFilter
+ (JNIEnv *env, jobject this, jint picture, jint filter) {
+
+ char * filterName = "fast";
+
+ switch(filter) {
+ case 0:
+ filterName = "fast";
+ break;
+
+ case 1:
+ filterName = "good";
+ break;
+
+ case 2:
+ filterName = "best";
+ break;
+ }
+
+ XRenderSetPictureFilter(awt_display, (Picture) picture, filterName, NULL, 0);
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_XRSetClipNative
+ (JNIEnv *env, jclass xsd, jlong dst,
+ jint x1, jint y1, jint x2, jint y2,
+ jobject complexclip, jboolean isGC)
+{
+ int numrects;
+ XRectangle rects[256];
+ XRectangle *pRect = rects;
+
+ numrects = RegionToYXBandedRectangles(env,
+ x1, y1, x2, y2, complexclip,
+ &pRect, 256);
+
+ if (isGC == JNI_TRUE) {
+ if (dst != (jlong) 0) {
+ XSetClipRectangles(awt_display, (GC) jlong_to_ptr(dst), 0, 0, pRect, numrects, YXBanded);
+ }
+ } else {
+ XRenderSetPictureClipRectangles (awt_display, (Picture) dst, 0, 0, pRect, numrects);
+ }
+
+ if (pRect != rects) {
+ free(pRect);
+ }
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_putMaskNative
+ (JNIEnv *env, jclass cls, jint drawable, jlong gc, jbyteArray imageData,
+ jint sx, jint sy, jint dx, jint dy, jint width, jint height,
+ jint maskOff, jint maskScan, jfloat ea, jlong imgPtr) {
+
+ int line, pix;
+ char *mask;
+ char *defaultData;
+ XImage *defaultImg, *img;
+ jboolean imageFits;
+
+ if ((mask = (char *)
+ (*env)->GetPrimitiveArrayCritical(env, imageData, NULL)) == NULL) {
+ return;
+ }
+
+ defaultImg = (XImage *) jlong_to_ptr(imgPtr);
+
+ if (ea != 1.0f) {
+ for (line=0; line < height; line++) {
+ for (pix=0; pix < width; pix++) {
+ int index = maskScan*line + pix + maskOff;
+ mask[index] = (((unsigned char) mask[index])*ea);
+ }
+ }
+ }
+
+ /*
+ * 1. If existing XImage and supplied buffer match, only adjust the data pointer
+ * 2. If existing XImage is large enough to hold the data but does not match in
+ * scan the data is copied to fit the XImage.
+ * 3. If data is larger than the existing XImage a new temporary XImage is
+ * allocated.
+ * The default XImage is optimized for the AA tiles, which are currently 32x32.
+ */
+ defaultData = defaultImg->data;
+ img = defaultImg;
+ imageFits = defaultImg->width >= width && defaultImg->height >= height;
+
+ if (imageFits &&
+ maskOff == defaultImg->xoffset && maskScan == defaultImg->bytes_per_line) {
+ defaultImg->data = mask;
+ } else {
+ if (imageFits) {
+ for (line=0; line < height; line++) {
+ for (pix=0; pix < width; pix++) {
+ img->data[line*img->bytes_per_line + pix] =
+ (unsigned char) (mask[maskScan*line + pix + maskOff]);
+ }
+ }
+ } else {
+ img = XCreateImage(awt_display, NULL, 8, ZPixmap,
+ maskOff, mask, maskScan, height, 8, 0);
+ }
+ }
+
+ XPutImage(awt_display, (Pixmap) drawable, (GC) jlong_to_ptr(gc),
+ img, 0, 0, 0, 0, width, height);
+ (*env)->ReleasePrimitiveArrayCritical(env, imageData, mask, JNI_ABORT);
+
+ if (img != defaultImg) {
+ img->data = NULL;
+ XDestroyImage(img);
+ }
+ defaultImg->data = defaultData;
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_XRAddGlyphsNative
+ (JNIEnv *env, jclass cls, jint glyphSet,
+ jlongArray glyphInfoPtrsArray, jint glyphCnt,
+ jbyteArray pixelDataArray, int pixelDataLength) {
+ jlong *glyphInfoPtrs;
+ unsigned char *pixelData;
+ int i;
+
+ XGlyphInfo *xginfo = (XGlyphInfo *) malloc(sizeof(XGlyphInfo) * glyphCnt);
+ Glyph *gid = (Glyph *) malloc(sizeof(Glyph) * glyphCnt);
+
+ if (xginfo == NULL || gid == NULL) {
+ return;
+ }
+
+ if ((glyphInfoPtrs = (jlong *) (*env)->GetPrimitiveArrayCritical(env, glyphInfoPtrsArray, NULL)) == NULL) {
+ return;
+ }
+
+ if ((pixelData = (unsigned char *)
+ (*env)->GetPrimitiveArrayCritical(env, pixelDataArray, NULL)) == NULL) {
+ (*env)->ReleasePrimitiveArrayCritical(env,
+ glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
+ return;
+ }
+
+ for (i=0; i < glyphCnt; i++) {
+ GlyphInfo *jginfo = (GlyphInfo *) jlong_to_ptr(glyphInfoPtrs[i]);
+
+ gid[i] = (Glyph) (0xffffffff & ((unsigned int) jginfo->cellInfo));
+ xginfo[i].x = (-jginfo->topLeftX);
+ xginfo[i].y = (-jginfo->topLeftY);
+ xginfo[i].width = jginfo->width;
+ xginfo[i].height = jginfo->height;
+ xginfo[i].xOff = round(jginfo->advanceX);
+ xginfo[i].yOff = round(jginfo->advanceY);
+ }
+
+ XRenderAddGlyphs(awt_display, glyphSet, &gid[0], &xginfo[0], glyphCnt,
+ pixelData, pixelDataLength);
+
+ (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoPtrsArray, glyphInfoPtrs, JNI_ABORT);
+ (*env)->ReleasePrimitiveArrayCritical(env, pixelDataArray, pixelData, JNI_ABORT);
+
+ free(xginfo);
+ free(gid);
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_XRFreeGlyphsNative
+ (JNIEnv *env, jclass cls, jint glyphSet, jintArray gidArray, jint glyphCnt) {
+ jint *gids;
+ int i;
+
+ if ((gids = (jint *) (*env)->GetPrimitiveArrayCritical(env, gidArray, NULL)) == NULL) {
+ return;
+ }
+
+ XRenderFreeGlyphs (awt_display, (GlyphSet) glyphSet, (Glyph *) gids, glyphCnt);
+
+ (*env)->ReleasePrimitiveArrayCritical(env, gidArray, gids, JNI_ABORT);
+}
+
+JNIEXPORT jint JNICALL
+Java_sun_java2d_xr_XRBackendNative_XRenderCreateGlyphSetNative
+ (JNIEnv *env, jclass cls, jlong format) {
+ return XRenderCreateGlyphSet(awt_display, (XRenderPictFormat *) jlong_to_ptr(format));
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_XRenderCompositeTextNative
+ (JNIEnv *env, jclass cls, jint op, jint src, jint dst, jlong maskFmt,
+ jintArray eltArray, jintArray glyphIDArray, jint eltCnt, jint glyphCnt) {
+ jint i;
+ jint *ids;
+ jint *elts;
+ XGlyphElt32 *xelts;
+ Glyph *xids;
+ XGlyphElt32 selts[24];
+ Glyph sids[256];
+ int charCnt = 0;
+
+ if (eltCnt <= 24) {
+ xelts = &selts[0];
+ }else {
+ xelts = (XGlyphElt32 *) malloc(sizeof(XGlyphElt32) * eltCnt);
+ }
+
+ if (glyphCnt <= 256) {
+ xids = &sids[0];
+ }else {
+ xids = (Glyph *) malloc(sizeof(Glyph) * glyphCnt);
+ }
+
+ if ((ids = (jint *) (*env)->GetPrimitiveArrayCritical(env, glyphIDArray, NULL)) == NULL) {
+ return;
+ }
+ if ((elts = (jint *)
+ (*env)->GetPrimitiveArrayCritical(env, eltArray, NULL)) == NULL) {
+ (*env)->ReleasePrimitiveArrayCritical(env,
+ glyphIDArray, ids, JNI_ABORT);
+ return;
+ }
+
+ for (i=0; i < glyphCnt; i++) {
+ xids[i] = (Glyph) ids[i];
+ }
+
+ for (i=0; i < eltCnt; i++) {
+ xelts[i].nchars = elts[i*4 + 0];
+ xelts[i].xOff = elts[i*4 + 1];
+ xelts[i].yOff = elts[i*4 + 2];
+ xelts[i].glyphset = (GlyphSet) elts[i*4 + 3];
+ xelts[i].chars = (unsigned int *) &xids[charCnt];
+
+ charCnt += xelts[i].nchars;
+ }
+
+ XRenderCompositeText32(awt_display, op, (Picture) src, (Picture) dst,
+ (XRenderPictFormat *) jlong_to_ptr(maskFmt),
+ 0, 0, 0, 0, xelts, eltCnt);
+
+ (*env)->ReleasePrimitiveArrayCritical(env, glyphIDArray, ids, JNI_ABORT);
+ (*env)->ReleasePrimitiveArrayCritical(env, eltArray, elts, JNI_ABORT);
+
+ if (xelts != &selts[0]) {
+ free(xelts);
+ }
+
+ if (xids != &sids[0]) {
+ free(xids);
+ }
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_setGCMode
+ (JNIEnv *env, jobject this, jlong gc, jboolean copy) {
+ GC xgc = (GC) jlong_to_ptr(gc);
+
+ if (copy == JNI_TRUE) {
+ XSetFunction(awt_display, xgc, GXcopy);
+ } else {
+ XSetFunction(awt_display, xgc, GXxor);
+ }
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_GCRectanglesNative
+ (JNIEnv *env, jclass xsd, jint dst, jlong gc,
+ jintArray rectArray, jint rectCnt) {
+ int i;
+ jint* rects;
+ XRectangle *xRects;
+ XRectangle sRects[256];
+
+ if (rectCnt <= 256) {
+ xRects = &sRects[0];
+ } else {
+ xRects = (XRectangle *) malloc(sizeof(XRectangle) * rectCnt);
+ if (xRects == NULL) {
+ return;
+ }
+ }
+
+ if ((rects = (jint *) (*env)->GetPrimitiveArrayCritical(env, rectArray, NULL)) == NULL) {
+ return;
+ }
+
+ for (i=0; i < rectCnt; i++) {
+ xRects[i].x = rects[i*4 + 0];
+ xRects[i].y = rects[i*4 + 1];
+ xRects[i].width = rects[i*4 + 2];
+ xRects[i].height = rects[i*4 + 3];
+ }
+
+ XFillRectangles(awt_display, (Drawable) dst, (GC) jlong_to_ptr(gc), xRects, rectCnt);
+
+ (*env)->ReleasePrimitiveArrayCritical(env, rectArray, rects, JNI_ABORT);
+ if (xRects != &sRects[0]) {
+ free(xRects);
+ }
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRBackendNative_renderCompositeTrapezoidsNative
+ (JNIEnv *env, jclass cls, jbyte op, jint src, jlong maskFmt,
+ jint dst, jint srcX, jint srcY, jintArray trapArray) {
+ jint *traps;
+
+ if ((traps = (jint *) (*env)->GetPrimitiveArrayCritical(env, trapArray, NULL)) == NULL) {
+ return;
+ }
+
+ XRenderCompositeTrapezoids(awt_display, op, (Picture) src, (Picture) dst,
+ (XRenderPictFormat *) jlong_to_ptr(maskFmt),
+ srcX, srcY, (XTrapezoid *) (traps+5), traps[0]);
+
+ (*env)->ReleasePrimitiveArrayCritical(env, trapArray, traps, JNI_ABORT);
+}
diff --git a/src/solaris/native/sun/java2d/x11/XRSurfaceData.c b/src/solaris/native/sun/java2d/x11/XRSurfaceData.c
new file mode 100644
index 000000000..d6d468efb
--- /dev/null
+++ b/src/solaris/native/sun/java2d/x11/XRSurfaceData.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+#include "GraphicsPrimitiveMgr.h"
+#include "Region.h"
+#include "Trace.h"
+#include "X11SurfaceData.h"
+
+/*#include <xcb/xcb.h>*/
+#include <Xrender.h>
+
+#ifndef RepeatNone /* added in 0.10 */
+#define RepeatNone 0
+#define RepeatNormal 1
+#define RepeatPad 2
+#define RepeatReflect 3
+#endif
+
+
+#include <sys/uio.h>
+#include <dlfcn.h>
+#include <setjmp.h>
+
+#ifndef HEADLESS
+jfieldID pictID;
+jfieldID xidID;
+jfieldID blitMaskPMID;
+jfieldID blitMaskPictID;
+#endif /* !HEADLESS */
+
+JNIEXPORT void JNICALL
+ Java_sun_java2d_xr_XRSurfaceData_initXRPicture(JNIEnv *env, jobject xsd,
+ jlong pXSData,
+ jint pictFormat)
+{
+#ifndef HEADLESS
+
+ X11SDOps *xsdo;
+ XRenderPictFormat *fmt;
+
+ J2dTraceLn(J2D_TRACE_INFO, "in XRSurfaceData_initXRender");
+
+ xsdo = (X11SDOps *) jlong_to_ptr(pXSData);
+ if (xsdo == NULL) {
+ return;
+ }
+
+ if (xsdo->xrPic == None) {
+ XRenderPictureAttributes pict_attr;
+ pict_attr.repeat = RepeatNone;
+ fmt = XRenderFindStandardFormat(awt_display, pictFormat);
+ xsdo->xrPic =
+ XRenderCreatePicture(awt_display, xsdo->drawable, fmt,
+ CPRepeat, &pict_attr);
+ }
+
+ (*env)->SetIntField (env, xsd, pictID, xsdo->xrPic);
+ (*env)->SetIntField (env, xsd, xidID, xsdo->drawable);
+#endif /* !HEADLESS */
+}
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRSurfaceData_initIDs(JNIEnv *env, jclass xsd)
+{
+#ifndef HEADLESS
+ J2dTraceLn(J2D_TRACE_INFO, "in XRSurfaceData_initIDs");
+
+ pictID = (*env)->GetFieldID(env, xsd, "picture", "I");
+ xidID = (*env)->GetFieldID(env, xsd, "xid", "I");
+
+ XShared_initIDs(env, JNI_FALSE);
+#endif /* !HEADLESS */
+}
+
+
+JNIEXPORT void JNICALL
+Java_sun_java2d_xr_XRSurfaceData_XRInitSurface(JNIEnv *env, jclass xsd,
+ jint depth,
+ jint width, jint height,
+ jlong drawable, jint pictFormat)
+{
+#ifndef HEADLESS
+ X11SDOps *xsdo;
+
+ J2dTraceLn(J2D_TRACE_INFO, "in XRSurfaceData_initSurface");
+
+ xsdo = X11SurfaceData_GetOps(env, xsd);
+ if (xsdo == NULL) {
+ return;
+ }
+
+ XShared_initSurface(env, xsdo, depth, width, height, drawable);
+#endif /* !HEADLESS */
+}