Merge
This commit is contained in:
commit
4fb42021d7
@ -6,3 +6,4 @@ fb57027902e04ecafceae31a605e69b436c23d57 jdk7-b26
|
||||
e21f4266466cd1306b176aaa08b2cd8337a9be3d jdk7-b29
|
||||
b6d6877c1155621a175dccd12dc14c54f938fb8b jdk7-b30
|
||||
b7474b739d13bacd9972f88ac91f6350b7b0be12 jdk7-b31
|
||||
c51121419e30eac5f0fbbce45ff1711c4ce0de28 jdk7-b32
|
||||
|
@ -370,7 +370,7 @@ ifeq ($(PLATFORM), windows)
|
||||
# ISHIELD_TEMP_MIN is the difference of an empty C:\TEMP vs. one after a
|
||||
# bundles build on windows.
|
||||
ISHIELD_TEMP_MIN=250000
|
||||
REQUIRED_DXSDK_VER = 0x0700
|
||||
REQUIRED_DXSDK_VER = 0x0900
|
||||
OS_VENDOR = Microsoft
|
||||
# How much RAM does this machine have:
|
||||
ifeq ($(JDK_HAS_MEM_INFO),)
|
||||
|
@ -92,7 +92,7 @@ ifeq ($(PLATFORM), windows)
|
||||
_WINDOWS_VERSION := Windows 2000 or Unknown (no systeminfo utility)
|
||||
endif
|
||||
WINDOWS_VERSION := $(strip $(_WINDOWS_VERSION))
|
||||
DXSDK_VER := $(shell $(EGREP) DIRECTDRAW_VERSION $(DXSDK_INCLUDE_PATH)/ddraw.h 2>&1 | \
|
||||
DXSDK_VER := $(shell $(EGREP) DIRECT3D_VERSION $(DXSDK_INCLUDE_PATH)/d3d9.h 2>&1 | \
|
||||
$(EGREP) "\#define" | $(NAWK) '{print $$3}')
|
||||
endif
|
||||
|
||||
@ -1258,7 +1258,7 @@ sane-unzip_version:
|
||||
######################################################
|
||||
sane-dxsdk:
|
||||
ifeq ($(PLATFORM), windows)
|
||||
@if [ ! -r $(DXSDK_INCLUDE_PATH)/ddraw.h ]; then \
|
||||
@if [ ! -r $(DXSDK_INCLUDE_PATH)/d3d9.h ]; then \
|
||||
$(ECHO) "ERROR: You do not have access to a valid DirectX SDK Include dir.\n" \
|
||||
" The value of DXSDK_INCLUDE_PATH must point a valid DX SDK dir.\n" \
|
||||
" Please check your access to \n" \
|
||||
@ -1287,7 +1287,7 @@ ifeq ($(PLATFORM), windows)
|
||||
" This may result in a build failure.\n" \
|
||||
" The DirectX SDK Include dir was obtained from the following location:\n" \
|
||||
" $(DXSDK_INCLUDE_PATH) \n" \
|
||||
" Please change your DirectX SDK to version 7 or 9 (Summer 2004 Update or newer).\n" \
|
||||
" Please change your DirectX SDK to version 9 (Summer 2004 Update or newer).\n" \
|
||||
" Microsoft DirectX 9 SDK can be downloaded from the following location:\n" \
|
||||
" http://msdn.microsoft.com/library/default.asp?url=/downloads/list/directx.asp\n" \
|
||||
" Or http://www.microsoft.com/directx\n" \
|
||||
|
@ -165,8 +165,8 @@ include $(BUILDDIR)/common/Library.gmk
|
||||
# Generate source files
|
||||
#
|
||||
|
||||
SPP = spp.sh
|
||||
SPP_CMD = $(SH) $(SPP)
|
||||
SPP_JARFILE = $(BUILDTOOLJARDIR)/spp.jar
|
||||
SPP_CMD = $(BOOT_JAVA_CMD) -jar $(SPP_JARFILE)
|
||||
|
||||
FILES_genout = $(FILES_gen:%.java=$(GENSRCDIR)/%.java)
|
||||
|
||||
@ -182,7 +182,7 @@ CS_GEN=$(NIO_GEN)/charset
|
||||
SCH_GEN=$(SNIO_GEN)/ch
|
||||
SCS_GEN=$(SNIO_GEN)/cs
|
||||
|
||||
sources: $(SPP) $(FILES_genout)
|
||||
sources: $(SPP_JARFILE) $(FILES_genout)
|
||||
|
||||
#
|
||||
# Generated buffer classes
|
||||
|
@ -53,8 +53,8 @@ if [ x$what = xdecoder ]; then
|
||||
-Dcoding='decoding' \
|
||||
-DOtherCoder='Encoder' \
|
||||
-DreplTypeName='string' \
|
||||
-DdefaultRepl='"\\\\uFFFD"' \
|
||||
-DdefaultReplName='<tt>"\\\\uFFFD"<\/tt>' \
|
||||
-DdefaultRepl='"\\uFFFD"' \
|
||||
-DdefaultReplName='<tt>"\\uFFFD"<\/tt>' \
|
||||
-DreplType='String' \
|
||||
-DreplFQType='java.lang.String' \
|
||||
-DreplLength='length()' \
|
||||
@ -84,7 +84,7 @@ elif [ x$what = xencoder ]; then
|
||||
-DOtherCoder='Decoder' \
|
||||
-DreplTypeName='byte array' \
|
||||
-DdefaultRepl='new byte[] { (byte)'"'"\\?"'"' }' \
|
||||
-DdefaultReplName='<tt>{<\/tt>\\\ <tt>(byte)'"'"\\?"'"'<\/tt>\\\ <tt>}<\/tt>' \
|
||||
-DdefaultReplName='<tt>{<\/tt>\ <tt>(byte)'"'"\\?"'"'<\/tt>\ <tt>}<\/tt>' \
|
||||
-DreplType='byte[]' \
|
||||
-DreplFQType='byte[]' \
|
||||
-DreplLength='length' \
|
||||
|
@ -1,165 +0,0 @@
|
||||
#! /bin/sh
|
||||
|
||||
#
|
||||
# Copyright 2000-2001 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.
|
||||
#
|
||||
|
||||
# SPP: A simple/sed-based/stream preprocessor
|
||||
# Mark Reinhold / mr@sun.com
|
||||
#
|
||||
# Usage: spp [-be] [-Kkey] -Dvar=value ... <in >out
|
||||
#
|
||||
# Source-file constructs
|
||||
#
|
||||
# Meaningful only at beginning of line, works with any number of keys:
|
||||
#
|
||||
# #if[key] Includes text between #if/#end if -Kkey specified,
|
||||
# #else[key] otherwise changes text to blank lines; key test
|
||||
# #end[key] may be negated by prefixing !, e.g., #if[!key]
|
||||
#
|
||||
# #begin If -be is specified then lines up to and including
|
||||
# #end #begin, and from #end to EOF, are deleted
|
||||
#
|
||||
# #warn Changed into warning that file is generated
|
||||
#
|
||||
# // ## Changed into blank line
|
||||
#
|
||||
# Meaningful anywhere in line, works only for first two keys:
|
||||
#
|
||||
# {#if[key]?yes} Expands to yes if -Kkey specified
|
||||
# {#if[key]?yes:no} Expands to yes if -Kkey, otherwise no
|
||||
# {#if[!key]?yes} Expands to yes if -Kother
|
||||
# {#if[!key]?yes:no} Expands to yes if -Kother, otherwise no
|
||||
# $var$ Expands to value if -Dvar=value given
|
||||
#
|
||||
# yes, no must not contain whitespace
|
||||
#
|
||||
# If the environment variable SED is defined, uses that instead of sed
|
||||
# If the environment variable NAWK is defined, uses that instead of awk
|
||||
#
|
||||
|
||||
SED=${SED:-sed}
|
||||
NAWK=${NAWK:-awk}
|
||||
|
||||
# Map a string of the form -Dvar=value into an appropriate sed command
|
||||
#
|
||||
subst() {
|
||||
# The first two lines are to avoid the direct use of echo,
|
||||
# which does not treat backslashes consistently across platforms
|
||||
echo '' \
|
||||
| $SED -e "s.*$*" \
|
||||
| $SED -e 's-D\([a-zA-Z_][-a-zA-Z_]*\)=\(.*\)'"s\\\\\$\\1\\\\\$\2gg" \
|
||||
-e 's-D\([a-zA-Z_][-a-zA-Z_]*\)'"s\\\\\$\\1\\\\\$1gg" \
|
||||
-e 's/ //g'
|
||||
}
|
||||
|
||||
es=
|
||||
be=
|
||||
keys=
|
||||
key1=_1_
|
||||
key2=_2_
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
-be)
|
||||
be='-e 1,/^#begin$/d -e /^#end$/,$d'
|
||||
;;
|
||||
-D*)
|
||||
es="$es -e `subst $1`"
|
||||
;;
|
||||
-K*)
|
||||
nk=`echo $1 | $SED -e 's/-K//'`
|
||||
if [ "x$keys" = x ]; then keys="$nk"; else keys="$keys $nk"; fi
|
||||
if [ "x$key1" = x_1_ ]; then key1="$nk";
|
||||
elif [ "x$key2" = x_2_ ]; then key2="$nk"; fi
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 [-be] [-Kkey] -Dvar=value ... <in >out"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
text='[-a-zA-Z0-9&;,.<>/#() ]'
|
||||
|
||||
$SED $es \
|
||||
-e 's// /g' \
|
||||
-e "s@^#warn .*@// -- This file was mechanically generated: Do not edit! -- //@" \
|
||||
-e 's-// ##.*$--' $be \
|
||||
-e "s/{#if\[$key1\]?\($text*\):\($text*\)}/\1/g" \
|
||||
-e "s/{#if\[!$key1\]?\($text*\):\($text*\)}/\2/g" \
|
||||
-e "s/{#if\[$key1\]?\($text*\)}/\1/g" \
|
||||
-e "s/{#if\[!$key1\]?\($text*\)}//g" \
|
||||
-e "s/{#if\[$key2\]?\($text*\):\($text*\)}/\1/g" \
|
||||
-e "s/{#if\[!$key2\]?\($text*\):\($text*\)}/\2/g" \
|
||||
-e "s/{#if\[$key2\]?\($text*\)}/\1/g" \
|
||||
-e "s/{#if\[!$key2\]?\($text*\)}//g" \
|
||||
-e "s/{#if\[[a-z]*\]?\($text*\):\($text*\)}/\2/g" \
|
||||
-e "s/{#if\[![a-z]*\]?\($text*\):\($text*\)}/\1/g" \
|
||||
-e "s/{#if\[[a-z]*\]?\($text*\)}//g" \
|
||||
-e "s/{#if\[![a-z]*\]?\($text*\)}/\1/g" \
|
||||
| $NAWK \
|
||||
'function key(s) {
|
||||
i = match(s, "[a-zA-Z][a-zA-Z]*\\]");
|
||||
if (i > 0) return substr(s, i, RLENGTH - 1);
|
||||
return "XYZZY"; }
|
||||
function neg(s) { return match(s, "!") > 0; }
|
||||
BEGIN {
|
||||
KEYS = "'"$keys"'"
|
||||
n = split(KEYS, ks, " *");
|
||||
for (i = 1; i <= n; i++) keys[ks[i]] = 1;
|
||||
top = 1; copy[top] = 1 }
|
||||
/^#if\[!?[a-zA-Z][a-zA-Z]*\]/ \
|
||||
{ k = key($0);
|
||||
n = neg($0);
|
||||
stack[++top] = k;
|
||||
if ((k in keys) == !n) {
|
||||
copy[top] = copy[top - 1];
|
||||
} else {
|
||||
copy[top] = 0;
|
||||
}
|
||||
print ""; next }
|
||||
/^#else\[!?[a-zA-Z][a-zA-Z]*\]/ \
|
||||
{ k = key($0);
|
||||
if (stack[top] == k) {
|
||||
copy[top] = copy[top - 1] && !copy[top];
|
||||
} else {
|
||||
printf "%d: Mismatched #else key\n", NR | "cat 1>&2";
|
||||
exit 11
|
||||
}
|
||||
print ""; next }
|
||||
/^#end\[!?[a-zA-Z][a-zA-Z]*\]/ \
|
||||
{ k = key($0);
|
||||
if (stack[top] == k) {
|
||||
top--;
|
||||
} else {
|
||||
printf "%d: Mismatched #end key\n", NR | "cat 1>&2"
|
||||
exit 11
|
||||
}
|
||||
print ""; next }
|
||||
/^#/ {
|
||||
printf "%d: Malformed #directive\n", NR | "cat 1>&2"
|
||||
exit 11
|
||||
}
|
||||
{ if (copy[top]) print; else print "" }'
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 1997-2008 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
|
||||
@ -112,29 +112,11 @@ FILES_cpp = \
|
||||
GDIHashtable.cpp \
|
||||
Devices.cpp \
|
||||
ObjectList.cpp \
|
||||
DDBlitLoops.cpp \
|
||||
DDRenderer.cpp \
|
||||
GDIBlitLoops.cpp \
|
||||
GDIRenderer.cpp \
|
||||
Win32OffScreenSurfaceData.cpp \
|
||||
Win32SurfaceData.cpp \
|
||||
WinBackBufferSurfaceData.cpp \
|
||||
GDIWindowSurfaceData.cpp \
|
||||
WindowsFlags.cpp \
|
||||
WBufferStrategy.cpp \
|
||||
WPrinterJob.cpp \
|
||||
ddrawUtils.cpp \
|
||||
dxCapabilities.cpp \
|
||||
dxInit.cpp \
|
||||
RegistryKey.cpp \
|
||||
D3DBlitLoops.cpp \
|
||||
D3DContext.cpp \
|
||||
D3DMaskFill.cpp \
|
||||
D3DRenderer.cpp \
|
||||
D3DRuntimeTest.cpp \
|
||||
D3DSurfaceData.cpp \
|
||||
D3DTextRenderer_md.cpp \
|
||||
D3DUtils.cpp \
|
||||
ddrawObject.cpp \
|
||||
awt_AWTEvent.cpp \
|
||||
awt_BitmapUtil.cpp \
|
||||
awt_Brush.cpp \
|
||||
@ -199,6 +181,23 @@ FILES_cpp = \
|
||||
awt_Mlib.cpp \
|
||||
awt_new.cpp \
|
||||
awt_TrayIcon.cpp \
|
||||
ShaderList.cpp \
|
||||
D3DBlitLoops.cpp \
|
||||
D3DBufImgOps.cpp \
|
||||
D3DContext.cpp \
|
||||
D3DGlyphCache.cpp \
|
||||
D3DGraphicsDevice.cpp \
|
||||
D3DMaskBlit.cpp \
|
||||
D3DMaskCache.cpp \
|
||||
D3DMaskFill.cpp \
|
||||
D3DPipelineManager.cpp \
|
||||
D3DPaints.cpp \
|
||||
D3DRenderer.cpp \
|
||||
D3DRenderQueue.cpp \
|
||||
D3DResourceManager.cpp \
|
||||
D3DSurfaceData.cpp \
|
||||
D3DTextRenderer.cpp \
|
||||
D3DVertexCacher.cpp \
|
||||
ShellFolder2.cpp \
|
||||
ThemeReader.cpp \
|
||||
ComCtl32Util.cpp \
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 2000-2008 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
|
||||
@ -49,6 +49,9 @@ FILES_export = \
|
||||
sun/java2d/loops/TransformHelper.java \
|
||||
sun/java2d/loops/GraphicsPrimitiveMgr.java \
|
||||
sun/java2d/loops/GraphicsPrimitive.java \
|
||||
sun/java2d/pipe/hw/AccelSurface.java \
|
||||
sun/java2d/pipe/hw/AccelDeviceEventNotifier.java \
|
||||
sun/java2d/pipe/hw/ContextCapabilities.java \
|
||||
sun/awt/image/ImagingLib.java \
|
||||
sun/java2d/SurfaceData.java \
|
||||
sun/java2d/SunGraphics2D.java \
|
||||
@ -107,6 +110,7 @@ FILES_export = \
|
||||
sun/java2d/pipe/BufferedContext.java \
|
||||
sun/java2d/pipe/BufferedMaskBlit.java \
|
||||
sun/java2d/pipe/BufferedOpCodes.java \
|
||||
sun/java2d/pipe/BufferedMaskBlit.java \
|
||||
sun/java2d/pipe/BufferedPaints.java \
|
||||
sun/java2d/pipe/BufferedRenderPipe.java \
|
||||
sun/java2d/pipe/BufferedTextPipe.java \
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 2000-2008 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
|
||||
@ -125,14 +125,9 @@ FILES_export2 = \
|
||||
sun/awt/image/BufImgSurfaceData.java \
|
||||
sun/awt/image/DataBufferNative.java \
|
||||
sun/awt/shell/Win32ShellFolder2.java \
|
||||
sun/java2d/windows/DDBlitLoops.java \
|
||||
sun/java2d/windows/DDRenderer.java \
|
||||
sun/java2d/windows/DDScaleLoops.java \
|
||||
sun/java2d/windows/GDIBlitLoops.java \
|
||||
sun/java2d/windows/GDIRenderer.java \
|
||||
sun/java2d/windows/Win32OffScreenSurfaceData.java \
|
||||
sun/java2d/windows/Win32SurfaceData.java \
|
||||
sun/java2d/windows/WinBackBufferSurfaceData.java \
|
||||
sun/java2d/windows/GDIWindowSurfaceData.java \
|
||||
sun/java2d/windows/WindowsFlags.java \
|
||||
sun/java2d/loops/Blit.java \
|
||||
sun/java2d/loops/BlitBg.java \
|
||||
@ -219,6 +214,9 @@ FILES_export3 = \
|
||||
sun/awt/windows/WBufferStrategy.java \
|
||||
sun/awt/windows/WTrayIconPeer.java \
|
||||
sun/awt/image/ImagingLib.java \
|
||||
sun/java2d/pipe/hw/AccelSurface.java \
|
||||
sun/java2d/pipe/hw/AccelDeviceEventNotifier.java \
|
||||
sun/java2d/pipe/hw/ContextCapabilities.java \
|
||||
sun/java2d/pipe/BufferedContext.java \
|
||||
sun/java2d/pipe/BufferedMaskBlit.java \
|
||||
sun/java2d/pipe/BufferedOpCodes.java \
|
||||
@ -229,13 +227,6 @@ FILES_export3 = \
|
||||
sun/java2d/pipe/ShapeSpanIterator.java \
|
||||
sun/java2d/pipe/SpanClipRenderer.java \
|
||||
sun/java2d/pipe/RegionIterator.java \
|
||||
sun/java2d/d3d/D3DBlitLoops.java \
|
||||
sun/java2d/d3d/D3DMaskFill.java \
|
||||
sun/java2d/d3d/D3DRenderer.java \
|
||||
sun/java2d/d3d/D3DContext.java \
|
||||
sun/java2d/d3d/D3DSurfaceData.java \
|
||||
sun/java2d/d3d/D3DBackBufferSurfaceData.java \
|
||||
sun/java2d/d3d/D3DTextRenderer.java \
|
||||
sun/java2d/opengl/OGLBlitLoops.java \
|
||||
sun/java2d/opengl/OGLContext.java \
|
||||
sun/java2d/opengl/OGLMaskFill.java \
|
||||
@ -245,4 +236,13 @@ FILES_export3 = \
|
||||
sun/java2d/opengl/OGLSurfaceData.java \
|
||||
sun/java2d/opengl/OGLTextRenderer.java \
|
||||
sun/java2d/opengl/WGLGraphicsConfig.java \
|
||||
sun/java2d/opengl/WGLSurfaceData.java
|
||||
sun/java2d/opengl/WGLSurfaceData.java \
|
||||
sun/java2d/d3d/D3DBlitLoops.java \
|
||||
sun/java2d/d3d/D3DGraphicsDevice.java \
|
||||
sun/java2d/d3d/D3DSurfaceData.java \
|
||||
sun/java2d/d3d/D3DMaskFill.java \
|
||||
sun/java2d/d3d/D3DPaints.java \
|
||||
sun/java2d/d3d/D3DRenderQueue.java \
|
||||
sun/java2d/d3d/D3DRenderer.java \
|
||||
sun/java2d/d3d/D3DTextRenderer.java \
|
||||
sun/java2d/d3d/D3DContext.java
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 1995-2008 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
|
||||
@ -65,7 +65,6 @@ include FILES_export_windows.gmk
|
||||
#
|
||||
AUTO_JAVA_PRUNE += RemoteOffScreenImage.java
|
||||
|
||||
OTHER_CXXFLAGS += -DD3D_OVERLOADS
|
||||
OTHER_CFLAGS += $(GX_OPTION) -DMLIB_NO_LIBSUNMATH -DUNICODE -D_UNICODE
|
||||
OTHER_CXXFLAGS += $(GX_OPTION) -DUNICODE -D_UNICODE
|
||||
|
||||
@ -444,7 +443,7 @@ OTHER_INCLUDES += -I$(CLASSHDRDIR)/../../java/jvm \
|
||||
-I$(SHARE_SRC)/native/sun/dc/path \
|
||||
-I$(SHARE_SRC)/native/sun/dc/doe \
|
||||
-I$(SHARE_SRC)/native/sun/awt/debug \
|
||||
-I$(PLATFORM_SRC)/native/sun/awt \
|
||||
-I$(PLATFORM_SRC)/native/sun/awt
|
||||
# -I$(WINAWT_COMMON_native)
|
||||
|
||||
# this is only required for compiling )/native/sun/awt/medialib/*.c files
|
||||
|
File diff suppressed because one or more lines are too long
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 2001-2008 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
|
||||
@ -417,12 +417,14 @@ SUNWprivate_1.1 {
|
||||
Java_sun_java2d_x11_X11SurfaceData_XSetForeground;
|
||||
Java_sun_java2d_x11_X11SurfaceData_XSetGraphicsExposures;
|
||||
|
||||
Java_sun_java2d_opengl_OGLContext_getOGLIdString;
|
||||
Java_sun_java2d_opengl_OGLMaskFill_maskFill;
|
||||
Java_sun_java2d_opengl_OGLRenderer_drawPoly;
|
||||
Java_sun_java2d_opengl_OGLRenderQueue_flushBuffer;
|
||||
Java_sun_java2d_opengl_OGLSurfaceData_initTexture;
|
||||
Java_sun_java2d_opengl_OGLSurfaceData_initFBObject;
|
||||
Java_sun_java2d_opengl_OGLSurfaceData_initFlipBackbuffer;
|
||||
Java_sun_java2d_opengl_OGLSurfaceData_getTextureID;
|
||||
Java_sun_java2d_opengl_OGLSurfaceData_getTextureTarget;
|
||||
Java_sun_java2d_opengl_OGLTextRenderer_drawGlyphList;
|
||||
Java_sun_java2d_opengl_GLXGraphicsConfig_getGLXConfigInfo;
|
||||
@ -511,6 +513,7 @@ SUNWprivate_1.1 {
|
||||
AWTCharAscent;
|
||||
AWTCharDescent;
|
||||
AWTDrawGlyphList;
|
||||
AccelGlyphCache_RemoveAllCellInfos;
|
||||
|
||||
local:
|
||||
*;
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 1997-2008 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
|
||||
@ -137,7 +137,6 @@ SUNWprivate_1.1 {
|
||||
RegionToYXBandedRectangles;
|
||||
GrPrim_CompGetXorInfo;
|
||||
GrPrim_CompGetAlphaInfo;
|
||||
GrPrim_ColorGetRGB;
|
||||
J2dTraceImpl;
|
||||
J2dTraceInit;
|
||||
img_makePalette;
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 2002-2008 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
|
||||
@ -568,6 +568,7 @@ SUNWprivate_1.1 {
|
||||
AWTCharAscent;
|
||||
AWTCharDescent;
|
||||
AWTDrawGlyphList;
|
||||
AccelGlyphCache_RemoveAllCellInfos;
|
||||
|
||||
local:
|
||||
*;
|
||||
|
@ -116,7 +116,7 @@ ifeq ($(PLATFORM),windows)
|
||||
FILES_c_platform = fontpath.c \
|
||||
lcdglyph.c
|
||||
|
||||
FILES_cpp_platform = D3DTextRenderer.cpp
|
||||
FILES_cpp_platform =
|
||||
else
|
||||
FILES_c_platform = X11FontScaler.c \
|
||||
X11TextRenderer.c
|
||||
|
@ -80,8 +80,6 @@ ifeq ($(PLATFORM), windows)
|
||||
OTHER_CFLAGS += -DCC_NOEX
|
||||
OTHER_CXXFLAGS += -DCC_NOEX
|
||||
|
||||
FILES_export += sun/java2d/d3d/D3DTextRenderer.java
|
||||
|
||||
else # PLATFORM unix
|
||||
|
||||
FILES_export += \
|
||||
@ -166,7 +164,6 @@ endif
|
||||
|
||||
ifeq ($(PLATFORM), windows)
|
||||
vpath %.cpp $(PLATFORM_SRC)/native/sun/windows
|
||||
vpath %.cpp $(PLATFORM_SRC)/native/sun/java2d/d3d
|
||||
else # PLATFORM
|
||||
|
||||
#
|
||||
@ -201,7 +198,6 @@ CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR) \
|
||||
-I$(TEMPDIR)/../../sun.awt/awt/CClassHeaders
|
||||
|
||||
ifeq ($(PLATFORM), windows)
|
||||
CPPFLAGS += -I$(PLATFORM_SRC)/native/sun/windows \
|
||||
-I$(PLATFORM_SRC)/native/sun/java2d/d3d
|
||||
CPPFLAGS += -I$(PLATFORM_SRC)/native/sun/windows
|
||||
endif
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 2001-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 2001-2008 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
|
||||
@ -60,6 +60,7 @@ SUNWprivate_1.1 {
|
||||
X11SurfaceData_GetOps;
|
||||
Java_java_awt_Font_initIDs;
|
||||
Java_sun_font_FontManager_getFontConfig;
|
||||
Java_sun_font_FontManager_getFontConfigVersion;
|
||||
Java_sun_font_FontManager_getFontConfigAASettings;
|
||||
Java_sun_font_FontManager_getFontPath;
|
||||
Java_sun_font_FontManager_setNativeFontPath;
|
||||
@ -98,6 +99,7 @@ SUNWprivate_1.1 {
|
||||
AWTCharAscent;
|
||||
AWTCharDescent;
|
||||
AWTDrawGlyphList;
|
||||
AccelGlyphCache_RemoveAllCellInfos;
|
||||
|
||||
|
||||
local:
|
||||
|
@ -1 +1 @@
|
||||
$(OBJDIR)/jawt.obj:: $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_AlphaComposite.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_AWTEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Component.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Dimension.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Event.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Font.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_PlatformFont.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/gdefs.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/loops/AlphaMath.h ../../../src/share/native/sun/java2d/loops/GlyphImageRef.h ../../../src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.h ../../../src/share/native/sun/java2d/pipe/SpanIterator.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/gdefs_md.h ../../../src/windows/native/sun/java2d/j2d_md.h ../../../src/windows/native/sun/java2d/windows/ddrawObject.h ../../../src/windows/native/sun/java2d/windows/dxCapabilities.h ../../../src/windows/native/sun/java2d/windows/RegistryKey.h ../../../src/windows/native/sun/java2d/windows/Win32SurfaceData.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/stdhdrs.h ../../../src/windows/native/sun/windows/UnicowsLoader.h
|
||||
$(OBJDIR)/jawt.obj:: $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_AWTEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Component.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Dimension.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Event.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_Font.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_FocusEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_KeyEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_MouseEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/java_awt_event_WindowEvent.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_FontDescriptor.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_PlatformFont.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WComponentPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WFontMetrics.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WObjectPeer.h $(CLASSHDRDIR)/../../awt/CClassHeaders/sun_awt_windows_WToolkit.h ../../../src/share/javavm/export/jawt.h ../../../src/share/javavm/export/jni.h ../../../src/share/javavm/export/jvm.h ../../../src/share/native/common/jlong.h ../../../src/share/native/common/jni_util.h ../../../src/share/native/sun/awt/debug/debug_assert.h ../../../src/share/native/sun/awt/debug/debug_mem.h ../../../src/share/native/sun/awt/debug/debug_trace.h ../../../src/share/native/sun/awt/debug/debug_util.h ../../../src/share/native/sun/awt/image/cvutils/img_globals.h ../../../src/share/native/sun/java2d/SurfaceData.h ../../../src/share/native/sun/java2d/Trace.h ../../../src/windows/javavm/export/jawt_md.h ../../../src/windows/javavm/export/jni_md.h ../../../src/windows/javavm/export/jvm_md.h ../../../src/windows/native/common/jlong_md.h ../../../src/windows/native/sun/java2d/windows/GDIWindowSurfaceData.h ../../../src/windows/native/sun/windows/Devices.h ../../../src/windows/native/sun/windows/GDIHashtable.h ../../../src/windows/native/sun/windows/Hashtable.h ../../../src/windows/native/sun/windows/ObjectList.h ../../../src/windows/native/sun/windows/UnicowsLoader.h ../../../src/windows/native/sun/windows/alloc.h ../../../src/windows/native/sun/windows/awt.h ../../../src/windows/native/sun/windows/awt_Brush.h ../../../src/windows/native/sun/windows/awt_Component.h ../../../src/windows/native/sun/windows/awt_Debug.h ../../../src/windows/native/sun/windows/awt_DrawingSurface.h ../../../src/windows/native/sun/windows/awt_Font.h ../../../src/windows/native/sun/windows/awt_GDIObject.h ../../../src/windows/native/sun/windows/awt_MMStub.h ../../../src/windows/native/sun/windows/awt_Multimon.h ../../../src/windows/native/sun/windows/awt_Object.h ../../../src/windows/native/sun/windows/awt_Palette.h ../../../src/windows/native/sun/windows/awt_Pen.h ../../../src/windows/native/sun/windows/awt_Toolkit.h ../../../src/windows/native/sun/windows/awt_Unicode.h ../../../src/windows/native/sun/windows/awt_Win32GraphicsDevice.h ../../../src/windows/native/sun/windows/awtmsg.h ../../../src/windows/native/sun/windows/colordata.h ../../../src/windows/native/sun/windows/stdhdrs.h
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 2002-2008 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
|
||||
@ -177,6 +177,7 @@ SUNWprivate_1.1 {
|
||||
Java_java_awt_TextField_initIDs;
|
||||
Java_java_awt_TrayIcon_initIDs;
|
||||
Java_sun_font_FontManager_getFontConfig;
|
||||
Java_sun_font_FontManager_getFontConfigVersion;
|
||||
Java_sun_font_FontManager_getFontConfigAASettings;
|
||||
Java_sun_font_FontManager_getFontPath;
|
||||
Java_sun_font_FontManager_setNativeFontPath;
|
||||
@ -241,6 +242,7 @@ SUNWprivate_1.1 {
|
||||
AWTCharAscent;
|
||||
AWTCharDescent;
|
||||
AWTDrawGlyphList;
|
||||
AccelGlyphCache_RemoveAllCellInfos;
|
||||
|
||||
Java_sun_awt_X11_XToolkit_waitForEvents;
|
||||
Java_java_awt_Event_initIDs;
|
||||
|
@ -51,6 +51,7 @@ SUBDIRS = \
|
||||
jdwpgen \
|
||||
makeclasslist \
|
||||
strip_properties \
|
||||
spp \
|
||||
CharsetMapping
|
||||
|
||||
all build clean clobber::
|
||||
|
45
jdk/make/tools/spp/Makefile
Normal file
45
jdk/make/tools/spp/Makefile
Normal file
@ -0,0 +1,45 @@
|
||||
#
|
||||
# Copyright 2008 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.
|
||||
#
|
||||
|
||||
#
|
||||
# Makefile for build spp tool
|
||||
#
|
||||
|
||||
BUILDDIR = ../..
|
||||
PACKAGE = build.tools.spp
|
||||
PRODUCT = tools
|
||||
PROGRAM = spp
|
||||
include $(BUILDDIR)/common/Defs.gmk
|
||||
|
||||
|
||||
BUILDTOOL_SOURCE_ROOT = $(BUILDDIR)/tools/src
|
||||
BUILDTOOL_MAIN = $(PKGDIR)/Spp.java
|
||||
|
||||
#
|
||||
# Build tool jar rules.
|
||||
#
|
||||
include $(BUILDDIR)/common/BuildToolJar.gmk
|
||||
|
||||
|
189
jdk/make/tools/src/build/tools/spp/Spp.java
Normal file
189
jdk/make/tools/src/build/tools/spp/Spp.java
Normal file
@ -0,0 +1,189 @@
|
||||
/*
|
||||
* Copyright 2008 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 build.tools.spp;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.regex.*;
|
||||
|
||||
/*
|
||||
* Spp: A simple regex-based stream preprocessor based on Mark Reinhold's
|
||||
* sed-based spp.sh
|
||||
*
|
||||
* Usage: java build.tools.spp.Spp [-be] [-Kkey] -Dvar=value ... <in >out
|
||||
*
|
||||
* Source-file constructs
|
||||
*
|
||||
* Meaningful only at beginning of line, works with any number of keys:
|
||||
*
|
||||
* #if[key] Includes text between #if/#end if -Kkey specified,
|
||||
* #else[key] otherwise changes text to blank lines; key test
|
||||
* #end[key] may be negated by prefixing !, e.g., #if[!key]
|
||||
*
|
||||
* #begin If -be is specified then lines up to and including
|
||||
* #end #begin, and from #end to EOF, are deleted
|
||||
*
|
||||
* #warn Changed into warning that file is generated
|
||||
*
|
||||
* // ## Changed into blank line
|
||||
*
|
||||
* Meaningful anywhere in line
|
||||
*
|
||||
* {#if[key]?yes} Expands to yes if -Kkey specified
|
||||
* {#if[key]?yes:no} Expands to yes if -Kkey, otherwise no
|
||||
* {#if[!key]?yes} Expands to yes if -Kother
|
||||
* {#if[!key]?yes:no} Expands to yes if -Kother, otherwise no
|
||||
* $var$ Expands to value if -Dvar=value given
|
||||
*
|
||||
* yes, no must not contain whitespace
|
||||
*
|
||||
* @author Xueming Shen
|
||||
*/
|
||||
|
||||
public class Spp {
|
||||
public static void main(String args[]) throws Exception {
|
||||
Map<String, String> vars = new HashMap<String, String>();
|
||||
Set<String> keys = new HashSet<String>();
|
||||
boolean be = false;
|
||||
|
||||
for (String arg:args) {
|
||||
if (arg.startsWith("-D")) {
|
||||
int i = arg.indexOf('=');
|
||||
vars.put(arg.substring(2, i),arg.substring(i+1));
|
||||
} else if (arg.startsWith("-K")) {
|
||||
keys.add(arg.substring(2));
|
||||
} else if ("-be".equals(arg)) {
|
||||
be = true;
|
||||
} else {
|
||||
System.err.println("Usage: java build.tools.spp.Spp [-be] [-Kkey] -Dvar=value ... <in >out");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
StringBuffer out = new StringBuffer();
|
||||
new Spp().spp(new Scanner(System.in),
|
||||
out, "",
|
||||
keys, vars, be,
|
||||
false);
|
||||
System.out.print(out.toString());
|
||||
}
|
||||
|
||||
static final String LNSEP = System.getProperty("line.separator");
|
||||
static final String KEY = "([a-zA-Z0-9]+)";
|
||||
static final String VAR = "([a-zA-Z0-9_\\-]+)";
|
||||
static final String TEXT = "([a-zA-Z0-9&;,.<>/#() \\$]+)"; // $ -- hack embedded $var$
|
||||
|
||||
static final int GN_NOT = 1;
|
||||
static final int GN_KEY = 2;
|
||||
static final int GN_YES = 3;
|
||||
static final int GN_NO = 5;
|
||||
static final int GN_VAR = 6;
|
||||
|
||||
Matcher ifkey = Pattern.compile("^#if\\[(!)?" + KEY + "\\]").matcher("");
|
||||
Matcher elsekey = Pattern.compile("^#else\\[(!)?" + KEY + "\\]").matcher("");
|
||||
Matcher endkey = Pattern.compile("^#end\\[(!)?" + KEY + "\\]").matcher("");
|
||||
Matcher vardef = Pattern.compile("\\{#if\\[(!)?" + KEY + "\\]\\?" + TEXT + "(:"+ TEXT + ")?\\}|\\$" + VAR + "\\$").matcher("");
|
||||
Matcher vardef2 = Pattern.compile("\\$" + VAR + "\\$").matcher("");
|
||||
|
||||
void append(StringBuffer buf, String ln,
|
||||
Set<String> keys, Map<String, String> vars) {
|
||||
vardef.reset(ln);
|
||||
while (vardef.find()) {
|
||||
String repl = "";
|
||||
if (vardef.group(GN_VAR) != null)
|
||||
repl = vars.get(vardef.group(GN_VAR));
|
||||
else {
|
||||
boolean test = keys.contains(vardef.group(GN_KEY));
|
||||
if (vardef.group(GN_NOT) != null)
|
||||
test = !test;
|
||||
repl = test?vardef.group(GN_YES):vardef.group(GN_NO);
|
||||
if (repl == null)
|
||||
repl = "";
|
||||
else { // embedded $var$
|
||||
while (vardef2.reset(repl).find()) {
|
||||
repl = vardef2.replaceFirst(vars.get(vardef2.group(1)));
|
||||
}
|
||||
}
|
||||
}
|
||||
vardef.appendReplacement(buf, repl);
|
||||
}
|
||||
vardef.appendTail(buf);
|
||||
}
|
||||
|
||||
// return true if #end[key], #end or EOF reached
|
||||
boolean spp(Scanner in, StringBuffer buf, String key,
|
||||
Set<String> keys, Map<String, String> vars,
|
||||
boolean be, boolean skip) {
|
||||
while (in.hasNextLine()) {
|
||||
String ln = in.nextLine();
|
||||
if (be) {
|
||||
if (ln.startsWith("#begin")) {
|
||||
buf.setLength(0); //clean up to this line
|
||||
continue;
|
||||
}
|
||||
if (ln.equals("#end")) {
|
||||
while (in.hasNextLine())
|
||||
in.nextLine();
|
||||
return true; //discard the rest to EOF
|
||||
}
|
||||
}
|
||||
if (ifkey.reset(ln).find()) {
|
||||
String k = ifkey.group(GN_KEY);
|
||||
boolean test = keys.contains(k);
|
||||
if (ifkey.group(GN_NOT) != null)
|
||||
test = !test;
|
||||
buf.append(LNSEP);
|
||||
if (!spp(in, buf, k, keys, vars, be, skip || !test)) {
|
||||
spp(in, buf, k, keys, vars, be, skip || test);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (elsekey.reset(ln).find()) {
|
||||
if (!key.equals(elsekey.group(GN_KEY))) {
|
||||
throw new Error("Mis-matched #if-else-end at line <" + ln + ">");
|
||||
}
|
||||
buf.append(LNSEP);
|
||||
return false;
|
||||
}
|
||||
if (endkey.reset(ln).find()) {
|
||||
if (!key.equals(endkey.group(GN_KEY))) {
|
||||
throw new Error("Mis-matched #if-else-end at line <" + ln + ">");
|
||||
}
|
||||
buf.append(LNSEP);
|
||||
return true;
|
||||
}
|
||||
if (ln.startsWith("#warn")) {
|
||||
ln = "// -- This file was mechanically generated: Do not edit! -- //";
|
||||
} else if (ln.trim().startsWith("// ##")) {
|
||||
ln = "";
|
||||
}
|
||||
if (!skip) {
|
||||
append(buf, ln, keys, vars);
|
||||
}
|
||||
buf.append(LNSEP);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -540,7 +540,6 @@ ownedMonitorsWithStackDepth(PacketInputStream *in, PacketOutputStream *out)
|
||||
|
||||
jvmtiError error = JVMTI_ERROR_NONE;
|
||||
jint count = 0;
|
||||
jint depth;
|
||||
jvmtiMonitorStackDepthInfo *monitors=NULL;
|
||||
|
||||
error = JVMTI_FUNC_PTR(gdata->jvmti,GetOwnedMonitorStackDepthInfo)
|
||||
|
@ -473,7 +473,7 @@ transport_startTransport(jboolean isServer, char *name, char *address,
|
||||
/*
|
||||
* Record listener address in a system property
|
||||
*/
|
||||
len = strlen(name) + strlen(retAddress) + 2; /* ':' and '\0' */
|
||||
len = (int)strlen(name) + (int)strlen(retAddress) + 2; /* ':' and '\0' */
|
||||
prop_value = (char*)jvmtiAllocate(len);
|
||||
strcpy(prop_value, name);
|
||||
strcat(prop_value, ":");
|
||||
|
@ -26,6 +26,7 @@
|
||||
package com.sun.jmx.mbeanserver;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
@ -113,4 +114,32 @@ public class Util {
|
||||
public static <T> T cast(Object x) {
|
||||
return (T) x;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes a descriptor hashcode from its names and values.
|
||||
* @param names the sorted array of descriptor names.
|
||||
* @param values the array of descriptor values.
|
||||
* @return a hash code value, as described in {@link #hashCode(Descriptor)}
|
||||
*/
|
||||
public static int hashCode(String[] names, Object[] values) {
|
||||
int hash = 0;
|
||||
for (int i = 0; i < names.length; i++) {
|
||||
Object v = values[i];
|
||||
int h;
|
||||
if (v == null) {
|
||||
h = 0;
|
||||
} else if (v instanceof Object[]) {
|
||||
h = Arrays.deepHashCode((Object[]) v);
|
||||
} else if (v.getClass().isArray()) {
|
||||
h = Arrays.deepHashCode(new Object[]{v}) - 31;
|
||||
// hashcode of a list containing just v is
|
||||
// v.hashCode() + 31, see List.hashCode()
|
||||
} else {
|
||||
h = v.hashCode();
|
||||
}
|
||||
hash += names[i].toLowerCase().hashCode() ^ h;
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -74,7 +74,11 @@ import sun.awt.dnd.SunDropTargetEvent;
|
||||
import sun.awt.im.CompositionArea;
|
||||
import sun.java2d.SunGraphics2D;
|
||||
import sun.java2d.pipe.Region;
|
||||
import sun.awt.image.VSyncedBSManager;
|
||||
import sun.java2d.pipe.hw.ExtendedBufferCapabilities;
|
||||
import static sun.java2d.pipe.hw.ExtendedBufferCapabilities.VSyncType.*;
|
||||
import sun.awt.RequestFocusController;
|
||||
import sun.java2d.SunGraphicsEnvironment;
|
||||
|
||||
/**
|
||||
* A <em>component</em> is an object having a graphical representation
|
||||
@ -3522,6 +3526,11 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
if (numBuffers == 1) {
|
||||
bufferStrategy = new SingleBufferStrategy(caps);
|
||||
} else {
|
||||
SunGraphicsEnvironment sge = (SunGraphicsEnvironment)
|
||||
GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
if (!caps.isPageFlipping() && sge.isFlipStrategyPreferred(peer)) {
|
||||
caps = new ProxyCapabilities(caps);
|
||||
}
|
||||
// assert numBuffers > 1;
|
||||
if (caps.isPageFlipping()) {
|
||||
bufferStrategy = new FlipSubRegionBufferStrategy(numBuffers, caps);
|
||||
@ -3531,6 +3540,25 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This is a proxy capabilities class used when a FlipBufferStrategy
|
||||
* is created instead of the requested Blit strategy.
|
||||
*
|
||||
* @see sun.awt.SunGraphicsEnvironment#isFlipStrategyPreferred(ComponentPeer)
|
||||
*/
|
||||
private class ProxyCapabilities extends ExtendedBufferCapabilities {
|
||||
private BufferCapabilities orig;
|
||||
private ProxyCapabilities(BufferCapabilities orig) {
|
||||
super(orig.getFrontBufferCapabilities(),
|
||||
orig.getBackBufferCapabilities(),
|
||||
orig.getFlipContents() ==
|
||||
BufferCapabilities.FlipContents.BACKGROUND ?
|
||||
BufferCapabilities.FlipContents.BACKGROUND :
|
||||
BufferCapabilities.FlipContents.COPIED);
|
||||
this.orig = orig;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the buffer strategy used by this component
|
||||
* @see Window#createBufferStrategy
|
||||
@ -3660,16 +3688,30 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
width = getWidth();
|
||||
height = getHeight();
|
||||
|
||||
if (drawBuffer == null) {
|
||||
peer.createBuffers(numBuffers, caps);
|
||||
} else {
|
||||
if (drawBuffer != null) {
|
||||
// dispose the existing backbuffers
|
||||
drawBuffer = null;
|
||||
drawVBuffer = null;
|
||||
destroyBuffers();
|
||||
// ... then recreate the backbuffers
|
||||
peer.createBuffers(numBuffers, caps);
|
||||
}
|
||||
|
||||
if (caps instanceof ExtendedBufferCapabilities) {
|
||||
ExtendedBufferCapabilities ebc =
|
||||
(ExtendedBufferCapabilities)caps;
|
||||
if (ebc.getVSync() == VSYNC_ON) {
|
||||
// if this buffer strategy is not allowed to be v-synced,
|
||||
// change the caps that we pass to the peer but keep on
|
||||
// trying to create v-synced buffers;
|
||||
// do not throw IAE here in case it is disallowed, see
|
||||
// ExtendedBufferCapabilities for more info
|
||||
if (!VSyncedBSManager.vsyncAllowed(this)) {
|
||||
caps = ebc.derive(VSYNC_DEFAULT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
peer.createBuffers(numBuffers, caps);
|
||||
updateInternalBuffers();
|
||||
}
|
||||
|
||||
@ -3714,7 +3756,23 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
*/
|
||||
protected void flip(BufferCapabilities.FlipContents flipAction) {
|
||||
if (peer != null) {
|
||||
peer.flip(flipAction);
|
||||
Image backBuffer = getBackBuffer();
|
||||
if (backBuffer != null) {
|
||||
peer.flip(0, 0,
|
||||
backBuffer.getWidth(null),
|
||||
backBuffer.getHeight(null), flipAction);
|
||||
}
|
||||
} else {
|
||||
throw new IllegalStateException(
|
||||
"Component must have a valid peer");
|
||||
}
|
||||
}
|
||||
|
||||
void flipSubRegion(int x1, int y1, int x2, int y2,
|
||||
BufferCapabilities.FlipContents flipAction)
|
||||
{
|
||||
if (peer != null) {
|
||||
peer.flip(x1, y1, x2, y2, flipAction);
|
||||
} else {
|
||||
throw new IllegalStateException(
|
||||
"Component must have a valid peer");
|
||||
@ -3725,6 +3783,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
* Destroys the buffers created through this object
|
||||
*/
|
||||
protected void destroyBuffers() {
|
||||
VSyncedBSManager.releaseVsync(this);
|
||||
if (peer != null) {
|
||||
peer.destroyBuffers();
|
||||
} else {
|
||||
@ -3737,7 +3796,11 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
* @return the buffering capabilities of this strategy
|
||||
*/
|
||||
public BufferCapabilities getCapabilities() {
|
||||
return caps;
|
||||
if (caps instanceof ProxyCapabilities) {
|
||||
return ((ProxyCapabilities)caps).orig;
|
||||
} else {
|
||||
return caps;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3824,6 +3887,14 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
flip(caps.getFlipContents());
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes specified region of the the next available buffer visible
|
||||
* by either blitting or flipping.
|
||||
*/
|
||||
void showSubRegion(int x1, int y1, int x2, int y2) {
|
||||
flipSubRegion(x1, y1, x2, y2, caps.getFlipContents());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
* @since 1.6
|
||||
@ -4094,8 +4165,6 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
|
||||
/**
|
||||
* Private class to perform sub-region flipping.
|
||||
* REMIND: this subclass currently punts on subregions and
|
||||
* flips the entire buffer.
|
||||
*/
|
||||
private class FlipSubRegionBufferStrategy extends FlipBufferStrategy
|
||||
implements SubRegionShowable
|
||||
@ -4109,14 +4178,13 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
}
|
||||
|
||||
public void show(int x1, int y1, int x2, int y2) {
|
||||
show();
|
||||
showSubRegion(x1, y1, x2, y2);
|
||||
}
|
||||
|
||||
// This is invoked by Swing on the toolkit thread.
|
||||
public boolean validateAndShow(int x1, int y1, int x2, int y2) {
|
||||
revalidate(false);
|
||||
if (!contentsRestored() && !contentsLost()) {
|
||||
show();
|
||||
public boolean showIfNotLost(int x1, int y1, int x2, int y2) {
|
||||
if (!contentsLost()) {
|
||||
showSubRegion(x1, y1, x2, y2);
|
||||
return !contentsLost();
|
||||
}
|
||||
return false;
|
||||
@ -4144,9 +4212,8 @@ public abstract class Component implements ImageObserver, MenuContainer,
|
||||
}
|
||||
|
||||
// This method is called by Swing on the toolkit thread.
|
||||
public boolean validateAndShow(int x1, int y1, int x2, int y2) {
|
||||
revalidate(false);
|
||||
if (!contentsRestored() && !contentsLost()) {
|
||||
public boolean showIfNotLost(int x1, int y1, int x2, int y2) {
|
||||
if (!contentsLost()) {
|
||||
showSubRegion(x1, y1, x2, y2);
|
||||
return !contentsLost();
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1997-2008 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
|
||||
@ -236,6 +236,10 @@ public abstract class GraphicsDevice {
|
||||
*/
|
||||
public void setFullScreenWindow(Window w) {
|
||||
if (fullScreenWindow != null && windowedModeBounds != null) {
|
||||
// if the window went into fs mode before it was realized it may
|
||||
// have (0,0) dimensions
|
||||
if (windowedModeBounds.width == 0) windowedModeBounds.width = 1;
|
||||
if (windowedModeBounds.height == 0) windowedModeBounds.height = 1;
|
||||
fullScreenWindow.setBounds(windowedModeBounds);
|
||||
}
|
||||
// Set the full screen window
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1999-2008 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
|
||||
@ -25,12 +25,18 @@
|
||||
|
||||
package java.awt;
|
||||
|
||||
import java.awt.peer.*;
|
||||
import java.awt.image.*;
|
||||
import java.awt.event.*;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.DataBufferInt;
|
||||
import java.awt.image.DirectColorModel;
|
||||
import java.awt.image.Raster;
|
||||
import java.awt.image.WritableRaster;
|
||||
import java.awt.peer.RobotPeer;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import sun.awt.ComponentFactory;
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.awt.image.SunWritableRaster;
|
||||
import sun.security.util.SecurityConstants;
|
||||
|
||||
/**
|
||||
@ -335,6 +341,10 @@ public class Robot {
|
||||
/* blue mask */ 0x000000FF);
|
||||
}
|
||||
|
||||
// need to sync the toolkit prior to grabbing the pixels since in some
|
||||
// cases rendering to the screen may be delayed
|
||||
Toolkit.getDefaultToolkit().sync();
|
||||
|
||||
int pixels[];
|
||||
int[] bandmasks = new int[3];
|
||||
|
||||
@ -346,6 +356,7 @@ public class Robot {
|
||||
bandmasks[2] = screenCapCM.getBlueMask();
|
||||
|
||||
raster = Raster.createPackedRaster(buffer, translatedRect.width, translatedRect.height, translatedRect.width, bandmasks, null);
|
||||
SunWritableRaster.makeTrackable(buffer);
|
||||
|
||||
image = new BufferedImage(screenCapCM, raster, false, null);
|
||||
|
||||
|
@ -530,6 +530,12 @@ public abstract class DataBuffer {
|
||||
public StateTrackableDelegate getTrackable(DataBuffer db) {
|
||||
return db.theTrackable;
|
||||
}
|
||||
|
||||
public void setTrackable(DataBuffer db,
|
||||
StateTrackableDelegate trackable)
|
||||
{
|
||||
db.theTrackable = trackable;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1995-2008 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
|
||||
@ -88,7 +88,7 @@ public interface ComponentPeer {
|
||||
boolean handlesWheelScrolling();
|
||||
void createBuffers(int numBuffers, BufferCapabilities caps) throws AWTException;
|
||||
Image getBackBuffer();
|
||||
void flip(BufferCapabilities.FlipContents flipAction);
|
||||
void flip(int x1, int y1, int x2, int y2, BufferCapabilities.FlipContents flipAction);
|
||||
void destroyBuffers();
|
||||
|
||||
/**
|
||||
|
@ -25,12 +25,9 @@
|
||||
|
||||
package java.net;
|
||||
|
||||
import java.security.AccessController;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectStreamException;
|
||||
import java.io.InvalidObjectException;
|
||||
import sun.security.action.*;
|
||||
import java.util.Enumeration;
|
||||
|
||||
/**
|
||||
@ -358,13 +355,13 @@ class Inet6Address extends InetAddress {
|
||||
}
|
||||
|
||||
private int deriveNumericScope (NetworkInterface ifc) throws UnknownHostException {
|
||||
Enumeration addresses = ifc.getInetAddresses();
|
||||
Enumeration<InetAddress> addresses = ifc.getInetAddresses();
|
||||
while (addresses.hasMoreElements()) {
|
||||
InetAddress address = (InetAddress)addresses.nextElement();
|
||||
if (!(address instanceof Inet6Address)) {
|
||||
InetAddress addr = addresses.nextElement();
|
||||
if (!(addr instanceof Inet6Address)) {
|
||||
continue;
|
||||
}
|
||||
Inet6Address ia6_addr = (Inet6Address)address;
|
||||
Inet6Address ia6_addr = (Inet6Address)addr;
|
||||
/* check if site or link local prefixes match */
|
||||
if (!differentLocalAddressTypes(ia6_addr)){
|
||||
/* type not the same, so carry on searching */
|
||||
@ -377,22 +374,22 @@ class Inet6Address extends InetAddress {
|
||||
}
|
||||
|
||||
private int deriveNumericScope (String ifname) throws UnknownHostException {
|
||||
Enumeration en;
|
||||
Enumeration<NetworkInterface> en;
|
||||
try {
|
||||
en = NetworkInterface.getNetworkInterfaces();
|
||||
} catch (SocketException e) {
|
||||
throw new UnknownHostException ("could not enumerate local network interfaces");
|
||||
}
|
||||
while (en.hasMoreElements()) {
|
||||
NetworkInterface ifc = (NetworkInterface)en.nextElement();
|
||||
NetworkInterface ifc = en.nextElement();
|
||||
if (ifc.getName().equals (ifname)) {
|
||||
Enumeration addresses = ifc.getInetAddresses();
|
||||
while (addresses.hasMoreElements()) {
|
||||
InetAddress address = (InetAddress)addresses.nextElement();
|
||||
if (!(address instanceof Inet6Address)) {
|
||||
InetAddress addr = (InetAddress)addresses.nextElement();
|
||||
if (!(addr instanceof Inet6Address)) {
|
||||
continue;
|
||||
}
|
||||
Inet6Address ia6_addr = (Inet6Address)address;
|
||||
Inet6Address ia6_addr = (Inet6Address)addr;
|
||||
/* check if site or link local prefixes match */
|
||||
if (!differentLocalAddressTypes(ia6_addr)){
|
||||
/* type not the same, so carry on searching */
|
||||
@ -420,21 +417,22 @@ class Inet6Address extends InetAddress {
|
||||
if (ifname != null && !"".equals (ifname)) {
|
||||
try {
|
||||
scope_ifname = NetworkInterface.getByName(ifname);
|
||||
try {
|
||||
scope_id = deriveNumericScope (scope_ifname);
|
||||
} catch (UnknownHostException e) {
|
||||
// should not happen
|
||||
assert false;
|
||||
if (scope_ifname == null) {
|
||||
/* the interface does not exist on this system, so we clear
|
||||
* the scope information completely */
|
||||
scope_id_set = false;
|
||||
scope_ifname_set = false;
|
||||
scope_id = 0;
|
||||
} else {
|
||||
try {
|
||||
scope_id = deriveNumericScope (scope_ifname);
|
||||
} catch (UnknownHostException e) {
|
||||
// should not happen
|
||||
assert false;
|
||||
}
|
||||
}
|
||||
} catch (SocketException e) {}
|
||||
|
||||
if (scope_ifname == null) {
|
||||
/* the interface does not exist on this system, so we clear
|
||||
* the scope information completely */
|
||||
scope_id_set = false;
|
||||
scope_ifname_set = false;
|
||||
scope_id = 0;
|
||||
}
|
||||
}
|
||||
/* if ifname was not supplied, then the numeric info is used */
|
||||
|
||||
@ -460,6 +458,7 @@ class Inet6Address extends InetAddress {
|
||||
* an IP multicast address
|
||||
* @since JDK1.1
|
||||
*/
|
||||
@Override
|
||||
public boolean isMulticastAddress() {
|
||||
return ((ipaddress[0] & 0xff) == 0xff);
|
||||
}
|
||||
@ -470,6 +469,7 @@ class Inet6Address extends InetAddress {
|
||||
* a wildcard address.
|
||||
* @since 1.4
|
||||
*/
|
||||
@Override
|
||||
public boolean isAnyLocalAddress() {
|
||||
byte test = 0x00;
|
||||
for (int i = 0; i < INADDRSZ; i++) {
|
||||
@ -485,6 +485,7 @@ class Inet6Address extends InetAddress {
|
||||
* a loopback address; or false otherwise.
|
||||
* @since 1.4
|
||||
*/
|
||||
@Override
|
||||
public boolean isLoopbackAddress() {
|
||||
byte test = 0x00;
|
||||
for (int i = 0; i < 15; i++) {
|
||||
@ -500,6 +501,7 @@ class Inet6Address extends InetAddress {
|
||||
* a link local address; or false if address is not a link local unicast address.
|
||||
* @since 1.4
|
||||
*/
|
||||
@Override
|
||||
public boolean isLinkLocalAddress() {
|
||||
return ((ipaddress[0] & 0xff) == 0xfe
|
||||
&& (ipaddress[1] & 0xc0) == 0x80);
|
||||
@ -512,6 +514,7 @@ class Inet6Address extends InetAddress {
|
||||
* a site local address; or false if address is not a site local unicast address.
|
||||
* @since 1.4
|
||||
*/
|
||||
@Override
|
||||
public boolean isSiteLocalAddress() {
|
||||
return ((ipaddress[0] & 0xff) == 0xfe
|
||||
&& (ipaddress[1] & 0xc0) == 0xc0);
|
||||
@ -525,6 +528,7 @@ class Inet6Address extends InetAddress {
|
||||
* of global scope or it is not a multicast address
|
||||
* @since 1.4
|
||||
*/
|
||||
@Override
|
||||
public boolean isMCGlobal() {
|
||||
return ((ipaddress[0] & 0xff) == 0xff
|
||||
&& (ipaddress[1] & 0x0f) == 0x0e);
|
||||
@ -538,6 +542,7 @@ class Inet6Address extends InetAddress {
|
||||
* of node-local scope or it is not a multicast address
|
||||
* @since 1.4
|
||||
*/
|
||||
@Override
|
||||
public boolean isMCNodeLocal() {
|
||||
return ((ipaddress[0] & 0xff) == 0xff
|
||||
&& (ipaddress[1] & 0x0f) == 0x01);
|
||||
@ -551,6 +556,7 @@ class Inet6Address extends InetAddress {
|
||||
* of link-local scope or it is not a multicast address
|
||||
* @since 1.4
|
||||
*/
|
||||
@Override
|
||||
public boolean isMCLinkLocal() {
|
||||
return ((ipaddress[0] & 0xff) == 0xff
|
||||
&& (ipaddress[1] & 0x0f) == 0x02);
|
||||
@ -564,6 +570,7 @@ class Inet6Address extends InetAddress {
|
||||
* of site-local scope or it is not a multicast address
|
||||
* @since 1.4
|
||||
*/
|
||||
@Override
|
||||
public boolean isMCSiteLocal() {
|
||||
return ((ipaddress[0] & 0xff) == 0xff
|
||||
&& (ipaddress[1] & 0x0f) == 0x05);
|
||||
@ -578,6 +585,7 @@ class Inet6Address extends InetAddress {
|
||||
* or it is not a multicast address
|
||||
* @since 1.4
|
||||
*/
|
||||
@Override
|
||||
public boolean isMCOrgLocal() {
|
||||
return ((ipaddress[0] & 0xff) == 0xff
|
||||
&& (ipaddress[1] & 0x0f) == 0x08);
|
||||
@ -590,6 +598,7 @@ class Inet6Address extends InetAddress {
|
||||
*
|
||||
* @return the raw IP address of this object.
|
||||
*/
|
||||
@Override
|
||||
public byte[] getAddress() {
|
||||
return ipaddress.clone();
|
||||
}
|
||||
@ -624,6 +633,7 @@ class Inet6Address extends InetAddress {
|
||||
*
|
||||
* @return the raw IP address in a string format.
|
||||
*/
|
||||
@Override
|
||||
public String getHostAddress() {
|
||||
String s = numericToTextFormat(ipaddress);
|
||||
if (scope_ifname_set) { /* must check this first */
|
||||
@ -639,6 +649,7 @@ class Inet6Address extends InetAddress {
|
||||
*
|
||||
* @return a hash code value for this IP address.
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
if (ipaddress != null) {
|
||||
|
||||
@ -677,6 +688,7 @@ class Inet6Address extends InetAddress {
|
||||
* <code>false</code> otherwise.
|
||||
* @see java.net.InetAddress#getAddress()
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj == null ||
|
||||
!(obj instanceof Inet6Address))
|
||||
|
@ -82,7 +82,7 @@ public abstract class AbstractSelector
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
private final Set cancelledKeys = new HashSet();
|
||||
private final Set<SelectionKey> cancelledKeys = new HashSet<SelectionKey>();
|
||||
|
||||
void cancel(SelectionKey k) { // package-private
|
||||
synchronized (cancelledKeys) {
|
||||
|
@ -303,7 +303,7 @@ public abstract class Charset$Coder$ {
|
||||
|
||||
#if[encoder]
|
||||
|
||||
private WeakReference cachedDecoder = null;
|
||||
private WeakReference<CharsetDecoder> cachedDecoder = null;
|
||||
|
||||
/**
|
||||
* Tells whether or not the given byte array is a legal replacement value
|
||||
@ -322,13 +322,13 @@ public abstract class Charset$Coder$ {
|
||||
* is a legal replacement value for this encoder
|
||||
*/
|
||||
public boolean isLegalReplacement(byte[] repl) {
|
||||
WeakReference wr = cachedDecoder;
|
||||
WeakReference<CharsetDecoder> wr = cachedDecoder;
|
||||
CharsetDecoder dec = null;
|
||||
if ((wr == null) || ((dec = (CharsetDecoder)wr.get()) == null)) {
|
||||
if ((wr == null) || ((dec = wr.get()) == null)) {
|
||||
dec = charset().newDecoder();
|
||||
dec.onMalformedInput(CodingErrorAction.REPORT);
|
||||
dec.onUnmappableCharacter(CodingErrorAction.REPORT);
|
||||
cachedDecoder = new WeakReference(dec);
|
||||
cachedDecoder = new WeakReference<CharsetDecoder>(dec);
|
||||
} else {
|
||||
dec.reset();
|
||||
}
|
||||
|
@ -379,7 +379,7 @@ public abstract class Charset
|
||||
}
|
||||
|
||||
// Thread-local gate to prevent recursive provider lookups
|
||||
private static ThreadLocal gate = new ThreadLocal();
|
||||
private static ThreadLocal<ThreadLocal> gate = new ThreadLocal<ThreadLocal>();
|
||||
|
||||
private static Charset lookupViaProviders(final String charsetName) {
|
||||
|
||||
@ -539,9 +539,9 @@ public abstract class Charset
|
||||
// Fold charsets from the given iterator into the given map, ignoring
|
||||
// charsets whose names already have entries in the map.
|
||||
//
|
||||
private static void put(Iterator i, Map m) {
|
||||
private static void put(Iterator<Charset> i, Map<String,Charset> m) {
|
||||
while (i.hasNext()) {
|
||||
Charset cs = (Charset)i.next();
|
||||
Charset cs = i.next();
|
||||
if (!m.containsKey(cs.name()))
|
||||
m.put(cs.name(), cs);
|
||||
}
|
||||
@ -623,7 +623,7 @@ public abstract class Charset
|
||||
|
||||
private final String name; // tickles a bug in oldjavac
|
||||
private final String[] aliases; // tickles a bug in oldjavac
|
||||
private Set aliasSet = null;
|
||||
private Set<String> aliasSet = null;
|
||||
|
||||
/**
|
||||
* Initializes a new charset with the given canonical name and alias
|
||||
@ -665,7 +665,7 @@ public abstract class Charset
|
||||
if (aliasSet != null)
|
||||
return aliasSet;
|
||||
int n = aliases.length;
|
||||
HashSet hs = new HashSet(n);
|
||||
HashSet<String> hs = new HashSet<String>(n);
|
||||
for (int i = 0; i < n; i++)
|
||||
hs.add(aliases[i]);
|
||||
aliasSet = Collections.unmodifiableSet(hs);
|
||||
|
@ -194,7 +194,7 @@ public class CoderResult {
|
||||
|
||||
private static abstract class Cache {
|
||||
|
||||
private Map cache = null;
|
||||
private Map<Integer,WeakReference<CoderResult>> cache = null;
|
||||
|
||||
protected abstract CoderResult create(int len);
|
||||
|
||||
@ -202,16 +202,16 @@ public class CoderResult {
|
||||
if (len <= 0)
|
||||
throw new IllegalArgumentException("Non-positive length");
|
||||
Integer k = new Integer(len);
|
||||
WeakReference w;
|
||||
WeakReference<CoderResult> w;
|
||||
CoderResult e = null;
|
||||
if (cache == null) {
|
||||
cache = new HashMap();
|
||||
} else if ((w = (WeakReference)cache.get(k)) != null) {
|
||||
e = (CoderResult)w.get();
|
||||
cache = new HashMap<Integer,WeakReference<CoderResult>>();
|
||||
} else if ((w = cache.get(k)) != null) {
|
||||
e = w.get();
|
||||
}
|
||||
if (e == null) {
|
||||
e = create(len);
|
||||
cache.put(k, new WeakReference(e));
|
||||
cache.put(k, new WeakReference<CoderResult>(e));
|
||||
}
|
||||
return e;
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ formatVersion=1
|
||||
# It is a serial number that accompanies with each amendment, such as
|
||||
# 'MAxxx.doc'
|
||||
|
||||
dataVersion=139
|
||||
dataVersion=140
|
||||
|
||||
# List of all valid ISO 4217 currency codes.
|
||||
# To ensure compatibility, do not remove codes.
|
||||
@ -187,7 +187,7 @@ HR=HRK
|
||||
# CUBA
|
||||
CU=CUP
|
||||
# CYPRUS
|
||||
CY=CYP
|
||||
CY=EUR
|
||||
# CZECH REPUBLIC
|
||||
CZ=CZK
|
||||
# DENMARK
|
||||
@ -346,7 +346,7 @@ MV=MVR
|
||||
# MALI
|
||||
ML=XOF
|
||||
# MALTA
|
||||
MT=MTL
|
||||
MT=EUR
|
||||
# MARSHALL ISLANDS
|
||||
MH=USD
|
||||
# MARTINIQUE
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2004-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2004-2008 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
|
||||
@ -25,6 +25,7 @@
|
||||
|
||||
package javax.management;
|
||||
|
||||
import com.sun.jmx.mbeanserver.Util;
|
||||
import java.io.InvalidObjectException;
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.Arrays;
|
||||
@ -362,6 +363,7 @@ public class ImmutableDescriptor implements Descriptor {
|
||||
*/
|
||||
// Note: this Javadoc is copied from javax.management.Descriptor
|
||||
// due to 6369229.
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o == this)
|
||||
return true;
|
||||
@ -410,29 +412,15 @@ public class ImmutableDescriptor implements Descriptor {
|
||||
*/
|
||||
// Note: this Javadoc is copied from javax.management.Descriptor
|
||||
// due to 6369229.
|
||||
@Override
|
||||
public int hashCode() {
|
||||
if (hashCode == -1) {
|
||||
int hash = 0;
|
||||
for (int i = 0; i < names.length; i++) {
|
||||
Object v = values[i];
|
||||
int h;
|
||||
if (v == null)
|
||||
h = 0;
|
||||
else if (v instanceof Object[])
|
||||
h = Arrays.deepHashCode((Object[]) v);
|
||||
else if (v.getClass().isArray()) {
|
||||
h = Arrays.deepHashCode(new Object[] {v}) - 31;
|
||||
// hashcode of a list containing just v is
|
||||
// v.hashCode() + 31, see List.hashCode()
|
||||
} else
|
||||
h = v.hashCode();
|
||||
hash += names[i].toLowerCase().hashCode() ^ h;
|
||||
}
|
||||
hashCode = hash;
|
||||
hashCode = Util.hashCode(names, values);
|
||||
}
|
||||
return hashCode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder("{");
|
||||
for (int i = 0; i < names.length; i++) {
|
||||
@ -479,6 +467,7 @@ public class ImmutableDescriptor implements Descriptor {
|
||||
* If the descriptor construction fails for any reason, this exception will
|
||||
* be thrown.
|
||||
*/
|
||||
@Override
|
||||
public Descriptor clone() {
|
||||
return this;
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ package javax.management.modelmbean;
|
||||
import static com.sun.jmx.defaults.JmxProperties.MODELMBEAN_LOGGER;
|
||||
import static com.sun.jmx.mbeanserver.Util.cast;
|
||||
import com.sun.jmx.mbeanserver.GetPropertyAction;
|
||||
import com.sun.jmx.mbeanserver.Util;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
@ -774,6 +775,7 @@ public class DescriptorSupport
|
||||
* fails for any reason, this exception will be thrown.
|
||||
*/
|
||||
|
||||
@Override
|
||||
public synchronized Object clone() throws RuntimeOperationsException {
|
||||
if (MODELMBEAN_LOGGER.isLoggable(Level.FINEST)) {
|
||||
MODELMBEAN_LOGGER.logp(Level.FINEST,
|
||||
@ -814,13 +816,16 @@ public class DescriptorSupport
|
||||
* otherwise.
|
||||
*
|
||||
*/
|
||||
// XXXX TODO: This is not very efficient!
|
||||
// Note: this Javadoc is copied from javax.management.Descriptor
|
||||
// due to 6369229.
|
||||
@Override
|
||||
public synchronized boolean equals(Object o) {
|
||||
if (o == this)
|
||||
return true;
|
||||
|
||||
if (! (o instanceof Descriptor))
|
||||
return false;
|
||||
if (o instanceof ImmutableDescriptor)
|
||||
return o.equals(this);
|
||||
return new ImmutableDescriptor(descriptorMap).equals(o);
|
||||
}
|
||||
|
||||
@ -844,11 +849,16 @@ public class DescriptorSupport
|
||||
* @return A hash code value for this object.
|
||||
*
|
||||
*/
|
||||
// XXXX TODO: This is not very efficient!
|
||||
// Note: this Javadoc is copied from javax.management.Descriptor
|
||||
// due to 6369229.
|
||||
@Override
|
||||
public synchronized int hashCode() {
|
||||
return new ImmutableDescriptor(descriptorMap).hashCode();
|
||||
final int size = descriptorMap.size();
|
||||
// descriptorMap is sorted with a comparator that ignores cases.
|
||||
//
|
||||
return Util.hashCode(
|
||||
descriptorMap.keySet().toArray(new String[size]),
|
||||
descriptorMap.values().toArray(new Object[size]));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1278,6 +1288,7 @@ public class DescriptorSupport
|
||||
* field Names or field Values. If the descriptor string fails
|
||||
* for any reason, this exception will be thrown.
|
||||
*/
|
||||
@Override
|
||||
public synchronized String toString() {
|
||||
if (MODELMBEAN_LOGGER.isLoggable(Level.FINEST)) {
|
||||
MODELMBEAN_LOGGER.logp(Level.FINEST,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2005-2008 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
|
||||
@ -263,7 +263,7 @@ class BufferStrategyPaintManager extends RepaintManager.PaintManager {
|
||||
(SubRegionShowable)bufferStrategy;
|
||||
boolean paintAllOnExpose = info.getPaintAllOnExpose();
|
||||
info.setPaintAllOnExpose(false);
|
||||
if (bsSubRegion.validateAndShow(x, y, (x + w), (y + h))) {
|
||||
if (bsSubRegion.showIfNotLost(x, y, (x + w), (y + h))) {
|
||||
return !paintAllOnExpose;
|
||||
}
|
||||
// Mark the buffer as needing to be repainted. We don't
|
||||
|
@ -72,6 +72,11 @@ public abstract class FontConfiguration {
|
||||
protected boolean preferLocaleFonts;
|
||||
protected boolean preferPropFonts;
|
||||
|
||||
private File fontConfigFile;
|
||||
private boolean foundOsSpecificFile;
|
||||
private boolean inited;
|
||||
private String javaLib;
|
||||
|
||||
/* A default FontConfiguration must be created before an alternate
|
||||
* one to ensure proper static initialisation takes place.
|
||||
*/
|
||||
@ -80,14 +85,25 @@ public abstract class FontConfiguration {
|
||||
logger = Logger.getLogger("sun.awt.FontConfiguration");
|
||||
}
|
||||
this.environment = environment;
|
||||
this.preferLocaleFonts = false;
|
||||
this.preferPropFonts = false;
|
||||
setOsNameAndVersion(); /* static initialization */
|
||||
setEncoding(); /* static initialization */
|
||||
fontConfig = this; /* static initialization */
|
||||
/* Separating out the file location from the rest of the
|
||||
* initialisation, so the caller has the option of doing
|
||||
* something else if a suitable file isn't found.
|
||||
*/
|
||||
findFontConfigFile();
|
||||
}
|
||||
|
||||
readFontConfigFile();
|
||||
initFontConfig();
|
||||
public synchronized boolean init() {
|
||||
if (!inited) {
|
||||
this.preferLocaleFonts = false;
|
||||
this.preferPropFonts = false;
|
||||
fontConfig = this; /* static initialization */
|
||||
readFontConfigFile(fontConfigFile);
|
||||
initFontConfig();
|
||||
inited = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public FontConfiguration(SunGraphicsEnvironment environment,
|
||||
@ -121,21 +137,51 @@ public abstract class FontConfiguration {
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// methods for loading the FontConfig file //
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
private void readFontConfigFile() {
|
||||
// Find fontconfig file
|
||||
File f = null;
|
||||
|
||||
public boolean foundOsSpecificFile() {
|
||||
return foundOsSpecificFile;
|
||||
}
|
||||
|
||||
/* Smoke test to see if we can trust this configuration by testing if
|
||||
* the first slot of a composite font maps to an installed file.
|
||||
*/
|
||||
public boolean fontFilesArePresent() {
|
||||
init();
|
||||
short fontNameID = compFontNameIDs[0][0][0];
|
||||
short fileNameID = getComponentFileID(fontNameID);
|
||||
final String fileName = mapFileName(getComponentFileName(fileNameID));
|
||||
Boolean exists = (Boolean)java.security.AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction() {
|
||||
public Object run() {
|
||||
try {
|
||||
File f = new File(fileName);
|
||||
return Boolean.valueOf(f.exists());
|
||||
}
|
||||
catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
return exists.booleanValue();
|
||||
}
|
||||
|
||||
private void findFontConfigFile() {
|
||||
|
||||
foundOsSpecificFile = true; // default assumption.
|
||||
String javaHome = System.getProperty("java.home");
|
||||
if (javaHome == null) {
|
||||
throw new Error("java.home property not set");
|
||||
}
|
||||
String javaLib = javaHome + File.separator + "lib";
|
||||
javaLib = javaHome + File.separator + "lib";
|
||||
String userConfigFile = System.getProperty("sun.awt.fontconfig");
|
||||
if (userConfigFile != null) {
|
||||
f = new File(userConfigFile);
|
||||
fontConfigFile = new File(userConfigFile);
|
||||
} else {
|
||||
f = findFontConfigFile(javaLib);
|
||||
fontConfigFile = findFontConfigFile(javaLib);
|
||||
}
|
||||
}
|
||||
|
||||
private void readFontConfigFile(File f) {
|
||||
/* This is invoked here as readFontConfigFile is only invoked
|
||||
* once per VM, and always in a privileged context, thus the
|
||||
* directory containing installed fall back fonts is accessed
|
||||
@ -167,7 +213,7 @@ public abstract class FontConfiguration {
|
||||
}
|
||||
}
|
||||
|
||||
private void getInstalledFallbackFonts(String javaLib) {
|
||||
protected void getInstalledFallbackFonts(String javaLib) {
|
||||
String fallbackDirName = javaLib + File.separator +
|
||||
"fonts" + File.separator + "fallback";
|
||||
|
||||
@ -229,6 +275,8 @@ public abstract class FontConfiguration {
|
||||
return configFile;
|
||||
}
|
||||
}
|
||||
foundOsSpecificFile = false;
|
||||
|
||||
configFile = findImpl(baseName);
|
||||
if (configFile != null) {
|
||||
return configFile;
|
||||
@ -506,12 +554,12 @@ public abstract class FontConfiguration {
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
protected static final int NUM_FONTS = 5;
|
||||
protected static final int NUM_STYLES = 4;
|
||||
private static final String[] fontNames
|
||||
protected static final String[] fontNames
|
||||
= {"serif", "sansserif", "monospaced", "dialog", "dialoginput"};
|
||||
private static final String[] publicFontNames
|
||||
protected static final String[] publicFontNames
|
||||
= {Font.SERIF, Font.SANS_SERIF, Font.MONOSPACED, Font.DIALOG,
|
||||
Font.DIALOG_INPUT};
|
||||
private static final String[] styleNames
|
||||
protected static final String[] styleNames
|
||||
= {"plain", "bold", "italic", "bolditalic"};
|
||||
|
||||
/**
|
||||
@ -656,7 +704,7 @@ public abstract class FontConfiguration {
|
||||
return null;
|
||||
}
|
||||
|
||||
private static String[] installedFallbackFontFiles = null;
|
||||
protected static String[] installedFallbackFontFiles = null;
|
||||
|
||||
/**
|
||||
* Maps a file name given in the font configuration file
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2000-2008 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
|
||||
@ -255,7 +255,9 @@ public class NullComponentPeer implements LightweightPeer,
|
||||
throw new IllegalStateException(
|
||||
"Page-flipping is not allowed on a lightweight component");
|
||||
}
|
||||
public void flip(BufferCapabilities.FlipContents flipAction) {
|
||||
public void flip(int x1, int y1, int x2, int y2,
|
||||
BufferCapabilities.FlipContents flipAction)
|
||||
{
|
||||
throw new IllegalStateException(
|
||||
"Page-flipping is not allowed on a lightweight component");
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2005-2008 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
|
||||
@ -39,10 +39,11 @@ public interface SubRegionShowable {
|
||||
public void show(int x1, int y1, int x2, int y2);
|
||||
|
||||
/**
|
||||
* Validates the buffer and if successful shows the specified region.
|
||||
* Shows the specified region if the buffer is not lost and the dimensions
|
||||
* of the back-buffer match those of the component.
|
||||
*
|
||||
* @return true if successful
|
||||
*/
|
||||
// NOTE: this is invoked by swing on the toolkit thread!
|
||||
public boolean validateAndShow(int x1, int y1, int x2, int y2);
|
||||
public boolean showIfNotLost(int x1, int y1, int x2, int y2);
|
||||
}
|
||||
|
@ -29,19 +29,18 @@ import java.awt.AlphaComposite;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Font;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.ImageCapabilities;
|
||||
import java.awt.Transparency;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.ColorModel;
|
||||
import java.awt.image.ImageObserver;
|
||||
import java.awt.image.VolatileImage;
|
||||
import java.awt.image.WritableRaster;
|
||||
import sun.java2d.SunGraphics2D;
|
||||
import sun.java2d.SurfaceData;
|
||||
import sun.java2d.SurfaceManagerFactory;
|
||||
import sun.java2d.DestSurfaceProvider;
|
||||
import sun.java2d.Surface;
|
||||
import static sun.java2d.pipe.hw.AccelSurface.*;
|
||||
|
||||
/**
|
||||
* This class is the base implementation of the VolatileImage
|
||||
@ -52,23 +51,28 @@ import sun.java2d.SurfaceManagerFactory;
|
||||
* appropriate VolatileSurfaceManager for the GraphicsConfiguration
|
||||
* under which this SunVolatileImage was created.
|
||||
*/
|
||||
public class SunVolatileImage extends VolatileImage {
|
||||
public class SunVolatileImage extends VolatileImage
|
||||
implements DestSurfaceProvider
|
||||
{
|
||||
|
||||
protected VolatileSurfaceManager volSurfaceManager;
|
||||
protected Component comp;
|
||||
private GraphicsConfiguration graphicsConfig;
|
||||
private Font defaultFont;
|
||||
private int width, height;
|
||||
private int forcedAccelSurfaceType;
|
||||
|
||||
private SunVolatileImage(Component comp,
|
||||
GraphicsConfiguration graphicsConfig,
|
||||
int width, int height, Object context,
|
||||
int transparency, ImageCapabilities caps)
|
||||
protected SunVolatileImage(Component comp,
|
||||
GraphicsConfiguration graphicsConfig,
|
||||
int width, int height, Object context,
|
||||
int transparency, ImageCapabilities caps,
|
||||
int accType)
|
||||
{
|
||||
this.comp = comp;
|
||||
this.graphicsConfig = graphicsConfig;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.forcedAccelSurfaceType = accType;
|
||||
if (!(transparency == Transparency.OPAQUE ||
|
||||
transparency == Transparency.BITMASK ||
|
||||
transparency == Transparency.TRANSLUCENT))
|
||||
@ -92,7 +96,7 @@ public class SunVolatileImage extends VolatileImage {
|
||||
ImageCapabilities caps)
|
||||
{
|
||||
this(comp, graphicsConfig,
|
||||
width, height, context, Transparency.OPAQUE, caps);
|
||||
width, height, context, Transparency.OPAQUE, caps, UNDEFINED);
|
||||
}
|
||||
|
||||
public SunVolatileImage(Component comp, int width, int height) {
|
||||
@ -110,7 +114,8 @@ public class SunVolatileImage extends VolatileImage {
|
||||
int width, int height, int transparency,
|
||||
ImageCapabilities caps)
|
||||
{
|
||||
this(null, graphicsConfig, width, height, null, transparency, caps);
|
||||
this(null, graphicsConfig, width, height, null, transparency,
|
||||
caps, UNDEFINED);
|
||||
}
|
||||
|
||||
public int getWidth() {
|
||||
@ -144,6 +149,10 @@ public class SunVolatileImage extends VolatileImage {
|
||||
return comp;
|
||||
}
|
||||
|
||||
public int getForcedAccelSurfaceType() {
|
||||
return forcedAccelSurfaceType;
|
||||
}
|
||||
|
||||
protected VolatileSurfaceManager createSurfaceManager(Object context,
|
||||
ImageCapabilities caps)
|
||||
{
|
||||
@ -248,4 +257,14 @@ public class SunVolatileImage extends VolatileImage {
|
||||
public ImageCapabilities getCapabilities() {
|
||||
return volSurfaceManager.getCapabilities(graphicsConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @see sun.java2d.DestSurfaceProvider#getDestSurface
|
||||
*/
|
||||
@Override
|
||||
public Surface getDestSurface() {
|
||||
return volSurfaceManager.getPrimarySurfaceData();
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2001-2008 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
|
||||
@ -35,6 +35,7 @@ import java.awt.image.DataBufferInt;
|
||||
import java.awt.image.SampleModel;
|
||||
import java.awt.image.WritableRaster;
|
||||
|
||||
import sun.java2d.StateTrackable.State;
|
||||
import sun.java2d.SurfaceData;
|
||||
import sun.java2d.StateTrackableDelegate;
|
||||
|
||||
@ -54,6 +55,7 @@ public class SunWritableRaster extends WritableRaster {
|
||||
public short[] getData(DataBufferUShort dbus, int bank);
|
||||
public int[] getData(DataBufferInt dbi, int bank);
|
||||
public StateTrackableDelegate getTrackable(DataBuffer db);
|
||||
public void setTrackable(DataBuffer db, StateTrackableDelegate trackable);
|
||||
}
|
||||
|
||||
public static void setDataStealer(DataStealer ds) {
|
||||
@ -79,6 +81,14 @@ public class SunWritableRaster extends WritableRaster {
|
||||
return stealer.getTrackable(db);
|
||||
}
|
||||
|
||||
public static void setTrackable(DataBuffer db, StateTrackableDelegate trackable) {
|
||||
stealer.setTrackable(db, trackable);
|
||||
}
|
||||
|
||||
public static void makeTrackable(DataBuffer db) {
|
||||
stealer.setTrackable(db, StateTrackableDelegate.createInstance(State.STABLE));
|
||||
}
|
||||
|
||||
public static void markDirty(DataBuffer db) {
|
||||
stealer.getTrackable(db).markDirty();
|
||||
}
|
||||
|
121
jdk/src/share/classes/sun/awt/image/VSyncedBSManager.java
Normal file
121
jdk/src/share/classes/sun/awt/image/VSyncedBSManager.java
Normal file
@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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.awt.image;
|
||||
|
||||
import java.awt.image.BufferStrategy;
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
/**
|
||||
* Manages v-synced buffer strategies.
|
||||
*/
|
||||
public abstract class VSyncedBSManager {
|
||||
|
||||
private static VSyncedBSManager theInstance;
|
||||
|
||||
private static final boolean vSyncLimit =
|
||||
Boolean.valueOf((String)java.security.AccessController.doPrivileged(
|
||||
new sun.security.action.GetPropertyAction(
|
||||
"sun.java2d.vsynclimit", "true")));
|
||||
|
||||
private static VSyncedBSManager getInstance(boolean create) {
|
||||
if (theInstance == null && create) {
|
||||
theInstance =
|
||||
vSyncLimit ? new SingleVSyncedBSMgr() : new NoLimitVSyncBSMgr();
|
||||
}
|
||||
return theInstance;
|
||||
}
|
||||
|
||||
abstract boolean checkAllowed(BufferStrategy bs);
|
||||
abstract void relinquishVsync(BufferStrategy bs);
|
||||
|
||||
/**
|
||||
* Returns true if the buffer strategy is allowed to be created
|
||||
* v-synced.
|
||||
*
|
||||
* @return true if the bs is allowed to be v-synced, false otherwise
|
||||
*/
|
||||
public static boolean vsyncAllowed(BufferStrategy bs) {
|
||||
VSyncedBSManager bsm = getInstance(true);
|
||||
return bsm.checkAllowed(bs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lets the manager know that this buffer strategy is no longer interested
|
||||
* in being v-synced.
|
||||
*/
|
||||
public static synchronized void releaseVsync(BufferStrategy bs) {
|
||||
VSyncedBSManager bsm = getInstance(false);
|
||||
if (bsm != null) {
|
||||
bsm.relinquishVsync(bs);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An instance of the manager which allows any buffer strategy to be
|
||||
* v-synced.
|
||||
*/
|
||||
private static final class NoLimitVSyncBSMgr extends VSyncedBSManager {
|
||||
@Override
|
||||
boolean checkAllowed(BufferStrategy bs) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
void relinquishVsync(BufferStrategy bs) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An instance of the manager which allows only one buffer strategy to
|
||||
* be v-synced at any give moment in the vm.
|
||||
*/
|
||||
private static final class SingleVSyncedBSMgr extends VSyncedBSManager {
|
||||
private WeakReference<BufferStrategy> strategy;
|
||||
|
||||
@Override
|
||||
public synchronized boolean checkAllowed(BufferStrategy bs) {
|
||||
if (strategy != null) {
|
||||
BufferStrategy current = strategy.get();
|
||||
if (current != null) {
|
||||
return (current == bs);
|
||||
}
|
||||
}
|
||||
strategy = new WeakReference<BufferStrategy>(bs);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void relinquishVsync(BufferStrategy bs) {
|
||||
if (strategy != null) {
|
||||
BufferStrategy b = strategy.get();
|
||||
if (b == bs) {
|
||||
strategy.clear();
|
||||
strategy = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2008 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
|
||||
@ -37,6 +37,7 @@ import sun.awt.image.SunVolatileImage;
|
||||
import sun.java2d.SunGraphicsEnvironment;
|
||||
import sun.java2d.SurfaceData;
|
||||
import sun.java2d.loops.CompositeType;
|
||||
import static sun.java2d.pipe.hw.AccelSurface.*;
|
||||
|
||||
/**
|
||||
* This SurfaceManager variant manages an accelerated volatile surface, if it
|
||||
@ -117,7 +118,11 @@ public abstract class VolatileSurfaceManager
|
||||
sdCurrent = sdAccel;
|
||||
}
|
||||
}
|
||||
if (sdCurrent == null) {
|
||||
// only initialize the backup surface for images with unforced
|
||||
// acceleration type
|
||||
if (sdCurrent == null &&
|
||||
vImg.getForcedAccelSurfaceType() == UNDEFINED)
|
||||
{
|
||||
sdCurrent = getBackupSurface();
|
||||
}
|
||||
}
|
||||
@ -270,9 +275,13 @@ public abstract class VolatileSurfaceManager
|
||||
* the background).
|
||||
*/
|
||||
public void initContents() {
|
||||
Graphics g = vImg.createGraphics();
|
||||
g.clearRect(0, 0, vImg.getWidth(), vImg.getHeight());
|
||||
g.dispose();
|
||||
// images with forced acceleration type may have a null sdCurrent
|
||||
// because we do not create a backup surface for them
|
||||
if (sdCurrent != null) {
|
||||
Graphics g = vImg.createGraphics();
|
||||
g.clearRect(0, 0, vImg.getWidth(), vImg.getHeight());
|
||||
g.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -148,6 +148,7 @@ public final class FontManager {
|
||||
static HashSet<String> jreLucidaFontFiles;
|
||||
static String[] jreOtherFontFiles;
|
||||
static boolean noOtherJREFontFiles = false; // initial assumption.
|
||||
static boolean fontConfigFailed = false;
|
||||
|
||||
/* Used to indicate required return type from toArray(..); */
|
||||
private static String[] STR_ARRAY = new String[0];
|
||||
@ -3100,19 +3101,30 @@ public final class FontManager {
|
||||
"monospace:bold:italic",
|
||||
};
|
||||
|
||||
/* This class is just a data structure.
|
||||
/* These next three classes are just data structures.
|
||||
*/
|
||||
private static class FontConfigInfo {
|
||||
static class FontConfigFont {
|
||||
String familyName; // eg Bitstream Vera Sans
|
||||
String styleStr; // eg Bold
|
||||
String fullName; // eg Bitstream Vera Sans Bold
|
||||
String fontFile; // eg /usr/X11/lib/fonts/foo.ttf
|
||||
}
|
||||
|
||||
static class FcCompFont {
|
||||
String fcName; // eg sans
|
||||
String fcFamily; // eg sans
|
||||
String jdkName; // eg sansserif
|
||||
int style; // eg 0=PLAIN
|
||||
String familyName; // eg Bitstream Vera Sans
|
||||
String fontFile; // eg /usr/X11/lib/fonts/foo.ttf
|
||||
FontConfigFont firstFont;
|
||||
FontConfigFont[] allFonts;
|
||||
//boolean preferBitmaps; // if embedded bitmaps preferred over AA
|
||||
CompositeFont compFont; // null if not yet created/known.
|
||||
}
|
||||
|
||||
static class FontConfigInfo {
|
||||
int fcVersion;
|
||||
String[] cacheDirs = new String[4];
|
||||
}
|
||||
|
||||
private static String getFCLocaleStr() {
|
||||
Locale l = SunToolkit.getStartupLocale();
|
||||
@ -3124,6 +3136,12 @@ public final class FontManager {
|
||||
return localeStr;
|
||||
}
|
||||
|
||||
/* This does cause the native libfontconfig to be loaded and unloaded,
|
||||
* but it does not incur the overhead of initialisation of its
|
||||
* data structures, so shouldn't have a measurable impact.
|
||||
*/
|
||||
public static native int getFontConfigVersion();
|
||||
|
||||
private static native int
|
||||
getFontConfigAASettings(String locale, String fcFamily);
|
||||
|
||||
@ -3157,17 +3175,35 @@ public final class FontManager {
|
||||
return getFontConfigAAHint("sans");
|
||||
}
|
||||
|
||||
/* This is populated by native */
|
||||
private static final FontConfigInfo fcInfo = new FontConfigInfo();
|
||||
|
||||
/* This array has the array elements created in Java code and is
|
||||
* passed down to native to be filled in.
|
||||
*/
|
||||
private static FontConfigInfo[] fontConfigFonts;
|
||||
private static FcCompFont[] fontConfigFonts;
|
||||
|
||||
/* Return an array of FontConfigInfo structs describing the primary
|
||||
/* Return an array of FcCompFont structs describing the primary
|
||||
* font located for each of fontconfig/GTK/Pango's logical font names.
|
||||
*/
|
||||
private static native void getFontConfig(String locale,
|
||||
FontConfigInfo[] fonts);
|
||||
FontConfigInfo fcInfo,
|
||||
FcCompFont[] fonts,
|
||||
boolean includeFallbacks);
|
||||
|
||||
static void populateFontConfig(FcCompFont[] fcInfo) {
|
||||
fontConfigFonts = fcInfo;
|
||||
}
|
||||
|
||||
static FcCompFont[] loadFontConfig() {
|
||||
initFontConfigFonts(true);
|
||||
return fontConfigFonts;
|
||||
}
|
||||
|
||||
static FontConfigInfo getFontConfigInfo() {
|
||||
initFontConfigFonts(true);
|
||||
return fcInfo;
|
||||
}
|
||||
|
||||
/* This can be made public if it's needed to force a re-read
|
||||
* rather than using the cached values. The re-read would be needed
|
||||
@ -3175,54 +3211,80 @@ public final class FontManager {
|
||||
* In that event this method would need to return directly the array
|
||||
* to be used by the caller in case it subsequently changed.
|
||||
*/
|
||||
private static void initFontConfigFonts() {
|
||||
private static synchronized void
|
||||
initFontConfigFonts(boolean includeFallbacks) {
|
||||
|
||||
if (fontConfigFonts != null) {
|
||||
return;
|
||||
if (!includeFallbacks || (fontConfigFonts[0].allFonts != null)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (isWindows) {
|
||||
if (isWindows || fontConfigFailed) {
|
||||
return;
|
||||
}
|
||||
|
||||
long t0 = 0;
|
||||
if (logging) {
|
||||
t0 = System.currentTimeMillis();
|
||||
t0 = System.nanoTime();
|
||||
}
|
||||
|
||||
FontConfigInfo[] fontArr = new FontConfigInfo[fontConfigNames.length];
|
||||
FcCompFont[] fontArr = new FcCompFont[fontConfigNames.length];
|
||||
for (int i = 0; i< fontArr.length; i++) {
|
||||
fontArr[i] = new FontConfigInfo();
|
||||
fontArr[i] = new FcCompFont();
|
||||
fontArr[i].fcName = fontConfigNames[i];
|
||||
int colonPos = fontArr[i].fcName.indexOf(':');
|
||||
fontArr[i].fcFamily = fontArr[i].fcName.substring(0, colonPos);
|
||||
fontArr[i].jdkName = mapFcName(fontArr[i].fcFamily);
|
||||
fontArr[i].style = i % 4; // depends on array order.
|
||||
}
|
||||
getFontConfig(getFCLocaleStr(), fontArr);
|
||||
getFontConfig(getFCLocaleStr(), fcInfo, fontArr, includeFallbacks);
|
||||
/* If don't find anything (eg no libfontconfig), then just return */
|
||||
for (int i = 0; i< fontArr.length; i++) {
|
||||
FcCompFont fci = fontArr[i];
|
||||
if (fci.firstFont == null) {
|
||||
if (logging) {
|
||||
logger.info("Fontconfig returned no fonts.");
|
||||
}
|
||||
fontConfigFailed = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
fontConfigFonts = fontArr;
|
||||
|
||||
if (logging) {
|
||||
long t1 = System.currentTimeMillis();
|
||||
logger.info("Time spent accessing fontconfig="+(t1-t0)+"ms.");
|
||||
long t1 = System.nanoTime();
|
||||
logger.info("Time spent accessing fontconfig="+
|
||||
(t1-t0)/1000000+"ms.");
|
||||
|
||||
for (int i = 0; i< fontConfigFonts.length; i++) {
|
||||
FontConfigInfo fci = fontConfigFonts[i];
|
||||
FcCompFont fci = fontConfigFonts[i];
|
||||
logger.info("FC font " + fci.fcName+" maps to family " +
|
||||
fci.familyName + " in file " + fci.fontFile);
|
||||
fci.firstFont.familyName +
|
||||
" in file " + fci.firstFont.fontFile);
|
||||
if (fci.allFonts != null) {
|
||||
for (int f=0;f<fci.allFonts.length;f++) {
|
||||
FontConfigFont fcf = fci.allFonts[f];
|
||||
logger.info("Family=" + fcf.familyName +
|
||||
" Style="+ fcf.styleStr +
|
||||
" Fullname="+fcf.fullName +
|
||||
" File="+fcf.fontFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static PhysicalFont registerFromFcInfo(FontConfigInfo fcInfo) {
|
||||
private static PhysicalFont registerFromFcInfo(FcCompFont fcInfo) {
|
||||
|
||||
/* If it's a TTC file we need to know that as we will need to
|
||||
* make sure we return the right font */
|
||||
int offset = fcInfo.fontFile.length()-4;
|
||||
String fontFile = fcInfo.firstFont.fontFile;
|
||||
int offset = fontFile.length()-4;
|
||||
if (offset <= 0) {
|
||||
return null;
|
||||
}
|
||||
String ext = fcInfo.fontFile.substring(offset).toLowerCase();
|
||||
String ext = fontFile.substring(offset).toLowerCase();
|
||||
boolean isTTC = ext.equals(".ttc");
|
||||
|
||||
/* If this file is already registered, can just return its font.
|
||||
@ -3230,10 +3292,10 @@ public final class FontManager {
|
||||
* a specific font, so rather than directly returning it, let
|
||||
* findFont2D resolve that.
|
||||
*/
|
||||
PhysicalFont physFont = registeredFontFiles.get(fcInfo.fontFile);
|
||||
PhysicalFont physFont = registeredFontFiles.get(fontFile);
|
||||
if (physFont != null) {
|
||||
if (isTTC) {
|
||||
Font2D f2d = findFont2D(fcInfo.familyName,
|
||||
Font2D f2d = findFont2D(fcInfo.firstFont.familyName,
|
||||
fcInfo.style, NO_FALLBACK);
|
||||
if (f2d instanceof PhysicalFont) { /* paranoia */
|
||||
return (PhysicalFont)f2d;
|
||||
@ -3249,18 +3311,20 @@ public final class FontManager {
|
||||
* Lucida Sans), we want to use the JRE version, so make it
|
||||
* point to the JRE font.
|
||||
*/
|
||||
physFont = findJREDeferredFont(fcInfo.familyName, fcInfo.style);
|
||||
physFont = findJREDeferredFont(fcInfo.firstFont.familyName,
|
||||
fcInfo.style);
|
||||
|
||||
/* It is also possible the font file is on the "deferred" list,
|
||||
* in which case we can just initialise it now.
|
||||
*/
|
||||
if (physFont == null &&
|
||||
deferredFontFiles.get(fcInfo.fontFile) != null) {
|
||||
physFont = initialiseDeferredFont(fcInfo.fontFile);
|
||||
deferredFontFiles.get(fontFile) != null)
|
||||
{
|
||||
physFont = initialiseDeferredFont(fcInfo.firstFont.fontFile);
|
||||
/* use findFont2D to get the right font from TTC's */
|
||||
if (physFont != null) {
|
||||
if (isTTC) {
|
||||
Font2D f2d = findFont2D(fcInfo.familyName,
|
||||
Font2D f2d = findFont2D(fcInfo.firstFont.familyName,
|
||||
fcInfo.style, NO_FALLBACK);
|
||||
if (f2d instanceof PhysicalFont) { /* paranoia */
|
||||
return (PhysicalFont)f2d;
|
||||
@ -3287,7 +3351,7 @@ public final class FontManager {
|
||||
fontFormat = FONTFORMAT_TYPE1;
|
||||
fontRank = Font2D.TYPE1_RANK;
|
||||
}
|
||||
physFont = registerFontFile(fcInfo.fontFile, null,
|
||||
physFont = registerFontFile(fcInfo.firstFont.fontFile, null,
|
||||
fontFormat, true, fontRank);
|
||||
}
|
||||
return physFont;
|
||||
@ -3345,12 +3409,12 @@ public final class FontManager {
|
||||
}
|
||||
info[1] = info[1] + File.separator + "arial.ttf";
|
||||
} else {
|
||||
initFontConfigFonts();
|
||||
initFontConfigFonts(false);
|
||||
for (int i=0; i<fontConfigFonts.length; i++) {
|
||||
if ("sans".equals(fontConfigFonts[i].fcFamily) &&
|
||||
0 == fontConfigFonts[i].style) {
|
||||
info[0] = fontConfigFonts[i].familyName;
|
||||
info[1] = fontConfigFonts[i].fontFile;
|
||||
info[0] = fontConfigFonts[i].firstFont.familyName;
|
||||
info[1] = fontConfigFonts[i].firstFont.fontFile;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -3360,9 +3424,9 @@ public final class FontManager {
|
||||
*/
|
||||
if (info[0] == null) {
|
||||
if (fontConfigFonts.length > 0 &&
|
||||
fontConfigFonts[0].fontFile != null) {
|
||||
info[0] = fontConfigFonts[0].familyName;
|
||||
info[1] = fontConfigFonts[0].fontFile;
|
||||
fontConfigFonts[0].firstFont.fontFile != null) {
|
||||
info[0] = fontConfigFonts[0].firstFont.familyName;
|
||||
info[1] = fontConfigFonts[0].firstFont.fontFile;
|
||||
} else {
|
||||
info[0] = "Dialog";
|
||||
info[1] = "/dialog.ttf";
|
||||
@ -3373,8 +3437,8 @@ public final class FontManager {
|
||||
return defaultPlatformFont;
|
||||
}
|
||||
|
||||
private FontConfigInfo getFontConfigInfo() {
|
||||
initFontConfigFonts();
|
||||
private FcCompFont getFcCompFont() {
|
||||
initFontConfigFonts(false);
|
||||
for (int i=0; i<fontConfigFonts.length; i++) {
|
||||
if ("sans".equals(fontConfigFonts[i].fcFamily) &&
|
||||
0 == fontConfigFonts[i].style) {
|
||||
@ -3391,9 +3455,9 @@ public final class FontManager {
|
||||
|
||||
name = name.toLowerCase();
|
||||
|
||||
initFontConfigFonts();
|
||||
initFontConfigFonts(false);
|
||||
|
||||
FontConfigInfo fcInfo = null;
|
||||
FcCompFont fcInfo = null;
|
||||
for (int i=0; i<fontConfigFonts.length; i++) {
|
||||
if (name.equals(fontConfigFonts[i].fcFamily) &&
|
||||
style == fontConfigFonts[i].style) {
|
||||
@ -3407,7 +3471,8 @@ public final class FontManager {
|
||||
|
||||
if (logging) {
|
||||
logger.info("FC name=" + name + " style=" + style + " uses " +
|
||||
fcInfo.familyName + " in file: " + fcInfo.fontFile);
|
||||
fcInfo.firstFont.familyName +
|
||||
" in file: " + fcInfo.firstFont.fontFile);
|
||||
}
|
||||
|
||||
if (fcInfo.compFont != null) {
|
||||
@ -3420,7 +3485,8 @@ public final class FontManager {
|
||||
CompositeFont jdkFont = (CompositeFont)
|
||||
findFont2D(fcInfo.jdkName, style, LOGICAL_FALLBACK);
|
||||
|
||||
if (fcInfo.familyName == null || fcInfo.fontFile == null) {
|
||||
if (fcInfo.firstFont.familyName == null ||
|
||||
fcInfo.firstFont.fontFile == null) {
|
||||
return (fcInfo.compFont = jdkFont);
|
||||
}
|
||||
|
||||
@ -3432,7 +3498,7 @@ public final class FontManager {
|
||||
* will fall through this code, but the regisration code will
|
||||
* find that file already registered and return its font.
|
||||
*/
|
||||
FontFamily family = FontFamily.getFamily(fcInfo.familyName);
|
||||
FontFamily family = FontFamily.getFamily(fcInfo.firstFont.familyName);
|
||||
PhysicalFont physFont = null;
|
||||
if (family != null) {
|
||||
Font2D f2D = family.getFontWithExactStyleMatch(fcInfo.style);
|
||||
@ -3441,7 +3507,8 @@ public final class FontManager {
|
||||
}
|
||||
}
|
||||
|
||||
if (physFont == null || !fcInfo.fontFile.equals(physFont.platName)) {
|
||||
if (physFont == null ||
|
||||
!fcInfo.firstFont.fontFile.equals(physFont.platName)) {
|
||||
physFont = registerFromFcInfo(fcInfo);
|
||||
if (physFont == null) {
|
||||
return (fcInfo.compFont = jdkFont);
|
||||
@ -3459,10 +3526,10 @@ public final class FontManager {
|
||||
* together to prevent synthetic styling.
|
||||
*/
|
||||
for (int i=0; i<fontConfigFonts.length; i++) {
|
||||
FontConfigInfo fc = fontConfigFonts[i];
|
||||
FcCompFont fc = fontConfigFonts[i];
|
||||
if (fc != fcInfo &&
|
||||
physFont.getFamilyName(null).equals(fc.familyName) &&
|
||||
!fc.fontFile.equals(physFont.platName) &&
|
||||
physFont.getFamilyName(null).equals(fc.firstFont.familyName) &&
|
||||
!fc.firstFont.fontFile.equals(physFont.platName) &&
|
||||
family.getFontWithExactStyleMatch(fc.style) == null) {
|
||||
|
||||
registerFromFcInfo(fontConfigFonts[i]);
|
||||
|
@ -76,7 +76,7 @@ class NullFontScaler extends FontScaler {
|
||||
}
|
||||
|
||||
int getNumGlyphs() throws FontScalerException {
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int getMissingGlyphCode() throws FontScalerException {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2008 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
|
||||
@ -25,16 +25,17 @@
|
||||
|
||||
package sun.font;
|
||||
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.lang.ref.Reference;
|
||||
import java.lang.ref.ReferenceQueue;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.awt.Font;
|
||||
import java.awt.FontFormatException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import sun.java2d.Disposer;
|
||||
import sun.java2d.pipe.BufferedContext;
|
||||
import sun.java2d.pipe.RenderQueue;
|
||||
import sun.java2d.pipe.hw.AccelGraphicsConfig;
|
||||
import sun.misc.Unsafe;
|
||||
|
||||
/**
|
||||
@ -192,13 +193,13 @@ public final class StrikeCache {
|
||||
recentStrikeIndex = index;
|
||||
}
|
||||
|
||||
static void disposeStrike(FontStrikeDisposer disposer) {
|
||||
private static final void doDispose(FontStrikeDisposer disposer) {
|
||||
if (disposer.intGlyphImages != null) {
|
||||
freeIntMemory(disposer.intGlyphImages,
|
||||
disposer.pScalerContext);
|
||||
disposer.pScalerContext);
|
||||
} else if (disposer.longGlyphImages != null) {
|
||||
freeLongMemory(disposer.longGlyphImages,
|
||||
disposer.pScalerContext);
|
||||
disposer.pScalerContext);
|
||||
} else if (disposer.segIntGlyphImages != null) {
|
||||
/* NB Now making multiple JNI calls in this case.
|
||||
* But assuming that there's a reasonable amount of locality
|
||||
@ -207,7 +208,7 @@ public final class StrikeCache {
|
||||
for (int i=0; i<disposer.segIntGlyphImages.length; i++) {
|
||||
if (disposer.segIntGlyphImages[i] != null) {
|
||||
freeIntMemory(disposer.segIntGlyphImages[i],
|
||||
disposer.pScalerContext);
|
||||
disposer.pScalerContext);
|
||||
/* native will only free the scaler context once */
|
||||
disposer.pScalerContext = 0L;
|
||||
disposer.segIntGlyphImages[i] = null;
|
||||
@ -223,7 +224,7 @@ public final class StrikeCache {
|
||||
for (int i=0; i<disposer.segLongGlyphImages.length; i++) {
|
||||
if (disposer.segLongGlyphImages[i] != null) {
|
||||
freeLongMemory(disposer.segLongGlyphImages[i],
|
||||
disposer.pScalerContext);
|
||||
disposer.pScalerContext);
|
||||
disposer.pScalerContext = 0L;
|
||||
disposer.segLongGlyphImages[i] = null;
|
||||
}
|
||||
@ -234,6 +235,44 @@ public final class StrikeCache {
|
||||
}
|
||||
}
|
||||
|
||||
static void disposeStrike(final FontStrikeDisposer disposer) {
|
||||
// we need to execute the strike disposal on the rendering thread
|
||||
// because they may be accessed on that thread at the time of the
|
||||
// disposal (for example, when the accel. cache is invalidated)
|
||||
|
||||
// REMIND: this look a bit heavyweight, but should be ok
|
||||
// because strike disposal is a relatively infrequent operation,
|
||||
// more worrisome is the necessity of getting a GC here.
|
||||
RenderQueue rq = null;
|
||||
GraphicsEnvironment ge =
|
||||
GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
if (!ge.isHeadless()) {
|
||||
GraphicsConfiguration gc =
|
||||
ge.getDefaultScreenDevice().getDefaultConfiguration();
|
||||
if (gc instanceof AccelGraphicsConfig) {
|
||||
AccelGraphicsConfig agc = (AccelGraphicsConfig)gc;
|
||||
BufferedContext bc = agc.getContext();
|
||||
if (bc != null) {
|
||||
rq = bc.getRenderQueue();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rq != null) {
|
||||
rq.lock();
|
||||
try {
|
||||
rq.flushAndInvokeNow(new Runnable() {
|
||||
public void run() {
|
||||
doDispose(disposer);
|
||||
}
|
||||
});
|
||||
} finally {
|
||||
rq.unlock();
|
||||
}
|
||||
} else {
|
||||
doDispose(disposer);
|
||||
}
|
||||
}
|
||||
|
||||
static native void freeIntPointer(int ptr);
|
||||
static native void freeLongPointer(long ptr);
|
||||
private static native void freeIntMemory(int[] glyphPtrs, long pContext);
|
||||
|
41
jdk/src/share/classes/sun/java2d/DestSurfaceProvider.java
Normal file
41
jdk/src/share/classes/sun/java2d/DestSurfaceProvider.java
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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;
|
||||
|
||||
import sun.java2d.pipe.hw.*;
|
||||
|
||||
/**
|
||||
* Classes implementing this interface provide access to their
|
||||
* destination surfaces.
|
||||
*/
|
||||
public interface DestSurfaceProvider {
|
||||
/**
|
||||
* Returns a surface currently used as a destination surface for rendering.
|
||||
*
|
||||
* @return destination surface
|
||||
*/
|
||||
public Surface getDestSurface();
|
||||
}
|
@ -41,24 +41,17 @@ import java.awt.image.renderable.RenderableImage;
|
||||
import java.awt.image.renderable.RenderContext;
|
||||
import java.awt.image.AffineTransformOp;
|
||||
import java.awt.image.Raster;
|
||||
import java.awt.image.SampleModel;
|
||||
import java.awt.image.VolatileImage;
|
||||
import java.awt.image.WritableRaster;
|
||||
import java.awt.Image;
|
||||
import java.awt.Composite;
|
||||
import java.awt.Color;
|
||||
import java.awt.color.ColorSpace;
|
||||
import java.awt.image.DataBuffer;
|
||||
import java.awt.image.ColorModel;
|
||||
import java.awt.image.IndexColorModel;
|
||||
import java.awt.image.DirectColorModel;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import java.awt.Paint;
|
||||
import java.awt.GradientPaint;
|
||||
import java.awt.LinearGradientPaint;
|
||||
import java.awt.RadialGradientPaint;
|
||||
import java.awt.TexturePaint;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.geom.PathIterator;
|
||||
import java.awt.geom.GeneralPath;
|
||||
@ -69,19 +62,16 @@ import java.awt.Rectangle;
|
||||
import java.text.AttributedCharacterIterator;
|
||||
import java.awt.Font;
|
||||
import java.awt.image.ImageObserver;
|
||||
import java.awt.image.ColorConvertOp;
|
||||
import java.awt.Transparency;
|
||||
import java.awt.font.GlyphVector;
|
||||
import java.awt.font.TextLayout;
|
||||
import sun.font.FontDesignMetrics;
|
||||
import sun.font.StandardGlyphVector;
|
||||
import sun.java2d.pipe.PixelDrawPipe;
|
||||
import sun.java2d.pipe.PixelFillPipe;
|
||||
import sun.java2d.pipe.ShapeDrawPipe;
|
||||
import sun.java2d.pipe.ValidatePipe;
|
||||
import sun.java2d.pipe.ShapeSpanIterator;
|
||||
import sun.java2d.pipe.Region;
|
||||
import sun.java2d.pipe.RegionIterator;
|
||||
import sun.java2d.pipe.TextPipe;
|
||||
import sun.java2d.pipe.DrawImagePipe;
|
||||
import sun.java2d.pipe.LoopPipe;
|
||||
@ -90,7 +80,6 @@ import sun.java2d.loops.RenderLoops;
|
||||
import sun.java2d.loops.CompositeType;
|
||||
import sun.java2d.loops.SurfaceType;
|
||||
import sun.java2d.loops.Blit;
|
||||
import sun.java2d.loops.BlitBg;
|
||||
import sun.java2d.loops.MaskFill;
|
||||
import sun.font.FontManager;
|
||||
import java.awt.font.FontRenderContext;
|
||||
@ -99,7 +88,7 @@ import sun.awt.ConstrainableGraphics;
|
||||
import sun.awt.SunHints;
|
||||
import java.util.Map;
|
||||
import java.util.Iterator;
|
||||
import sun.awt.image.OffScreenImage;
|
||||
import sun.java2d.DestSurfaceProvider;
|
||||
import sun.misc.PerformanceLogger;
|
||||
|
||||
/**
|
||||
@ -113,7 +102,7 @@ import sun.misc.PerformanceLogger;
|
||||
*/
|
||||
public final class SunGraphics2D
|
||||
extends Graphics2D
|
||||
implements ConstrainableGraphics, Cloneable
|
||||
implements ConstrainableGraphics, Cloneable, DestSurfaceProvider
|
||||
{
|
||||
/*
|
||||
* Attribute States
|
||||
@ -3306,4 +3295,14 @@ public final class SunGraphics2D
|
||||
public Object getDestination() {
|
||||
return surfaceData.getDestination();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @see sun.java2d.DestSurfaceProvider#getDestSurface
|
||||
*/
|
||||
@Override
|
||||
public Surface getDestSurface() {
|
||||
return surfaceData;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1997-2008 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
|
||||
@ -36,6 +36,7 @@ import java.awt.Rectangle;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.font.TextAttribute;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.peer.ComponentPeer;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
@ -78,6 +79,7 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment
|
||||
|
||||
public static boolean isLinux;
|
||||
public static boolean isSolaris;
|
||||
public static boolean isOpenSolaris;
|
||||
public static boolean isWindows;
|
||||
public static boolean noType1Font;
|
||||
private static Font defaultFont;
|
||||
@ -167,6 +169,23 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment
|
||||
isLinux = true;
|
||||
} else if ("SunOS".equals(osName)) {
|
||||
isSolaris = true;
|
||||
String version = System.getProperty("os.version", "0.0");
|
||||
try {
|
||||
float ver = Float.parseFloat(version);
|
||||
if (ver > 5.10f) {
|
||||
File f = new File("/etc/release");
|
||||
FileInputStream fis = new FileInputStream(f);
|
||||
InputStreamReader isr
|
||||
= new InputStreamReader(fis, "ISO-8859-1");
|
||||
BufferedReader br = new BufferedReader(isr);
|
||||
String line = br.readLine();
|
||||
if (line.indexOf("OpenSolaris") >= 0) {
|
||||
isOpenSolaris = true;
|
||||
}
|
||||
fis.close();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
} else if ("Windows".equals(osName)) {
|
||||
isWindows = true;
|
||||
}
|
||||
@ -174,11 +193,7 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment
|
||||
noType1Font = "true".
|
||||
equals(System.getProperty("sun.java2d.noType1Font"));
|
||||
|
||||
if (isOpenJDK()) {
|
||||
String[] fontInfo = FontManager.getDefaultPlatformFont();
|
||||
defaultFontName = fontInfo[0];
|
||||
defaultFontFileName = fontInfo[1];
|
||||
} else {
|
||||
if (!isOpenJDK()) {
|
||||
defaultFontName = lucidaFontName;
|
||||
if (useAbsoluteFontFileNames()) {
|
||||
defaultFontFileName =
|
||||
@ -244,6 +259,11 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment
|
||||
* that might be specified.
|
||||
*/
|
||||
fontConfig = createFontConfiguration();
|
||||
if (isOpenJDK()) {
|
||||
String[] fontInfo = FontManager.getDefaultPlatformFont();
|
||||
defaultFontName = fontInfo[0];
|
||||
defaultFontFileName = fontInfo[1];
|
||||
}
|
||||
getPlatformFontPathFromFontConfig();
|
||||
|
||||
String extraFontPath = fontConfig.getExtraFontPath();
|
||||
@ -1069,7 +1089,7 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment
|
||||
String fontFileName =
|
||||
getFileNameFromPlatformName(platformFontName);
|
||||
String[] nativeNames = null;
|
||||
if (fontFileName == null) {
|
||||
if (fontFileName == null || fontFileName.equals(platformFontName)){
|
||||
/* No file located, so register using the platform name,
|
||||
* i.e. as a native font.
|
||||
*/
|
||||
@ -1294,4 +1314,18 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment
|
||||
/*
|
||||
* ----END DISPLAY CHANGE SUPPORT----
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns true if FlipBufferStrategy with COPIED buffer contents
|
||||
* is preferred for this peer's GraphicsConfiguration over
|
||||
* BlitBufferStrategy, false otherwise.
|
||||
*
|
||||
* The reason FlipBS could be preferred is that in some configurations
|
||||
* an accelerated copy to the screen is supported (like Direct3D 9)
|
||||
*
|
||||
* @return true if flip strategy should be used, false otherwise
|
||||
*/
|
||||
public boolean isFlipStrategyPreferred(ComponentPeer peer) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
34
jdk/src/share/classes/sun/java2d/Surface.java
Normal file
34
jdk/src/share/classes/sun/java2d/Surface.java
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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;
|
||||
|
||||
/**
|
||||
* This is a tag interface for a surface.
|
||||
* @see sun.java2d.SurfaceData
|
||||
* @see sun.java2d.pipe.hw.AccelSurface
|
||||
*/
|
||||
public interface Surface {
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1999-2008 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
|
||||
@ -93,7 +93,7 @@ import sun.awt.image.SurfaceManager;
|
||||
* retrieved the tracker.
|
||||
*/
|
||||
public abstract class SurfaceData
|
||||
implements Transparency, DisposerTarget, StateTrackable
|
||||
implements Transparency, DisposerTarget, StateTrackable, Surface
|
||||
{
|
||||
private long pData;
|
||||
private boolean valid;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2007-2008 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
|
||||
@ -521,7 +521,7 @@ public abstract class SurfaceDataProxy
|
||||
CompositeType.SrcNoEa,
|
||||
dstType);
|
||||
blitbg.BlitBg(srcData, dstData,
|
||||
AlphaComposite.Src, null, bgColor,
|
||||
AlphaComposite.Src, null, bgColor.getRGB(),
|
||||
0, 0, 0, 0, w, h);
|
||||
dstData.markDirty();
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1999-2004 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1999-2008 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
|
||||
@ -109,7 +109,7 @@ public class BlitBg extends GraphicsPrimitive
|
||||
*/
|
||||
public native void BlitBg(SurfaceData src, SurfaceData dst,
|
||||
Composite comp, Region clip,
|
||||
Color bgColor,
|
||||
int bgColor,
|
||||
int srcx, int srcy,
|
||||
int dstx, int dsty,
|
||||
int width, int height);
|
||||
@ -142,19 +142,19 @@ public class BlitBg extends GraphicsPrimitive
|
||||
compositeType = comptype;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void BlitBg(SurfaceData srcData,
|
||||
SurfaceData dstData,
|
||||
Composite comp,
|
||||
Region clip,
|
||||
Color bgColor,
|
||||
int bgArgb,
|
||||
int srcx, int srcy,
|
||||
int dstx, int dsty,
|
||||
int width, int height)
|
||||
{
|
||||
ColorModel dstModel = dstData.getColorModel();
|
||||
if (!dstModel.hasAlpha() &&
|
||||
bgColor.getTransparency() != Transparency.OPAQUE)
|
||||
{
|
||||
boolean bgHasAlpha = (bgArgb >>> 24) != 0xff;
|
||||
if (!dstModel.hasAlpha() && bgHasAlpha) {
|
||||
dstModel = ColorModel.getRGBdefault();
|
||||
}
|
||||
WritableRaster wr =
|
||||
@ -163,6 +163,7 @@ public class BlitBg extends GraphicsPrimitive
|
||||
BufferedImage bimg =
|
||||
new BufferedImage(dstModel, wr, isPremult, null);
|
||||
SurfaceData tmpData = BufImgSurfaceData.createData(bimg);
|
||||
Color bgColor = new Color(bgArgb, bgHasAlpha);
|
||||
SunGraphics2D sg2d = new SunGraphics2D(tmpData, bgColor, bgColor,
|
||||
defaultFont);
|
||||
FillRect fillop = FillRect.locate(SurfaceType.AnyColor,
|
||||
@ -201,9 +202,10 @@ public class BlitBg extends GraphicsPrimitive
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void BlitBg(SurfaceData src, SurfaceData dst,
|
||||
Composite comp, Region clip,
|
||||
Color bgColor,
|
||||
int bgColor,
|
||||
int srcx, int srcy, int dstx, int dsty,
|
||||
int width, int height)
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1998-2008 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
|
||||
@ -159,6 +159,10 @@ public final class GeneralRenderer {
|
||||
{
|
||||
int mx, my, x1, y1;
|
||||
int[] tmp = null;
|
||||
|
||||
if (nPoints <= 0) {
|
||||
return;
|
||||
}
|
||||
mx = x1 = xPoints[off] + transx;
|
||||
my = y1 = yPoints[off] + transy;
|
||||
while (--nPoints > 0) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2007-2008 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
|
||||
@ -35,6 +35,7 @@ import sun.java2d.SunGraphics2D;
|
||||
import sun.java2d.SurfaceData;
|
||||
import sun.java2d.loops.CompositeType;
|
||||
import sun.java2d.pipe.BufferedBufImgOps;
|
||||
import static sun.java2d.opengl.OGLContext.OGLContextCaps.*;
|
||||
|
||||
class OGLBufImgOps extends BufferedBufImgOps {
|
||||
|
||||
@ -94,7 +95,7 @@ class OGLBufImgOps extends BufferedBufImgOps {
|
||||
OGLSurfaceData oglSrc = (OGLSurfaceData)srcData;
|
||||
OGLGraphicsConfig gc = oglSrc.getOGLGraphicsConfig();
|
||||
if (oglSrc.getType() != OGLSurfaceData.TEXTURE ||
|
||||
!gc.isCapPresent(OGLContext.CAPS_EXT_BIOP_SHADER))
|
||||
!gc.isCapPresent(CAPS_EXT_BIOP_SHADER))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2004-2008 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
|
||||
@ -25,91 +25,24 @@
|
||||
|
||||
package sun.java2d.opengl;
|
||||
|
||||
import java.awt.AlphaComposite;
|
||||
import java.awt.Composite;
|
||||
import java.awt.Paint;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import sun.java2d.SunGraphics2D;
|
||||
import sun.java2d.pipe.BufferedContext;
|
||||
import sun.java2d.pipe.Region;
|
||||
import sun.java2d.pipe.RenderBuffer;
|
||||
import sun.java2d.pipe.RenderQueue;
|
||||
import sun.java2d.pipe.hw.ContextCapabilities;
|
||||
import static sun.java2d.pipe.BufferedOpCodes.*;
|
||||
import static sun.java2d.pipe.hw.ContextCapabilities.*;
|
||||
|
||||
/**
|
||||
* Note that the RenderQueue lock must be acquired before calling any of
|
||||
* the methods in this class.
|
||||
*/
|
||||
class OGLContext extends BufferedContext {
|
||||
public class OGLContext extends BufferedContext {
|
||||
|
||||
/** Indicates that the context has no capabilities. */
|
||||
static final int CAPS_EMPTY = (0 << 0);
|
||||
/** Indicates that the context is doublebuffered. */
|
||||
static final int CAPS_DOUBLEBUFFERED = (1 << 0);
|
||||
/** Indicates that the context supports a stored alpha channel. */
|
||||
static final int CAPS_STORED_ALPHA = (1 << 1);
|
||||
/** Indicates the presence of the GL_ARB_multitexture extension. */
|
||||
static final int CAPS_EXT_MULTITEXTURE = (1 << 2);
|
||||
/** Indicates the presence of the GL_ARB_texture_non_power_of_two ext. */
|
||||
static final int CAPS_EXT_TEXNONPOW2 = (1 << 3);
|
||||
/**
|
||||
* Indicates the presence of the GL_EXT_framebuffer_object extension.
|
||||
* This cap will only be set if the fbobject system property has been
|
||||
* enabled and we are able to create an FBO with depth buffer.
|
||||
*/
|
||||
static final int CAPS_EXT_FBOBJECT = (1 << 4);
|
||||
/**
|
||||
* Indicates the presence of the GL_ARB_fragment_shader extension.
|
||||
* This cap will only be set if the lcdshader system property has been
|
||||
* enabled and the hardware supports the minimum number of texture units.
|
||||
*/
|
||||
static final int CAPS_EXT_LCD_SHADER = (1 << 5);
|
||||
/** Indicates the presence of the GL_ARB_texture_rectangle extension. */
|
||||
static final int CAPS_EXT_TEXRECT = (1 << 6);
|
||||
/**
|
||||
* Indicates the presence of the GL_ARB_fragment_shader extension.
|
||||
* This cap will only be set if the biopshader system property has been
|
||||
* enabled and the hardware meets our minimum requirements.
|
||||
*/
|
||||
static final int CAPS_EXT_BIOP_SHADER = (1 << 7);
|
||||
/**
|
||||
* Indicates the presence of the GL_ARB_fragment_shader extension.
|
||||
* This cap will only be set if the gradshader system property has been
|
||||
* enabled and the hardware meets our minimum requirements.
|
||||
*/
|
||||
static final int CAPS_EXT_GRAD_SHADER = (1 << 8);
|
||||
private final OGLGraphicsConfig config;
|
||||
|
||||
OGLContext(RenderQueue rq) {
|
||||
OGLContext(RenderQueue rq, OGLGraphicsConfig config) {
|
||||
super(rq);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the OGLContext associated with the current GraphicsConfig
|
||||
* and validates the context using the given parameters. Most rendering
|
||||
* operations will call this method first in order to set the necessary
|
||||
* state before issuing rendering commands.
|
||||
*/
|
||||
static void validateContext(OGLSurfaceData srcData,
|
||||
OGLSurfaceData dstData,
|
||||
Region clip, Composite comp,
|
||||
AffineTransform xform,
|
||||
Paint paint, SunGraphics2D sg2d,
|
||||
int flags)
|
||||
{
|
||||
// assert rq.lock.isHeldByCurrentThread();
|
||||
OGLContext oglc = dstData.getContext();
|
||||
oglc.validate(srcData, dstData,
|
||||
clip, comp, xform, paint, sg2d, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Simplified version of validateContext() that disables all context
|
||||
* state settings.
|
||||
*/
|
||||
static void validateContext(OGLSurfaceData dstData) {
|
||||
// assert rq.lock.isHeldByCurrentThread();
|
||||
validateContext(dstData, dstData,
|
||||
null, null, null, null, null, NO_CONTEXT_FLAGS);
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -160,19 +93,128 @@ class OGLContext extends BufferedContext {
|
||||
static void invalidateCurrentContext() {
|
||||
// assert OGLRenderQueue.getInstance().lock.isHeldByCurrentThread();
|
||||
|
||||
// first invalidate the context reference at the native level, and
|
||||
// invalidate the current Java-level context so that we
|
||||
// revalidate everything the next time around
|
||||
if (currentContext != null) {
|
||||
currentContext.invalidateContext();
|
||||
currentContext = null;
|
||||
}
|
||||
|
||||
// invalidate the context reference at the native level, and
|
||||
// then flush the queue so that we have no pending operations
|
||||
// dependent on the current context
|
||||
OGLRenderQueue rq = OGLRenderQueue.getInstance();
|
||||
rq.ensureCapacity(4);
|
||||
rq.getBuffer().putInt(INVALIDATE_CONTEXT);
|
||||
rq.flushNow();
|
||||
}
|
||||
|
||||
// then invalidate the current Java-level context so that we
|
||||
// revalidate everything the next time around
|
||||
if (currentContext != null) {
|
||||
currentContext.invalidateSurfaces();
|
||||
currentContext = null;
|
||||
public RenderQueue getRenderQueue() {
|
||||
return OGLRenderQueue.getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representing adapter id (vendor, renderer, version).
|
||||
* Must be called on the rendering thread.
|
||||
*
|
||||
* @return an id string for the adapter
|
||||
*/
|
||||
static final native String getOGLIdString();
|
||||
|
||||
@Override
|
||||
public void saveState() {
|
||||
// assert rq.lock.isHeldByCurrentThread();
|
||||
|
||||
// reset all attributes of this and current contexts
|
||||
invalidateContext();
|
||||
invalidateCurrentContext();
|
||||
|
||||
setScratchSurface(config);
|
||||
|
||||
// save the state on the native level
|
||||
rq.ensureCapacity(4);
|
||||
buf.putInt(SAVE_STATE);
|
||||
rq.flushNow();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreState() {
|
||||
// assert rq.lock.isHeldByCurrentThread();
|
||||
|
||||
// reset all attributes of this and current contexts
|
||||
invalidateContext();
|
||||
invalidateCurrentContext();
|
||||
|
||||
setScratchSurface(config);
|
||||
|
||||
// restore the state on the native level
|
||||
rq.ensureCapacity(4);
|
||||
buf.putInt(RESTORE_STATE);
|
||||
rq.flushNow();
|
||||
}
|
||||
|
||||
static class OGLContextCaps extends ContextCapabilities {
|
||||
/**
|
||||
* Indicates the presence of the GL_EXT_framebuffer_object extension.
|
||||
* This cap will only be set if the fbobject system property has been
|
||||
* enabled and we are able to create an FBO with depth buffer.
|
||||
*/
|
||||
static final int CAPS_EXT_FBOBJECT =
|
||||
(CAPS_RT_TEXTURE_ALPHA | CAPS_RT_TEXTURE_OPAQUE);
|
||||
/** Indicates that the context supports a stored alpha channel. */
|
||||
static final int CAPS_STORED_ALPHA = CAPS_RT_PLAIN_ALPHA;
|
||||
/** Indicates that the context is doublebuffered. */
|
||||
static final int CAPS_DOUBLEBUFFERED = (FIRST_PRIVATE_CAP << 0);
|
||||
/**
|
||||
* Indicates the presence of the GL_ARB_fragment_shader extension.
|
||||
* This cap will only be set if the lcdshader system property has been
|
||||
* enabled and the hardware supports the minimum number of texture units
|
||||
*/
|
||||
static final int CAPS_EXT_LCD_SHADER = (FIRST_PRIVATE_CAP << 1);
|
||||
/**
|
||||
* Indicates the presence of the GL_ARB_fragment_shader extension.
|
||||
* This cap will only be set if the biopshader system property has been
|
||||
* enabled and the hardware meets our minimum requirements.
|
||||
*/
|
||||
static final int CAPS_EXT_BIOP_SHADER = (FIRST_PRIVATE_CAP << 2);
|
||||
/**
|
||||
* Indicates the presence of the GL_ARB_fragment_shader extension.
|
||||
* This cap will only be set if the gradshader system property has been
|
||||
* enabled and the hardware meets our minimum requirements.
|
||||
*/
|
||||
static final int CAPS_EXT_GRAD_SHADER = (FIRST_PRIVATE_CAP << 3);
|
||||
/** Indicates the presence of the GL_ARB_texture_rectangle extension. */
|
||||
static final int CAPS_EXT_TEXRECT = (FIRST_PRIVATE_CAP << 4);
|
||||
|
||||
OGLContextCaps(int caps, String adapterId) {
|
||||
super(caps, adapterId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuffer buf = new StringBuffer(super.toString());
|
||||
if ((caps & CAPS_EXT_FBOBJECT) != 0) {
|
||||
buf.append("CAPS_EXT_FBOBJECT|");
|
||||
}
|
||||
if ((caps & CAPS_STORED_ALPHA) != 0) {
|
||||
buf.append("CAPS_STORED_ALPHA|");
|
||||
}
|
||||
if ((caps & CAPS_DOUBLEBUFFERED) != 0) {
|
||||
buf.append("CAPS_DOUBLEBUFFERED|");
|
||||
}
|
||||
if ((caps & CAPS_EXT_LCD_SHADER) != 0) {
|
||||
buf.append("CAPS_EXT_LCD_SHADER|");
|
||||
}
|
||||
if ((caps & CAPS_EXT_BIOP_SHADER) != 0) {
|
||||
buf.append("CAPS_BIOP_SHADER|");
|
||||
}
|
||||
if ((caps & CAPS_EXT_GRAD_SHADER) != 0) {
|
||||
buf.append("CAPS_EXT_GRAD_SHADER|");
|
||||
}
|
||||
if ((caps & CAPS_EXT_TEXRECT) != 0) {
|
||||
buf.append("CAPS_EXT_TEXRECT|");
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2005-2008 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
|
||||
@ -27,13 +27,16 @@ package sun.java2d.opengl;
|
||||
|
||||
import sun.java2d.SurfaceData;
|
||||
import sun.awt.image.SurfaceManager;
|
||||
import sun.java2d.pipe.hw.AccelGraphicsConfig;
|
||||
|
||||
/**
|
||||
* This interface collects the methods that are provided by both
|
||||
* GLXGraphicsConfig and WGLGraphicsConfig, making it easier to invoke these
|
||||
* methods directly from OGLSurfaceData.
|
||||
*/
|
||||
interface OGLGraphicsConfig extends SurfaceManager.ProxiedGraphicsConfig {
|
||||
interface OGLGraphicsConfig extends
|
||||
AccelGraphicsConfig, SurfaceManager.ProxiedGraphicsConfig
|
||||
{
|
||||
OGLContext getContext();
|
||||
long getNativeConfigInfo();
|
||||
boolean isCapPresent(int cap);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2007-2008 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
|
||||
@ -39,6 +39,7 @@ import sun.java2d.SunGraphics2D;
|
||||
import sun.java2d.SurfaceData;
|
||||
import sun.java2d.loops.CompositeType;
|
||||
import static sun.java2d.pipe.BufferedPaints.*;
|
||||
import static sun.java2d.opengl.OGLContext.OGLContextCaps.*;
|
||||
|
||||
abstract class OGLPaints {
|
||||
|
||||
@ -170,7 +171,7 @@ abstract class OGLPaints {
|
||||
|
||||
OGLSurfaceData dstData = (OGLSurfaceData)sg2d.surfaceData;
|
||||
OGLGraphicsConfig gc = dstData.getOGLGraphicsConfig();
|
||||
if (!gc.isCapPresent(OGLContext.CAPS_EXT_GRAD_SHADER)) {
|
||||
if (!gc.isCapPresent(CAPS_EXT_GRAD_SHADER)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2008 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
|
||||
@ -30,6 +30,7 @@ import java.awt.geom.Path2D;
|
||||
import sun.java2d.SunGraphics2D;
|
||||
import sun.java2d.loops.GraphicsPrimitive;
|
||||
import sun.java2d.pipe.BufferedRenderPipe;
|
||||
import sun.java2d.pipe.ParallelogramPipe;
|
||||
import sun.java2d.pipe.RenderQueue;
|
||||
import sun.java2d.pipe.SpanIterator;
|
||||
import static sun.java2d.pipe.BufferedOpCodes.*;
|
||||
@ -51,6 +52,15 @@ class OGLRenderer extends BufferedRenderPipe {
|
||||
null, sg2d.paint, sg2d, ctxflags);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void validateContextAA(SunGraphics2D sg2d) {
|
||||
int ctxflags = OGLContext.NO_CONTEXT_FLAGS;
|
||||
OGLSurfaceData dstData = (OGLSurfaceData)sg2d.surfaceData;
|
||||
OGLContext.validateContext(dstData, dstData,
|
||||
sg2d.getCompClip(), sg2d.composite,
|
||||
null, sg2d.paint, sg2d, ctxflags);
|
||||
}
|
||||
|
||||
void copyArea(SunGraphics2D sg2d,
|
||||
int x, int y, int w, int h, int dx, int dy)
|
||||
{
|
||||
@ -88,6 +98,31 @@ class OGLRenderer extends BufferedRenderPipe {
|
||||
super(oglr.rq);
|
||||
this.oglr = oglr;
|
||||
}
|
||||
public ParallelogramPipe getAAParallelogramPipe() {
|
||||
final ParallelogramPipe realpipe = oglr.getAAParallelogramPipe();
|
||||
return new ParallelogramPipe() {
|
||||
public void fillParallelogram(SunGraphics2D sg2d,
|
||||
double x, double y,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2)
|
||||
{
|
||||
GraphicsPrimitive.tracePrimitive("OGLFillAAParallelogram");
|
||||
realpipe.fillParallelogram(sg2d,
|
||||
x, y, dx1, dy1, dx2, dy2);
|
||||
}
|
||||
public void drawParallelogram(SunGraphics2D sg2d,
|
||||
double x, double y,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2,
|
||||
double lw1, double lw2)
|
||||
{
|
||||
GraphicsPrimitive.tracePrimitive("OGLDrawAAParallelogram");
|
||||
realpipe.drawParallelogram(sg2d,
|
||||
x, y, dx1, dy1, dx2, dy2,
|
||||
lw1, lw2);
|
||||
}
|
||||
};
|
||||
}
|
||||
protected void validateContext(SunGraphics2D sg2d) {
|
||||
oglr.validateContext(sg2d);
|
||||
}
|
||||
@ -130,6 +165,23 @@ class OGLRenderer extends BufferedRenderPipe {
|
||||
GraphicsPrimitive.tracePrimitive("OGLFillSpans");
|
||||
oglr.fillSpans(sg2d, si, transx, transy);
|
||||
}
|
||||
public void fillParallelogram(SunGraphics2D sg2d,
|
||||
double x, double y,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2)
|
||||
{
|
||||
GraphicsPrimitive.tracePrimitive("OGLFillParallelogram");
|
||||
oglr.fillParallelogram(sg2d, x, y, dx1, dy1, dx2, dy2);
|
||||
}
|
||||
public void drawParallelogram(SunGraphics2D sg2d,
|
||||
double x, double y,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2,
|
||||
double lw1, double lw2)
|
||||
{
|
||||
GraphicsPrimitive.tracePrimitive("OGLDrawParallelogram");
|
||||
oglr.drawParallelogram(sg2d, x, y, dx1, dy1, dx2, dy2, lw1, lw2);
|
||||
}
|
||||
public void copyArea(SunGraphics2D sg2d,
|
||||
int x, int y, int w, int h, int dx, int dy)
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2008 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
|
||||
@ -27,23 +27,26 @@ package sun.java2d.opengl;
|
||||
|
||||
import java.awt.AlphaComposite;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.Transparency;
|
||||
import java.awt.image.ColorModel;
|
||||
import java.awt.image.Raster;
|
||||
import sun.awt.SunHints;
|
||||
import sun.awt.image.PixelConverter;
|
||||
import sun.java2d.pipe.hw.AccelSurface;
|
||||
import sun.java2d.SunGraphics2D;
|
||||
import sun.java2d.SurfaceData;
|
||||
import sun.java2d.SurfaceDataProxy;
|
||||
import sun.java2d.loops.CompositeType;
|
||||
import sun.java2d.loops.GraphicsPrimitive;
|
||||
import sun.java2d.loops.MaskFill;
|
||||
import sun.java2d.loops.SurfaceType;
|
||||
import sun.java2d.pipe.PixelToShapeConverter;
|
||||
import sun.java2d.pipe.ParallelogramPipe;
|
||||
import sun.java2d.pipe.PixelToParallelogramConverter;
|
||||
import sun.java2d.pipe.RenderBuffer;
|
||||
import sun.java2d.pipe.RenderQueue;
|
||||
import sun.java2d.pipe.TextPipe;
|
||||
import static sun.java2d.pipe.BufferedOpCodes.*;
|
||||
import static sun.java2d.opengl.OGLContext.*;
|
||||
import static sun.java2d.opengl.OGLContext.OGLContextCaps.*;
|
||||
|
||||
/**
|
||||
* This class describes an OpenGL "surface", that is, a region of pixels
|
||||
@ -92,17 +95,16 @@ import static sun.java2d.opengl.OGLContext.*;
|
||||
* FLIP_BACKBUFFER OpenGLSurface
|
||||
* FBOBJECT OpenGLSurfaceRTT
|
||||
*/
|
||||
public abstract class OGLSurfaceData extends SurfaceData {
|
||||
public abstract class OGLSurfaceData extends SurfaceData
|
||||
implements AccelSurface {
|
||||
|
||||
/**
|
||||
* OGL-specific surface types
|
||||
*
|
||||
* @see sun.java2d.pipe.hw.AccelSurface
|
||||
*/
|
||||
public static final int UNDEFINED = 0;
|
||||
public static final int WINDOW = 1;
|
||||
public static final int PBUFFER = 2;
|
||||
public static final int TEXTURE = 3;
|
||||
public static final int FLIP_BACKBUFFER = 4;
|
||||
public static final int FBOBJECT = 5;
|
||||
public static final int PBUFFER = RT_PLAIN;
|
||||
public static final int FBOBJECT = RT_TEXTURE;
|
||||
|
||||
/**
|
||||
* Pixel formats
|
||||
@ -148,11 +150,14 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
private static boolean isGradShaderEnabled;
|
||||
|
||||
private OGLGraphicsConfig graphicsConfig;
|
||||
private int textureTarget;
|
||||
protected int type;
|
||||
// these fields are set from the native code when the surface is
|
||||
// initialized
|
||||
private int nativeWidth, nativeHeight;
|
||||
|
||||
protected static OGLRenderer oglRenderPipe;
|
||||
protected static PixelToShapeConverter oglTxRenderPipe;
|
||||
protected static PixelToParallelogramConverter oglTxRenderPipe;
|
||||
protected static ParallelogramPipe oglAAPgramPipe;
|
||||
protected static OGLTextRenderer oglTextPipe;
|
||||
protected static OGLDrawImage oglImagePipe;
|
||||
|
||||
@ -170,6 +175,7 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
int width, int height);
|
||||
|
||||
private native int getTextureTarget(long pData);
|
||||
private native int getTextureID(long pData);
|
||||
|
||||
static {
|
||||
if (!GraphicsEnvironment.isHeadless()) {
|
||||
@ -203,9 +209,14 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
oglRenderPipe = new OGLRenderer(rq);
|
||||
if (GraphicsPrimitive.tracingEnabled()) {
|
||||
oglTextPipe = oglTextPipe.traceWrap();
|
||||
oglRenderPipe = oglRenderPipe.traceWrap();
|
||||
//The wrapped oglRenderPipe will wrap the AA pipe as well...
|
||||
//oglAAPgramPipe = oglRenderPipe.traceWrap();
|
||||
}
|
||||
oglTxRenderPipe = new PixelToShapeConverter(oglRenderPipe);
|
||||
oglAAPgramPipe = oglRenderPipe.getAAParallelogramPipe();
|
||||
oglTxRenderPipe =
|
||||
new PixelToParallelogramConverter(oglRenderPipe,
|
||||
oglRenderPipe,
|
||||
1.0, 0.25, true);
|
||||
|
||||
OGLBlitLoops.register();
|
||||
OGLMaskFill.register();
|
||||
@ -282,9 +293,7 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
break;
|
||||
}
|
||||
|
||||
if (success) {
|
||||
textureTarget = getTextureTarget(getNativeOps());
|
||||
} else {
|
||||
if (!success) {
|
||||
throw new OutOfMemoryError("can't create offscreen surface");
|
||||
}
|
||||
}
|
||||
@ -323,7 +332,7 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
* Returns the OGLContext for the GraphicsConfig associated with this
|
||||
* surface.
|
||||
*/
|
||||
final OGLContext getContext() {
|
||||
public final OGLContext getContext() {
|
||||
return graphicsConfig.getContext();
|
||||
}
|
||||
|
||||
@ -337,7 +346,7 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
/**
|
||||
* Returns one of the surface type constants defined above.
|
||||
*/
|
||||
final int getType() {
|
||||
public final int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@ -346,8 +355,41 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
* for that texture (either GL_TEXTURE_2D or GL_TEXTURE_RECTANGLE_ARB).
|
||||
* Otherwise, this method will return zero.
|
||||
*/
|
||||
final int getTextureTarget() {
|
||||
return textureTarget;
|
||||
public final int getTextureTarget() {
|
||||
return getTextureTarget(getNativeOps());
|
||||
}
|
||||
|
||||
/**
|
||||
* If this surface is backed by a texture object, returns the texture ID
|
||||
* for that texture.
|
||||
* Otherwise, this method will return zero.
|
||||
*/
|
||||
public final int getTextureID() {
|
||||
return getTextureID(getNativeOps());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns native resource of specified {@code resType} associated with
|
||||
* this surface.
|
||||
*
|
||||
* Specifically, for {@code OGLSurfaceData} this method returns the
|
||||
* the following:
|
||||
* <pre>
|
||||
* TEXTURE - texture id
|
||||
* </pre>
|
||||
*
|
||||
* Note: the resource returned by this method is only valid on the rendering
|
||||
* thread.
|
||||
*
|
||||
* @return native resource of specified type or 0L if
|
||||
* such resource doesn't exist or can not be retrieved.
|
||||
* @see sun.java2d.pipe.hw.AccelSurface#getNativeResource
|
||||
*/
|
||||
public long getNativeResource(int resType) {
|
||||
if (resType == TEXTURE) {
|
||||
return getTextureID();
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
public Raster getRaster(int x, int y, int w, int h) {
|
||||
@ -366,7 +408,7 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
*/
|
||||
public boolean canRenderLCDText(SunGraphics2D sg2d) {
|
||||
return
|
||||
graphicsConfig.isCapPresent(OGLContext.CAPS_EXT_LCD_SHADER) &&
|
||||
graphicsConfig.isCapPresent(CAPS_EXT_LCD_SHADER) &&
|
||||
sg2d.compositeState <= SunGraphics2D.COMP_ISCOPY &&
|
||||
sg2d.paintState <= SunGraphics2D.PAINT_OPAQUECOLOR;
|
||||
}
|
||||
@ -405,7 +447,7 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
validated = true;
|
||||
}
|
||||
|
||||
PixelToShapeConverter txPipe = null;
|
||||
PixelToParallelogramConverter txPipe = null;
|
||||
OGLRenderer nonTxPipe = null;
|
||||
|
||||
if (sg2d.antialiasHint != SunHints.INTVAL_ANTIALIAS_ON) {
|
||||
@ -422,12 +464,28 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
// custom paints handled by super.validatePipe() below
|
||||
}
|
||||
} else {
|
||||
if (sg2d.paintState <= sg2d.PAINT_ALPHACOLOR &&
|
||||
sg2d.compositeState == sg2d.COMP_XOR)
|
||||
{
|
||||
// install the solid pipes when AA and XOR are both enabled
|
||||
txPipe = oglTxRenderPipe;
|
||||
nonTxPipe = oglRenderPipe;
|
||||
if (sg2d.paintState <= sg2d.PAINT_ALPHACOLOR) {
|
||||
if (graphicsConfig.isCapPresent(CAPS_PS30) &&
|
||||
(sg2d.imageComp == CompositeType.SrcOverNoEa ||
|
||||
sg2d.imageComp == CompositeType.SrcOver))
|
||||
{
|
||||
if (!validated) {
|
||||
super.validatePipe(sg2d);
|
||||
validated = true;
|
||||
}
|
||||
PixelToParallelogramConverter aaConverter =
|
||||
new PixelToParallelogramConverter(sg2d.shapepipe,
|
||||
oglAAPgramPipe,
|
||||
1.0/8.0, 0.499,
|
||||
false);
|
||||
sg2d.drawpipe = aaConverter;
|
||||
sg2d.fillpipe = aaConverter;
|
||||
sg2d.shapepipe = aaConverter;
|
||||
} else if (sg2d.compositeState == sg2d.COMP_XOR) {
|
||||
// install the solid pipes when AA and XOR are both enabled
|
||||
txPipe = oglTxRenderPipe;
|
||||
nonTxPipe = oglRenderPipe;
|
||||
}
|
||||
}
|
||||
// other cases handled by super.validatePipe() below
|
||||
}
|
||||
@ -443,7 +501,11 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
sg2d.drawpipe = nonTxPipe;
|
||||
sg2d.fillpipe = nonTxPipe;
|
||||
}
|
||||
sg2d.shapepipe = nonTxPipe;
|
||||
// Note that we use the transforming pipe here because it
|
||||
// will examine the shape and possibly perform an optimized
|
||||
// operation if it can be simplified. The simplifications
|
||||
// will be valid for all STROKE and TRANSFORM types.
|
||||
sg2d.shapepipe = txPipe;
|
||||
} else {
|
||||
if (!validated) {
|
||||
super.validatePipe(sg2d);
|
||||
@ -472,7 +534,7 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
* validation code will choose a more general software-based loop.
|
||||
*/
|
||||
if (!OGLPaints.isValid(sg2d) ||
|
||||
!graphicsConfig.isCapPresent(CAPS_EXT_MULTITEXTURE))
|
||||
!graphicsConfig.isCapPresent(CAPS_MULTITEXTURE))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@ -564,7 +626,7 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
* when using the basic GL_TEXTURE_2D target.
|
||||
*/
|
||||
boolean isTexNonPow2Available() {
|
||||
return graphicsConfig.isCapPresent(OGLContext.CAPS_EXT_TEXNONPOW2);
|
||||
return graphicsConfig.isCapPresent(CAPS_TEXNONPOW2);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -573,6 +635,16 @@ public abstract class OGLSurfaceData extends SurfaceData {
|
||||
* GL_ARB_texture_rectangle extension is present).
|
||||
*/
|
||||
boolean isTexRectAvailable() {
|
||||
return graphicsConfig.isCapPresent(OGLContext.CAPS_EXT_TEXRECT);
|
||||
return graphicsConfig.isCapPresent(CAPS_EXT_TEXRECT);
|
||||
}
|
||||
|
||||
public Rectangle getNativeBounds() {
|
||||
OGLRenderQueue rq = OGLRenderQueue.getInstance();
|
||||
rq.lock();
|
||||
try {
|
||||
return new Rectangle(nativeWidth, nativeHeight);
|
||||
} finally {
|
||||
rq.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2005-2008 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
|
||||
@ -26,12 +26,13 @@
|
||||
package sun.java2d.pipe;
|
||||
|
||||
import java.awt.AlphaComposite;
|
||||
import java.awt.Color;
|
||||
import java.awt.Composite;
|
||||
import java.awt.Paint;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import sun.java2d.pipe.hw.AccelSurface;
|
||||
import sun.java2d.InvalidPipeException;
|
||||
import sun.java2d.SunGraphics2D;
|
||||
import sun.java2d.SurfaceData;
|
||||
import sun.java2d.loops.XORComposite;
|
||||
import static sun.java2d.pipe.BufferedOpCodes.*;
|
||||
import static sun.java2d.pipe.BufferedRenderPipe.BYTES_PER_SPAN;
|
||||
@ -43,8 +44,10 @@ import static sun.java2d.pipe.BufferedRenderPipe.BYTES_PER_SPAN;
|
||||
* single thread. Note that the RenderQueue lock must be acquired before
|
||||
* calling the validate() method (or any other method in this class). See
|
||||
* the RenderQueue class comments for a sample usage scenario.
|
||||
*
|
||||
* @see RenderQueue
|
||||
*/
|
||||
public class BufferedContext {
|
||||
public abstract class BufferedContext {
|
||||
|
||||
/*
|
||||
* The following flags help the internals of validate() determine
|
||||
@ -82,19 +85,66 @@ public class BufferedContext {
|
||||
*/
|
||||
protected static BufferedContext currentContext;
|
||||
|
||||
private SurfaceData validatedSrcData;
|
||||
private SurfaceData validatedDstData;
|
||||
private AccelSurface validatedSrcData;
|
||||
private AccelSurface validatedDstData;
|
||||
private Region validatedClip;
|
||||
private Composite validatedComp;
|
||||
private Paint validatedPaint;
|
||||
private boolean isValidatedPaintAColor;
|
||||
private int validatedRGB;
|
||||
private int validatedFlags;
|
||||
private boolean xformInUse;
|
||||
private int transX;
|
||||
private int transY;
|
||||
|
||||
protected BufferedContext(RenderQueue rq) {
|
||||
this.rq = rq;
|
||||
this.buf = rq.getBuffer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the BufferedContextContext associated with the dst. surface
|
||||
* and validates the context using the given parameters. Most rendering
|
||||
* operations will call this method first in order to set the necessary
|
||||
* state before issuing rendering commands.
|
||||
*
|
||||
* Note: must be called while the RenderQueue lock is held.
|
||||
*
|
||||
* @throws InvalidPipeException if either src or dest surface is not valid
|
||||
* or lost
|
||||
* @see RenderQueue#lock
|
||||
* @see RenderQueue#unlock
|
||||
*/
|
||||
public static void validateContext(AccelSurface srcData,
|
||||
AccelSurface dstData,
|
||||
Region clip, Composite comp,
|
||||
AffineTransform xform,
|
||||
Paint paint, SunGraphics2D sg2d,
|
||||
int flags)
|
||||
{
|
||||
// assert rq.lock.isHeldByCurrentThread();
|
||||
BufferedContext d3dc = dstData.getContext();
|
||||
d3dc.validate(srcData, dstData,
|
||||
clip, comp, xform, paint, sg2d, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the BufferedContextassociated with the surface
|
||||
* and disables all context state settings.
|
||||
*
|
||||
* Note: must be called while the RenderQueue lock is held.
|
||||
*
|
||||
* @throws InvalidPipeException if the surface is not valid
|
||||
* or lost
|
||||
* @see RenderQueue#lock
|
||||
* @see RenderQueue#unlock
|
||||
*/
|
||||
public static void validateContext(AccelSurface surface) {
|
||||
// assert rt.lock.isHeldByCurrentThread();
|
||||
validateContext(surface, surface,
|
||||
null, null, null, null, null, NO_CONTEXT_FLAGS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the given parameters against the current state for this
|
||||
* context. If this context is not current, it will be made current
|
||||
@ -106,19 +156,47 @@ public class BufferedContext {
|
||||
* Note that the SunGraphics2D parameter is only used for the purposes
|
||||
* of validating a (non-null) Paint parameter. In all other cases it
|
||||
* is safe to pass a null SunGraphics2D and it will be ignored.
|
||||
*
|
||||
* Note: must be called while the RenderQueue lock is held.
|
||||
*
|
||||
* @throws InvalidPipeException if either src or dest surface is not valid
|
||||
* or lost
|
||||
*/
|
||||
public void validate(SurfaceData srcData, SurfaceData dstData,
|
||||
public void validate(AccelSurface srcData, AccelSurface dstData,
|
||||
Region clip, Composite comp,
|
||||
AffineTransform xform,
|
||||
Paint paint, SunGraphics2D sg2d, int flags)
|
||||
{
|
||||
// assert rq.lock.isHeldByCurrentThread();
|
||||
|
||||
boolean updateClip = (clip != validatedClip);
|
||||
boolean updatePaint = (paint != validatedPaint);
|
||||
boolean updateClip = false;
|
||||
boolean updatePaint = false;
|
||||
|
||||
if (!dstData.isValid()) {
|
||||
throw new InvalidPipeException("bounds changed");
|
||||
if (!dstData.isValid() ||
|
||||
dstData.isSurfaceLost() || srcData.isSurfaceLost())
|
||||
{
|
||||
invalidateContext();
|
||||
throw new InvalidPipeException("bounds changed or surface lost");
|
||||
}
|
||||
|
||||
if (paint instanceof Color) {
|
||||
// REMIND: not 30-bit friendly
|
||||
int newRGB = ((Color)paint).getRGB();
|
||||
if (isValidatedPaintAColor) {
|
||||
if (newRGB != validatedRGB) {
|
||||
validatedRGB = newRGB;
|
||||
updatePaint = true;
|
||||
}
|
||||
} else {
|
||||
validatedRGB = newRGB;
|
||||
updatePaint = true;
|
||||
isValidatedPaintAColor = true;
|
||||
}
|
||||
} else if (validatedPaint != paint) {
|
||||
updatePaint = true;
|
||||
// this should be set when we are switching from paint to color
|
||||
// in which case this condition will be true
|
||||
isValidatedPaintAColor = false;
|
||||
}
|
||||
|
||||
if ((currentContext != this) ||
|
||||
@ -147,9 +225,18 @@ public class BufferedContext {
|
||||
}
|
||||
|
||||
// validate clip
|
||||
if (updateClip) {
|
||||
if ((clip != validatedClip) || updateClip) {
|
||||
if (clip != null) {
|
||||
setClip(clip);
|
||||
if (updateClip ||
|
||||
validatedClip == null ||
|
||||
!(validatedClip.isRectangular() && clip.isRectangular()) ||
|
||||
((clip.getLoX() != validatedClip.getLoX() ||
|
||||
clip.getLoY() != validatedClip.getLoY() ||
|
||||
clip.getHiX() != validatedClip.getHiX() ||
|
||||
clip.getHiY() != validatedClip.getHiY())))
|
||||
{
|
||||
setClip(clip);
|
||||
}
|
||||
} else {
|
||||
resetClip();
|
||||
}
|
||||
@ -173,14 +260,29 @@ public class BufferedContext {
|
||||
}
|
||||
|
||||
// validate transform
|
||||
boolean txChanged = false;
|
||||
if (xform == null) {
|
||||
if (xformInUse) {
|
||||
resetTransform();
|
||||
xformInUse = false;
|
||||
txChanged = true;
|
||||
} else if (sg2d != null) {
|
||||
if (transX != sg2d.transX || transY != sg2d.transY) {
|
||||
txChanged = true;
|
||||
}
|
||||
}
|
||||
if (sg2d != null) {
|
||||
transX = sg2d.transX;
|
||||
transY = sg2d.transY;
|
||||
}
|
||||
} else {
|
||||
setTransform(xform);
|
||||
xformInUse = true;
|
||||
txChanged = true;
|
||||
}
|
||||
// non-Color paints may require paint revalidation
|
||||
if (!isValidatedPaintAColor && txChanged) {
|
||||
updatePaint = true;
|
||||
}
|
||||
|
||||
// validate paint
|
||||
@ -194,6 +296,7 @@ public class BufferedContext {
|
||||
}
|
||||
|
||||
// mark dstData dirty
|
||||
// REMIND: is this really needed now? we do it in SunGraphics2D..
|
||||
dstData.markDirty();
|
||||
}
|
||||
|
||||
@ -201,13 +304,20 @@ public class BufferedContext {
|
||||
* Invalidates the surfaces associated with this context. This is
|
||||
* useful when the context is no longer needed, and we want to break
|
||||
* the chain caused by these surface references.
|
||||
*
|
||||
* Note: must be called while the RenderQueue lock is held.
|
||||
*
|
||||
* @see RenderQueue#lock
|
||||
* @see RenderQueue#unlock
|
||||
*/
|
||||
public void invalidateSurfaces() {
|
||||
validatedSrcData = null;
|
||||
validatedDstData = null;
|
||||
}
|
||||
|
||||
private void setSurfaces(SurfaceData srcData, SurfaceData dstData) {
|
||||
private void setSurfaces(AccelSurface srcData,
|
||||
AccelSurface dstData)
|
||||
{
|
||||
// assert rq.lock.isHeldByCurrentThread();
|
||||
rq.ensureCapacityAndAlignment(20, 4);
|
||||
buf.putInt(SET_SURFACES);
|
||||
@ -304,4 +414,54 @@ public class BufferedContext {
|
||||
buf.putDouble(xform.getTranslateX());
|
||||
buf.putDouble(xform.getTranslateY());
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets this context's surfaces and all attributes.
|
||||
*
|
||||
* Note: must be called while the RenderQueue lock is held.
|
||||
*
|
||||
* @see RenderQueue#lock
|
||||
* @see RenderQueue#unlock
|
||||
*/
|
||||
public void invalidateContext() {
|
||||
resetTransform();
|
||||
resetComposite();
|
||||
resetClip();
|
||||
invalidateSurfaces();
|
||||
validatedComp = null;
|
||||
validatedClip = null;
|
||||
validatedPaint = null;
|
||||
xformInUse = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a singleton {@code RenderQueue} object used by the rendering
|
||||
* pipeline.
|
||||
*
|
||||
* @return a render queue
|
||||
* @see RenderQueue
|
||||
*/
|
||||
public abstract RenderQueue getRenderQueue();
|
||||
|
||||
/**
|
||||
* Saves the the state of this context.
|
||||
* It may reset the current context.
|
||||
*
|
||||
* Note: must be called while the RenderQueue lock is held.
|
||||
*
|
||||
* @see RenderQueue#lock
|
||||
* @see RenderQueue#unlock
|
||||
*/
|
||||
public abstract void saveState();
|
||||
|
||||
/**
|
||||
* Restores the native state of this context.
|
||||
* It may reset the current context.
|
||||
*
|
||||
* Note: must be called while the RenderQueue lock is held.
|
||||
*
|
||||
* @see RenderQueue#lock
|
||||
* @see RenderQueue#unlock
|
||||
*/
|
||||
public abstract void restoreState();
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2005-2008 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
|
||||
@ -32,10 +32,14 @@ public class BufferedOpCodes {
|
||||
public static final int DRAW_POLY = 12;
|
||||
public static final int DRAW_PIXEL = 13;
|
||||
public static final int DRAW_SCANLINES = 14;
|
||||
public static final int DRAW_PARALLELOGRAM = 15;
|
||||
public static final int DRAW_AAPARALLELOGRAM = 16;
|
||||
|
||||
// fill ops
|
||||
public static final int FILL_RECT = 20;
|
||||
public static final int FILL_SPANS = 21;
|
||||
public static final int FILL_PARALLELOGRAM = 22;
|
||||
public static final int FILL_AAPARALLELOGRAM = 23;
|
||||
|
||||
// copy-related ops
|
||||
public static final int COPY_AREA = 30;
|
||||
@ -67,6 +71,9 @@ public class BufferedOpCodes {
|
||||
public static final int DISPOSE_CONFIG = 74;
|
||||
public static final int INVALIDATE_CONTEXT = 75;
|
||||
public static final int SYNC = 76;
|
||||
public static final int RESTORE_DEVICES = 77;
|
||||
public static final int SAVE_STATE = 78;
|
||||
public static final int RESTORE_STATE = 79;
|
||||
|
||||
// multibuffering ops
|
||||
public static final int SWAP_BUFFERS = 80;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2005-2008 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
|
||||
@ -25,6 +25,7 @@
|
||||
|
||||
package sun.java2d.pipe;
|
||||
|
||||
import java.awt.BasicStroke;
|
||||
import java.awt.Polygon;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.AffineTransform;
|
||||
@ -33,6 +34,7 @@ import java.awt.geom.Ellipse2D;
|
||||
import java.awt.geom.Path2D;
|
||||
import java.awt.geom.IllegalPathStateException;
|
||||
import java.awt.geom.PathIterator;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.geom.RoundRectangle2D;
|
||||
import sun.java2d.SunGraphics2D;
|
||||
import sun.java2d.loops.ProcessPath;
|
||||
@ -51,8 +53,10 @@ import static sun.java2d.pipe.BufferedOpCodes.*;
|
||||
* simply delegate to draw(Shape) and fill(Shape), respectively.
|
||||
*/
|
||||
public abstract class BufferedRenderPipe
|
||||
implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe
|
||||
implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe, ParallelogramPipe
|
||||
{
|
||||
ParallelogramPipe aapgrampipe = new AAParallelogramPipe();
|
||||
|
||||
static final int BYTES_PER_POLY_POINT = 8;
|
||||
static final int BYTES_PER_SCANLINE = 12;
|
||||
static final int BYTES_PER_SPAN = 16;
|
||||
@ -67,12 +71,17 @@ public abstract class BufferedRenderPipe
|
||||
this.drawHandler = new BufferedDrawHandler();
|
||||
}
|
||||
|
||||
public ParallelogramPipe getAAParallelogramPipe() {
|
||||
return aapgrampipe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the state in the provided SunGraphics2D object and sets up
|
||||
* any special resources for this operation (e.g. enabling gradient
|
||||
* shading).
|
||||
*/
|
||||
protected abstract void validateContext(SunGraphics2D sg2d);
|
||||
protected abstract void validateContextAA(SunGraphics2D sg2d);
|
||||
|
||||
public void drawLine(SunGraphics2D sg2d,
|
||||
int x1, int y1, int x2, int y2)
|
||||
@ -398,6 +407,98 @@ public abstract class BufferedRenderPipe
|
||||
}
|
||||
}
|
||||
|
||||
public void fillParallelogram(SunGraphics2D sg2d,
|
||||
double x, double y,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2)
|
||||
{
|
||||
rq.lock();
|
||||
try {
|
||||
validateContext(sg2d);
|
||||
rq.ensureCapacity(28);
|
||||
buf.putInt(FILL_PARALLELOGRAM);
|
||||
buf.putFloat((float) x);
|
||||
buf.putFloat((float) y);
|
||||
buf.putFloat((float) dx1);
|
||||
buf.putFloat((float) dy1);
|
||||
buf.putFloat((float) dx2);
|
||||
buf.putFloat((float) dy2);
|
||||
} finally {
|
||||
rq.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public void drawParallelogram(SunGraphics2D sg2d,
|
||||
double x, double y,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2,
|
||||
double lw1, double lw2)
|
||||
{
|
||||
rq.lock();
|
||||
try {
|
||||
validateContext(sg2d);
|
||||
rq.ensureCapacity(36);
|
||||
buf.putInt(DRAW_PARALLELOGRAM);
|
||||
buf.putFloat((float) x);
|
||||
buf.putFloat((float) y);
|
||||
buf.putFloat((float) dx1);
|
||||
buf.putFloat((float) dy1);
|
||||
buf.putFloat((float) dx2);
|
||||
buf.putFloat((float) dy2);
|
||||
buf.putFloat((float) lw1);
|
||||
buf.putFloat((float) lw2);
|
||||
} finally {
|
||||
rq.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
private class AAParallelogramPipe implements ParallelogramPipe {
|
||||
public void fillParallelogram(SunGraphics2D sg2d,
|
||||
double x, double y,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2)
|
||||
{
|
||||
rq.lock();
|
||||
try {
|
||||
validateContextAA(sg2d);
|
||||
rq.ensureCapacity(28);
|
||||
buf.putInt(FILL_AAPARALLELOGRAM);
|
||||
buf.putFloat((float) x);
|
||||
buf.putFloat((float) y);
|
||||
buf.putFloat((float) dx1);
|
||||
buf.putFloat((float) dy1);
|
||||
buf.putFloat((float) dx2);
|
||||
buf.putFloat((float) dy2);
|
||||
} finally {
|
||||
rq.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public void drawParallelogram(SunGraphics2D sg2d,
|
||||
double x, double y,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2,
|
||||
double lw1, double lw2)
|
||||
{
|
||||
rq.lock();
|
||||
try {
|
||||
validateContextAA(sg2d);
|
||||
rq.ensureCapacity(36);
|
||||
buf.putInt(DRAW_AAPARALLELOGRAM);
|
||||
buf.putFloat((float) x);
|
||||
buf.putFloat((float) y);
|
||||
buf.putFloat((float) dx1);
|
||||
buf.putFloat((float) dy1);
|
||||
buf.putFloat((float) dx2);
|
||||
buf.putFloat((float) dy2);
|
||||
buf.putFloat((float) lw1);
|
||||
buf.putFloat((float) lw2);
|
||||
} finally {
|
||||
rq.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void draw(SunGraphics2D sg2d, Shape s) {
|
||||
if (sg2d.strokeState == sg2d.STROKE_THIN) {
|
||||
if (s instanceof Polygon) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2001-2008 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
|
||||
@ -955,7 +955,7 @@ public class DrawImage implements DrawImagePipe
|
||||
} else {
|
||||
BlitBg blit = BlitBg.getFromCache(srcType, comp, dstType);
|
||||
blit.BlitBg(srcData, dstData, sg.composite, clipRegion,
|
||||
bgColor, sx, sy, dx, dy, w, h);
|
||||
bgColor.getRGB(), sx, sy, dx, dy, w, h);
|
||||
}
|
||||
}
|
||||
|
||||
|
66
jdk/src/share/classes/sun/java2d/pipe/ParallelogramPipe.java
Normal file
66
jdk/src/share/classes/sun/java2d/pipe/ParallelogramPipe.java
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright 2008 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.pipe;
|
||||
|
||||
import sun.java2d.SunGraphics2D;
|
||||
|
||||
/**
|
||||
* This interface defines the set of calls that pipeline objects
|
||||
* can use to pass on responsibility for drawing arbitrary
|
||||
* parallelogram shapes.
|
||||
* Six floating point numbers are provided and the parallelogram
|
||||
* is defined as the quadrilateral with the following vertices:
|
||||
* <pre>
|
||||
* origin: (x, y)
|
||||
* => (x+dx1, y+dy1)
|
||||
* => (x+dx1+dx2, y+dy1+dy2)
|
||||
* => (x+dx2, y+dy2)
|
||||
* => origin
|
||||
* </pre>
|
||||
*/
|
||||
public interface ParallelogramPipe {
|
||||
public void fillParallelogram(SunGraphics2D sg,
|
||||
double x, double y,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2);
|
||||
|
||||
/**
|
||||
* Draw a Parallelogram with the indicated line widths
|
||||
* assuming a standard BasicStroke with MITER joins.
|
||||
* lw1 specifies the width of the stroke along the dx1,dy1
|
||||
* vector and lw2 specifies the width of the stroke along
|
||||
* the dx2,dy2 vector.
|
||||
* This is equivalent to outsetting the indicated
|
||||
* parallelogram by lw/2 pixels, then insetting the
|
||||
* same parallelogram by lw/2 pixels and filling the
|
||||
* difference between the outer and inner parallelograms.
|
||||
*/
|
||||
public void drawParallelogram(SunGraphics2D sg,
|
||||
double x, double y,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2,
|
||||
double lw1, double lw2);
|
||||
}
|
@ -0,0 +1,417 @@
|
||||
/*
|
||||
* Copyright 2008 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.pipe;
|
||||
|
||||
import java.awt.Shape;
|
||||
import java.awt.BasicStroke;
|
||||
import java.awt.geom.Line2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import sun.java2d.SunGraphics2D;
|
||||
import sun.awt.SunHints;
|
||||
|
||||
/**
|
||||
* This class converts calls to the basic pixel rendering methods
|
||||
* into calls to the methods on a ParallelogramPipe.
|
||||
* Most calls are transformed into calls to the fill(Shape) method
|
||||
* by the parent PixelToShapeConverter class, but some calls are
|
||||
* transformed into calls to fill/drawParallelogram().
|
||||
*/
|
||||
public class PixelToParallelogramConverter extends PixelToShapeConverter
|
||||
implements ShapeDrawPipe
|
||||
{
|
||||
ParallelogramPipe outrenderer;
|
||||
double minPenSize;
|
||||
double normPosition;
|
||||
double normRoundingBias;
|
||||
boolean adjustfill;
|
||||
|
||||
/**
|
||||
* @param shapepipe pipeline to forward shape calls to
|
||||
* @param pgrampipe pipeline to forward parallelogram calls to
|
||||
* (and drawLine calls if possible)
|
||||
* @param minPenSize minimum pen size for dropout control
|
||||
* @param normPosition sub-pixel location to normalize endpoints
|
||||
* for STROKE_NORMALIZE cases
|
||||
* @param adjustFill boolean to control whethere normalization
|
||||
* constants are also applied to fill operations
|
||||
* (normally true for non-AA, false for AA)
|
||||
*/
|
||||
public PixelToParallelogramConverter(ShapeDrawPipe shapepipe,
|
||||
ParallelogramPipe pgrampipe,
|
||||
double minPenSize,
|
||||
double normPosition,
|
||||
boolean adjustfill)
|
||||
{
|
||||
super(shapepipe);
|
||||
outrenderer = pgrampipe;
|
||||
this.minPenSize = minPenSize;
|
||||
this.normPosition = normPosition;
|
||||
this.normRoundingBias = 0.5 - normPosition;
|
||||
this.adjustfill = adjustfill;
|
||||
}
|
||||
|
||||
public void drawLine(SunGraphics2D sg2d,
|
||||
int x1, int y1, int x2, int y2)
|
||||
{
|
||||
if (!drawGeneralLine(sg2d, x1, y1, x2, y2)) {
|
||||
super.drawLine(sg2d, x1, y1, x2, y2);
|
||||
}
|
||||
}
|
||||
|
||||
public void drawRect(SunGraphics2D sg2d,
|
||||
int x, int y, int w, int h)
|
||||
{
|
||||
if (w >= 0 && h >= 0) {
|
||||
if (sg2d.strokeState < SunGraphics2D.STROKE_CUSTOM) {
|
||||
BasicStroke bs = ((BasicStroke) sg2d.stroke);
|
||||
if (w > 0 && h > 0) {
|
||||
if (bs.getLineJoin() == BasicStroke.JOIN_MITER &&
|
||||
bs.getDashArray() == null)
|
||||
{
|
||||
double lw = bs.getLineWidth();
|
||||
drawRectangle(sg2d, x, y, w, h, lw);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// Note: This calls the integer version which
|
||||
// will verify that the local drawLine optimizations
|
||||
// work and call super.drawLine(), if not.
|
||||
drawLine(sg2d, x, y, x+w, y+h);
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.drawRect(sg2d, x, y, w, h);
|
||||
}
|
||||
}
|
||||
|
||||
public void fillRect(SunGraphics2D sg2d,
|
||||
int x, int y, int w, int h)
|
||||
{
|
||||
if (w > 0 && h > 0) {
|
||||
fillRectangle(sg2d, x, y, w, h);
|
||||
}
|
||||
}
|
||||
|
||||
public void draw(SunGraphics2D sg2d, Shape s) {
|
||||
if (sg2d.strokeState < SunGraphics2D.STROKE_CUSTOM) {
|
||||
BasicStroke bs = ((BasicStroke) sg2d.stroke);
|
||||
if (s instanceof Rectangle2D) {
|
||||
if (bs.getLineJoin() == BasicStroke.JOIN_MITER &&
|
||||
bs.getDashArray() == null)
|
||||
{
|
||||
Rectangle2D r2d = (Rectangle2D) s;
|
||||
double w = r2d.getWidth();
|
||||
double h = r2d.getHeight();
|
||||
double x = r2d.getX();
|
||||
double y = r2d.getY();
|
||||
if (w >= 0 && h >= 0) {
|
||||
double lw = bs.getLineWidth();
|
||||
drawRectangle(sg2d, x, y, w, h, lw);
|
||||
}
|
||||
return;
|
||||
}
|
||||
} else if (s instanceof Line2D) {
|
||||
Line2D l2d = (Line2D) s;
|
||||
if (drawGeneralLine(sg2d,
|
||||
l2d.getX1(), l2d.getY1(),
|
||||
l2d.getX2(), l2d.getY2()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
outpipe.draw(sg2d, s);
|
||||
}
|
||||
|
||||
public void fill(SunGraphics2D sg2d, Shape s) {
|
||||
if (s instanceof Rectangle2D) {
|
||||
Rectangle2D r2d = (Rectangle2D) s;
|
||||
double w = r2d.getWidth();
|
||||
double h = r2d.getHeight();
|
||||
if (w > 0 && h > 0) {
|
||||
double x = r2d.getX();
|
||||
double y = r2d.getY();
|
||||
fillRectangle(sg2d, x, y, w, h);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
outpipe.fill(sg2d, s);
|
||||
}
|
||||
|
||||
static double len(double x, double y) {
|
||||
return ((x == 0) ? Math.abs(y)
|
||||
: ((y == 0) ? Math.abs(x)
|
||||
: Math.sqrt(x * x + y * y)));
|
||||
}
|
||||
|
||||
double normalize(double v) {
|
||||
return Math.floor(v + normRoundingBias) + normPosition;
|
||||
}
|
||||
|
||||
public boolean drawGeneralLine(SunGraphics2D sg2d,
|
||||
double x1, double y1,
|
||||
double x2, double y2)
|
||||
{
|
||||
if (sg2d.strokeState == SunGraphics2D.STROKE_CUSTOM ||
|
||||
sg2d.strokeState == SunGraphics2D.STROKE_THINDASHED)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
BasicStroke bs = (BasicStroke) sg2d.stroke;
|
||||
int cap = bs.getEndCap();
|
||||
if (cap == BasicStroke.CAP_ROUND || bs.getDashArray() != null) {
|
||||
// TODO: we could construct the GeneralPath directly
|
||||
// for CAP_ROUND and save a lot of processing in that case...
|
||||
// And again, we would need to deal with dropout control...
|
||||
return false;
|
||||
}
|
||||
double lw = bs.getLineWidth();
|
||||
// Save the original dx, dy in case we need it to transform
|
||||
// the linewidth as a perpendicular vector below
|
||||
double dx = x2 - x1;
|
||||
double dy = y2 - y1;
|
||||
switch (sg2d.transformState) {
|
||||
case SunGraphics2D.TRANSFORM_GENERIC:
|
||||
case SunGraphics2D.TRANSFORM_TRANSLATESCALE:
|
||||
{
|
||||
double coords[] = {x1, y1, x2, y2};
|
||||
sg2d.transform.transform(coords, 0, coords, 0, 2);
|
||||
x1 = coords[0];
|
||||
y1 = coords[1];
|
||||
x2 = coords[2];
|
||||
y2 = coords[3];
|
||||
}
|
||||
break;
|
||||
case SunGraphics2D.TRANSFORM_ANY_TRANSLATE:
|
||||
case SunGraphics2D.TRANSFORM_INT_TRANSLATE:
|
||||
{
|
||||
double tx = sg2d.transform.getTranslateX();
|
||||
double ty = sg2d.transform.getTranslateY();
|
||||
x1 += tx;
|
||||
y1 += ty;
|
||||
x2 += tx;
|
||||
y2 += ty;
|
||||
}
|
||||
break;
|
||||
case SunGraphics2D.TRANSFORM_ISIDENT:
|
||||
break;
|
||||
default:
|
||||
throw new InternalError("unknown TRANSFORM state...");
|
||||
}
|
||||
if (sg2d.strokeHint != SunHints.INTVAL_STROKE_PURE) {
|
||||
if (sg2d.strokeState == SunGraphics2D.STROKE_THIN &&
|
||||
outrenderer instanceof PixelDrawPipe)
|
||||
{
|
||||
// PixelDrawPipes will add sg2d.transXY so we need to factor
|
||||
// that out...
|
||||
int ix1 = (int) Math.floor(x1 - sg2d.transX);
|
||||
int iy1 = (int) Math.floor(y1 - sg2d.transY);
|
||||
int ix2 = (int) Math.floor(x2 - sg2d.transX);
|
||||
int iy2 = (int) Math.floor(y2 - sg2d.transY);
|
||||
((PixelDrawPipe)outrenderer).drawLine(sg2d, ix1, iy1, ix2, iy2);
|
||||
return true;
|
||||
}
|
||||
x1 = normalize(x1);
|
||||
y1 = normalize(y1);
|
||||
x2 = normalize(x2);
|
||||
y2 = normalize(y2);
|
||||
}
|
||||
if (sg2d.transformState >= SunGraphics2D.TRANSFORM_TRANSLATESCALE) {
|
||||
// Transform the linewidth...
|
||||
// calculate the scaling factor for a unit vector
|
||||
// perpendicular to the original user space line.
|
||||
double len = len(dx, dy);
|
||||
if (len == 0) {
|
||||
dx = len = 1;
|
||||
// dy = 0; already
|
||||
}
|
||||
// delta transform the transposed (90 degree rotated) unit vector
|
||||
double unitvector[] = {dy/len, -dx/len};
|
||||
sg2d.transform.deltaTransform(unitvector, 0, unitvector, 0, 1);
|
||||
lw *= len(unitvector[0], unitvector[1]);
|
||||
}
|
||||
lw = Math.max(lw, minPenSize);
|
||||
dx = x2 - x1;
|
||||
dy = y2 - y1;
|
||||
double len = len(dx, dy);
|
||||
double udx, udy;
|
||||
if (len == 0) {
|
||||
if (cap == BasicStroke.CAP_BUTT) {
|
||||
return true;
|
||||
}
|
||||
udx = lw;
|
||||
udy = 0;
|
||||
} else {
|
||||
udx = lw * dx / len;
|
||||
udy = lw * dy / len;
|
||||
}
|
||||
double px = x1 + udy / 2.0;
|
||||
double py = y1 - udx / 2.0;
|
||||
if (cap == BasicStroke.CAP_SQUARE) {
|
||||
px -= udx / 2.0;
|
||||
py -= udy / 2.0;
|
||||
dx += udx;
|
||||
dy += udy;
|
||||
}
|
||||
outrenderer.fillParallelogram(sg2d, px, py, -udy, udx, dx, dy);
|
||||
return true;
|
||||
}
|
||||
|
||||
public void fillRectangle(SunGraphics2D sg2d,
|
||||
double rx, double ry,
|
||||
double rw, double rh)
|
||||
{
|
||||
double px, py;
|
||||
double dx1, dy1, dx2, dy2;
|
||||
AffineTransform txform = sg2d.transform;
|
||||
dx1 = txform.getScaleX();
|
||||
dy1 = txform.getShearY();
|
||||
dx2 = txform.getShearX();
|
||||
dy2 = txform.getScaleY();
|
||||
px = rx * dx1 + ry * dx2 + txform.getTranslateX();
|
||||
py = rx * dy1 + ry * dy2 + txform.getTranslateY();
|
||||
dx1 *= rw;
|
||||
dy1 *= rw;
|
||||
dx2 *= rh;
|
||||
dy2 *= rh;
|
||||
if (adjustfill &&
|
||||
sg2d.strokeState < SunGraphics2D.STROKE_CUSTOM &&
|
||||
sg2d.strokeHint != SunHints.INTVAL_STROKE_PURE)
|
||||
{
|
||||
double newx = normalize(px);
|
||||
double newy = normalize(py);
|
||||
dx1 = normalize(px + dx1) - newx;
|
||||
dy1 = normalize(py + dy1) - newy;
|
||||
dx2 = normalize(px + dx2) - newx;
|
||||
dy2 = normalize(py + dy2) - newy;
|
||||
px = newx;
|
||||
py = newy;
|
||||
}
|
||||
outrenderer.fillParallelogram(sg2d, px, py, dx1, dy1, dx2, dy2);
|
||||
}
|
||||
|
||||
public void drawRectangle(SunGraphics2D sg2d,
|
||||
double rx, double ry,
|
||||
double rw, double rh,
|
||||
double lw)
|
||||
{
|
||||
double px, py;
|
||||
double dx1, dy1, dx2, dy2;
|
||||
double lw1, lw2;
|
||||
AffineTransform txform = sg2d.transform;
|
||||
dx1 = txform.getScaleX();
|
||||
dy1 = txform.getShearY();
|
||||
dx2 = txform.getShearX();
|
||||
dy2 = txform.getScaleY();
|
||||
px = rx * dx1 + ry * dx2 + txform.getTranslateX();
|
||||
py = rx * dy1 + ry * dy2 + txform.getTranslateY();
|
||||
// lw along dx1,dy1 scale by transformed length of dx2,dy2 vectors
|
||||
// and vice versa
|
||||
lw1 = len(dx1, dy1) * lw;
|
||||
lw2 = len(dx2, dy2) * lw;
|
||||
dx1 *= rw;
|
||||
dy1 *= rw;
|
||||
dx2 *= rh;
|
||||
dy2 *= rh;
|
||||
if (sg2d.strokeState < SunGraphics2D.STROKE_CUSTOM &&
|
||||
sg2d.strokeHint != SunHints.INTVAL_STROKE_PURE)
|
||||
{
|
||||
double newx = normalize(px);
|
||||
double newy = normalize(py);
|
||||
dx1 = normalize(px + dx1) - newx;
|
||||
dy1 = normalize(py + dy1) - newy;
|
||||
dx2 = normalize(px + dx2) - newx;
|
||||
dy2 = normalize(py + dy2) - newy;
|
||||
px = newx;
|
||||
py = newy;
|
||||
}
|
||||
lw1 = Math.max(lw1, minPenSize);
|
||||
lw2 = Math.max(lw2, minPenSize);
|
||||
double len1 = len(dx1, dy1);
|
||||
double len2 = len(dx2, dy2);
|
||||
if (lw1 >= len1 || lw2 >= len2) {
|
||||
// The line widths are large enough to consume the
|
||||
// entire hole in the middle of the parallelogram
|
||||
// so we can just fill the outer parallelogram.
|
||||
fillOuterParallelogram(sg2d,
|
||||
px, py, dx1, dy1, dx2, dy2,
|
||||
len1, len2, lw1, lw2);
|
||||
} else {
|
||||
outrenderer.drawParallelogram(sg2d,
|
||||
px, py, dx1, dy1, dx2, dy2,
|
||||
lw1 / len1, lw2 / len2);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This utility function handles the case where a drawRectangle
|
||||
* operation discovered that the interior hole in the rectangle
|
||||
* or parallelogram has been completely filled in by the stroke
|
||||
* width. It calculates the outer parallelogram of the stroke
|
||||
* and issues a single fillParallelogram request to fill it.
|
||||
*/
|
||||
public void fillOuterParallelogram(SunGraphics2D sg2d,
|
||||
double px, double py,
|
||||
double dx1, double dy1,
|
||||
double dx2, double dy2,
|
||||
double len1, double len2,
|
||||
double lw1, double lw2)
|
||||
{
|
||||
double udx1 = dx1 / len1;
|
||||
double udy1 = dy1 / len1;
|
||||
double udx2 = dx2 / len2;
|
||||
double udy2 = dy2 / len2;
|
||||
if (len1 == 0) {
|
||||
// len1 is 0, replace udxy1 with perpendicular of udxy2
|
||||
if (len2 == 0) {
|
||||
// both are 0, use a unit Y vector for udxy2
|
||||
udx2 = 0;
|
||||
udy2 = 1;
|
||||
}
|
||||
udx1 = udy2;
|
||||
udy1 = -udx2;
|
||||
} else if (len2 == 0) {
|
||||
// len2 is 0, replace udxy2 with perpendicular of udxy1
|
||||
udx2 = udy1;
|
||||
udy2 = -udx1;
|
||||
}
|
||||
udx1 *= lw1;
|
||||
udy1 *= lw1;
|
||||
udx2 *= lw2;
|
||||
udy2 *= lw2;
|
||||
px -= (udx1 + udx2) / 2;
|
||||
py -= (udy1 + udy2) / 2;
|
||||
dx1 += udx1;
|
||||
dy1 += udy1;
|
||||
dx2 += udx2;
|
||||
dy2 += udy2;
|
||||
|
||||
outrenderer.fillParallelogram(sg2d, px, py, dx1, dy1, dx2, dy2);
|
||||
}
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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.pipe.hw;
|
||||
|
||||
/**
|
||||
* An interface for receiving notifications about imminent accelerated device's
|
||||
* events. Upon receiving such event appropriate actions can be taken (for
|
||||
* example, resources associated with the device can be freed).
|
||||
*/
|
||||
public interface AccelDeviceEventListener {
|
||||
/**
|
||||
* Called when the device is about to be reset.
|
||||
*
|
||||
* One must release all native resources associated with the device which
|
||||
* prevent the device from being reset (such as Default Pool resources for
|
||||
* the D3D pipeline).
|
||||
*
|
||||
* It is safe to remove the listener while in the call back.
|
||||
*
|
||||
* Note: this method is called on the rendering thread,
|
||||
* do not call into user code, do not take RQ lock!
|
||||
*/
|
||||
public void onDeviceReset();
|
||||
|
||||
/**
|
||||
* Called when the device is about to be disposed of.
|
||||
*
|
||||
* One must release all native resources associated with the device.
|
||||
*
|
||||
* It is safe to remove the listener while in the call back.
|
||||
*
|
||||
* Note: this method is called on the rendering thread,
|
||||
* do not call into user code, do not take RQ lock!
|
||||
*/
|
||||
public void onDeviceDispose();
|
||||
}
|
@ -0,0 +1,167 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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.pipe.hw;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* This class is used to notify listeners about accelerated device's
|
||||
* events such as device reset or dispose that are about to occur.
|
||||
*/
|
||||
public class AccelDeviceEventNotifier {
|
||||
|
||||
private static AccelDeviceEventNotifier theInstance;
|
||||
|
||||
/**
|
||||
* A device is about to be reset. The listeners have to release all
|
||||
* resources associated with the device which are required for the device
|
||||
* to be reset.
|
||||
*/
|
||||
public static final int DEVICE_RESET = 0;
|
||||
|
||||
/**
|
||||
* A device is about to be disposed. The listeners have to release all
|
||||
* resources associated with the device.
|
||||
*/
|
||||
public static final int DEVICE_DISPOSED = 1;
|
||||
|
||||
private final Map<AccelDeviceEventListener, Integer> listeners;
|
||||
|
||||
private AccelDeviceEventNotifier() {
|
||||
listeners = Collections.synchronizedMap(
|
||||
new HashMap<AccelDeviceEventListener, Integer>(1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a singleton of AccelDeviceEventNotifier if it exists. If the
|
||||
* passed boolean is false and singleton doesn't exist yet, null is
|
||||
* returned. If the passed boolean is {@code true} and singleton doesn't
|
||||
* exist it will be created and returned.
|
||||
*
|
||||
* @param create whether to create a singleton instance if doesn't yet
|
||||
* exist
|
||||
* @return a singleton instance or null
|
||||
*/
|
||||
private static synchronized
|
||||
AccelDeviceEventNotifier getInstance(boolean create)
|
||||
{
|
||||
if (theInstance == null && create) {
|
||||
theInstance = new AccelDeviceEventNotifier();
|
||||
}
|
||||
return theInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to indicate that a device event had occured.
|
||||
* If a singleton exists, the listeners (those associated with
|
||||
* the device) will be notified.
|
||||
*
|
||||
* @param screen a screen number of the device which is a source of
|
||||
* the event
|
||||
* @param eventType a type of the event
|
||||
* @see #DEVICE_DISPOSED
|
||||
* @see #DEVICE_RESET
|
||||
*/
|
||||
public static final void eventOccured(int screen, int eventType) {
|
||||
AccelDeviceEventNotifier notifier = getInstance(false);
|
||||
if (notifier != null) {
|
||||
notifier.notifyListeners(eventType, screen);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the listener associated with a device on particular screen.
|
||||
*
|
||||
* Note: the listener must be removed as otherwise it will forever
|
||||
* be referenced by the notifier.
|
||||
*
|
||||
* @param l the listener
|
||||
* @param screen the screen number indicating which device the listener is
|
||||
* interested in.
|
||||
*/
|
||||
public static final void addListener(AccelDeviceEventListener l,int screen){
|
||||
getInstance(true).add(l, screen);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the listener.
|
||||
*
|
||||
* @param l the listener
|
||||
*/
|
||||
public static final void removeListener(AccelDeviceEventListener l) {
|
||||
getInstance(true).remove(l);
|
||||
}
|
||||
|
||||
private final void add(AccelDeviceEventListener theListener, int screen) {
|
||||
listeners.put(theListener, screen);
|
||||
}
|
||||
private final void remove(AccelDeviceEventListener theListener) {
|
||||
listeners.remove(theListener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies the listeners associated with the screen's device about the
|
||||
* event.
|
||||
*
|
||||
* Implementation note: the current list of listeners is first duplicated
|
||||
* which allows the listeners to remove themselves during the iteration.
|
||||
*
|
||||
* @param screen a screen number with which the device which is a source of
|
||||
* the event is associated with
|
||||
* @param eventType a type of the event
|
||||
* @see #DEVICE_DISPOSED
|
||||
* @see #DEVICE_RESET
|
||||
*/
|
||||
private final void notifyListeners(int deviceEventType, int screen) {
|
||||
HashMap<AccelDeviceEventListener, Integer> listClone;
|
||||
Set<AccelDeviceEventListener> cloneSet;
|
||||
|
||||
synchronized(listeners) {
|
||||
listClone =
|
||||
new HashMap<AccelDeviceEventListener, Integer>(listeners);
|
||||
}
|
||||
|
||||
cloneSet = listClone.keySet();
|
||||
Iterator<AccelDeviceEventListener> itr = cloneSet.iterator();
|
||||
while (itr.hasNext()) {
|
||||
AccelDeviceEventListener current = itr.next();
|
||||
Integer i = listClone.get(current);
|
||||
// only notify listeners which are interested in this device
|
||||
if (i != null && i.intValue() != screen) {
|
||||
continue;
|
||||
}
|
||||
if (deviceEventType == DEVICE_RESET) {
|
||||
current.onDeviceReset();
|
||||
} else if (deviceEventType == DEVICE_DISPOSED) {
|
||||
current.onDeviceDispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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.pipe.hw;
|
||||
|
||||
import java.awt.image.VolatileImage;
|
||||
|
||||
/**
|
||||
* Implementors of this interface provida a way to create a
|
||||
* {@code VolatileImage} whose destination surface is an
|
||||
* {@link AccelSurface} of specified type.
|
||||
*
|
||||
* @see AccelSurface
|
||||
*/
|
||||
public interface AccelGraphicsConfig extends BufferedContextProvider {
|
||||
/**
|
||||
* Returns a VolatileImage with specified width, height, transparency
|
||||
* and guaranteed accelerated surface type. If such image can not be created
|
||||
* (out of vram error, specific surface type is not supported) null
|
||||
* is returned.
|
||||
*
|
||||
* Note: if {@link AccelSurface#TEXTURE} type is requested, rendering
|
||||
* to the image will be denied by throwing
|
||||
* {@code UnsupportedOperationException }
|
||||
* from {@link java.awt.image.VolatileImage#getGraphics} and
|
||||
* {@link java.awt.image.VolatileImage#createGraphics}
|
||||
*
|
||||
* @param width the width of the returned {@code VolatileImage}
|
||||
* @param height the height of the returned {@code VolatileImage}
|
||||
* @param transparency the specified transparency mode
|
||||
* @param type requested accelerated surface type as specified by constants
|
||||
* in AccelSurface interface
|
||||
* @return a {@code VolatileImage} backed up by requested accelerated
|
||||
* surface type or null
|
||||
* @throws IllegalArgumentException if the transparency is not a valid value
|
||||
* @see AccelSurface#TEXTURE
|
||||
* @see AccelSurface#RT_PLAIN
|
||||
* @see AccelSurface#RT_TEXTURE
|
||||
*/
|
||||
public VolatileImage createCompatibleVolatileImage(int width, int height,
|
||||
int transparency,
|
||||
int type);
|
||||
/**
|
||||
* Returns object representing capabilities of the context associated
|
||||
* with this {@code AccelGraphicsConfig}.
|
||||
*
|
||||
* @return ContextCapabilities object representing caps
|
||||
* @see ContextCapabilities
|
||||
*/
|
||||
public ContextCapabilities getContextCapabilities();
|
||||
|
||||
/**
|
||||
* Adds an {@code AccelDeviceEventListener} to listen to accelerated
|
||||
* device's (which is associated with this {@code AccelGraphicsConfig})
|
||||
* events.
|
||||
*
|
||||
* Note: a hard link to the listener may be kept so it must be explicitly
|
||||
* removed via {@link #removeDeviceEventListener()}.
|
||||
*
|
||||
* @param l the listener
|
||||
* @see AccelDeviceEventListener
|
||||
*/
|
||||
public void addDeviceEventListener(AccelDeviceEventListener l);
|
||||
|
||||
/**
|
||||
* Removes an {@code AccelDeviceEventListener} from the list of listeners
|
||||
* for this device's events.
|
||||
*
|
||||
* @param l the listener
|
||||
* @see AccelDeviceEventListener
|
||||
*/
|
||||
public void removeDeviceEventListener(AccelDeviceEventListener l);
|
||||
}
|
136
jdk/src/share/classes/sun/java2d/pipe/hw/AccelSurface.java
Normal file
136
jdk/src/share/classes/sun/java2d/pipe/hw/AccelSurface.java
Normal file
@ -0,0 +1,136 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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.pipe.hw;
|
||||
|
||||
import java.awt.Rectangle;
|
||||
import sun.java2d.Surface;
|
||||
|
||||
/**
|
||||
* Abstraction for a hardware accelerated surface.
|
||||
*/
|
||||
public interface AccelSurface extends BufferedContextProvider, Surface {
|
||||
/**
|
||||
* Undefined
|
||||
*/
|
||||
public static final int UNDEFINED = 0;
|
||||
/**
|
||||
* Window (or window substitute) surface
|
||||
*/
|
||||
public static final int WINDOW = 1;
|
||||
/**
|
||||
* Render-To Plain surface (pbuffer for OpenGL, Render Target surface
|
||||
* for Direct3D)
|
||||
*/
|
||||
public static final int RT_PLAIN = 2;
|
||||
/**
|
||||
* Texture surface
|
||||
*/
|
||||
public static final int TEXTURE = 3;
|
||||
/**
|
||||
* A back-buffer surface (SwapChain surface for Direct3D, backbuffer for
|
||||
* OpenGL)
|
||||
*/
|
||||
public static final int FLIP_BACKBUFFER = 4;
|
||||
/**
|
||||
* Render-To Texture surface (fbobject for OpenGL, texture with render-to
|
||||
* attribute for Direct3D)
|
||||
*/
|
||||
public static final int RT_TEXTURE = 5;
|
||||
|
||||
/**
|
||||
* Returns {@code int} representing surface's type as defined by constants
|
||||
* in this interface.
|
||||
*
|
||||
* @return an integer representing this surface's type
|
||||
* @see AccelSurface#UNDEFINED
|
||||
* @see AccelSurface#WINDOW
|
||||
* @see AccelSurface#RT_PLAIN
|
||||
* @see AccelSurface#TEXTURE
|
||||
* @see AccelSurface#FLIP_BACKBUFFER
|
||||
* @see AccelSurface#RT_TEXTURE
|
||||
*/
|
||||
public int getType();
|
||||
|
||||
/**
|
||||
* Returns a pointer to the native surface data associated with this
|
||||
* surface.
|
||||
* Note: this pointer is only valid on the rendering thread.
|
||||
*
|
||||
* @return pointer to the native surface's data
|
||||
*/
|
||||
public long getNativeOps();
|
||||
|
||||
/**
|
||||
* Returns a pointer to the real native resource
|
||||
* of the specified type associated with this AccelSurface.
|
||||
* Note: this pointer is only valid on the rendering thread.
|
||||
*
|
||||
* @param resType the type of the requested resource
|
||||
* @return a long containing a pointer to the native resource of the
|
||||
* specified type or 0L if such resource doesn't exist for this surface
|
||||
*/
|
||||
public long getNativeResource(int resType);
|
||||
|
||||
/**
|
||||
* Marks this surface dirty.
|
||||
*/
|
||||
public void markDirty();
|
||||
|
||||
/**
|
||||
* Returns whether the pipeline considers this surface valid. A surface
|
||||
* may become invalid if it is disposed of, or resized.
|
||||
*
|
||||
* @return true if valid, false otherwise
|
||||
*/
|
||||
public boolean isValid();
|
||||
|
||||
/**
|
||||
* Returns whether this surface is lost. The return value is only valid
|
||||
* on the render thread, meaning that even if this method returns
|
||||
* {@code true} it could be lost in the next moment unless it is called
|
||||
* on the rendering thread.
|
||||
*
|
||||
* @return true if the surface is known to be lost, false otherwise
|
||||
*/
|
||||
public boolean isSurfaceLost();
|
||||
|
||||
/**
|
||||
* Returns the requested bounds of the destination surface. The real bounds
|
||||
* of the native accelerated surface may differ. Use
|
||||
* {@link #getNativeBounds} to get the bounds of the native surface.
|
||||
*
|
||||
* @return Rectangle representing java surface's bounds
|
||||
*/
|
||||
public Rectangle getBounds();
|
||||
|
||||
/**
|
||||
* Returns real bounds of the native surface, which may differ from those
|
||||
* returned by {@link #getBounds}.
|
||||
*
|
||||
* @return Rectangle representing native surface's bounds
|
||||
*/
|
||||
public Rectangle getNativeBounds();
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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.pipe.hw;
|
||||
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.GraphicsConfiguration;
|
||||
import sun.awt.image.SunVolatileImage;
|
||||
import static sun.java2d.pipe.hw.AccelSurface.*;
|
||||
|
||||
/**
|
||||
* This is an image with forced type of the accelerated surface.
|
||||
*/
|
||||
public class AccelTypedVolatileImage extends SunVolatileImage {
|
||||
|
||||
/**
|
||||
* Creates a volatile image with specified type of accelerated surface.
|
||||
*
|
||||
* @param graphicsConfig a GraphicsConfiguration for which this image should
|
||||
* be created.
|
||||
* @param width width
|
||||
* @param height width
|
||||
* @param transparency type of {@link java.awt.Transparency transparency}
|
||||
* requested for the image
|
||||
* @param accType type of the desired accelerated surface as defined in
|
||||
* AccelSurface interface
|
||||
* @see sun.java2d.pipe.hw.AccelSurface
|
||||
*/
|
||||
public AccelTypedVolatileImage(GraphicsConfiguration graphicsConfig,
|
||||
int width, int height, int transparency,
|
||||
int accType)
|
||||
{
|
||||
super(null, graphicsConfig, width, height, null, transparency,
|
||||
null, accType);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* This method will throw {@code UnsupportedOperationException} if it this
|
||||
* image's destination surface can not be rendered to.
|
||||
*/
|
||||
@Override
|
||||
public Graphics2D createGraphics() {
|
||||
if (getForcedAccelSurfaceType() == TEXTURE) {
|
||||
throw new UnsupportedOperationException("Can't render " +
|
||||
"to a non-RT Texture");
|
||||
}
|
||||
return super.createGraphics();
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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.pipe.hw;
|
||||
|
||||
import sun.java2d.pipe.BufferedContext;
|
||||
|
||||
/**
|
||||
* Classes implementing this interface can provide the {@code BufferedContext}
|
||||
* associated with or used by them.
|
||||
*
|
||||
* @see sun.java2d.pipe.BufferedContext
|
||||
*/
|
||||
public interface BufferedContextProvider {
|
||||
/**
|
||||
* Retrieves a context associated with object implementing this
|
||||
* interface.
|
||||
*
|
||||
* @return associated context
|
||||
* @see sun.java2d.pipe.BufferedContext
|
||||
*/
|
||||
public BufferedContext getContext();
|
||||
}
|
@ -0,0 +1,128 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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.pipe.hw;
|
||||
|
||||
/**
|
||||
* Represents a set of capabilities of a BufferedContext and associated
|
||||
* AccelGraphicsConfig.
|
||||
*
|
||||
* @see AccelGraphicsConfig
|
||||
*/
|
||||
public class ContextCapabilities {
|
||||
/** Indicates that the context has no capabilities. */
|
||||
public static final int CAPS_EMPTY = (0 << 0);
|
||||
/** Indicates that the context supports RT surfaces with alpha channel. */
|
||||
public static final int CAPS_RT_PLAIN_ALPHA = (1 << 1);
|
||||
/** Indicates that the context supports RT textures with alpha channel. */
|
||||
public static final int CAPS_RT_TEXTURE_ALPHA = (1 << 2);
|
||||
/** Indicates that the context supports opaque RT textures. */
|
||||
public static final int CAPS_RT_TEXTURE_OPAQUE = (1 << 3);
|
||||
/** Indicates that the context supports multitexturing. */
|
||||
public static final int CAPS_MULTITEXTURE = (1 << 4);
|
||||
/** Indicates that the context supports non-pow2 texture dimensions. */
|
||||
public static final int CAPS_TEXNONPOW2 = (1 << 5);
|
||||
/** Indicates that the context supports non-square textures. */
|
||||
public static final int CAPS_TEXNONSQUARE = (1 << 6);
|
||||
/** Indicates that the context supports pixel shader 2.0 or better. */
|
||||
public static final int CAPS_PS20 = (1 << 7);
|
||||
/** Indicates that the context supports pixel shader 3.0 or better. */
|
||||
public static final int CAPS_PS30 = (1 << 8);
|
||||
/*
|
||||
* Pipeline contexts should use this for defining pipeline-specific
|
||||
* capabilities, for example:
|
||||
* int CAPS_D3D_1 = (FIRST_PRIVATE_CAP << 0);
|
||||
* int CAPS_D3D_2 = (FIRST_PRIVATE_CAP << 1);
|
||||
*/
|
||||
protected static final int FIRST_PRIVATE_CAP = (1 << 16);
|
||||
|
||||
protected final int caps;
|
||||
protected final String adapterId;
|
||||
|
||||
/**
|
||||
* Constructs a {@code ContextCapabilities} object.
|
||||
* @param caps an {@code int} representing the capabilities
|
||||
* @param a {@code String} representing the name of the adapter, or null,
|
||||
* in which case the adapterId will be set to "unknown adapter".
|
||||
*/
|
||||
protected ContextCapabilities(int caps, String adapterId) {
|
||||
this.caps = caps;
|
||||
this.adapterId = adapterId != null ? adapterId : "unknown adapter";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representing the name of the graphics adapter if such
|
||||
* could be determined. It is guaranteed to never return {@code null}.
|
||||
* @return string representing adapter id
|
||||
*/
|
||||
public String getAdapterId() {
|
||||
return adapterId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an {@code int} with capabilities (OR-ed constants defined in
|
||||
* this class and its pipeline-specific subclasses).
|
||||
* @return capabilities as {@code int}
|
||||
*/
|
||||
public int getCaps() {
|
||||
return caps;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuffer buf =
|
||||
new StringBuffer("ContextCapabilities: adapter=" +
|
||||
adapterId+", caps=");
|
||||
if (caps == CAPS_EMPTY) {
|
||||
buf.append("CAPS_EMPTY");
|
||||
} else {
|
||||
if ((caps & CAPS_RT_PLAIN_ALPHA) != 0) {
|
||||
buf.append("CAPS_RT_PLAIN_ALPHA|");
|
||||
}
|
||||
if ((caps & CAPS_RT_TEXTURE_ALPHA) != 0) {
|
||||
buf.append("CAPS_RT_TEXTURE_ALPHA|");
|
||||
}
|
||||
if ((caps & CAPS_RT_TEXTURE_OPAQUE) != 0) {
|
||||
buf.append("CAPS_RT_TEXTURE_OPAQUE|");
|
||||
}
|
||||
if ((caps & CAPS_MULTITEXTURE) != 0) {
|
||||
buf.append("CAPS_MULTITEXTURE|");
|
||||
}
|
||||
if ((caps & CAPS_TEXNONPOW2) != 0) {
|
||||
buf.append("CAPS_TEXNONPOW2|");
|
||||
}
|
||||
if ((caps & CAPS_TEXNONSQUARE) != 0) {
|
||||
buf.append("CAPS_TEXNONSQUARE|");
|
||||
}
|
||||
if ((caps & CAPS_PS20) != 0) {
|
||||
buf.append("CAPS_PS20|");
|
||||
}
|
||||
if ((caps & CAPS_PS30) != 0) {
|
||||
buf.append("CAPS_PS30|");
|
||||
}
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
@ -0,0 +1,154 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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.pipe.hw;
|
||||
|
||||
import java.awt.BufferCapabilities;
|
||||
import java.awt.ImageCapabilities;
|
||||
|
||||
/**
|
||||
* Provides extended BufferStrategy capabilities, allowing to specify
|
||||
* the type of vertical refresh synchronization for a buffer strategy.
|
||||
*
|
||||
* This BS capability is always page flipping because v-sync is only relevant
|
||||
* to flipping buffer strategies.
|
||||
*
|
||||
* Note that asking for a v-synced BS doesn't necessarily guarantee that it will
|
||||
* be v-synced since the vsync capability may be disabled in the driver, or
|
||||
* there may be other restriction (like a number of v-synced buffer strategies
|
||||
* allowed per vm). Because of this {@code createBufferStrategy} doesn't
|
||||
* throw {@code AWTException} when a v-synced BS could not be created when
|
||||
* requested.
|
||||
*
|
||||
* @see java.awt.Canvas#createBufferStrategy(int, BufferCapabilities)
|
||||
* @see java.awt.Window#createBufferStrategy(int, BufferCapabilities)
|
||||
*/
|
||||
public class ExtendedBufferCapabilities extends BufferCapabilities {
|
||||
|
||||
/**
|
||||
* Type of synchronization on vertical retrace.
|
||||
*/
|
||||
public static enum VSyncType {
|
||||
/**
|
||||
* Use the default v-sync mode appropriate for given BufferStrategy
|
||||
* and situation.
|
||||
*/
|
||||
VSYNC_DEFAULT(0),
|
||||
|
||||
/**
|
||||
* Synchronize flip on vertical retrace.
|
||||
*/
|
||||
VSYNC_ON(1),
|
||||
|
||||
/**
|
||||
* Do not synchronize flip on vertical retrace.
|
||||
*/
|
||||
VSYNC_OFF(2);
|
||||
|
||||
/**
|
||||
* Used to identify the v-sync type (independent of the constants
|
||||
* order as opposed to {@code ordinal()}).
|
||||
*/
|
||||
public int id() {
|
||||
return id;
|
||||
}
|
||||
|
||||
private VSyncType(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
private int id;
|
||||
}
|
||||
|
||||
private VSyncType vsync;
|
||||
|
||||
/**
|
||||
* Creates an ExtendedBufferCapabilities object with front/back/flip caps
|
||||
* from the passed cap, and VSYNC_DEFAULT v-sync mode.
|
||||
*/
|
||||
public ExtendedBufferCapabilities(BufferCapabilities caps) {
|
||||
super(caps.getFrontBufferCapabilities(),
|
||||
caps.getBackBufferCapabilities(),
|
||||
caps.getFlipContents());
|
||||
|
||||
this.vsync = VSyncType.VSYNC_DEFAULT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ExtendedBufferCapabilities instance with front/back/flip caps
|
||||
* from the passed caps, and VSYNC_DEFAULT v-sync mode.
|
||||
*/
|
||||
public ExtendedBufferCapabilities(ImageCapabilities front,
|
||||
ImageCapabilities back, FlipContents flip)
|
||||
{
|
||||
super(front, back, flip);
|
||||
|
||||
this.vsync = VSyncType.VSYNC_DEFAULT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ExtendedBufferCapabilities instance with front/back/flip caps
|
||||
* from the passed image/flip caps, and the v-sync type.
|
||||
*/
|
||||
public ExtendedBufferCapabilities(ImageCapabilities front,
|
||||
ImageCapabilities back, FlipContents flip,
|
||||
VSyncType t)
|
||||
{
|
||||
super(front, back, flip);
|
||||
|
||||
this.vsync = t;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ExtendedBufferCapabilities instance with front/back/flip caps
|
||||
* from the passed cap, and the passed v-sync mode.
|
||||
*/
|
||||
public ExtendedBufferCapabilities(BufferCapabilities caps, VSyncType t) {
|
||||
super(caps.getFrontBufferCapabilities(),
|
||||
caps.getBackBufferCapabilities(),
|
||||
caps.getFlipContents());
|
||||
|
||||
this.vsync = t;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an ExtendedBufferCapabilities instance with front/back/flip caps
|
||||
* from the object, and passed v-sync mode.
|
||||
*/
|
||||
public ExtendedBufferCapabilities derive(VSyncType t) {
|
||||
return new ExtendedBufferCapabilities(this, t);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the type of v-sync requested by this capabilities instance.
|
||||
*/
|
||||
public VSyncType getVSync() {
|
||||
return vsync;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final boolean isPageFlipping() {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -124,7 +124,7 @@ public class LocalMonitoredVm extends AbstractMonitoredVm {
|
||||
}
|
||||
|
||||
int oldInterval = interval;
|
||||
super.setInterval(interval);
|
||||
super.setInterval(newInterval);
|
||||
|
||||
if (task != null) {
|
||||
task.cancel();
|
||||
|
@ -130,7 +130,7 @@ public class MonitoredHostProvider extends MonitoredHost {
|
||||
}
|
||||
|
||||
int oldInterval = interval;
|
||||
super.setInterval(interval);
|
||||
super.setInterval(newInterval);
|
||||
|
||||
if (task != null) {
|
||||
task.cancel();
|
||||
|
@ -352,6 +352,9 @@ public class FtpClient extends TransferProtocolClient {
|
||||
s = new Socket(Proxy.NO_PROXY);
|
||||
} else
|
||||
s = new Socket();
|
||||
// Bind the socket to the same address as the control channel. This
|
||||
// is needed in case of multi-homed systems.
|
||||
s.bind(new InetSocketAddress(serverSocket.getLocalAddress(),0));
|
||||
if (connectTimeout >= 0) {
|
||||
s.connect(dest, connectTimeout);
|
||||
} else {
|
||||
@ -417,8 +420,10 @@ public class FtpClient extends TransferProtocolClient {
|
||||
// since we can't accept a connection through SOCKS (yet)
|
||||
// throw an exception
|
||||
throw new FtpProtocolException("Passive mode failed");
|
||||
} else
|
||||
portSocket = new ServerSocket(0, 1);
|
||||
}
|
||||
// Bind the ServerSocket to the same address as the control channel
|
||||
// This is needed for multi-homed systems
|
||||
portSocket = new ServerSocket(0, 1, serverSocket.getLocalAddress());
|
||||
try {
|
||||
myAddress = portSocket.getInetAddress();
|
||||
if (myAddress.isAnyLocalAddress())
|
||||
|
@ -120,14 +120,8 @@ class ServerImpl implements TimeSource {
|
||||
if (executor == null) {
|
||||
executor = new DefaultExecutor();
|
||||
}
|
||||
Thread t = new Thread (dispatcher);
|
||||
started = true;
|
||||
final Dispatcher d = dispatcher;
|
||||
Thread t = AccessController.doPrivileged(new PrivilegedAction<Thread>() {
|
||||
public Thread run() {
|
||||
Thread t = new Thread (d);
|
||||
return t;
|
||||
}
|
||||
});
|
||||
t.start();
|
||||
}
|
||||
|
||||
@ -355,10 +349,8 @@ class ServerImpl implements TimeSource {
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (CancelledKeyException e) {
|
||||
} catch (Exception e) {
|
||||
logger.log (Level.FINER, "Dispatcher (3)", e);
|
||||
} catch (IOException e) {
|
||||
logger.log (Level.FINER, "Dispatcher (4)", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -370,10 +362,10 @@ class ServerImpl implements TimeSource {
|
||||
Exchange t = new Exchange (chan, protocol, conn);
|
||||
executor.execute (t);
|
||||
} catch (HttpError e1) {
|
||||
logger.log (Level.FINER, "Dispatcher (5)", e1);
|
||||
logger.log (Level.FINER, "Dispatcher (4)", e1);
|
||||
conn.close();
|
||||
} catch (IOException e) {
|
||||
logger.log (Level.FINER, "Dispatcher (6)", e);
|
||||
logger.log (Level.FINER, "Dispatcher (5)", e);
|
||||
conn.close();
|
||||
}
|
||||
}
|
||||
|
@ -42,19 +42,19 @@ abstract class SelectorImpl
|
||||
{
|
||||
|
||||
// The set of keys with data ready for an operation
|
||||
protected Set selectedKeys;
|
||||
protected Set<SelectionKey> selectedKeys;
|
||||
|
||||
// The set of keys registered with this Selector
|
||||
protected HashSet keys;
|
||||
protected HashSet<SelectionKey> keys;
|
||||
|
||||
// Public views of the key sets
|
||||
private Set publicKeys; // Immutable
|
||||
private Set publicSelectedKeys; // Removal allowed, but not addition
|
||||
private Set<SelectionKey> publicKeys; // Immutable
|
||||
private Set<SelectionKey> publicSelectedKeys; // Removal allowed, but not addition
|
||||
|
||||
protected SelectorImpl(SelectorProvider sp) {
|
||||
super(sp);
|
||||
keys = new HashSet();
|
||||
selectedKeys = new HashSet();
|
||||
keys = new HashSet<SelectionKey>();
|
||||
selectedKeys = new HashSet<SelectionKey>();
|
||||
if (Util.atBugLevel("1.4")) {
|
||||
publicKeys = keys;
|
||||
publicSelectedKeys = selectedKeys;
|
||||
@ -64,13 +64,13 @@ abstract class SelectorImpl
|
||||
}
|
||||
}
|
||||
|
||||
public Set keys() {
|
||||
public Set<SelectionKey> keys() {
|
||||
if (!isOpen() && !Util.atBugLevel("1.4"))
|
||||
throw new ClosedSelectorException();
|
||||
return publicKeys;
|
||||
}
|
||||
|
||||
public Set selectedKeys() {
|
||||
public Set<SelectionKey> selectedKeys() {
|
||||
if (!isOpen() && !Util.atBugLevel("1.4"))
|
||||
throw new ClosedSelectorException();
|
||||
return publicSelectedKeys;
|
||||
|
@ -51,9 +51,13 @@ class Util {
|
||||
// Per-thread soft cache of the last temporary direct buffer
|
||||
private static ThreadLocal<SoftReference<ByteBuffer>>[] bufferPool;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
static ThreadLocal<SoftReference<ByteBuffer>>[] createThreadLocalBufferPool() {
|
||||
return new ThreadLocal[TEMP_BUF_POOL_SIZE];
|
||||
}
|
||||
|
||||
static {
|
||||
bufferPool = (ThreadLocal<SoftReference<ByteBuffer>>[])
|
||||
new ThreadLocal[TEMP_BUF_POOL_SIZE];
|
||||
bufferPool = createThreadLocalBufferPool();
|
||||
for (int i=0; i<TEMP_BUF_POOL_SIZE; i++)
|
||||
bufferPool[i] = new ThreadLocal<SoftReference<ByteBuffer>>();
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 1997-2008 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
|
||||
@ -26,35 +26,23 @@
|
||||
package sun.security.tools;
|
||||
|
||||
import java.io.*;
|
||||
import java.math.BigInteger;
|
||||
import java.security.GeneralSecurityException;
|
||||
import java.security.InvalidParameterException;
|
||||
import java.security.KeyStore;
|
||||
import java.security.KeyStoreException;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.Key;
|
||||
import java.security.PublicKey;
|
||||
import java.security.PrivateKey;
|
||||
import java.security.Security;
|
||||
import java.security.Signature;
|
||||
import java.security.SignatureException;
|
||||
import java.security.UnrecoverableEntryException;
|
||||
import java.security.UnrecoverableKeyException;
|
||||
import java.security.Principal;
|
||||
import java.security.Provider;
|
||||
import java.security.Identity;
|
||||
import java.security.Signer;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.interfaces.DSAParams;
|
||||
import java.security.interfaces.DSAPrivateKey;
|
||||
import java.security.interfaces.DSAPublicKey;
|
||||
import java.security.interfaces.RSAPrivateCrtKey;
|
||||
import java.security.interfaces.RSAPrivateKey;
|
||||
import java.security.interfaces.RSAPublicKey;
|
||||
import java.text.Collator;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.*;
|
||||
@ -62,7 +50,6 @@ import java.lang.reflect.Constructor;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
|
||||
import sun.misc.BASE64Decoder;
|
||||
import sun.misc.BASE64Encoder;
|
||||
import sun.security.util.ObjectIdentifier;
|
||||
import sun.security.pkcs.PKCS10;
|
||||
@ -72,11 +59,16 @@ import sun.security.provider.SystemIdentity;
|
||||
import sun.security.provider.X509Factory;
|
||||
import sun.security.util.DerOutputStream;
|
||||
import sun.security.util.Password;
|
||||
import sun.security.util.Resources;
|
||||
import sun.security.util.PathList;
|
||||
import javax.crypto.KeyGenerator;
|
||||
import javax.crypto.SecretKey;
|
||||
|
||||
import javax.net.ssl.HostnameVerifier;
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import javax.net.ssl.SSLContext;
|
||||
import javax.net.ssl.SSLSession;
|
||||
import javax.net.ssl.TrustManager;
|
||||
import javax.net.ssl.X509TrustManager;
|
||||
import sun.security.x509.*;
|
||||
|
||||
import static java.security.KeyStore.*;
|
||||
@ -132,6 +124,7 @@ public final class KeyTool {
|
||||
private String ksfname = null;
|
||||
private File ksfile = null;
|
||||
private InputStream ksStream = null; // keystore stream
|
||||
private String sslserver = null;
|
||||
private KeyStore keyStore = null;
|
||||
private boolean token = false;
|
||||
private boolean nullStream = false;
|
||||
@ -347,6 +340,9 @@ public final class KeyTool {
|
||||
} else if (collator.compare(flags, "-file") == 0) {
|
||||
if (++i == args.length) errorNeedArgument(flags);
|
||||
filename = args[i];
|
||||
} else if (collator.compare(flags, "-sslserver") == 0) {
|
||||
if (++i == args.length) errorNeedArgument(flags);
|
||||
sslserver = args[i];
|
||||
} else if (collator.compare(flags, "-srckeystore") == 0) {
|
||||
if (++i == args.length) errorNeedArgument(flags);
|
||||
srcksfname = args[i];
|
||||
@ -924,17 +920,7 @@ public final class KeyTool {
|
||||
doPrintEntries(out);
|
||||
}
|
||||
} else if (command == PRINTCERT) {
|
||||
InputStream inStream = System.in;
|
||||
if (filename != null) {
|
||||
inStream = new FileInputStream(filename);
|
||||
}
|
||||
try {
|
||||
doPrintCert(inStream, out);
|
||||
} finally {
|
||||
if (inStream != System.in) {
|
||||
inStream.close();
|
||||
}
|
||||
}
|
||||
doPrintCert(out);
|
||||
} else if (command == SELFCERT) {
|
||||
doSelfCert(alias, dname, sigAlgName);
|
||||
kssave = true;
|
||||
@ -1468,8 +1454,8 @@ public final class KeyTool {
|
||||
} else {
|
||||
// Print the digest of the user cert only
|
||||
out.println
|
||||
(rb.getString("Certificate fingerprint (MD5): ") +
|
||||
getCertFingerPrint("MD5", chain[0]));
|
||||
(rb.getString("Certificate fingerprint (SHA1): ") +
|
||||
getCertFingerPrint("SHA1", chain[0]));
|
||||
}
|
||||
}
|
||||
} else if (keyStore.entryInstanceOf(alias,
|
||||
@ -1486,8 +1472,8 @@ public final class KeyTool {
|
||||
out.println(cert.toString());
|
||||
} else {
|
||||
out.println(rb.getString("trustedCertEntry,"));
|
||||
out.println(rb.getString("Certificate fingerprint (MD5): ")
|
||||
+ getCertFingerPrint("MD5", cert));
|
||||
out.println(rb.getString("Certificate fingerprint (SHA1): ")
|
||||
+ getCertFingerPrint("SHA1", cert));
|
||||
}
|
||||
} else {
|
||||
out.println(rb.getString("Unknown Entry Type"));
|
||||
@ -1744,7 +1730,7 @@ public final class KeyTool {
|
||||
* Reads a certificate (or certificate chain) and prints its contents in
|
||||
* a human readbable format.
|
||||
*/
|
||||
private void doPrintCert(InputStream in, PrintStream out)
|
||||
private void printCertFromStream(InputStream in, PrintStream out)
|
||||
throws Exception
|
||||
{
|
||||
Collection<? extends Certificate> c = null;
|
||||
@ -1770,13 +1756,98 @@ public final class KeyTool {
|
||||
Object[] source = {new Integer(i + 1)};
|
||||
out.println(form.format(source));
|
||||
}
|
||||
printX509Cert(x509Cert, out);
|
||||
if (rfc) dumpCert(x509Cert, out);
|
||||
else printX509Cert(x509Cert, out);
|
||||
if (i < (certs.length-1)) {
|
||||
out.println();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void doPrintCert(final PrintStream out) throws Exception {
|
||||
if (sslserver != null) {
|
||||
SSLContext sc = SSLContext.getInstance("SSL");
|
||||
final boolean[] certPrinted = new boolean[1];
|
||||
sc.init(null, new TrustManager[] {
|
||||
new X509TrustManager() {
|
||||
|
||||
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void checkClientTrusted(
|
||||
java.security.cert.X509Certificate[] certs, String authType) {
|
||||
}
|
||||
|
||||
public void checkServerTrusted(
|
||||
java.security.cert.X509Certificate[] certs, String authType) {
|
||||
for (int i=0; i<certs.length; i++) {
|
||||
X509Certificate cert = certs[i];
|
||||
try {
|
||||
if (rfc) {
|
||||
dumpCert(cert, out);
|
||||
} else {
|
||||
out.println("Certificate #" + i);
|
||||
out.println("====================================");
|
||||
printX509Cert(cert, out);
|
||||
out.println();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (debug) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set to true where there's something to print
|
||||
if (certs.length > 0) {
|
||||
certPrinted[0] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}, null);
|
||||
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
|
||||
HttpsURLConnection.setDefaultHostnameVerifier(
|
||||
new HostnameVerifier() {
|
||||
public boolean verify(String hostname, SSLSession session) {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
// HTTPS instead of raw SSL, so that -Dhttps.proxyHost and
|
||||
// -Dhttps.proxyPort can be used. Since we only go through
|
||||
// the handshake process, an HTTPS server is not needed.
|
||||
// This program should be able to deal with any SSL-based
|
||||
// network service.
|
||||
Exception ex = null;
|
||||
try {
|
||||
new URL("https://" + sslserver).openConnection().connect();
|
||||
} catch (Exception e) {
|
||||
ex = e;
|
||||
}
|
||||
// If the certs are not printed out, we consider it an error even
|
||||
// if the URL connection is successful.
|
||||
if (!certPrinted[0]) {
|
||||
Exception e = new Exception(
|
||||
rb.getString("No certificate from the SSL server"));
|
||||
if (ex != null) {
|
||||
e.initCause(ex);
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
} else {
|
||||
InputStream inStream = System.in;
|
||||
if (filename != null) {
|
||||
inStream = new FileInputStream(filename);
|
||||
}
|
||||
try {
|
||||
printCertFromStream(inStream, out);
|
||||
} finally {
|
||||
if (inStream != System.in) {
|
||||
inStream.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Creates a self-signed certificate, and stores it as a single-element
|
||||
* certificate chain.
|
||||
@ -3127,7 +3198,7 @@ public final class KeyTool {
|
||||
System.err.println();
|
||||
|
||||
System.err.println(rb.getString
|
||||
("-printcert [-v] [-file <cert_file>]"));
|
||||
("-printcert [-v] [-rfc] [-file <cert_file> | -sslserver <host[:port]>]"));
|
||||
System.err.println();
|
||||
|
||||
System.err.println(rb.getString
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2000-2008 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
|
||||
@ -171,7 +171,7 @@ public class Resources extends java.util.ListResourceBundle {
|
||||
{"Entry type: <type>", "Entry type: {0}"},
|
||||
{"Certificate chain length: ", "Certificate chain length: "},
|
||||
{"Certificate[(i + 1)]:", "Certificate[{0,number,integer}]:"},
|
||||
{"Certificate fingerprint (MD5): ", "Certificate fingerprint (MD5): "},
|
||||
{"Certificate fingerprint (SHA1): ", "Certificate fingerprint (SHA1): "},
|
||||
{"Entry type: trustedCertEntry\n", "Entry type: trustedCertEntry\n"},
|
||||
{"trustedCertEntry,", "trustedCertEntry,"},
|
||||
{"Keystore type: ", "Keystore type: "},
|
||||
@ -386,8 +386,10 @@ public class Resources extends java.util.ListResourceBundle {
|
||||
{"\t [-alias <alias>]", "\t [-alias <alias>]"},
|
||||
/** rest is same as -certreq starting from -keystore **/
|
||||
|
||||
{"-printcert [-v] [-file <cert_file>]",
|
||||
"-printcert [-v] [-file <cert_file>]"},
|
||||
{"-printcert [-v] [-rfc] [-file <cert_file> | -sslserver <host[:port]>]",
|
||||
"-printcert [-v] [-rfc] [-file <cert_file> | -sslserver <host[:port]>]"},
|
||||
{"No certificate from the SSL server",
|
||||
"No certificate from the SSL server"},
|
||||
|
||||
//{"-selfcert [-v] [-protected]",
|
||||
// "-selfcert [-v] [-protected]"},
|
||||
|
@ -104,6 +104,12 @@ public class FormatData_sv extends ListResourceBundle {
|
||||
"l\u00f6" // abb Saturday
|
||||
}
|
||||
},
|
||||
{ "AmPmMarkers",
|
||||
new String[] {
|
||||
"fm", // am marker
|
||||
"em" // pm marker
|
||||
}
|
||||
},
|
||||
{ "NumberElements",
|
||||
new String[] {
|
||||
",", // decimal separator
|
||||
|
@ -1900,7 +1900,6 @@ static void
|
||||
dump_heap_segment_and_reset(jlong segment_size)
|
||||
{
|
||||
int fd;
|
||||
char *last_chunk;
|
||||
jlong last_chunk_len;
|
||||
|
||||
HPROF_ASSERT(gdata->heap_fd >= 0);
|
||||
|
@ -1174,7 +1174,7 @@ add_class_fields(JNIEnv *env, ClassIndex top_cnum, ClassIndex cnum,
|
||||
|
||||
finfo = empty_finfo;
|
||||
finfo.cnum = cnum;
|
||||
finfo.modifiers = getFieldModifiers(klass, idlist[i]);
|
||||
finfo.modifiers = (unsigned short)getFieldModifiers(klass, idlist[i]);
|
||||
if ( ( finfo.modifiers & JVM_ACC_STATIC ) == 0 ||
|
||||
!skip_static_field_names ) {
|
||||
char *field_name;
|
||||
|
@ -116,7 +116,7 @@ Java_java_nio_Bits_copyFromShortArray(JNIEnv *env, jobject this, jobject src,
|
||||
jshort *srcShort, *dstShort, *endShort;
|
||||
jshort tmpShort;
|
||||
|
||||
dstShort = (jshort *)dstAddr;
|
||||
dstShort = (jshort *)jlong_to_ptr(dstAddr);
|
||||
|
||||
while (length > 0) {
|
||||
/* do not change this if-else statement, see WARNING above */
|
||||
@ -151,7 +151,7 @@ Java_java_nio_Bits_copyToShortArray(JNIEnv *env, jobject this, jlong srcAddr,
|
||||
jshort *srcShort, *dstShort, *endShort;
|
||||
jshort tmpShort;
|
||||
|
||||
srcShort = (jshort *)srcAddr;
|
||||
srcShort = (jshort *)jlong_to_ptr(srcAddr);
|
||||
|
||||
while (length > 0) {
|
||||
/* do not change this if-else statement, see WARNING above */
|
||||
@ -186,7 +186,7 @@ Java_java_nio_Bits_copyFromIntArray(JNIEnv *env, jobject this, jobject src,
|
||||
jint *srcInt, *dstInt, *endInt;
|
||||
jint tmpInt;
|
||||
|
||||
dstInt = (jint *)dstAddr;
|
||||
dstInt = (jint *)jlong_to_ptr(dstAddr);
|
||||
|
||||
while (length > 0) {
|
||||
/* do not change this code, see WARNING above */
|
||||
@ -221,7 +221,7 @@ Java_java_nio_Bits_copyToIntArray(JNIEnv *env, jobject this, jlong srcAddr,
|
||||
jint *srcInt, *dstInt, *endInt;
|
||||
jint tmpInt;
|
||||
|
||||
srcInt = (jint *)srcAddr;
|
||||
srcInt = (jint *)jlong_to_ptr(srcAddr);
|
||||
|
||||
while (length > 0) {
|
||||
/* do not change this code, see WARNING above */
|
||||
@ -256,7 +256,7 @@ Java_java_nio_Bits_copyFromLongArray(JNIEnv *env, jobject this, jobject src,
|
||||
jlong *srcLong, *dstLong, *endLong;
|
||||
jlong tmpLong;
|
||||
|
||||
dstLong = (jlong *)dstAddr;
|
||||
dstLong = (jlong *)jlong_to_ptr(dstAddr);
|
||||
|
||||
while (length > 0) {
|
||||
/* do not change this code, see WARNING above */
|
||||
@ -291,7 +291,7 @@ Java_java_nio_Bits_copyToLongArray(JNIEnv *env, jobject this, jlong srcAddr,
|
||||
jlong *srcLong, *dstLong, *endLong;
|
||||
jlong tmpLong;
|
||||
|
||||
srcLong = (jlong *)srcAddr;
|
||||
srcLong = (jlong *)jlong_to_ptr(srcAddr);
|
||||
|
||||
while (length > 0) {
|
||||
/* do not change this code, see WARNING above */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2008 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
|
||||
@ -45,6 +45,19 @@
|
||||
* list describing the cache as new glyphs are added. Platform specific
|
||||
* glyph caching code is responsible for actually creating the accelerated
|
||||
* memory surface that will contain the individual glyph images.
|
||||
*
|
||||
* Each glyph contains a reference to a list of cell infos - one per glyph
|
||||
* cache. There may be multiple glyph caches (for example, one per graphics
|
||||
* adapter), so if the glyph is cached on two devices its cell list will
|
||||
* consists of two elements corresponding to different glyph caches.
|
||||
*
|
||||
* The platform-specific glyph caching code is supposed to use
|
||||
* GetCellInfoForCache method for retrieving cache infos from the glyph's list.
|
||||
*
|
||||
* Note that if it is guaranteed that there will be only one global glyph
|
||||
* cache then it one does not have to use AccelGlyphCache_GetCellInfoForCache
|
||||
* for retrieving cell info for the glyph, but instead just use the struct's
|
||||
* field directly.
|
||||
*/
|
||||
GlyphCacheInfo *
|
||||
AccelGlyphCache_Init(jint width, jint height,
|
||||
@ -86,8 +99,11 @@ AccelGlyphCache_Init(jint width, jint height,
|
||||
* "virtual" glyph cache is available for the glyph image. Platform specific
|
||||
* glyph caching code is responsible for actually caching the glyph image
|
||||
* in the associated accelerated memory surface.
|
||||
*
|
||||
* Returns created cell info if it was successfully created and added to the
|
||||
* cache and glyph's cell lists, NULL otherwise.
|
||||
*/
|
||||
void
|
||||
CacheCellInfo *
|
||||
AccelGlyphCache_AddGlyph(GlyphCacheInfo *cache, GlyphInfo *glyph)
|
||||
{
|
||||
CacheCellInfo *cellinfo = NULL;
|
||||
@ -99,7 +115,7 @@ AccelGlyphCache_AddGlyph(GlyphCacheInfo *cache, GlyphInfo *glyph)
|
||||
if ((glyph->width > cache->cellWidth) ||
|
||||
(glyph->height > cache->cellHeight))
|
||||
{
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!cache->isFull) {
|
||||
@ -126,9 +142,8 @@ AccelGlyphCache_AddGlyph(GlyphCacheInfo *cache, GlyphInfo *glyph)
|
||||
// create new CacheCellInfo
|
||||
cellinfo = (CacheCellInfo *)malloc(sizeof(CacheCellInfo));
|
||||
if (cellinfo == NULL) {
|
||||
glyph->cellInfo = NULL;
|
||||
J2dTraceLn(J2D_TRACE_ERROR, "could not allocate CellInfo");
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cellinfo->cacheInfo = cache;
|
||||
@ -136,6 +151,8 @@ AccelGlyphCache_AddGlyph(GlyphCacheInfo *cache, GlyphInfo *glyph)
|
||||
cellinfo->timesRendered = 0;
|
||||
cellinfo->x = x;
|
||||
cellinfo->y = y;
|
||||
cellinfo->leftOff = 0;
|
||||
cellinfo->rightOff = 0;
|
||||
cellinfo->tx1 = (jfloat)cellinfo->x / cache->width;
|
||||
cellinfo->ty1 = (jfloat)cellinfo->y / cache->height;
|
||||
cellinfo->tx2 = cellinfo->tx1 + ((jfloat)w / cache->width);
|
||||
@ -152,6 +169,7 @@ AccelGlyphCache_AddGlyph(GlyphCacheInfo *cache, GlyphInfo *glyph)
|
||||
// add the new cell to the end of the list
|
||||
cache->tail = cellinfo;
|
||||
cellinfo->next = NULL;
|
||||
cellinfo->nextGCI = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -210,9 +228,9 @@ AccelGlyphCache_AddGlyph(GlyphCacheInfo *cache, GlyphInfo *glyph)
|
||||
cache->Flush();
|
||||
}
|
||||
|
||||
// if the cell is occupied, notify the base glyph that its
|
||||
// cached version is about to be kicked out
|
||||
cellinfo->glyphInfo->cellInfo = NULL;
|
||||
// if the cell is occupied, notify the base glyph that the
|
||||
// cached version for this cache is about to be kicked out
|
||||
AccelGlyphCache_RemoveCellInfo(cellinfo->glyphInfo, cellinfo);
|
||||
}
|
||||
|
||||
// update cellinfo with glyph's occupied region information
|
||||
@ -221,8 +239,9 @@ AccelGlyphCache_AddGlyph(GlyphCacheInfo *cache, GlyphInfo *glyph)
|
||||
cellinfo->ty2 = cellinfo->ty1 + ((jfloat)h / cache->height);
|
||||
}
|
||||
|
||||
// update the glyph's reference to its cache cell
|
||||
glyph->cellInfo = cellinfo;
|
||||
// add cache cell to the glyph's cells list
|
||||
AccelGlyphCache_AddCellInfo(glyph, cellinfo);
|
||||
return cellinfo;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -251,10 +270,145 @@ AccelGlyphCache_Invalidate(GlyphCacheInfo *cache)
|
||||
while (cellinfo != NULL) {
|
||||
if (cellinfo->glyphInfo != NULL) {
|
||||
// if the cell is occupied, notify the base glyph that its
|
||||
// cached version is about to be invalidated
|
||||
cellinfo->glyphInfo->cellInfo = NULL;
|
||||
cellinfo->glyphInfo = NULL;
|
||||
// cached version for this cache is about to be invalidated
|
||||
AccelGlyphCache_RemoveCellInfo(cellinfo->glyphInfo, cellinfo);
|
||||
}
|
||||
cellinfo = cellinfo->next;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invalidates and frees all cells and the cache itself. The "cache" pointer
|
||||
* becomes invalid after this function returns.
|
||||
*/
|
||||
void
|
||||
AccelGlyphCache_Free(GlyphCacheInfo *cache)
|
||||
{
|
||||
CacheCellInfo *cellinfo;
|
||||
|
||||
J2dTraceLn(J2D_TRACE_INFO, "AccelGlyphCache_Free");
|
||||
|
||||
if (cache == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
// flush any pending vertices that may be depending on the current
|
||||
// glyph cache
|
||||
if (cache->Flush != NULL) {
|
||||
cache->Flush();
|
||||
}
|
||||
|
||||
while (cache->head != NULL) {
|
||||
cellinfo = cache->head;
|
||||
if (cellinfo->glyphInfo != NULL) {
|
||||
// if the cell is occupied, notify the base glyph that its
|
||||
// cached version for this cache is about to be invalidated
|
||||
AccelGlyphCache_RemoveCellInfo(cellinfo->glyphInfo, cellinfo);
|
||||
}
|
||||
cache->head = cellinfo->next;
|
||||
free(cellinfo);
|
||||
}
|
||||
free(cache);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add cell info to the head of the glyph's list of cached cells.
|
||||
*/
|
||||
void
|
||||
AccelGlyphCache_AddCellInfo(GlyphInfo *glyph, CacheCellInfo *cellInfo)
|
||||
{
|
||||
// assert (glyph != NULL && cellInfo != NULL)
|
||||
J2dTraceLn(J2D_TRACE_INFO, "AccelGlyphCache_AddCellInfo");
|
||||
J2dTraceLn2(J2D_TRACE_VERBOSE, " glyph 0x%x: adding cell 0x%x to the list",
|
||||
glyph, cellInfo);
|
||||
|
||||
cellInfo->glyphInfo = glyph;
|
||||
cellInfo->nextGCI = glyph->cellInfo;
|
||||
glyph->cellInfo = cellInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes cell info from the glyph's list of cached cells.
|
||||
*/
|
||||
void
|
||||
AccelGlyphCache_RemoveCellInfo(GlyphInfo *glyph, CacheCellInfo *cellInfo)
|
||||
{
|
||||
CacheCellInfo *currCellInfo = glyph->cellInfo;
|
||||
CacheCellInfo *prevInfo = NULL;
|
||||
// assert (glyph!= NULL && glyph->cellInfo != NULL && cellInfo != NULL)
|
||||
J2dTraceLn(J2D_TRACE_INFO, "AccelGlyphCache_RemoveCellInfo");
|
||||
do {
|
||||
if (currCellInfo == cellInfo) {
|
||||
J2dTraceLn2(J2D_TRACE_VERBOSE,
|
||||
" glyph 0x%x: removing cell 0x%x from glyph's list",
|
||||
glyph, currCellInfo);
|
||||
if (prevInfo == NULL) { // it's the head, chop-chop
|
||||
glyph->cellInfo = currCellInfo->nextGCI;
|
||||
} else {
|
||||
prevInfo->nextGCI = currCellInfo->nextGCI;
|
||||
}
|
||||
currCellInfo->glyphInfo = NULL;
|
||||
currCellInfo->nextGCI = NULL;
|
||||
return;
|
||||
}
|
||||
prevInfo = currCellInfo;
|
||||
currCellInfo = currCellInfo->nextGCI;
|
||||
} while (currCellInfo != NULL);
|
||||
J2dTraceLn2(J2D_TRACE_WARNING, "AccelGlyphCache_RemoveCellInfo: "\
|
||||
"no cell 0x%x in glyph 0x%x's cell list",
|
||||
cellInfo, glyph);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes cell info from the glyph's list of cached cells.
|
||||
*/
|
||||
JNIEXPORT void
|
||||
AccelGlyphCache_RemoveAllCellInfos(GlyphInfo *glyph)
|
||||
{
|
||||
CacheCellInfo *currCell, *prevCell;
|
||||
|
||||
J2dTraceLn(J2D_TRACE_INFO, "AccelGlyphCache_RemoveAllCellInfos");
|
||||
|
||||
if (glyph == NULL || glyph->cellInfo == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
// invalidate all of this glyph's accelerated cache cells
|
||||
currCell = glyph->cellInfo;
|
||||
do {
|
||||
currCell->glyphInfo = NULL;
|
||||
prevCell = currCell;
|
||||
currCell = currCell->nextGCI;
|
||||
prevCell->nextGCI = NULL;
|
||||
} while (currCell != NULL);
|
||||
|
||||
glyph->cellInfo = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns cell info associated with particular cache from the glyph's list of
|
||||
* cached cells.
|
||||
*/
|
||||
CacheCellInfo *
|
||||
AccelGlyphCache_GetCellInfoForCache(GlyphInfo *glyph, GlyphCacheInfo *cache)
|
||||
{
|
||||
// assert (glyph != NULL && cache != NULL)
|
||||
J2dTraceLn(J2D_TRACE_VERBOSE2, "AccelGlyphCache_GetCellInfoForCache");
|
||||
|
||||
if (glyph->cellInfo != NULL) {
|
||||
CacheCellInfo *cellInfo = glyph->cellInfo;
|
||||
do {
|
||||
if (cellInfo->cacheInfo == cache) {
|
||||
J2dTraceLn3(J2D_TRACE_VERBOSE2,
|
||||
" glyph 0x%x: found cell 0x%x for cache 0x%x",
|
||||
glyph, cellInfo, cache);
|
||||
return cellInfo;
|
||||
}
|
||||
cellInfo = cellInfo->nextGCI;
|
||||
} while (cellInfo != NULL);
|
||||
}
|
||||
J2dTraceLn2(J2D_TRACE_VERBOSE2, " glyph 0x%x: no cell for cache 0x%x",
|
||||
glyph, cache);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2008 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
|
||||
@ -26,6 +26,10 @@
|
||||
#ifndef AccelGlyphCache_h_Included
|
||||
#define AccelGlyphCache_h_Included
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "jni.h"
|
||||
#include "fontscalerdefs.h"
|
||||
|
||||
@ -48,10 +52,18 @@ typedef struct {
|
||||
struct _CacheCellInfo {
|
||||
GlyphCacheInfo *cacheInfo;
|
||||
struct GlyphInfo *glyphInfo;
|
||||
// next cell info in the cache's list
|
||||
CacheCellInfo *next;
|
||||
// REMIND: find better name?
|
||||
// next cell info in the glyph's cell list (next Glyph Cache Info)
|
||||
CacheCellInfo *nextGCI;
|
||||
jint timesRendered;
|
||||
jint x;
|
||||
jint y;
|
||||
// number of pixels from the left or right edge not considered touched
|
||||
// by the glyph
|
||||
jint leftOff;
|
||||
jint rightOff;
|
||||
jfloat tx1;
|
||||
jfloat ty1;
|
||||
jfloat tx2;
|
||||
@ -62,9 +74,24 @@ GlyphCacheInfo *
|
||||
AccelGlyphCache_Init(jint width, jint height,
|
||||
jint cellWidth, jint cellHeight,
|
||||
FlushFunc *func);
|
||||
void
|
||||
CacheCellInfo *
|
||||
AccelGlyphCache_AddGlyph(GlyphCacheInfo *cache, struct GlyphInfo *glyph);
|
||||
void
|
||||
AccelGlyphCache_Invalidate(GlyphCacheInfo *cache);
|
||||
void
|
||||
AccelGlyphCache_AddCellInfo(struct GlyphInfo *glyph, CacheCellInfo *cellInfo);
|
||||
void
|
||||
AccelGlyphCache_RemoveCellInfo(struct GlyphInfo *glyph, CacheCellInfo *cellInfo);
|
||||
CacheCellInfo *
|
||||
AccelGlyphCache_GetCellInfoForCache(struct GlyphInfo *glyph,
|
||||
GlyphCacheInfo *cache);
|
||||
JNIEXPORT void
|
||||
AccelGlyphCache_RemoveAllCellInfos(struct GlyphInfo *glyph);
|
||||
void
|
||||
AccelGlyphCache_Free(GlyphCacheInfo *cache);
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* AccelGlyphCache_h_Included */
|
||||
|
@ -770,11 +770,9 @@ Java_sun_font_FreetypeFontScaler_getGlyphImageNative(
|
||||
glyphInfo->topLeftX = (float) ftglyph->bitmap_left;
|
||||
glyphInfo->topLeftY = (float) -ftglyph->bitmap_top;
|
||||
|
||||
if (context->aaType == TEXT_AA_LCD_HRGB ||
|
||||
context->aaType == TEXT_AA_LCD_HBGR) {
|
||||
if (ftglyph->bitmap.pixel_mode == FT_PIXEL_MODE_LCD) {
|
||||
glyphInfo->width = width/3;
|
||||
} else if (context->aaType == TEXT_AA_LCD_VRGB ||
|
||||
context->aaType == TEXT_AA_LCD_VBGR) {
|
||||
} else if (ftglyph->bitmap.pixel_mode == FT_PIXEL_MODE_LCD_V) {
|
||||
glyphInfo->height = glyphInfo->height/3;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2007-2008 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
|
||||
@ -35,6 +35,8 @@
|
||||
#include "sun_font_StrikeCache.h"
|
||||
|
||||
static void *theNullScalerContext = NULL;
|
||||
extern void AccelGlyphCache_RemoveAllCellInfos(GlyphInfo *glyph);
|
||||
|
||||
|
||||
JNIEXPORT jlong JNICALL
|
||||
Java_sun_font_NullFontScaler_getNullScalerContext
|
||||
@ -294,7 +296,7 @@ JNIEXPORT void JNICALL Java_sun_font_StrikeCache_freeIntMemory
|
||||
GlyphInfo *ginfo = (GlyphInfo *)ptrs[i];
|
||||
if (ginfo->cellInfo != NULL) {
|
||||
// invalidate this glyph's accelerated cache cell
|
||||
ginfo->cellInfo->glyphInfo = NULL;
|
||||
AccelGlyphCache_RemoveAllCellInfos(ginfo);
|
||||
}
|
||||
free((void*)ginfo);
|
||||
}
|
||||
@ -324,8 +326,7 @@ JNIEXPORT void JNICALL Java_sun_font_StrikeCache_freeLongMemory
|
||||
if (ptrs[i] != 0L) {
|
||||
GlyphInfo *ginfo = (GlyphInfo *) jlong_to_ptr(ptrs[i]);
|
||||
if (ginfo->cellInfo != NULL) {
|
||||
// invalidate this glyph's accelerated cache cell
|
||||
ginfo->cellInfo->glyphInfo = NULL;
|
||||
AccelGlyphCache_RemoveAllCellInfos(ginfo);
|
||||
}
|
||||
free((void*)ginfo);
|
||||
}
|
||||
|
143
jdk/src/share/native/sun/java2d/ShaderList.c
Normal file
143
jdk/src/share/native/sun/java2d/ShaderList.c
Normal file
@ -0,0 +1,143 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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 <malloc.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ShaderList.h"
|
||||
#include "Trace.h"
|
||||
|
||||
/**
|
||||
* Creates a new ShaderInfo that wraps the given fragment program handle
|
||||
* and related data and stores it at the front of the provided ShaderList.
|
||||
* If the addition causes the ShaderList to outgrow its defined capacity,
|
||||
* the least-recently used item in the list (including its fragment program
|
||||
* object) will be disposed.
|
||||
*/
|
||||
void
|
||||
ShaderList_AddProgram(ShaderList *programList,
|
||||
jlong programID,
|
||||
jint compType, jint compMode, jint flags)
|
||||
{
|
||||
ShaderInfo *info;
|
||||
|
||||
J2dTraceLn(J2D_TRACE_INFO, "ShaderList_AddProgram");
|
||||
|
||||
// create new ShaderInfo
|
||||
info = (ShaderInfo *)malloc(sizeof(ShaderInfo));
|
||||
if (info == NULL) {
|
||||
J2dTraceLn(J2D_TRACE_ERROR,
|
||||
"OGLContext_AddProgram: could not allocate ShaderInfo");
|
||||
return;
|
||||
}
|
||||
|
||||
// fill in the information
|
||||
info->next = programList->head;
|
||||
info->programID = programID;
|
||||
info->compType = compType;
|
||||
info->compMode = compMode;
|
||||
info->flags = flags;
|
||||
|
||||
// insert it at the head of the list
|
||||
programList->head = info;
|
||||
|
||||
// run through the list and see if we need to delete the least
|
||||
// recently used item
|
||||
{
|
||||
int i = 1;
|
||||
ShaderInfo *prev = NULL;
|
||||
ShaderInfo *curr = info->next;
|
||||
while (curr != NULL) {
|
||||
if (i >= programList->maxItems) {
|
||||
prev->next = NULL;
|
||||
programList->dispose(curr->programID);
|
||||
free(curr);
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
prev = curr;
|
||||
curr = curr->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Locates a fragment program handle given a list of shader programs
|
||||
* (ShaderInfos), using the provided composite state and flags as search
|
||||
* parameters. The "flags" parameter is a bitwise-or'd value that helps
|
||||
* differentiate one program for another; the interpretation of this value
|
||||
* varies depending on the type of shader (BufImgOp, Paint, etc) but here
|
||||
* it is only used to find another ShaderInfo with that same "flags" value.
|
||||
* If no matching program can be located, this method returns 0.
|
||||
*/
|
||||
jlong
|
||||
ShaderList_FindProgram(ShaderList *programList,
|
||||
jint compType, jint compMode, jint flags)
|
||||
{
|
||||
ShaderInfo *prev = NULL;
|
||||
ShaderInfo *info = programList->head;
|
||||
|
||||
J2dTraceLn(J2D_TRACE_INFO, "ShaderList_FindProgram");
|
||||
|
||||
while (info != NULL) {
|
||||
if (compType == info->compType &&
|
||||
compMode == info->compMode &&
|
||||
flags == info->flags)
|
||||
{
|
||||
// it's a match: move it to the front of the list (if it's not
|
||||
// there already) and patch up the links
|
||||
if (info != programList->head) {
|
||||
prev->next = info->next;
|
||||
info->next = programList->head;
|
||||
programList->head = info;
|
||||
}
|
||||
return info->programID;
|
||||
}
|
||||
prev = info;
|
||||
info = info->next;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disposes all entries (and their associated shader program objects)
|
||||
* contained in the given ShaderList.
|
||||
*/
|
||||
void
|
||||
ShaderList_Dispose(ShaderList *programList)
|
||||
{
|
||||
ShaderInfo *info = programList->head;
|
||||
|
||||
J2dTraceLn(J2D_TRACE_INFO, "ShaderList_Dispose");
|
||||
|
||||
while (info != NULL) {
|
||||
ShaderInfo *tmp = info->next;
|
||||
programList->dispose(info->programID);
|
||||
free(info);
|
||||
info = tmp;
|
||||
}
|
||||
|
||||
programList->head = NULL;
|
||||
}
|
85
jdk/src/share/native/sun/java2d/ShaderList.h
Normal file
85
jdk/src/share/native/sun/java2d/ShaderList.h
Normal file
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Copyright 2007-2008 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.
|
||||
*/
|
||||
|
||||
#ifndef ShaderList_h_Included
|
||||
#define ShaderList_h_Included
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "jni.h"
|
||||
#include "jlong.h"
|
||||
|
||||
typedef void (ShaderDisposeFunc)(jlong programID);
|
||||
|
||||
/**
|
||||
* The following structures are used to maintain a list of fragment program
|
||||
* objects and their associated attributes. Each logical shader (e.g.
|
||||
* RadialGradientPaint shader, ConvolveOp shader) can have a number of
|
||||
* different variants depending on a number of factors, such as whether
|
||||
* antialiasing is enabled or the current composite mode. Since the number
|
||||
* of possible combinations of these factors is in the hundreds, we need
|
||||
* some way to create fragment programs on an as-needed basis, and also
|
||||
* keep them in a limited sized cache to avoid creating too many objects.
|
||||
*
|
||||
* The ShaderInfo structure keeps a reference to the fragment program's
|
||||
* handle, as well as some other values that help differentiate one ShaderInfo
|
||||
* from another. ShaderInfos can be chained together to form a linked list.
|
||||
*
|
||||
* The ShaderList structure acts as a cache for ShaderInfos, placing
|
||||
* most-recently used items at the front, and removing items from the
|
||||
* cache when its size exceeds the "maxItems" limit.
|
||||
*/
|
||||
typedef struct _ShaderInfo ShaderInfo;
|
||||
|
||||
typedef struct {
|
||||
ShaderInfo *head;
|
||||
ShaderDisposeFunc *dispose;
|
||||
jint maxItems;
|
||||
} ShaderList;
|
||||
|
||||
struct _ShaderInfo {
|
||||
ShaderInfo *next;
|
||||
jlong programID;
|
||||
jint compType;
|
||||
jint compMode;
|
||||
jint flags;
|
||||
};
|
||||
|
||||
void ShaderList_AddProgram(ShaderList *programList,
|
||||
jlong programID,
|
||||
jint compType, jint compMode,
|
||||
jint flags);
|
||||
jlong ShaderList_FindProgram(ShaderList *programList,
|
||||
jint compType, jint compMode,
|
||||
jint flags);
|
||||
void ShaderList_Dispose(ShaderList *programList);
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* ShaderList_h_Included */
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2003-2008 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
|
||||
@ -62,12 +62,18 @@ J2dTraceInit();
|
||||
#define J2dTrace3(level, string, arg1, arg2, arg3)
|
||||
#define J2dTrace4(level, string, arg1, arg2, arg3, arg4)
|
||||
#define J2dTrace5(level, string, arg1, arg2, arg3, arg4, arg5)
|
||||
#define J2dTrace6(level, string, arg1, arg2, arg3, arg4, arg5, arg6)
|
||||
#define J2dTrace7(level, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
|
||||
#define J2dTrace8(level, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
|
||||
#define J2dTraceLn(level, string)
|
||||
#define J2dTraceLn1(level, string, arg1)
|
||||
#define J2dTraceLn2(level, string, arg1, arg2)
|
||||
#define J2dTraceLn3(level, string, arg1, arg2, arg3)
|
||||
#define J2dTraceLn4(level, string, arg1, arg2, arg3, arg4)
|
||||
#define J2dTraceLn5(level, string, arg1, arg2, arg3, arg4, arg5)
|
||||
#define J2dTraceLn6(level, string, arg1, arg2, arg3, arg4, arg5, arg6)
|
||||
#define J2dTraceLn7(level, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
|
||||
#define J2dTraceLn8(level, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
|
||||
#else /* DEBUG */
|
||||
#define J2dTrace(level, string) { \
|
||||
J2dTraceImpl(level, JNI_FALSE, string); \
|
||||
@ -87,6 +93,15 @@ J2dTraceInit();
|
||||
#define J2dTrace5(level, string, arg1, arg2, arg3, arg4, arg5) { \
|
||||
J2dTraceImpl(level, JNI_FALSE, string, arg1, arg2, arg3, arg4, arg5); \
|
||||
}
|
||||
#define J2dTrace6(level, string, arg1, arg2, arg3, arg4, arg5, arg6) { \
|
||||
J2dTraceImpl(level, JNI_FALSE, string, arg1, arg2, arg3, arg4, arg5, arg6); \
|
||||
}
|
||||
#define J2dTrace7(level, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { \
|
||||
J2dTraceImpl(level, JNI_FALSE, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
|
||||
}
|
||||
#define J2dTrace8(level, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) { \
|
||||
J2dTraceImpl(level, JNI_FALSE, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
|
||||
}
|
||||
#define J2dTraceLn(level, string) { \
|
||||
J2dTraceImpl(level, JNI_TRUE, string); \
|
||||
}
|
||||
@ -105,6 +120,15 @@ J2dTraceInit();
|
||||
#define J2dTraceLn5(level, string, arg1, arg2, arg3, arg4, arg5) { \
|
||||
J2dTraceImpl(level, JNI_TRUE, string, arg1, arg2, arg3, arg4, arg5); \
|
||||
}
|
||||
#define J2dTraceLn6(level, string, arg1, arg2, arg3, arg4, arg5, arg6) { \
|
||||
J2dTraceImpl(level, JNI_TRUE, string, arg1, arg2, arg3, arg4, arg5, arg6); \
|
||||
}
|
||||
#define J2dTraceLn7(level, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { \
|
||||
J2dTraceImpl(level, JNI_TRUE, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7); \
|
||||
}
|
||||
#define J2dTraceLn8(level, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) { \
|
||||
J2dTraceImpl(level, JNI_TRUE, string, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); \
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2000-2008 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
|
||||
@ -31,12 +31,12 @@
|
||||
/*
|
||||
* Class: sun_java2d_loops_BlitBg
|
||||
* Method: BlitBg
|
||||
* Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/SurfaceData;Ljava/awt/Composite;Ljava/awt/Color;IIIIII)V
|
||||
* Signature: (Lsun/java2d/SurfaceData;Lsun/java2d/SurfaceData;Ljava/awt/Composite;IIIIIII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_sun_java2d_loops_BlitBg_BlitBg
|
||||
(JNIEnv *env, jobject self,
|
||||
jobject srcData, jobject dstData,
|
||||
jobject comp, jobject clip, jobject bgColor,
|
||||
jobject comp, jobject clip, jint bgColor,
|
||||
jint srcx, jint srcy, jint dstx, jint dsty, jint width, jint height)
|
||||
{
|
||||
SurfaceDataOps *srcOps;
|
||||
@ -93,7 +93,7 @@ JNIEXPORT void JNICALL Java_sun_java2d_loops_BlitBg_BlitBg
|
||||
Region_IntersectBounds(&clipInfo, &dstInfo.bounds);
|
||||
|
||||
if (!Region_IsEmpty(&clipInfo)) {
|
||||
jint bgpixel = GrPrim_ColorGetRGB(env, bgColor);
|
||||
jint bgpixel = bgColor;
|
||||
srcOps->GetRasInfo(env, srcOps, &srcInfo);
|
||||
dstOps->GetRasInfo(env, dstOps, &dstInfo);
|
||||
if (pPrim->pDstType->pixelFor) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2000-2008 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
|
||||
@ -50,7 +50,6 @@ static jfieldID eargbID;
|
||||
static jfieldID clipRegionID;
|
||||
static jfieldID compositeID;
|
||||
static jfieldID lcdTextContrastID;
|
||||
static jfieldID valueID;
|
||||
static jfieldID xorPixelID;
|
||||
static jfieldID xorColorID;
|
||||
static jfieldID alphaMaskID;
|
||||
@ -64,6 +63,8 @@ static jfieldID m10ID;
|
||||
static jfieldID m11ID;
|
||||
static jfieldID m12ID;
|
||||
|
||||
static jmethodID getRgbID;
|
||||
|
||||
static jboolean InitPrimTypes(JNIEnv *env);
|
||||
static jboolean InitSurfaceTypes(JNIEnv *env, jclass SurfaceType);
|
||||
static jboolean InitCompositeTypes(JNIEnv *env, jclass CompositeType);
|
||||
@ -114,7 +115,7 @@ Java_sun_java2d_loops_GraphicsPrimitiveMgr_initIDs
|
||||
"Ljava/awt/Composite;");
|
||||
lcdTextContrastID =
|
||||
(*env)->GetFieldID(env, SG2D, "lcdTextContrast", "I");
|
||||
valueID = (*env)->GetFieldID(env, Color, "value", "I");
|
||||
getRgbID = (*env)->GetMethodID(env, Color, "getRGB", "()I");
|
||||
xorPixelID = (*env)->GetFieldID(env, XORComp, "xorPixel", "I");
|
||||
xorColorID = (*env)->GetFieldID(env, XORComp, "xorColor",
|
||||
"Ljava/awt/Color;");
|
||||
@ -138,7 +139,6 @@ Java_sun_java2d_loops_GraphicsPrimitiveMgr_initIDs
|
||||
sg2dStrokeHintID = (*env)->GetFieldID(env, SG2D, "strokeHint", "I");
|
||||
fid = (*env)->GetStaticFieldID(env, SHints, "INTVAL_STROKE_PURE", "I");
|
||||
sunHints_INTVAL_STROKE_PURE = (*env)->GetStaticIntField(env, SHints, fid);
|
||||
|
||||
}
|
||||
|
||||
void GrPrim_RefineBounds(SurfaceDataBounds *bounds, jint transX, jint transY,
|
||||
@ -467,7 +467,7 @@ GrPrim_CompGetXorColor(JNIEnv *env, jobject comp)
|
||||
jint rgb;
|
||||
|
||||
color = (*env)->GetObjectField(env, comp, xorColorID);
|
||||
rgb = (*env)->GetIntField(env, color, valueID);
|
||||
rgb = (*env)->CallIntMethod(env, color, getRgbID);
|
||||
(*env)->DeleteLocalRef(env, color);
|
||||
|
||||
return rgb;
|
||||
@ -492,11 +492,6 @@ GrPrim_Sg2dGetEaRGB(JNIEnv *env, jobject sg2d)
|
||||
return (*env)->GetIntField(env, sg2d, eargbID);
|
||||
}
|
||||
|
||||
jint GrPrim_ColorGetRGB(JNIEnv *env, jobject color)
|
||||
{
|
||||
return (*env)->GetIntField(env, color, valueID);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
GrPrim_Sg2dGetLCDTextContrast(JNIEnv *env, jobject sg2d)
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2000-2008 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
|
||||
@ -501,7 +501,6 @@ extern JNIEXPORT jint JNICALL
|
||||
GrPrim_Sg2dGetEaRGB(JNIEnv *env, jobject sg2d);
|
||||
extern JNIEXPORT jint JNICALL
|
||||
GrPrim_Sg2dGetLCDTextContrast(JNIEnv *env, jobject sg2d);
|
||||
extern jint GrPrim_ColorGetRGB(JNIEnv *env, jobject color);
|
||||
|
||||
/*
|
||||
* Data structure and functions to retrieve and use
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright 2004-2008 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
|
||||
@ -852,28 +852,58 @@ OGLContext_GetExtensionInfo(JNIEnv *env, jint *caps)
|
||||
|
||||
J2dTraceLn(J2D_TRACE_INFO, "OGLContext_GetExtensionInfo");
|
||||
|
||||
*caps |= CAPS_TEXNONSQUARE;
|
||||
if (OGLContext_IsExtensionAvailable(e, "GL_ARB_multitexture")) {
|
||||
*caps |= sun_java2d_opengl_OGLContext_CAPS_EXT_MULTITEXTURE;
|
||||
*caps |= CAPS_MULTITEXTURE;
|
||||
}
|
||||
if (OGLContext_IsExtensionAvailable(e, "GL_ARB_texture_non_power_of_two")){
|
||||
*caps |= sun_java2d_opengl_OGLContext_CAPS_EXT_TEXNONPOW2;
|
||||
*caps |= CAPS_TEXNONPOW2;
|
||||
}
|
||||
if (OGLContext_IsExtensionAvailable(e, "GL_ARB_texture_rectangle")) {
|
||||
*caps |= sun_java2d_opengl_OGLContext_CAPS_EXT_TEXRECT;
|
||||
// 6656574: Use of the GL_ARB_texture_rectangle extension by Java 2D
|
||||
// complicates any third-party libraries that try to interact with
|
||||
// the OGL pipeline (and we've run into driver bugs in the past related
|
||||
// to this extension), so for now we will disable its use by default (unless
|
||||
// forced). We will still make use of the GL_ARB_texture_non_power_of_two
|
||||
// extension when available, which is the better choice going forward
|
||||
// anyway.
|
||||
if (OGLContext_IsExtensionAvailable(e, "GL_ARB_texture_rectangle") &&
|
||||
getenv("J2D_OGL_TEXRECT") != NULL)
|
||||
{
|
||||
*caps |= CAPS_EXT_TEXRECT;
|
||||
}
|
||||
if (OGLContext_IsFBObjectExtensionAvailable(env, e)) {
|
||||
*caps |= sun_java2d_opengl_OGLContext_CAPS_EXT_FBOBJECT;
|
||||
*caps |= CAPS_EXT_FBOBJECT;
|
||||
}
|
||||
if (OGLContext_IsLCDShaderSupportAvailable(env, fragShaderAvail)) {
|
||||
*caps |= sun_java2d_opengl_OGLContext_CAPS_EXT_LCD_SHADER;
|
||||
*caps |= CAPS_EXT_LCD_SHADER | CAPS_PS20;
|
||||
}
|
||||
if (OGLContext_IsBIOpShaderSupportAvailable(env, fragShaderAvail)) {
|
||||
*caps |= sun_java2d_opengl_OGLContext_CAPS_EXT_BIOP_SHADER;
|
||||
*caps |= CAPS_EXT_BIOP_SHADER | CAPS_PS20;
|
||||
}
|
||||
if (OGLContext_IsGradShaderSupportAvailable(env, fragShaderAvail)) {
|
||||
*caps |= sun_java2d_opengl_OGLContext_CAPS_EXT_GRAD_SHADER;
|
||||
*caps |= CAPS_EXT_GRAD_SHADER | CAPS_PS20;
|
||||
}
|
||||
if (OGLContext_IsExtensionAvailable(e, "GL_NV_fragment_program")) {
|
||||
// this is an Nvidia board, at least PS 2.0, but we can't
|
||||
// use the "max instructions" heuristic since GeForce FX
|
||||
// boards report 1024 even though they're only PS 2.0,
|
||||
// so we'll check the following, which does imply PS 3.0
|
||||
if (OGLContext_IsExtensionAvailable(e, "GL_NV_fragment_program2")) {
|
||||
*caps |= CAPS_PS30;
|
||||
}
|
||||
} else {
|
||||
// for all other boards, we look at the "max instructions"
|
||||
// count reported by the GL_ARB_fragment_program extension
|
||||
// as a heuristic for detecting PS 3.0 compatible hardware
|
||||
if (OGLContext_IsExtensionAvailable(e, "GL_ARB_fragment_program")) {
|
||||
GLint instr;
|
||||
j2d_glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB,
|
||||
GL_MAX_PROGRAM_INSTRUCTIONS_ARB, &instr);
|
||||
if (instr > 512) {
|
||||
*caps |= CAPS_PS30;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// stuff vendor descriptor in the upper bits of the caps
|
||||
if (vendor != NULL) {
|
||||
if (strncmp(vendor, "ATI", 3) == 0) {
|
||||
@ -883,8 +913,10 @@ OGLContext_GetExtensionInfo(JNIEnv *env, jint *caps)
|
||||
} else if (strncmp(vendor, "Sun", 3) == 0) {
|
||||
vcap = OGLC_VENDOR_SUN;
|
||||
}
|
||||
// REMIND: new in 7 - check if needs fixing
|
||||
*caps |= ((vcap & OGLC_VCAP_MASK) << OGLC_VCAP_OFFSET);
|
||||
}
|
||||
*caps |= ((vcap & OGLC_VCAP_MASK) << OGLC_VCAP_OFFSET);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -983,4 +1015,49 @@ OGLContext_CreateFragmentProgram(const char *fragmentShaderSource)
|
||||
return fragmentProgram;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_java2d_opengl_OGLContext
|
||||
* Method: getOGLIdString
|
||||
* Signature: ()Ljava/lang/String;
|
||||
*/
|
||||
JNIEXPORT jstring JNICALL Java_sun_java2d_opengl_OGLContext_getOGLIdString
|
||||
(JNIEnv *env, jclass oglcc)
|
||||
{
|
||||
char *vendor, *renderer, *version;
|
||||
char *pAdapterId;
|
||||
jobject ret = NULL;
|
||||
int len;
|
||||
|
||||
J2dTraceLn(J2D_TRACE_INFO, "OGLContext_getOGLIdString");
|
||||
|
||||
vendor = (char*)j2d_glGetString(GL_VENDOR);
|
||||
if (vendor == NULL) {
|
||||
vendor = "Unknown Vendor";
|
||||
}
|
||||
renderer = (char*)j2d_glGetString(GL_RENDERER);
|
||||
if (renderer == NULL) {
|
||||
renderer = "Unknown Renderer";
|
||||
}
|
||||
version = (char*)j2d_glGetString(GL_VERSION);
|
||||
if (version == NULL) {
|
||||
version = "unknown version";
|
||||
}
|
||||
|
||||
// 'vendor renderer (version)0'
|
||||
len = strlen(vendor) + 1 + strlen(renderer) + 1 + 1+strlen(version)+1 + 1;
|
||||
pAdapterId = malloc(len);
|
||||
if (pAdapterId != NULL) {
|
||||
|
||||
jio_snprintf(pAdapterId, len, "%s %s (%s)", vendor, renderer, version);
|
||||
|
||||
J2dTraceLn1(J2D_TRACE_VERBOSE, " id=%s", pAdapterId);
|
||||
|
||||
ret = JNU_NewStringPlatform(env, pAdapterId);
|
||||
|
||||
free(pAdapterId);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* !HEADLESS */
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user